diff --git a/DEPS b/DEPS index 14c5f36..faf5563 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,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': 'd2916264aae08b547792556fd4197524b96cf44d', + 'skia_revision': '64b0fb59951790b29131f299461a784f60640c70', # 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': '1eb6866c0c4eab8b181362c02446ebbc6d078f2b', + 'v8_revision': 'c12805f8d5c043bc83b9cb16de020c3f94fe5f27', # 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. @@ -117,7 +117,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': 'f4d429c1cbc1351ea9f1ac74e0f22b085d275179', + 'angle_revision': '7f2329398fe8a8b57fa16ec222127a55a457968d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -129,7 +129,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '5700d9e2eea5813861920995815ac092fd7df973', + 'pdfium_revision': '7a956edb6b5356ebab6bae0a6c3d8bd279c01019', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -165,7 +165,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': '5f6da8a57db16291c01a894083137c294b3b4e5f', + 'catapult_revision': '3e071665b9f98563767e62ffa34611ffe5fbe4b8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -584,7 +584,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd7d11650ca3794720a99d2003ce64df354edd743', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '71ddeb9859d4337575bcf07520d13af05e7425dc', 'condition': 'checkout_linux', }, @@ -609,7 +609,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'dfce68bcddba7508d74016405a95e7865cbf47ba', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b5e87815540404a4a68f6c3a195a514146e631d7', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -802,7 +802,7 @@ Var('chromium_git') + '/external/libaddressinput.git' + '@' + 'd7ed8e2f3f35ce9a3aafdfdc48745ceab66e7229', 'src/third_party/libaom/source/libaom': { - 'url': Var('aomedia_git') + '/aom.git' + '@' + '7d447f5b0021abd363dd64912c59196393e9b159', + 'url': Var('aomedia_git') + '/aom.git' + '@' + '67645b8f529cd4e56b31147db57882089345bedc', 'condition': 'checkout_libaom', }, @@ -1098,7 +1098,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '7ca87fb1d3da3b3d2060886e8c58e726d74c8219', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'dc899dce9e2e3e5ae4517aa40de796d50557fe9f', + Var('webrtc_git') + '/src.git' + '@' + 'bdc115c23d219bf91c2eb90bbf215a27114e7d22', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d', @@ -1129,7 +1129,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@86a4158a03f98f970d349a1090453cedbe33217c', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d3bc41f640c5692e4cfc2508d0f7199d36fec684', 'condition': 'checkout_src_internal', },
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index ecdcded..72299ec 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1297,8 +1297,6 @@ "wm/workspace/two_step_edge_cycler.h", "wm/workspace/workspace_event_handler.cc", "wm/workspace/workspace_event_handler.h", - "wm/workspace/workspace_event_handler_classic.cc", - "wm/workspace/workspace_event_handler_classic.h", "wm/workspace/workspace_layout_manager.cc", "wm/workspace/workspace_layout_manager.h", "wm/workspace/workspace_types.h", @@ -2332,6 +2330,7 @@ "//device/bluetooth", "//services/ws:test_support", "//services/ws/public/cpp", + "//services/ws/public/cpp/host", "//services/ws/public/cpp/input_devices", "//services/ws/public/mojom", "//skia",
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index fccef3d..41f7a26 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc
@@ -107,10 +107,7 @@ using message_center::SystemNotificationWarningLevel; // Toast id and duration for voice interaction shortcuts -const char kSecondaryUserToastId[] = "voice_interaction_secondary_user"; -const char kUnsupportedLocaleToastId[] = "voice_interaction_locale_unsupported"; -const char kPolicyDisabledToastId[] = "voice_interaction_policy_disabled"; -const char kDemoModeToastId[] = "demo_mode"; +const char kVoiceInteractionErrorToastId[] = "voice_interaction_error"; const int kToastDurationMs = 2500; // Ensures that there are no word breaks at the "+"s in the shortcut texts such @@ -684,7 +681,7 @@ switch (Shell::Get()->voice_interaction_controller()->allowed_state()) { case mojom::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER: // Show a toast if the active user is not primary. - ShowToast(kSecondaryUserToastId, + ShowToast(kVoiceInteractionErrorToastId, l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_SECONDARY_USER_TOAST_MESSAGE)); return; @@ -692,20 +689,27 @@ // Show a toast if voice interaction is disabled due to unsupported // locales. ShowToast( - kUnsupportedLocaleToastId, + kVoiceInteractionErrorToastId, l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_LOCALE_UNSUPPORTED_TOAST_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_ARC_POLICY: // Show a toast if voice interaction is disabled due to enterprise policy. - ShowToast(kPolicyDisabledToastId, + ShowToast(kVoiceInteractionErrorToastId, l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_DISABLED_BY_POLICY_MESSAGE)); return; case mojom::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE: // Show a toast if voice interaction is disabled due to being in Demo // Mode. - ShowToast(kDemoModeToastId, + ShowToast(kVoiceInteractionErrorToastId, + l10n_util::GetStringUTF16( + IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE)); + return; + case mojom::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION: + // Show a toast if voice interaction is disabled due to being in Demo + // Mode. + ShowToast(kVoiceInteractionErrorToastId, l10n_util::GetStringUTF16( IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE)); return;
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 76b9cde4..5951bb3 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -362,7 +362,7 @@ AddAccelerator(ui::Accelerator(ui::VKEY_BROWSER_BACK, ui::EF_NONE)); parent_window_ = params.parent; - InitializeFullscreen(params.parent, params.parent_container_id); + InitializeFullscreen(params.parent); InitChildWidgets(); AddChildView(overlay_view_); @@ -557,8 +557,7 @@ app_list_main_view_->contents_view()->Layout(); } -void AppListView::InitializeFullscreen(gfx::NativeView parent, - int parent_container_id) { +void AppListView::InitializeFullscreen(gfx::NativeView parent) { const display::Display display_nearest_view = GetDisplayNearestView(); const gfx::Rect display_work_area_bounds = display_nearest_view.work_area();
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index 3cc7999..f07c67ce 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -83,17 +83,10 @@ static constexpr int kScrollIgnoreTimeMs = 500; struct InitParams { - // Used in classic ash for both bubble and fullscreen style. gfx::NativeView parent = nullptr; - // Window container id. Used in mash for both bubble and fullscreen style. - // TODO(jamescook): Remove when the app list moves into the ash process. - int parent_container_id = -1; - // Used for both bubble and fullscreen style. int initial_apps_page = 0; - // Used for fullscreen style. bool is_tablet_mode = false; - // Whether the shelf alignment is on the side of the display. Used for - // fullscreen style. + // Whether the shelf alignment is on the side of the display. bool is_side_shelf = false; }; @@ -266,7 +259,7 @@ void InitChildWidgets(); // Initializes the widget for fullscreen mode. - void InitializeFullscreen(gfx::NativeView parent, int parent_container_id); + void InitializeFullscreen(gfx::NativeView parent); // Closes the AppListView when a click or tap event propogates to the // AppListView.
diff --git a/ash/app_list/views/folder_background_view.cc b/ash/app_list/views/folder_background_view.cc index 373afb7..1368483 100644 --- a/ash/app_list/views/folder_background_view.cc +++ b/ash/app_list/views/folder_background_view.cc
@@ -10,9 +10,7 @@ namespace app_list { FolderBackgroundView::FolderBackgroundView(AppListFolderView* folder_view) - : folder_view_(folder_view) { - SetPaintToLayer(); -} + : folder_view_(folder_view) {} FolderBackgroundView::~FolderBackgroundView() = default;
diff --git a/ash/app_list/views/suggestion_chip_view.cc b/ash/app_list/views/suggestion_chip_view.cc index 5d411f0..ba33770 100644 --- a/ash/app_list/views/suggestion_chip_view.cc +++ b/ash/app_list/views/suggestion_chip_view.cc
@@ -118,6 +118,7 @@ text_view_->SetAutoColorReadabilityEnabled(false); text_view_->SetEnabledColor(assistant_style_ ? kAssistantTextColor : kAppListTextColor); + text_view_->SetSubpixelRenderingEnabled(false); text_view_->SetFontList( assistant_style_ ? ash::assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(1)
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index be23b04..b5de6f1f 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -653,6 +653,9 @@ <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_DEMO_MODE_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a demo session, which does not support voice interaction."> The Google Assistant is not available in a demo session. </message> + <message name="IDS_ASH_VOICE_INTERACTION_DISABLED_IN_PUBLIC_SESSION_MESSAGE" desc="Message content on the toast that appears when the voice interaction shortcut is pressed in a public session, which does not support voice interaction."> + The Google Assistant is not available in a public session. + </message> <message name="IDS_ASH_TOAST_DISMISS_BUTTON" desc="The text button shown in toasts to close the toast immediately without waiting timeout."> DISMISS
diff --git a/ash/assistant/assistant_interaction_controller.cc b/ash/assistant/assistant_interaction_controller.cc index 2a960f8..595fa3f 100644 --- a/ash/assistant/assistant_interaction_controller.cc +++ b/ash/assistant/assistant_interaction_controller.cc
@@ -50,12 +50,12 @@ void AssistantInteractionController::AddModelObserver( AssistantInteractionModelObserver* observer) { - assistant_interaction_model_.AddObserver(observer); + model_.AddObserver(observer); } void AssistantInteractionController::RemoveModelObserver( AssistantInteractionModelObserver* observer) { - assistant_interaction_model_.RemoveObserver(observer); + model_.RemoveObserver(observer); } void AssistantInteractionController::OnAssistantControllerConstructed() { @@ -100,12 +100,27 @@ if (ui_mode == AssistantUiMode::kMiniUi) return; - // When the Assistant is not in mini state there should not be an active - // metalayer session. If we were in mini state when the UI mode was changed, - // we need to clean up the metalayer session and reset default input modality. - if (assistant_interaction_model_.input_modality() == InputModality::kStylus) { - Shell::Get()->highlighter_controller()->AbortSession(); - assistant_interaction_model_.SetInputModality(InputModality::kKeyboard); + switch (model_.input_modality()) { + case InputModality::kStylus: + // When the Assistant is not in mini state there should not be an active + // metalayer session. If we were in mini state when the UI mode was + // changed, we need to clean up the metalayer session and reset default + // input modality. + Shell::Get()->highlighter_controller()->AbortSession(); + model_.SetInputModality(InputModality::kKeyboard); + break; + case InputModality::kVoice: + // When transitioning to web UI we abort any in progress voice query. We + // do this to prevent Assistant from listening to the user while we + // navigate away from the main stage. + if (ui_mode == AssistantUiMode::kWebUi && + model_.pending_query().type() == AssistantQueryType::kVoice) { + StopActiveInteraction(); + } + break; + case InputModality::kKeyboard: + // No action necessary. + break; } } @@ -118,24 +133,23 @@ // When the UI is closed we need to stop any active interaction. We also // reset the interaction state and restore the default input modality. StopActiveInteraction(); - assistant_interaction_model_.ClearInteraction(); - assistant_interaction_model_.SetInputModality(InputModality::kKeyboard); + model_.ClearInteraction(); + model_.SetInputModality(InputModality::kKeyboard); break; case AssistantVisibility::kHidden: // When the UI is hidden we stop any voice query in progress so that we // don't listen to the user while not visible. We also restore the default // input modality for the next launch. - if (assistant_interaction_model_.pending_query().type() == - AssistantQueryType::kVoice) { + if (model_.pending_query().type() == AssistantQueryType::kVoice) { StopActiveInteraction(); } - assistant_interaction_model_.SetInputModality(InputModality::kKeyboard); + model_.SetInputModality(InputModality::kKeyboard); break; case AssistantVisibility::kVisible: if (source == AssistantSource::kLongPressLauncher) { StartVoiceInteraction(); } else if (source == AssistantSource::kStylus) { - assistant_interaction_model_.SetInputModality(InputModality::kStylus); + model_.SetInputModality(InputModality::kStylus); } break; } @@ -145,12 +159,12 @@ HighlighterEnabledState state) { switch (state) { case HighlighterEnabledState::kEnabled: - assistant_interaction_model_.SetInputModality(InputModality::kStylus); + model_.SetInputModality(InputModality::kStylus); break; case HighlighterEnabledState::kDisabledByUser: FALLTHROUGH; case HighlighterEnabledState::kDisabledBySessionComplete: - assistant_interaction_model_.SetInputModality(InputModality::kKeyboard); + model_.SetInputModality(InputModality::kKeyboard); break; case HighlighterEnabledState::kDisabledBySessionAbort: // When metalayer mode has been aborted, no action necessary. Abort occurs @@ -196,20 +210,18 @@ void AssistantInteractionController::OnInteractionStarted( bool is_voice_interaction) { - assistant_interaction_model_.SetInteractionState(InteractionState::kActive); + model_.SetInteractionState(InteractionState::kActive); // In the case of a voice interaction, we assume that the mic is open and // transition to voice input modality. if (is_voice_interaction) { - assistant_interaction_model_.SetInputModality(InputModality::kVoice); - assistant_interaction_model_.SetMicState(MicState::kOpen); + model_.SetInputModality(InputModality::kVoice); + model_.SetMicState(MicState::kOpen); // When a voice interaction is initiated by hotword, we haven't yet set a // pending query so this is our earliest opportunity. - if (assistant_interaction_model_.pending_query().type() == - AssistantQueryType::kNull) { - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantVoiceQuery>()); + if (model_.pending_query().type() == AssistantQueryType::kNull) { + model_.SetPendingQuery(std::make_unique<AssistantVoiceQuery>()); } } else { // TODO(b/112000321): It should not be possible to reach this code without @@ -218,31 +230,28 @@ // AssistantInteractionController when beginning an interaction. To address // this, we temporarily pend an empty text query to commit until we can do // development to expose something more meaningful. - if (assistant_interaction_model_.pending_query().type() == - AssistantQueryType::kNull) { - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantTextQuery>()); + if (model_.pending_query().type() == AssistantQueryType::kNull) { + model_.SetPendingQuery(std::make_unique<AssistantTextQuery>()); } - assistant_interaction_model_.CommitPendingQuery(); - assistant_interaction_model_.SetMicState(MicState::kClosed); + model_.CommitPendingQuery(); + model_.SetMicState(MicState::kClosed); } // Start caching a new Assistant response for the interaction. - assistant_interaction_model_.SetPendingResponse( - std::make_unique<AssistantResponse>()); + model_.SetPendingResponse(std::make_unique<AssistantResponse>()); } void AssistantInteractionController::OnInteractionFinished( AssistantInteractionResolution resolution) { - assistant_interaction_model_.SetInteractionState(InteractionState::kInactive); - assistant_interaction_model_.SetMicState(MicState::kClosed); + model_.SetInteractionState(InteractionState::kInactive); + model_.SetMicState(MicState::kClosed); // If the interaction was finished due to mic timeout, we only want to clear // the pending query/response state for that interaction. if (resolution == AssistantInteractionResolution::kMicTimeout) { - assistant_interaction_model_.ClearPendingQuery(); - assistant_interaction_model_.ClearPendingResponse(); + model_.ClearPendingQuery(); + model_.ClearPendingResponse(); return; } @@ -251,40 +260,38 @@ // device hotword loss, for example, but can also occur if the interaction // errors out. In these cases we still need to commit the pending query as // this is a prerequisite step to being able to finalize the pending response. - if (assistant_interaction_model_.pending_query().type() != - AssistantQueryType::kNull) { - assistant_interaction_model_.CommitPendingQuery(); + if (model_.pending_query().type() != AssistantQueryType::kNull) { + model_.CommitPendingQuery(); } // If the interaction was finished due to multi-device hotword loss, we want // to show an appropriate message to the user. if (resolution == AssistantInteractionResolution::kMultiDeviceHotwordLoss) { - assistant_interaction_model_.pending_response()->AddUiElement( + model_.pending_response()->AddUiElement( std::make_unique<AssistantTextElement>(l10n_util::GetStringUTF8( IDS_ASH_ASSISTANT_MULTI_DEVICE_HOTWORD_LOSS))); } // The interaction has finished, so we finalize the pending response if it // hasn't already been finalized. - if (assistant_interaction_model_.pending_response()) - assistant_interaction_model_.FinalizePendingResponse(); + if (model_.pending_response()) + model_.FinalizePendingResponse(); } void AssistantInteractionController::OnHtmlResponse( const std::string& response) { - if (assistant_interaction_model_.interaction_state() != - InteractionState::kActive) { + if (model_.interaction_state() != InteractionState::kActive) { return; } // If this occurs, the server has broken our response ordering agreement. We // should not crash but we cannot handle the response so we ignore it. - if (!assistant_interaction_model_.pending_response()) { + if (!model_.pending_response()) { NOTREACHED(); return; } - assistant_interaction_model_.pending_response()->AddUiElement( + model_.pending_response()->AddUiElement( std::make_unique<AssistantCardElement>(response)); } @@ -303,37 +310,34 @@ void AssistantInteractionController::OnSuggestionsResponse( std::vector<AssistantSuggestionPtr> response) { - if (assistant_interaction_model_.interaction_state() != - InteractionState::kActive) { + if (model_.interaction_state() != InteractionState::kActive) { return; } // If this occurs, the server has broken our response ordering agreement. We // should not crash but we cannot handle the response so we ignore it. - if (!assistant_interaction_model_.pending_response()) { + if (!model_.pending_response()) { NOTREACHED(); return; } - assistant_interaction_model_.pending_response()->AddSuggestions( - std::move(response)); + model_.pending_response()->AddSuggestions(std::move(response)); } void AssistantInteractionController::OnTextResponse( const std::string& response) { - if (assistant_interaction_model_.interaction_state() != - InteractionState::kActive) { + if (model_.interaction_state() != InteractionState::kActive) { return; } // If this occurs, the server has broken our response ordering agreement. We // should not crash but we cannot handle the response so we ignore it. - if (!assistant_interaction_model_.pending_response()) { + if (!model_.pending_response()) { NOTREACHED(); return; } - assistant_interaction_model_.pending_response()->AddUiElement( + model_.pending_response()->AddUiElement( std::make_unique<AssistantTextElement>(response)); } @@ -342,47 +346,49 @@ void AssistantInteractionController::OnSpeechRecognitionIntermediateResult( const std::string& high_confidence_text, const std::string& low_confidence_text) { - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantVoiceQuery>(high_confidence_text, - low_confidence_text)); + model_.SetPendingQuery(std::make_unique<AssistantVoiceQuery>( + high_confidence_text, low_confidence_text)); } void AssistantInteractionController::OnSpeechRecognitionEndOfUtterance() { - assistant_interaction_model_.SetMicState(MicState::kClosed); + model_.SetMicState(MicState::kClosed); } void AssistantInteractionController::OnSpeechRecognitionFinalResult( const std::string& final_result) { - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantVoiceQuery>(final_result)); - assistant_interaction_model_.CommitPendingQuery(); + // We sometimes receive this event with an empty payload when the interaction + // is resolving due to mic timeout. In such cases, we should not commit the + // pending query as the interaction will be discarded. + if (final_result.empty()) + return; + + model_.SetPendingQuery(std::make_unique<AssistantVoiceQuery>(final_result)); + model_.CommitPendingQuery(); } void AssistantInteractionController::OnSpeechLevelUpdated(float speech_level) { - assistant_interaction_model_.SetSpeechLevel(speech_level); + model_.SetSpeechLevel(speech_level); } void AssistantInteractionController::OnTtsStarted(bool due_to_error) { - if (assistant_interaction_model_.interaction_state() != - InteractionState::kActive) { + if (model_.interaction_state() != InteractionState::kActive) { return; } // Commit the pending query in whatever state it's in. In most cases the // pending query is already committed, but we must always commit the pending // query before finalizing a pending result. - if (assistant_interaction_model_.pending_query().type() != - AssistantQueryType::kNull) { - assistant_interaction_model_.CommitPendingQuery(); + if (model_.pending_query().type() != AssistantQueryType::kNull) { + model_.CommitPendingQuery(); } if (due_to_error) { // In the case of an error occurring during a voice interaction, this is our // earliest indication that the mic has closed. - assistant_interaction_model_.SetMicState(MicState::kClosed); + model_.SetMicState(MicState::kClosed); // Add an error message to the response. - assistant_interaction_model_.pending_response()->AddUiElement( + model_.pending_response()->AddUiElement( std::make_unique<AssistantTextElement>( l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_ERROR_GENERIC))); } @@ -391,12 +397,11 @@ // of an interaction to be processed. To be timely in updating UI, we use // this as an opportunity to finalize the Assistant response and update the // interaction model. - assistant_interaction_model_.FinalizePendingResponse(); + model_.FinalizePendingResponse(); } void AssistantInteractionController::OnOpenUrlResponse(const GURL& url) { - if (assistant_interaction_model_.interaction_state() != - InteractionState::kActive) { + if (model_.interaction_state() != InteractionState::kActive) { return; } assistant_controller_->OpenUrl(url); @@ -405,14 +410,14 @@ void AssistantInteractionController::OnDialogPlateButtonPressed( DialogPlateButtonId id) { if (id == DialogPlateButtonId::kKeyboardInputToggle) { - assistant_interaction_model_.SetInputModality(InputModality::kKeyboard); + model_.SetInputModality(InputModality::kKeyboard); return; } if (id != DialogPlateButtonId::kVoiceInputToggle) return; - switch (assistant_interaction_model_.mic_state()) { + switch (model_.mic_state()) { case MicState::kClosed: StartVoiceInteraction(); break; @@ -432,9 +437,8 @@ const gfx::Rect& region) { StopActiveInteraction(); - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantTextQuery>( - l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_CHIP_WHATS_ON_MY_SCREEN))); + model_.SetPendingQuery(std::make_unique<AssistantTextQuery>( + l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_CHIP_WHATS_ON_MY_SCREEN))); assistant_->StartMetalayerInteraction(region); } @@ -442,9 +446,8 @@ void AssistantInteractionController::StartScreenContextInteraction() { StopActiveInteraction(); - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantTextQuery>( - l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_CHIP_WHATS_ON_MY_SCREEN))); + model_.SetPendingQuery(std::make_unique<AssistantTextQuery>( + l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_CHIP_WHATS_ON_MY_SCREEN))); // Note that screen context was cached when the UI was launched. assistant_->StartCachedScreenContextInteraction(); @@ -454,8 +457,7 @@ const std::string text) { StopActiveInteraction(); - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantTextQuery>(text)); + model_.SetPendingQuery(std::make_unique<AssistantTextQuery>(text)); assistant_->SendTextQuery(text); } @@ -463,8 +465,7 @@ void AssistantInteractionController::StartVoiceInteraction() { StopActiveInteraction(); - assistant_interaction_model_.SetPendingQuery( - std::make_unique<AssistantVoiceQuery>()); + model_.SetPendingQuery(std::make_unique<AssistantVoiceQuery>()); assistant_->StartVoiceInteraction(); } @@ -474,15 +475,15 @@ // via a call to OnInteractionFinished(Resolution), we explicitly set it to // inactive here to prevent processing any additional UI related service // events belonging to the interaction being stopped. - assistant_interaction_model_.SetInteractionState(InteractionState::kInactive); - assistant_interaction_model_.ClearPendingQuery(); + model_.SetInteractionState(InteractionState::kInactive); + model_.ClearPendingQuery(); assistant_->StopActiveInteraction(); // Because we are stopping an interaction in progress, we discard any pending // response for it that is cached to prevent it from being finalized when the // interaction is finished. - assistant_interaction_model_.ClearPendingResponse(); + model_.ClearPendingResponse(); } } // namespace ash
diff --git a/ash/assistant/assistant_interaction_controller.h b/ash/assistant/assistant_interaction_controller.h index c141b5f3..1017495 100644 --- a/ash/assistant/assistant_interaction_controller.h +++ b/ash/assistant/assistant_interaction_controller.h
@@ -46,9 +46,7 @@ void SetAssistant(chromeos::assistant::mojom::Assistant* assistant); // Returns a reference to the underlying model. - const AssistantInteractionModel* model() const { - return &assistant_interaction_model_; - } + const AssistantInteractionModel* model() const { return &model_; } // Adds/removes the specified interaction model |observer|. void AddModelObserver(AssistantInteractionModelObserver* observer); @@ -117,7 +115,7 @@ mojo::Binding<chromeos::assistant::mojom::AssistantInteractionSubscriber> assistant_interaction_subscriber_binding_; - AssistantInteractionModel assistant_interaction_model_; + AssistantInteractionModel model_; DISALLOW_COPY_AND_ASSIGN(AssistantInteractionController); };
diff --git a/ash/assistant/assistant_screen_context_controller.cc b/ash/assistant/assistant_screen_context_controller.cc index 1bbf86f7..c43b10d 100644 --- a/ash/assistant/assistant_screen_context_controller.cc +++ b/ash/assistant/assistant_screen_context_controller.cc
@@ -144,12 +144,12 @@ void AssistantScreenContextController::AddModelObserver( AssistantScreenContextModelObserver* observer) { - assistant_screen_context_model_.AddObserver(observer); + model_.AddObserver(observer); } void AssistantScreenContextController::RemoveModelObserver( AssistantScreenContextModelObserver* observer) { - assistant_screen_context_model_.RemoveObserver(observer); + model_.RemoveObserver(observer); } void AssistantScreenContextController::RequestScreenshot( @@ -195,8 +195,7 @@ // Otherwise, we abort any requests in progress and reset state. if (new_visibility != AssistantVisibility::kVisible) { screen_context_request_factory_.InvalidateWeakPtrs(); - assistant_screen_context_model_.SetRequestState( - ScreenContextRequestState::kIdle); + model_.SetRequestState(ScreenContextRequestState::kIdle); return; } @@ -210,8 +209,7 @@ // Abort any request in progress and update request state. screen_context_request_factory_.InvalidateWeakPtrs(); - assistant_screen_context_model_.SetRequestState( - ScreenContextRequestState::kInProgress); + model_.SetRequestState(ScreenContextRequestState::kInProgress); // Cache screen context for the entire screen. assistant_->CacheScreenContext(base::BindOnce( @@ -220,8 +218,7 @@ } void AssistantScreenContextController::OnScreenContextRequestFinished() { - assistant_screen_context_model_.SetRequestState( - ScreenContextRequestState::kIdle); + model_.SetRequestState(ScreenContextRequestState::kIdle); } std::unique_ptr<ui::LayerTreeOwner>
diff --git a/ash/assistant/assistant_screen_context_controller.h b/ash/assistant/assistant_screen_context_controller.h index 79927e97..5919a4d 100644 --- a/ash/assistant/assistant_screen_context_controller.h +++ b/ash/assistant/assistant_screen_context_controller.h
@@ -36,9 +36,7 @@ void SetAssistant(chromeos::assistant::mojom::Assistant* assistant); // Returns a reference to the underlying model. - const AssistantScreenContextModel* model() const { - return &assistant_screen_context_model_; - } + const AssistantScreenContextModel* model() const { return &model_; } // Adds/removes the specified screen context model |observer|. void AddModelObserver(AssistantScreenContextModelObserver* observer); @@ -71,7 +69,7 @@ // Owned by AssistantController. chromeos::assistant::mojom::Assistant* assistant_ = nullptr; - AssistantScreenContextModel assistant_screen_context_model_; + AssistantScreenContextModel model_; // Weak pointer factory used for screen context requests. base::WeakPtrFactory<AssistantScreenContextController>
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc index 23e972e9..8eab5c3 100644 --- a/ash/assistant/assistant_ui_controller.cc +++ b/ash/assistant/assistant_ui_controller.cc
@@ -62,12 +62,12 @@ void AssistantUiController::AddModelObserver( AssistantUiModelObserver* observer) { - assistant_ui_model_.AddObserver(observer); + model_.AddObserver(observer); } void AssistantUiController::RemoveModelObserver( AssistantUiModelObserver* observer) { - assistant_ui_model_.RemoveObserver(observer); + model_.RemoveObserver(observer); } void AssistantUiController::OnWidgetActivationChanged(views::Widget* widget, @@ -90,8 +90,8 @@ // We need to update the model when the widget is destroyed as this may have // happened outside our control. This can occur as the result of pressing the // ESC key, for example. - assistant_ui_model_.SetVisibility(AssistantVisibility::kClosed, - AssistantSource::kUnspecified); + model_.SetVisibility(AssistantVisibility::kClosed, + AssistantSource::kUnspecified); container_view_->GetWidget()->RemoveObserver(this); container_view_ = nullptr; @@ -114,12 +114,16 @@ } void AssistantUiController::OnMicStateChanged(MicState mic_state) { - UpdateUiMode(); + // When the mic is opened we update the UI mode to ensure that the user is + // being presented with the main stage. When closing the mic it is appropriate + // to stay in whatever UI mode we are currently in. + if (mic_state == MicState::kOpen) + UpdateUiMode(); } void AssistantUiController::OnScreenContextRequestStateChanged( ScreenContextRequestState request_state) { - if (assistant_ui_model_.visibility() != AssistantVisibility::kVisible) + if (model_.visibility() != AssistantVisibility::kVisible) return; // Once screen context request state has become idle, it is safe to activate @@ -168,11 +172,11 @@ HighlighterEnabledState state) { switch (state) { case HighlighterEnabledState::kEnabled: - if (assistant_ui_model_.visibility() != AssistantVisibility::kVisible) + if (model_.visibility() != AssistantVisibility::kVisible) ShowUi(AssistantSource::kStylus); break; case HighlighterEnabledState::kDisabledByUser: - if (assistant_ui_model_.visibility() == AssistantVisibility::kVisible) + if (model_.visibility() == AssistantVisibility::kVisible) HideUi(AssistantSource::kStylus); break; case HighlighterEnabledState::kDisabledBySessionComplete: @@ -210,7 +214,7 @@ void AssistantUiController::OnUrlOpened(const GURL& url) { // We hide Assistant UI when opening a URL in a new tab. - if (assistant_ui_model_.visibility() == AssistantVisibility::kVisible) + if (model_.visibility() == AssistantVisibility::kVisible) HideUi(AssistantSource::kUnspecified); } @@ -256,7 +260,7 @@ return; } - if (assistant_ui_model_.visibility() == AssistantVisibility::kVisible) { + if (model_.visibility() == AssistantVisibility::kVisible) { // If Assistant window is already visible, we just try to retake focus. container_view_->GetWidget()->Activate(); return; @@ -271,24 +275,24 @@ // necessary due to limitations imposed by retrieving screen context. Once we // have finished retrieving screen context, the Assistant widget is activated. container_view_->GetWidget()->ShowInactive(); - assistant_ui_model_.SetVisibility(AssistantVisibility::kVisible, source); + model_.SetVisibility(AssistantVisibility::kVisible, source); } void AssistantUiController::HideUi(AssistantSource source) { - if (assistant_ui_model_.visibility() == AssistantVisibility::kHidden) + if (model_.visibility() == AssistantVisibility::kHidden) return; if (container_view_) container_view_->GetWidget()->Hide(); - assistant_ui_model_.SetVisibility(AssistantVisibility::kHidden, source); + model_.SetVisibility(AssistantVisibility::kHidden, source); } void AssistantUiController::CloseUi(AssistantSource source) { - if (assistant_ui_model_.visibility() == AssistantVisibility::kClosed) + if (model_.visibility() == AssistantVisibility::kClosed) return; - assistant_ui_model_.SetVisibility(AssistantVisibility::kClosed, source); + model_.SetVisibility(AssistantVisibility::kClosed, source); if (container_view_) { container_view_->GetWidget()->CloseNow(); @@ -298,13 +302,13 @@ void AssistantUiController::ToggleUi(AssistantSource source) { // When not visible, toggling will show the UI. - if (assistant_ui_model_.visibility() != AssistantVisibility::kVisible) { + if (model_.visibility() != AssistantVisibility::kVisible) { ShowUi(source); return; } // When in mini state, toggling will restore the main UI. - if (assistant_ui_model_.ui_mode() == AssistantUiMode::kMiniUi) { + if (model_.ui_mode() == AssistantUiMode::kMiniUi) { UpdateUiMode(AssistantUiMode::kMainUi); return; } @@ -318,7 +322,7 @@ // If a UI mode is provided, we will use it in lieu of updating UI mode on the // basis of interaction/widget visibility state. if (ui_mode.has_value()) { - assistant_ui_model_.SetUiMode(ui_mode.value()); + model_.SetUiMode(ui_mode.value()); return; } @@ -328,9 +332,9 @@ // When stylus input modality is selected, we should be in mini UI mode. // Otherwise we fall back to main UI mode. - assistant_ui_model_.SetUiMode(input_modality == InputModality::kStylus - ? AssistantUiMode::kMiniUi - : AssistantUiMode::kMainUi); + model_.SetUiMode(input_modality == InputModality::kStylus + ? AssistantUiMode::kMiniUi + : AssistantUiMode::kMainUi); } AssistantContainerView* AssistantUiController::GetViewForTest() {
diff --git a/ash/assistant/assistant_ui_controller.h b/ash/assistant/assistant_ui_controller.h index b4919b1d..715ef62 100644 --- a/ash/assistant/assistant_ui_controller.h +++ b/ash/assistant/assistant_ui_controller.h
@@ -57,7 +57,7 @@ void SetAssistant(chromeos::assistant::mojom::Assistant* assistant); // Returns the underlying model. - const AssistantUiModel* model() const { return &assistant_ui_model_; } + const AssistantUiModel* model() const { return &model_; } // Adds/removes the specified model |observer|. void AddModelObserver(AssistantUiModelObserver* observer); @@ -119,7 +119,7 @@ // Owned by AssistantController. chromeos::assistant::mojom::Assistant* assistant_ = nullptr; - AssistantUiModel assistant_ui_model_; + AssistantUiModel model_; AssistantContainerView* container_view_ = nullptr; // Owned by view hierarchy.
diff --git a/ash/assistant/ui/dialog_plate/dialog_plate.cc b/ash/assistant/ui/dialog_plate/dialog_plate.cc index c24ff1af..a697326 100644 --- a/ash/assistant/ui/dialog_plate/dialog_plate.cc +++ b/ash/assistant/ui/dialog_plate/dialog_plate.cc
@@ -100,14 +100,6 @@ return kPreferredHeightDip; } -void DialogPlate::ChildPreferredSizeChanged(views::View* child) { - PreferredSizeChanged(); -} - -void DialogPlate::ChildVisibilityChanged(views::View* child) { - PreferredSizeChanged(); -} - void DialogPlate::ButtonPressed(views::Button* sender, const ui::Event& event) { OnButtonPressed(static_cast<DialogPlateButtonId>(sender->id())); }
diff --git a/ash/assistant/ui/dialog_plate/dialog_plate.h b/ash/assistant/ui/dialog_plate/dialog_plate.h index d58e981a..744aa98 100644 --- a/ash/assistant/ui/dialog_plate/dialog_plate.h +++ b/ash/assistant/ui/dialog_plate/dialog_plate.h
@@ -75,8 +75,6 @@ // views::View: gfx::Size CalculatePreferredSize() const override; int GetHeightForWidth(int width) const override; - void ChildPreferredSizeChanged(views::View* child) override; - void ChildVisibilityChanged(views::View* child) override; void RequestFocus() override; // ButtonListener:
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc index ce609bf..1ab8c63 100644 --- a/ash/assistant/ui/main_stage/assistant_footer_view.cc +++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -67,14 +67,6 @@ return kPreferredHeightDip; } -void AssistantFooterView::ChildPreferredSizeChanged(views::View* child) { - PreferredSizeChanged(); -} - -void AssistantFooterView::ChildVisibilityChanged(views::View* child) { - PreferredSizeChanged(); -} - void AssistantFooterView::InitLayout() { SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.h b/ash/assistant/ui/main_stage/assistant_footer_view.h index e26afb0..0f9604e3 100644 --- a/ash/assistant/ui/main_stage/assistant_footer_view.h +++ b/ash/assistant/ui/main_stage/assistant_footer_view.h
@@ -31,8 +31,6 @@ // views::View: gfx::Size CalculatePreferredSize() const override; int GetHeightForWidth(int width) const override; - void ChildPreferredSizeChanged(views::View* child) override; - void ChildVisibilityChanged(views::View* child) override; // mojom::VoiceInteractionObserver: void OnVoiceInteractionStatusChanged(
diff --git a/ash/assistant/util/deep_link_util.cc b/ash/assistant/util/deep_link_util.cc index 41e17b8b..2457381 100644 --- a/ash/assistant/util/deep_link_util.cc +++ b/ash/assistant/util/deep_link_util.cc
@@ -6,6 +6,7 @@ #include <set> +#include "base/i18n/rtl.h" #include "base/stl_util.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -37,9 +38,9 @@ // TODO(b/113357196): Make these URLs configurable for development purposes. constexpr char kAssistantRemindersWebUrl[] = - "https://assistant.google.com/reminders/mainview"; + "https://assistant.google.com/reminders/mainview?hl="; constexpr char kAssistantSettingsWebUrl[] = - "https://assistant.google.com/settings/mainpage"; + "https://assistant.google.com/settings/mainpage?hl="; } // namespace @@ -141,9 +142,10 @@ switch (type) { case DeepLinkType::kReminders: - return GURL(kAssistantRemindersWebUrl); + return GURL(kAssistantRemindersWebUrl + + base::i18n::GetConfiguredLocale()); case DeepLinkType::kSettings: - return GURL(kAssistantSettingsWebUrl); + return GURL(kAssistantSettingsWebUrl + base::i18n::GetConfiguredLocale()); case DeepLinkType::kUnsupported: case DeepLinkType::kFeedback: case DeepLinkType::kOnboarding:
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom index 203e3de..c4990eb 100644 --- a/ash/public/interfaces/voice_interaction_controller.mojom +++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -44,7 +44,9 @@ // Disallowed because incognito mode. DISALLOWED_BY_INCOGNITO, // Disallowed because the device is in demo mode. - DISALLOWED_BY_DEMO_MODE + DISALLOWED_BY_DEMO_MODE, + // Disallowed because the device is in public session. + DISALLOWED_BY_PUBLIC_SESSION }; // Allows observing changes to voice interaction status and settings.
diff --git a/ash/system/status_area_widget_delegate.cc b/ash/system/status_area_widget_delegate.cc index 405b9b0..dba6fabb 100644 --- a/ash/system/status_area_widget_delegate.cc +++ b/ash/system/status_area_widget_delegate.cc
@@ -29,6 +29,8 @@ constexpr int kPaddingFromEdgeOfShelf = 3; +constexpr int kPaddingBetweenWidgetsNewUi = 8; + class StatusAreaWidgetDelegateAnimationSettings : public ui::ScopedLayerAnimationSettings { public: @@ -194,20 +196,24 @@ void StatusAreaWidgetDelegate::SetBorderOnChild(views::View* child, bool extend_border_to_edge) { - const int padding = (ShelfConstants::shelf_size() - kTrayItemSize) / 2; + const int vertical_padding = + (ShelfConstants::shelf_size() - kTrayItemSize) / 2; // Edges for horizontal alignment (right-to-left, default). - int top_edge = padding; + int top_edge = vertical_padding; int left_edge = 0; - int bottom_edge = padding; + int bottom_edge = vertical_padding; int right_edge = !features::IsSystemTrayUnifiedEnabled() && extend_border_to_edge ? kPaddingFromEdgeOfShelf : 0; // In the new UI, since all corners are rounded, add some extra space so that - // borders don't overlap. - if (chromeos::switches::ShouldUseShelfNewUi()) - right_edge += ShelfConstants::control_border_radius() / 3; + // borders don't overlap. This padding between items also takes care of + // padding at the edge of the shelf. + if (chromeos::switches::ShouldUseShelfNewUi()) { + right_edge = kPaddingBetweenWidgetsNewUi; + left_edge = 0; + } // Swap edges if alignment is not horizontal (bottom-to-top). if (!shelf_->IsHorizontalAlignment()) {
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index 9e9e43b..00c1a47e 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -30,6 +30,7 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_policy_controller.h" #include "chromeos/network/network_handler.h" +#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h" #include "components/prefs/testing_pref_service.h" #include "device/bluetooth/bluetooth_adapter_factory.h" #include "device/bluetooth/dbus/bluez_dbus_manager.h" @@ -39,6 +40,8 @@ #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/identity.h" #include "services/service_manager/public/cpp/service.h" +#include "services/ws/public/cpp/host/gpu_interface_provider.h" +#include "services/ws/public/mojom/gpu.mojom.h" #include "services/ws/window_service.h" #include "ui/aura/env.h" #include "ui/aura/input_state_lookup.h" @@ -65,6 +68,41 @@ namespace ash { +// An implementation of GpuInterfaceProvider that queues up requests for +// interfaces. The requests are never actually bound, but are kept alive to +// ensure the requestor doesn't detect a close and try to exit. +class TestGpuInterfaceProvider : public ws::GpuInterfaceProvider { + public: + TestGpuInterfaceProvider() = default; + ~TestGpuInterfaceProvider() override = default; + + // ws::GpuInterfaceProvider: + void RegisterGpuInterfaces( + service_manager::BinderRegistry* registry) override { + registry->AddInterface(base::BindRepeating( + &TestGpuInterfaceProvider::BindDiscardableSharedMemoryManager, + base::Unretained(this))); + registry->AddInterface(base::BindRepeating( + &TestGpuInterfaceProvider::BindGpuRequest, base::Unretained(this))); + } + void RegisterOzoneGpuInterfaces( + service_manager::BinderRegistry* registry) override {} + + private: + void BindDiscardableSharedMemoryManager( + discardable_memory::mojom::DiscardableSharedMemoryManagerRequest + request) { + request_handles_.push_back(request.PassMessagePipe()); + } + void BindGpuRequest(ws::mojom::GpuRequest request) { + request_handles_.push_back(request.PassMessagePipe()); + } + + std::vector<mojo::ScopedMessagePipeHandle> request_handles_; + + DISALLOW_COPY_AND_ASSIGN(TestGpuInterfaceProvider); +}; + // TODO(sky): refactor and move to services. class TestConnector : public service_manager::mojom::Connector { public: @@ -268,9 +306,8 @@ new TestSessionControllerClient(shell->session_controller())); session_controller_client_->InitializeAndBind(); - if (start_session) { + if (start_session) session_controller_client_->CreatePredefinedUserSessions(1); - } // Tests that change the display configuration generally don't care about // the notifications and the popup UI can interfere with things like @@ -321,6 +358,15 @@ ui::TerminateContextFactoryForTests(); + // ui::TerminateContextFactoryForTests() destroyed the context factory (and + // context factory private) referenced by Env. Reset Env's members in case + // some other test tries to use it. This matters if someone else created Env + // (such as the test suite) and is long lived. + if (aura::Env::HasInstance()) { + aura::Env::GetInstance()->set_context_factory(nullptr); + aura::Env::GetInstance()->set_context_factory_private(nullptr); + } + ui::ShutdownInputMethodForTesting(); zero_duration_mode_.reset(); @@ -392,6 +438,8 @@ init_params.delegate.reset(test_shell_delegate_); init_params.context_factory = context_factory; init_params.context_factory_private = context_factory_private; + init_params.gpu_interface_provider = + std::make_unique<TestGpuInterfaceProvider>(); Shell::CreateInstance(std::move(init_params)); }
diff --git a/ash/wm/workspace/workspace_event_handler.cc b/ash/wm/workspace/workspace_event_handler.cc index 69932ed..1ef7bc0 100644 --- a/ash/wm/workspace/workspace_event_handler.cc +++ b/ash/wm/workspace/workspace_event_handler.cc
@@ -16,12 +16,18 @@ namespace ash { -WorkspaceEventHandler::WorkspaceEventHandler() : click_component_(HTNOWHERE) {} +WorkspaceEventHandler::WorkspaceEventHandler(aura::Window* workspace_window) + : workspace_window_(workspace_window), click_component_(HTNOWHERE) { + // TODO(crbug.com/866529): Convert to AddPreTargetHandler. + wm::AddLimitedPreTargetHandlerForWindow(this, workspace_window_); +} -WorkspaceEventHandler::~WorkspaceEventHandler() = default; +WorkspaceEventHandler::~WorkspaceEventHandler() { + wm::RemoveLimitedPreTargetHandlerForWindow(this, workspace_window_); +} -void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event, - aura::Window* target) { +void WorkspaceEventHandler::OnMouseEvent(ui::MouseEvent* event) { + aura::Window* target = static_cast<aura::Window*>(event->target()); if (event->type() == ui::ET_MOUSE_PRESSED && event->IsOnlyLeftMouseButton() && ((event->flags() & (ui::EF_IS_DOUBLE_CLICK | ui::EF_IS_TRIPLE_CLICK)) == 0)) { @@ -70,11 +76,11 @@ } } -void WorkspaceEventHandler::OnGestureEvent(ui::GestureEvent* event, - aura::Window* target) { +void WorkspaceEventHandler::OnGestureEvent(ui::GestureEvent* event) { if (event->handled() || event->type() != ui::ET_GESTURE_TAP) return; + aura::Window* target = static_cast<aura::Window*>(event->target()); int previous_target_component = click_component_; click_component_ = wm::GetNonClientComponent(target, event->location());
diff --git a/ash/wm/workspace/workspace_event_handler.h b/ash/wm/workspace/workspace_event_handler.h index 5c94d04..dc3018d 100644 --- a/ash/wm/workspace/workspace_event_handler.h +++ b/ash/wm/workspace/workspace_event_handler.h
@@ -8,6 +8,7 @@ #include "ash/ash_export.h" #include "ash/wm/workspace/multi_window_resize_controller.h" #include "base/macros.h" +#include "ui/events/event_handler.h" namespace aura { class Window; @@ -25,17 +26,16 @@ class WindowState; } -// ui::EventHandler like class installed on the window associated with -// WorkspaceLayoutManager. This handles various events happening on child -// windows and takes appropriate action. It is expected the environment specific -// file calls OnMouseEvent()/OnGestureEvent() as appropriate. -class ASH_EXPORT WorkspaceEventHandler { +// Handles events on workspace windows, such as double-click on the resize edge +// to maximize in one dimension. +class ASH_EXPORT WorkspaceEventHandler : public ui::EventHandler { public: - WorkspaceEventHandler(); - virtual ~WorkspaceEventHandler(); + explicit WorkspaceEventHandler(aura::Window* workspace_window); + ~WorkspaceEventHandler() override; - void OnMouseEvent(ui::MouseEvent* event, aura::Window* target); - void OnGestureEvent(ui::GestureEvent* event, aura::Window* target); + // ui::EventHandler: + void OnMouseEvent(ui::MouseEvent* event) override; + void OnGestureEvent(ui::GestureEvent* event) override; private: friend class WorkspaceEventHandlerTestHelper; @@ -47,6 +47,8 @@ void HandleVerticalResizeDoubleClick(wm::WindowState* window_state, ui::MouseEvent* event); + aura::Window* workspace_window_; + MultiWindowResizeController multi_window_resize_controller_; // The non-client component for the target of a MouseEvent or GestureEvent.
diff --git a/ash/wm/workspace/workspace_event_handler_classic.cc b/ash/wm/workspace/workspace_event_handler_classic.cc deleted file mode 100644 index cb5a233..0000000 --- a/ash/wm/workspace/workspace_event_handler_classic.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/wm/workspace/workspace_event_handler_classic.h" - -#include "ash/wm/window_util.h" -#include "ui/aura/window.h" -#include "ui/events/event.h" - -namespace ash { - -WorkspaceEventHandlerClassic::WorkspaceEventHandlerClassic( - aura::Window* workspace_window) - : workspace_window_(workspace_window) { - wm::AddLimitedPreTargetHandlerForWindow(this, workspace_window_); -} - -WorkspaceEventHandlerClassic::~WorkspaceEventHandlerClassic() { - wm::RemoveLimitedPreTargetHandlerForWindow(this, workspace_window_); -} - -void WorkspaceEventHandlerClassic::OnMouseEvent(ui::MouseEvent* event) { - WorkspaceEventHandler::OnMouseEvent( - event, static_cast<aura::Window*>(event->target())); -} - -void WorkspaceEventHandlerClassic::OnGestureEvent(ui::GestureEvent* event) { - WorkspaceEventHandler::OnGestureEvent( - event, static_cast<aura::Window*>(event->target())); -} - -} // namespace ash
diff --git a/ash/wm/workspace/workspace_event_handler_classic.h b/ash/wm/workspace/workspace_event_handler_classic.h deleted file mode 100644 index 9e77d09..0000000 --- a/ash/wm/workspace/workspace_event_handler_classic.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_WM_WORKSPACE_WORKSPACE_EVENT_HANDLER_CLASSIC_H_ -#define ASH_WM_WORKSPACE_WORKSPACE_EVENT_HANDLER_CLASSIC_H_ - -#include "ash/ash_export.h" -#include "ash/wm/workspace/workspace_event_handler.h" -#include "base/macros.h" -#include "ui/events/event_handler.h" - -namespace aura { -class Window; -} - -namespace ash { - -// TODO: fold this back into WorkspaceEventHandler. https://crbug.com/842365 -class ASH_EXPORT WorkspaceEventHandlerClassic : public ui::EventHandler, - public WorkspaceEventHandler { - public: - explicit WorkspaceEventHandlerClassic(aura::Window* workspace_window); - ~WorkspaceEventHandlerClassic() override; - - // ui::EventHandler: - void OnMouseEvent(ui::MouseEvent* event) override; - void OnGestureEvent(ui::GestureEvent* event) override; - - private: - aura::Window* workspace_window_; - - DISALLOW_COPY_AND_ASSIGN(WorkspaceEventHandlerClassic); -}; - -} // namespace ash - -#endif // ASH_WM_WORKSPACE_WORKSPACE_EVENT_HANDLER_CLASSIC_H_
diff --git a/ash/wm/workspace_controller.cc b/ash/wm/workspace_controller.cc index bb72fff6..2a9feda9 100644 --- a/ash/wm/workspace_controller.cc +++ b/ash/wm/workspace_controller.cc
@@ -16,7 +16,7 @@ #include "ash/wm/wm_window_animations.h" #include "ash/wm/workspace/backdrop_controller.h" #include "ash/wm/workspace/backdrop_delegate.h" -#include "ash/wm/workspace/workspace_event_handler_classic.h" +#include "ash/wm/workspace/workspace_event_handler.h" #include "ash/wm/workspace/workspace_layout_manager.h" #include "ui/aura/window.h" #include "ui/compositor/layer.h" @@ -37,7 +37,7 @@ WorkspaceController::WorkspaceController(aura::Window* viewport) : viewport_(viewport), - event_handler_(std::make_unique<WorkspaceEventHandlerClassic>(viewport)), + event_handler_(std::make_unique<WorkspaceEventHandler>(viewport)), layout_manager_(new WorkspaceLayoutManager(viewport)) { viewport_->AddObserver(this); ::wm::SetWindowVisibilityAnimationTransition(viewport_, ::wm::ANIMATE_NONE);
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java index bfa5d5c..765e7eb6 100644 --- a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java +++ b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java
@@ -152,13 +152,15 @@ } } - // Synchronize on this for access. - @GuardedBy("sAllBindingStateCounts") + // Global lock to protect all the fields that can be accessed outside launcher thread. + private static final Object sBindingStateLock = new Object(); + + @GuardedBy("sBindingStateLock") private static final int[] sAllBindingStateCounts = new int[NUM_BINDING_STATES]; @VisibleForTesting static void resetBindingStateCountsForTesting() { - synchronized (sAllBindingStateCounts) { + synchronized (sBindingStateLock) { for (int i = 0; i < NUM_BINDING_STATES; ++i) { sAllBindingStateCounts[i] = 0; } @@ -236,21 +238,19 @@ private boolean mUnbound; // Binding state of this connection. + @GuardedBy("sBindingStateLock") private @ChildBindingState int mBindingState; - // Protects access to instance variables that are also accessed on the client thread. - private final Object mClientThreadLock = new Object(); - // Same as above except it no longer updates after |unbind()|. - @GuardedBy("mClientThreadLock") + @GuardedBy("sBindingStateLock") private @ChildBindingState int mBindingStateCurrentOrWhenDied; // Indicate |kill()| was called to intentionally kill this process. - @GuardedBy("mClientThreadLock") + @GuardedBy("sBindingStateLock") private boolean mKilledByUs; // Copy of |sAllBindingStateCounts| at the time this is unbound. - @GuardedBy("mClientThreadLock") + @GuardedBy("sBindingStateLock") private int[] mAllBindingStateCountsWhenDied; private MemoryPressureCallback mMemoryPressureCallback; @@ -423,7 +423,7 @@ } catch (RemoteException e) { // Intentionally ignore since we are killing it anyway. } - synchronized (mClientThreadLock) { + synchronized (sBindingStateLock) { mKilledByUs = true; } notifyChildProcessDied(); @@ -572,12 +572,9 @@ mModerateBinding.unbind(); updateBindingState(); - int[] bindingStateCounts; - synchronized (sAllBindingStateCounts) { - bindingStateCounts = Arrays.copyOf(sAllBindingStateCounts, NUM_BINDING_STATES); - } - synchronized (mClientThreadLock) { - mAllBindingStateCountsWhenDied = bindingStateCounts; + synchronized (sBindingStateLock) { + mAllBindingStateCountsWhenDied = + Arrays.copyOf(sAllBindingStateCounts, NUM_BINDING_STATES); } if (mMemoryPressureCallback != null) { @@ -659,7 +656,7 @@ // WARNING: this method can be called from a thread other than the launcher thread. // Note that it returns the current waived bound only state and is racy. This not really // preventable without changing the caller's API, short of blocking. - synchronized (mClientThreadLock) { + synchronized (sBindingStateLock) { return mBindingStateCurrentOrWhenDied; } } @@ -671,53 +668,62 @@ // WARNING: this method can be called from a thread other than the launcher thread. // Note that it returns the current waived bound only state and is racy. This not really // preventable without changing the caller's API, short of blocking. - synchronized (mClientThreadLock) { + synchronized (sBindingStateLock) { return mKilledByUs; } } - public int[] bindingStateCountsCurrentOrWhenDied() { + /** + * Returns the binding state of remaining processes, excluding the current connection. + * + * If the current process is dead then returns the binding state of all processes when it died. + * Otherwise returns current state. + */ + public int[] remainingBindingStateCountsCurrentOrWhenDied() { // WARNING: this method can be called from a thread other than the launcher thread. // Note that it returns the current waived bound only state and is racy. This not really // preventable without changing the caller's API, short of blocking. - synchronized (mClientThreadLock) { + synchronized (sBindingStateLock) { if (mAllBindingStateCountsWhenDied != null) { return Arrays.copyOf(mAllBindingStateCountsWhenDied, NUM_BINDING_STATES); } - } - synchronized (sAllBindingStateCounts) { - return Arrays.copyOf(sAllBindingStateCounts, NUM_BINDING_STATES); + + int[] counts = Arrays.copyOf(sAllBindingStateCounts, NUM_BINDING_STATES); + // If current process is still bound then remove it from the counts. + if (mBindingState != ChildBindingState.UNBOUND) { + assert counts[mBindingState] > 0; + counts[mBindingState]--; + } + return counts; } } // Should be called any binding is bound or unbound. private void updateBindingState() { - int oldBindingState = mBindingState; + int newBindingState; if (mUnbound) { - mBindingState = ChildBindingState.UNBOUND; + newBindingState = ChildBindingState.UNBOUND; } else if (mStrongBinding.isBound()) { - mBindingState = ChildBindingState.STRONG; + newBindingState = ChildBindingState.STRONG; } else if (mModerateBinding.isBound()) { - mBindingState = ChildBindingState.MODERATE; + newBindingState = ChildBindingState.MODERATE; } else { assert mWaivedBinding.isBound(); - mBindingState = ChildBindingState.WAIVED; + newBindingState = ChildBindingState.WAIVED; } - if (mBindingState != oldBindingState) { - synchronized (sAllBindingStateCounts) { - if (oldBindingState != ChildBindingState.UNBOUND) { - assert sAllBindingStateCounts[oldBindingState] > 0; - sAllBindingStateCounts[oldBindingState]--; - } + synchronized (sBindingStateLock) { + if (newBindingState != mBindingState) { if (mBindingState != ChildBindingState.UNBOUND) { - sAllBindingStateCounts[mBindingState]++; + assert sAllBindingStateCounts[mBindingState] > 0; + sAllBindingStateCounts[mBindingState]--; + } + if (newBindingState != ChildBindingState.UNBOUND) { + sAllBindingStateCounts[newBindingState]++; } } - } - - if (!mUnbound) { - synchronized (mClientThreadLock) { + mBindingState = newBindingState; + if (!mUnbound) { mBindingStateCurrentOrWhenDied = mBindingState; } }
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java index 95474ea..a12d50d 100644 --- a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java +++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
@@ -368,19 +368,19 @@ mFirstServiceConnection = null; assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 0, 0}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 0, 0}); connection0.start(false /* useStrongBinding */, null /* serviceCallback */); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 0}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 0, 0}); connection1.start(true /* useStrongBinding */, null /* serviceCallback */); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 0, 1}); connection2.start(false /* useStrongBinding */, null /* serviceCallback */); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 2, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); Binder binder0 = new Binder(); Binder binder1 = new Binder(); @@ -396,30 +396,30 @@ // Add and remove moderate binding works as expected. connection2.removeModerateBinding(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 1, 1, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 1, 0, 1}); connection2.addModerateBinding(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 2, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); // Add and remove strong binding works as expected. connection0.addStrongBinding(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 2}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); connection0.removeStrongBinding(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 2, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); // Stopped connection should no longe update. connection0.stop(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); assertArrayEquals( - connection1.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); + connection1.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 0}); connection2.removeModerateBinding(); assertArrayEquals( - connection0.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); + connection0.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 0, 1, 1}); assertArrayEquals( - connection1.bindingStateCountsCurrentOrWhenDied(), new int[] {0, 1, 0, 1}); + connection1.remainingBindingStateCountsCurrentOrWhenDied(), new int[] {0, 1, 0, 0}); } }
diff --git a/base/win/win_util.cc b/base/win/win_util.cc index 7f9cc50a..4628713 100644 --- a/base/win/win_util.cc +++ b/base/win/win_util.cc
@@ -121,6 +121,29 @@ return false; } +// Enable V2 per-monitor high-DPI support for the process. This will cause +// Windows to scale dialogs, comctl32 controls, context menus, and non-client +// area owned by this process on a per-monitor basis. If per-monitor V2 is not +// available (i.e., prior to Windows 10 1703) or fails, returns false. +// https://docs.microsoft.com/en-us/windows/desktop/hidpi/dpi-awareness-context +bool EnablePerMonitorV2() { + decltype( + &::SetProcessDpiAwarenessContext) set_process_dpi_awareness_context_func = + reinterpret_cast<decltype(&::SetProcessDpiAwarenessContext)>( + ::GetProcAddress(::GetModuleHandle(L"user32.dll"), + "SetProcessDpiAwarenessContext")); + if (set_process_dpi_awareness_context_func) { + return set_process_dpi_awareness_context_func( + DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + + DCHECK_LT(GetVersion(), VERSION_WIN10_RS2) + << "SetProcessDpiAwarenessContext should be available on all platforms" + " >= Windows 10 Redstone 2"; + + return false; +} + bool* GetDomainEnrollmentStateStorage() { static bool state = IsOS(OS_DOMAINMEMBER); return &state; @@ -685,9 +708,13 @@ } void EnableHighDPISupport() { - // Enable per-monitor DPI for Win10 or above instead of Win8.1 since Win8.1 - // does not have EnableChildWindowDpiMessage, necessary for correct non-client - // area scaling across monitors. + // Enable per-monitor V2 if it is available (Win10 1703 or later). + if (EnablePerMonitorV2()) + return; + + // Fall back to per-monitor DPI for older versions of Win10 instead of Win8.1 + // since Win8.1 does not have EnableChildWindowDpiMessage, necessary for + // correct non-client area scaling across monitors. PROCESS_DPI_AWARENESS process_dpi_awareness = GetVersion() >= VERSION_WIN10 ? PROCESS_PER_MONITOR_DPI_AWARE : PROCESS_SYSTEM_DPI_AWARE;
diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000..47e059db --- /dev/null +++ b/build/README.md
@@ -0,0 +1,30 @@ +# About +`//build` contains: + * Core GN templates and configuration + * Core Python build scripts + +Since this directory is DEPS'ed in by some other repositories (webrtc, pdfium, +v8, etc), it should be kept as self-contained as possible by not referring +to files outside of it. Some exceptions exist (`//testing`, select +`//third_party` subdirectories), but new dependencies tend to break these other +projects, and so should be avoided. + +## Contents + * `//build/config` - Common templates via `.gni` files. + * `//build/toolchain` - GN toolchain definitions. + * `Other .py files` - Some are used by GN/Ninja. Some by gclient hooks, some + are just random utilities. + +Files referenced by `//.gn`: + * `//build/BUILDCONFIG.gn` - Included by all `BUILD.gn` files. + * `//build/secondary` - An overlay for `BUILD.gn` files. Enables adding + `BUILD.gn` to directories that live in sub-repositories. + * `//build_overrides` - + Refer to [//build_overrides/README.md](../build_overrides/README.md). + +## Docs + +* [Writing GN Templates](docs/writing_gn_templates.md) +* [Debugging Slow Builds](docs/debugging_slow_builds.md) +* [Mac Hermetic Toolchains](docs/mac_hermetic_toolchain.md) +* [Android Build Documentation](android/docs)
diff --git a/build/config/fuchsia/testing_sandbox_policy b/build/config/fuchsia/testing_sandbox_policy index e3a67a08..8dbc3eae 100644 --- a/build/config/fuchsia/testing_sandbox_policy +++ b/build/config/fuchsia/testing_sandbox_policy
@@ -3,7 +3,7 @@ "vulkan" ], "dev": ["null", "zero"], "services": [ - "fuchsia.fonts.FontProvider", + "fuchsia.fonts.Provider", "fuchsia.media.Audio", "fuchsia.net.LegacySocketProvider", "fuchsia.netstack.Netstack",
diff --git a/build/docs/debugging_slow_builds.md b/build/docs/debugging_slow_builds.md new file mode 100644 index 0000000..315690c --- /dev/null +++ b/build/docs/debugging_slow_builds.md
@@ -0,0 +1,19 @@ +# Debugging slow builds + +Some tips for debugging slow build times: +* Use [ninjatracing](https://github.com/nico/ninjatracing) and chrome:tracing to + view a timeline of the most recent build. + * Many bots output a build trace (look for a `"ninja_log"` link). +* Use `gn gen --tracelog trace.json` to create a similar trace for `gn gen`. +* Depot Tool's `autoninja` has logic for summarizing slow steps. Enable it via: + * `NINJA_SUMMARIZE_BUILD=1 autoninja -C out/Debug my_target` +* Many Android templates make use of + [`md5_check.py`](https://cs.chromium.org/chromium/src/build/android/gyp/util/md5_check.py) + to optimize incremental builds. + * Set `PRINT_BUILD_EXPLANATIONS=1` to have these commands log which inputs + changed. +* If you suspect files are being rebuilt unnecessarily during incremental + builds: + * Use `ninja -n -d explain` to figure out why ninja thinks a target is dirty. + * Ensure actions are taking advantage of ninja's `restat=1` feature by not + updating timestamps on outputs when their content does not change.
diff --git a/build/docs/writing_gn_templates.md b/build/docs/writing_gn_templates.md new file mode 100644 index 0000000..95ffadff --- /dev/null +++ b/build/docs/writing_gn_templates.md
@@ -0,0 +1,226 @@ +# Writing GN Templates +GN and Ninja are documented here: +* GN: https://gn.googlesource.com/gn/+/master/docs/ +* Ninja: https://ninja-build.org/manual.html + +[TOC] + +## Things to Consider When Writing Templates +### Inputs and Depfiles +* List all files read (or executed) by an action as `inputs`. + * It is [not enough](https://chromium-review.googlesource.com/c/chromium/src/+/1090231) + to have inputs listed by dependent targets. They must be listed directly by targets that use them. + * Non-system Python imports are inputs! For scripts that import such modules, + use [`action_with_pydeps`](https://cs.chromium.org/chromium/src/build/config/python.gni?rcl=320ee4295eb7fabaa112f08d1aacc88efd1444e5&l=75) + to ensure all dependent Python files are captured as inputs. +* For action inputs that are not computable during "gn gen", actions can write + depfiles (.d files) to add additional input files as dependencies for + subsequent builds. They are relevant only for incremental builds. + * Depfiles should not list files that GN already lists as `inputs`. + * Besides being redundant, listing them also makes it harder to remove + inputs, since removing them from GN does not immediately remove them from + depfiles. + * Stale paths in depfiles can cause ninja to complain of circular + dependencies [in some cases](https://bugs.chromium.org/p/chromium/issues/detail?id=639042). + +### Ensuring "gn analyze" Knows About your Inputs +"gn analyze" is used by bots to run only affected tests and build only affected +targets. Try it out locally via: +```bash +echo "compute_inputs_for_analyze = true" >> out/Debug/args.gn +gn analyze //out/Debug <(echo '{ + "files": ["//BUILD.gn"], + "test_targets": ["//base"], + "additional_compile_targets":[]}') result.txt; cat result.txt +``` +* For analyze to work properly, GN must know about all inputs. +* Inputs added by depfiles are *not available* to "gn analyze". + * When paths listed in a target's depfile are listed as `inputs` to a + dependent target, analyze will be correct. + * Example: An `AndroidManifest.xml` file is an input to an + `android_library()` and is included in an `android_apk()`'s depfile. + `gn analyze` will know that a change to the file will require the APK + to be rebuilt, because the file is marked as an input to the library, and + the library is a dep of the APK. + * When paths listed in a target's depfile are *not* listed as `inputs` to a + dependent target, a few options exist: + * Rather than putting the inputs in a depfile, force users of your template + to list them, and then have your action re-compute them and assert that + they were correct. + * `jinja_template()` does this. + * Rather than putting the inputs in a depfile, compute them beforehand and + save them to a text file. Have your template Use `read_file()` to read + them in. + * `action_with_pydeps()` does this. + * Continue using a depfile, but use an `exec_script()` to compute them when + [`compute_inputs_for_analyze`](https://cs.chromium.org/chromium/src/build/config/compute_inputs_for_analyze.gni) + is set. + * `grit()` does this. + +### Outputs +Do not list files as `outputs` unless they are important. Outputs are important +if they are: + * used as an input by another target, or + * are leaves in the dependency graph (e.g. binaries, apks, etc). + +Example: +* An action runs a binary that creates an output as well as a log file. Do not + list the log file as an output. + +## Best Practices for Python Actions +Outputs should be atomic and take advantage of `restat=1`. +* Make outputs atomic by writing to temporary files and then moving them to + their final location. + * Rationale: An interrupted write can leave a file with an updated timestamp + and corrupt contents. Ninja looks only at timestamps. +* Do not overwrite an existing output with identical contents. + * Rationale: `restat=1` is a ninja feature enabled for all actions that + short-circuits a build when output timestamps do not change. This feature is + the reason that the total number of build steps sometimes decreases when + building.. +* Use [`build_utils.AtomicOutput()`](https://cs.chromium.org/chromium/src/build/android/gyp/util/build_utils.py?rcl=7d6ba28e92bec865a7b7876c35b4621d56fb37d8&l=128) + to perform both of these techniques. + +Actions should be deterministic in order to avoid hard-to-reproduce bugs. +Given identical inputs, they should produce byte-for-byte identical outputs. +* Some common mistakes: + * Depending on filesystem iteration order. + * Writing timestamps in files (or in zip entries). + * Writing absolute paths in outputs. + +## Style Guide +Chromium GN files follow +[GN's Style Guide](https://gn.googlesource.com/gn/+/master/docs/style_guide.md) +with a few additions. + +### Action Granularity + * Prefer writing new Python scripts that do what you want over + composing multiple separate actions within a template. + * Fewer targets makes for a simpler build graph. + * GN logic and build logic winds up much simpler. + +Bad: +```python +template("generate_zipped_sources") { + generate_files("${target_name}__gen") { + ... + outputs = [ "$target_gen_dir/$target_name.temp" ] + } + zip(target_name) { + deps = [ ":${target_name}__gen" ] + inputs = [ "$target_gen_dir/$target_name.temp" ] + outputs = [ invoker.output_zip ] + } +} +``` + +Good: +```python +template("generate_zipped_sources") { + action(target_name) { + script = "generate_and_zip.py" + ... + outputs = [ invoker.output_zip ] + } +} +``` + +### Naming for Intermediate Targets +Targets that are not relevant to users of your template should be named as: +`${target_name}__$something`. + +Example: +```python +template("my_template") { + action("${target_name}__helper") { + ... + } + action(target_name) { + deps = [ ":${target_name}__helper" ] + ... + } +} +``` + +### Variables +Prefix variables within templates and targets with an underscore. For example: + +```python +template("example") { + _outer_sources = invoker.extra_sources + + source_set(target_name) { + _inner_sources = invoker.sources + sources = _outer_sources + _inner_sources + } +} +``` + +This convention conveys that `sources` is relevant to `source_set`, while +`_outer_sources` and `_inner_sources` are not. + +### Passing Arguments to Targets +Pass arguments to targets by assigning them directly within target definitions. + +When a GN template goes to resolve `invoker.FOO`, GN will look in all enclosing +scopes of the target's definition. It is hard to figure out where `invoker.FOO` +is coming from when it is not assigned directly within the target definition. + +Bad: +```python +template("hello") { + script = "..." + action(target_name) { + # This action will see "script" from the enclosing scope. + } +} +``` + +Good: +```python +template("hello") { + action(target_name) { + script = "..." # This is equivalent, but much more clear. + } +} +``` + +**Exception:** `testonly` and `visibility` can be set in the outer scope so that +they are implicitly passed to all targets within a template. + +This is okay: +```python +template("hello") { + testonly = true # Applies to all nested targets. + action(target_name) { + script = "..." + } +} +``` + +### Using forward_variables_from() +Using `forward_variables_from()` is encouraged, but `testonly` and `visibility` +should always be listed explicitly in case they are assigned in an enclosing +scope (applies to the `"*"` variant of `forward_variables_from()`). +See [this bug](https://bugs.chromium.org/p/chromium/issues/detail?id=862232) +for more context. + +```python +template("action_wrapper") { + action(target_name) { + forward_variables_from(invoker, "*", [ "testonly", "visibility" ]) + forward_variables_from(invoker, [ "testonly", "visibility" ]) + ... + } +} +``` + +## Useful Ninja Flags +Useful ninja flags when developing build rules: +* `ninja -v` - log the full command-line of every target. +* `ninja -v -n` - log the full command-line of every target without having + to wait for a build. +* `ninja -w dupbuild=err` - fail if multiple targets have the same output. +* `ninja -d keeprsp` - prevent ninja from deleting response files. +* `ninja -n -d explain` - print why ninja thinks a target is dirty. +* `ninja -j1` - execute only one command at a time.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 2cc6489..6ead596a 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -71a461e9bc9c9f5c9a24d9f580cc0ea7dcfda1c0 \ No newline at end of file +5e8bc2ea95f5f87583674d5f6ee8fa0241790f47 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 87b90bff..96d2934d 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8be776b3c2a222010e7a7dec81257dcbb11470a4 \ No newline at end of file +f50929bddbf4b5cd2ea0f1ec1ae1bc93b78d11ac \ No newline at end of file
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 9ce96c1d..817ee9d3 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -736,6 +736,11 @@ MathUtil::AddToTracedValue("position", position_, state); + state->SetInteger("transform_tree_index", transform_tree_index()); + state->SetInteger("clip_tree_index", clip_tree_index()); + state->SetInteger("effect_tree_index", effect_tree_index()); + state->SetInteger("scroll_tree_index", scroll_tree_index()); + state->SetInteger("draws_content", DrawsContent()); state->SetInteger("gpu_memory_usage", base::saturated_cast<int>(GPUMemoryUsageInBytes()));
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc index 499b95b7..0b2784b 100644 --- a/cc/layers/texture_layer.cc +++ b/cc/layers/texture_layer.cc
@@ -18,21 +18,13 @@ namespace cc { -const int TextureLayer::kMaxResourcesWaitingDefault; -const int TextureLayer::kMaxResourcesWaitingCanvasWebGL; - scoped_refptr<TextureLayer> TextureLayer::CreateForMailbox( - TextureLayerClient* client, - int max_resources_waiting) { - return scoped_refptr<TextureLayer>( - new TextureLayer(client, max_resources_waiting)); + TextureLayerClient* client) { + return scoped_refptr<TextureLayer>(new TextureLayer(client)); } -TextureLayer::TextureLayer(TextureLayerClient* client, - int max_resources_waiting) - : client_(client), - max_resources_waiting_(max_resources_waiting), - weak_ptr_factory_(this) {} +TextureLayer::TextureLayer(TextureLayerClient* client) + : client_(client), weak_ptr_factory_(this) {} TextureLayer::~TextureLayer() = default; @@ -116,29 +108,6 @@ resource != holder_ref_->holder()->resource()); DCHECK_EQ(resource.mailbox_holder.mailbox.IsZero(), !release_callback); - if (release_callback && max_resources_waiting_) { - if (!layer_tree_host()->IsSingleThreaded()) { - // In certain test scenarios we have a single threaded compositor where - // compositing is forced and we may ignore commit deferral. Don't DCHECK - // in these cases. - DCHECK_LT(resources_waiting_for_release_, max_resources_waiting_); - } - ++resources_waiting_for_release_; - if (resources_waiting_for_release_ == max_resources_waiting_) { - // Add backpressure by blocking RAF until the GPU process returns our - // resources. This prevents us from queuing up too WebGL frames at once. - // If too many frames are queued latency suffers and the GPU scheduler - // might decide to execute two WebGL frames in one browser frame, causing - // a framerate hiccup. http://crbug.com/835353 - DCHECK(!defer_commits_); - defer_commits_ = layer_tree_host()->DeferCommits(); - } - // Wrap the release callback to decrement the counter and restore RAF. - release_callback = viz::SingleReleaseCallback::Create(base::BindOnce( - &TextureLayer::ReleaseAndUpdateWaiting, weak_ptr_factory_.GetWeakPtr(), - std::move(release_callback))); - } - // If we never commited the mailbox, we need to release it here. if (!resource.mailbox_holder.mailbox.IsZero()) { holder_ref_ = TransferableResourceHolder::Create( @@ -177,12 +146,6 @@ return; } - // If we previously took a DeferCommits, reset it here before we lose the - // reference to this LayerTreeHost, and set it on the new LayerTreeHost. - if (defer_commits_) { - defer_commits_.reset(); - } - // If we're removed from the tree, the TextureLayerImpl will be destroyed, and // we will need to set the mailbox again on a new TextureLayerImpl the next // time we push. @@ -200,12 +163,6 @@ std::make_move_iterator(registered_bitmaps_.begin()), std::make_move_iterator(registered_bitmaps_.end())); registered_bitmaps_.clear(); - - // If we need to throttle RAF for backpressure, defer commits on the new - // LayerTreeHost. - if (max_resources_waiting_ && - resources_waiting_for_release_ >= max_resources_waiting_) - defer_commits_ = host->DeferCommits(); } Layer::SetLayerTreeHost(host); } @@ -421,23 +378,4 @@ base::Bind(&TransferableResourceHolder::InternalRelease, this)); } -// We must take a weak_ptr here (rather than making this a non-static member -// fn) as the |original_callback| must always be run, whether or not -// TextureLayer is still alive. -void TextureLayer::ReleaseAndUpdateWaiting( - base::WeakPtr<TextureLayer> weak_texture_layer, - std::unique_ptr<viz::SingleReleaseCallback> original_callback, - const gpu::SyncToken& sync_token, - bool is_lost) { - if (auto* texture_layer = weak_texture_layer.get()) { - DCHECK_GT(texture_layer->resources_waiting_for_release_, 0); - --texture_layer->resources_waiting_for_release_; - if (texture_layer->resources_waiting_for_release_ < - texture_layer->max_resources_waiting_) { - texture_layer->defer_commits_.reset(); - } - } - original_callback->Run(sync_token, is_lost); -} - } // namespace cc
diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h index e063818..b5d59931 100644 --- a/cc/layers/texture_layer.h +++ b/cc/layers/texture_layer.h
@@ -7,7 +7,6 @@ #include <string> -#include "build/build_config.h" #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -28,7 +27,6 @@ } namespace cc { -class ScopedDeferCommits; class SingleReleaseCallback; class TextureLayer; class TextureLayerClient; @@ -107,29 +105,9 @@ DISALLOW_COPY_AND_ASSIGN(TransferableResourceHolder); }; - // By default, don't throttle RAF. 0 disables throttling. - static const int kMaxResourcesWaitingDefault = 0; -#if !defined(OS_ANDROID) - // On some platforms (Mac), we don't control the texture return flow, as a - // component like CoreAnimation does not provide a clear contract as to how - // long it will hold our resources. For now, disable throttling on all - // platforms other than Android where we control the resource return flow. - static const int kMaxResourcesWaitingCanvasWebGL = - kMaxResourcesWaitingDefault; -#else - // For Canvas or WebGL, we limit to two outstanding resources on Android. - static const int kMaxResourcesWaitingCanvasWebGL = 2; -#endif - // Used when mailbox names are specified instead of texture IDs. - // |max_resources_waiting| specifies the number of outstanding resources that - // can be outstanding for a texture layer before we block commits to stop the - // flow of new resources. By default, this is set to 0, which allows - // unlimited resources. For WebGL and Canvas we use 2, which provides some - // backpressure in these cases. static scoped_refptr<TextureLayer> CreateForMailbox( - TextureLayerClient* client, - int max_resources_waiting = kMaxResourcesWaitingDefault); + TextureLayerClient* client); // Resets the client, which also resets the texture. void ClearClient(); @@ -190,7 +168,7 @@ scoped_refptr<CrossThreadSharedBitmap> bitmap) override; protected: - TextureLayer(TextureLayerClient* client, int max_resources_waiting); + explicit TextureLayer(TextureLayerClient* client); ~TextureLayer() override; bool HasDrawableContent() const override; @@ -206,15 +184,6 @@ // compositor. void UnregisterSharedBitmapId(viz::SharedBitmapId id); - // Helper function which wraps an existing release callback and also - // decrements our |resources_waiting_for_release_|, un-deferring commits if - // we drop below |max_resources_waiting_|. - static void ReleaseAndUpdateWaiting( - base::WeakPtr<TextureLayer> weak_texture_layer, - std::unique_ptr<viz::SingleReleaseCallback> original_callback, - const gpu::SyncToken& sync_token, - bool is_lost); - TextureLayerClient* client_; bool flipped_ = true; @@ -228,8 +197,6 @@ std::unique_ptr<TransferableResourceHolder::MainThreadReference> holder_ref_; bool needs_set_resource_ = false; - int resources_waiting_for_release_ = 0; - const int max_resources_waiting_ = 0; // The set of SharedBitmapIds to register with the LayerTreeFrameSink on the // compositor thread. These requests are forwarded to the TextureLayerImpl to @@ -246,8 +213,6 @@ // The SharedBitmapIds to unregister on the compositor thread, passed to the // TextureLayerImpl. std::vector<viz::SharedBitmapId> to_unregister_bitmap_ids_; - // To add backpressure to RAF, TextureLayer may take a ScopedDeferCommits. - std::unique_ptr<ScopedDeferCommits> defer_commits_; base::WeakPtrFactory<TextureLayer> weak_ptr_factory_;
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index c48a588..88b1b63 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc
@@ -304,103 +304,6 @@ } } -TEST_F(TextureLayerTest, MaxResourcesWaitingEnforced) { - // Specify that when two or more resources are waiting, DeferCommits should - // be called to delay RAF. - auto test_layer = TextureLayer::CreateForMailbox( - nullptr, 2 /* max_resources_waiting */); - layer_tree_host_->SetRootLayer(test_layer); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - EXPECT_SET_NEEDS_COMMIT( - 1, test_layer->SetTransferableResource( - test_data_.resource1_, - viz::SingleReleaseCallback::Create(base::DoNothing()))); - // Prevent resource1_ from being released by holding it in a second layer. - auto holder_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); - test_layer->PushPropertiesTo(holder_layer.get()); - // Only one resource is waiting, we should not be deferring commits yet. - EXPECT_FALSE(layer_tree_host_->defer_commits()); - EXPECT_SET_NEEDS_COMMIT( - 1, test_layer->SetTransferableResource( - test_data_.resource2_, - viz::SingleReleaseCallback::Create(base::DoNothing()))); - // Now two resources are waiting. We should defer commits. - EXPECT_TRUE(layer_tree_host_->defer_commits()); - // Make sure that all callbacks have been run and verify again. - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(layer_tree_host_->defer_commits()); - // Release resource1_. - holder_layer->SetTransferableResource(viz::TransferableResource(), nullptr); - base::RunLoop().RunUntilIdle(); - // Now there is only one resource waiting and callbacks have run, we should no - // longer be deferring commits. - EXPECT_FALSE(layer_tree_host_->defer_commits()); - - // Release the resource from test_layer and give callback a chance to run - // before exiting. - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransferableResource( - viz::TransferableResource(), nullptr)); -} - -TEST_F(TextureLayerTest, MaxResourcesWaitingSwitchLayerTreeHost) { - // Specify that when two or more resources are waiting, DeferCommits should - // be called to delay RAF. - auto test_layer = TextureLayer::CreateForMailbox( - nullptr, 2 /* max_resources_waiting */); - layer_tree_host_->SetRootLayer(test_layer); - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); - - EXPECT_SET_NEEDS_COMMIT( - 1, test_layer->SetTransferableResource( - test_data_.resource1_, - viz::SingleReleaseCallback::Create(base::DoNothing()))); - // Prevent resource1_ from being released by holding it in a second layer. - auto holder_layer = TextureLayerImpl::Create(host_impl_.active_tree(), 1); - test_layer->PushPropertiesTo(holder_layer.get()); - // Only one resource is waiting, we should not be deferring commits yet. - EXPECT_FALSE(layer_tree_host_->defer_commits()); - EXPECT_SET_NEEDS_COMMIT( - 1, test_layer->SetTransferableResource( - test_data_.resource2_, - viz::SingleReleaseCallback::Create(base::DoNothing()))); - // Now two resources are waiting. We should defer commits. - EXPECT_TRUE(layer_tree_host_->defer_commits()); - // Make sure that all callbacks have been run and verify again. - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(layer_tree_host_->defer_commits()); - - // Switch layer tree hosts. Defer commits should transfer from one host to - // another. - // First remove the layer from our current host. - EXPECT_SET_NEEDS_COMMIT(1, layer_tree_host_->SetRootLayer(nullptr)); - // It should no longer defer commits. - EXPECT_FALSE(layer_tree_host_->defer_commits()); - // Next create a new host. - auto layer_tree_host_2 = MockLayerTreeHost::Create( - &fake_client_, &task_graph_runner_, animation_host_.get()); - // It should not yet be deferring commits. - EXPECT_FALSE(layer_tree_host_2->defer_commits()); - // Next, add the layer to our new |layer_tree_host_2| - EXPECT_CALL(*layer_tree_host_2, SetNeedsCommit()); - layer_tree_host_2->SetRootLayer(test_layer); - Mock::VerifyAndClearExpectations(layer_tree_host_2.get()); - // |layer_tree_host_2| should now defer commits. - EXPECT_TRUE(layer_tree_host_2->defer_commits()); - // Release resource1_. - holder_layer->SetTransferableResource(viz::TransferableResource(), nullptr); - base::RunLoop().RunUntilIdle(); - // Now there is only one resource waiting and callbacks have run, we should no - // longer be deferring commits. - EXPECT_FALSE(layer_tree_host_2->defer_commits()); - - // Release the resource from test_layer and give callback a chance to run - // before exiting. - EXPECT_CALL(*layer_tree_host_2, SetNeedsCommit()); - test_layer->SetTransferableResource(viz::TransferableResource(), nullptr); - Mock::VerifyAndClearExpectations(layer_tree_host_2.get()); -} - class TestMailboxHolder : public TextureLayer::TransferableResourceHolder { public: using TextureLayer::TransferableResourceHolder::Create;
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 5de0fbaa..327e907 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -1123,6 +1123,9 @@ if (active_tree_needs_first_draw_) return true; + if (!needs_redraw_) + return false; + // This is used to prioritize impl-thread draws when the main thread isn't // producing anything, e.g., after an aborted commit. We also check that we // don't have a pending tree -- otherwise we should give it a chance to @@ -1132,7 +1135,7 @@ return true; // Prioritize impl-thread draws in ImplLatencyTakesPriority mode. - if (needs_redraw_ && ImplLatencyTakesPriority()) + if (ImplLatencyTakesPriority()) return true; return false;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index acd7b0c3..aa742f8 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -2649,27 +2649,5 @@ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::Action::ACTIVATE_SYNC_TREE); } -TEST(SchedulerStateMachineTest, EarlyDeadlineAfterAbortedMainFrame) { - SchedulerSettings settings; - StateMachine state(settings); - - SET_UP_STATE(state); - state.SetNeedsRedraw(false); - state.SetNeedsBeginMainFrame(); - state.IssueNextBeginImplFrame(); - - // Use a late deadline after sending main frame and no impl side draw. - EXPECT_ACTION_UPDATE_STATE( - SchedulerStateMachine::Action::SEND_BEGIN_MAIN_FRAME); - EXPECT_EQ(state.CurrentBeginImplFrameDeadlineMode(), - SchedulerStateMachine::BeginImplFrameDeadlineMode::LATE); - - // Use an immediate deadline after aborting main frame and no impl side draw. - state.NotifyBeginMainFrameStarted(); - state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); - EXPECT_EQ(state.CurrentBeginImplFrameDeadlineMode(), - SchedulerStateMachine::BeginImplFrameDeadlineMode::IMMEDIATE); -} - } // namespace } // namespace cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index e45ba10..b232488 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -372,6 +372,27 @@ micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); property_trees_.ResetAllChangeTracking(); + + // Dump property trees and layers if run with: + // --vmodule=layer_tree_host=3 + if (VLOG_IS_ON(3)) { + VLOG(3) << "After finishing commit on impl, the sync tree:"; + // Because the property tree and layer list output can be verbose, the VLOG + // output is split by line to avoid line buffer limits on android. + VLOG(3) << "property trees:"; + std::string property_trees; + base::JSONWriter::WriteWithOptions( + *sync_tree->property_trees()->AsTracedValue()->ToBaseValue(), + base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + std::stringstream property_trees_stream(property_trees); + for (std::string line; std::getline(property_trees_stream, line);) + VLOG(3) << line; + + VLOG(3) << "layers:"; + std::stringstream layers_stream(host_impl->LayerListAsJson()); + for (std::string line; std::getline(layers_stream, line);) + VLOG(3) << line; + } } void LayerTreeHost::ImageDecodesFinished( @@ -751,75 +772,75 @@ TRACE_EVENT_INSTANT1("cc", "LayerTreeHost::UpdateLayers_BuiltPropertyTrees", TRACE_EVENT_SCOPE_THREAD, "property_trees", property_trees_.AsTracedValue()); - } else { - TRACE_EVENT_INSTANT1("cc", - "LayerTreeHost::UpdateLayers_ReceivedPropertyTrees", - TRACE_EVENT_SCOPE_THREAD, "property_trees", - property_trees_.AsTracedValue()); - // The HUD layer is managed outside the layer list sent to LayerTreeHost - // and needs to have its property tree state set. - if (hud_layer_ && root_layer_.get()) { - hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); - hud_layer_->SetEffectTreeIndex(root_layer_->effect_tree_index()); - hud_layer_->SetClipTreeIndex(root_layer_->clip_tree_index()); - hud_layer_->SetScrollTreeIndex(root_layer_->scroll_tree_index()); - hud_layer_->set_property_tree_sequence_number( - root_layer_->property_tree_sequence_number()); - } + } else { + TRACE_EVENT_INSTANT1("cc", + "LayerTreeHost::UpdateLayers_ReceivedPropertyTrees", + TRACE_EVENT_SCOPE_THREAD, "property_trees", + property_trees_.AsTracedValue()); + // The HUD layer is managed outside the layer list sent to LayerTreeHost + // and needs to have its property tree state set. + if (hud_layer_ && root_layer_.get()) { + hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); + hud_layer_->SetEffectTreeIndex(root_layer_->effect_tree_index()); + hud_layer_->SetClipTreeIndex(root_layer_->clip_tree_index()); + hud_layer_->SetScrollTreeIndex(root_layer_->scroll_tree_index()); + hud_layer_->set_property_tree_sequence_number( + root_layer_->property_tree_sequence_number()); } + } #if DCHECK_IS_ON() - // Ensure property tree nodes were created for all layers. When using layer - // lists, this can fail if blink doesn't setup layers or nodes correctly in - // |PaintArtifactCompositor|. When not using layer lists, this can fail if - // |PropertyTreeBuilder::BuildPropertyTrees| fails to create property tree - // nodes. - for (auto* layer : *this) { - DCHECK(property_trees_.effect_tree.Node(layer->effect_tree_index())); - DCHECK( - property_trees_.transform_tree.Node(layer->transform_tree_index())); - DCHECK(property_trees_.clip_tree.Node(layer->clip_tree_index())); - DCHECK(property_trees_.scroll_tree.Node(layer->scroll_tree_index())); - } + // Ensure property tree nodes were created for all layers. When using layer + // lists, this can fail if blink doesn't setup layers or nodes correctly in + // |PaintArtifactCompositor|. When not using layer lists, this can fail if + // |PropertyTreeBuilder::BuildPropertyTrees| fails to create property tree + // nodes. + for (auto* layer : *this) { + DCHECK(property_trees_.effect_tree.Node(layer->effect_tree_index())); + DCHECK(property_trees_.transform_tree.Node(layer->transform_tree_index())); + DCHECK(property_trees_.clip_tree.Node(layer->clip_tree_index())); + DCHECK(property_trees_.scroll_tree.Node(layer->scroll_tree_index())); + } #endif - draw_property_utils::UpdatePropertyTrees(this, &property_trees_); + draw_property_utils::UpdatePropertyTrees(this, &property_trees_); - LayerList update_layer_list; - draw_property_utils::FindLayersThatNeedUpdates(this, &property_trees_, - &update_layer_list); + LayerList update_layer_list; + draw_property_utils::FindLayersThatNeedUpdates(this, &property_trees_, + &update_layer_list); - // Dump property trees useful for debugging --blink-gen-property-trees - // flag. We care only about the renderer compositor. - if (VLOG_IS_ON(3) && GetClientNameForMetrics() == std::string("Renderer")) { - VLOG(3) << "CC Property Trees:"; - std::string out; - base::JSONWriter::WriteWithOptions( - *property_trees_.AsTracedValue()->ToBaseValue(), - base::JSONWriter::OPTIONS_PRETTY_PRINT, &out); - std::stringstream ss(out); - while (!ss.eof()) { - std::string line; - std::getline(ss, line); - VLOG(3) << line; - } + // Dump property trees and layers if run with: + // --vmodule=layer_tree_host=3 + // This only prints output for the renderer. + if (VLOG_IS_ON(3) && GetClientNameForMetrics() == std::string("Renderer")) { + VLOG(3) << "After updating layers on the main thread:"; + // Because the property tree and layer list output can be verbose, the VLOG + // output is split by line to avoid line buffer limits on android. + VLOG(3) << "property trees:"; + std::string property_trees; + base::JSONWriter::WriteWithOptions( + *property_trees_.AsTracedValue()->ToBaseValue(), + base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + std::stringstream property_trees_stream(property_trees); + for (std::string line; std::getline(property_trees_stream, line);) + VLOG(3) << line; - VLOG(3) << "CC Layer List:"; - for (auto* layer : *this) { - VLOG(3) << "layer id " << layer->id(); - VLOG(3) << " element_id: " << layer->element_id(); - VLOG(3) << " bounds: " << layer->bounds().ToString(); - VLOG(3) << " opacity: " << layer->opacity(); - VLOG(3) << " position: " << layer->position().ToString(); - VLOG(3) << " draws_content: " << layer->DrawsContent(); - VLOG(3) << " scrollable: " << layer->scrollable(); - VLOG(3) << " contents_opaque: " << layer->contents_opaque(); - VLOG(3) << " transform_tree_index: " << layer->transform_tree_index(); - VLOG(3) << " clip_tree_index: " << layer->clip_tree_index(); - VLOG(3) << " effect_tree_index: " << layer->effect_tree_index(); - VLOG(3) << " scroll_tree_index: " << layer->scroll_tree_index(); - } + VLOG(3) << "layers:"; + for (auto* layer : *this) { + VLOG(3) << " layer id " << layer->id(); + VLOG(3) << " element_id: " << layer->element_id(); + VLOG(3) << " bounds: " << layer->bounds().ToString(); + VLOG(3) << " opacity: " << layer->opacity(); + VLOG(3) << " position: " << layer->position().ToString(); + VLOG(3) << " draws_content: " << layer->DrawsContent(); + VLOG(3) << " scrollable: " << layer->scrollable(); + VLOG(3) << " contents_opaque: " << layer->contents_opaque(); + VLOG(3) << " transform_tree_index: " << layer->transform_tree_index(); + VLOG(3) << " clip_tree_index: " << layer->clip_tree_index(); + VLOG(3) << " effect_tree_index: " << layer->effect_tree_index(); + VLOG(3) << " scroll_tree_index: " << layer->scroll_tree_index(); } + } bool painted_content_has_slow_paths = false; bool painted_content_has_non_aa_paint = false;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 2675af2..b61ef6f1 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2870,6 +2870,27 @@ if (active_tree()->TakeNewLocalSurfaceIdRequest()) child_local_surface_id_allocator_.GenerateId(); } + + // Dump property trees and layers if run with: + // --vmodule=layer_tree_host_impl=3 + if (VLOG_IS_ON(3)) { + VLOG(3) << "After activating sync tree, the active tree:"; + // Because the property tree and layer list output can be verbose, the VLOG + // output is split by line to avoid line buffer limits on android. + VLOG(3) << "property trees:"; + std::string property_trees; + base::JSONWriter::WriteWithOptions( + *active_tree_->property_trees()->AsTracedValue()->ToBaseValue(), + base::JSONWriter::OPTIONS_PRETTY_PRINT, &property_trees); + std::stringstream property_trees_stream(property_trees); + for (std::string line; std::getline(property_trees_stream, line);) + VLOG(3) << line; + + VLOG(3) << "layers:"; + std::stringstream layers_stream(LayerListAsJson()); + for (std::string line; std::getline(layers_stream, line);) + VLOG(3) << line; + } } void LayerTreeHostImpl::ActivateStateForImages() {
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java index 727c639..53b309d 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedOfflineBridge.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.feed; +import com.google.android.libraries.feed.api.knowncontent.ContentMetadata; import com.google.android.libraries.feed.api.knowncontent.ContentRemoval; import com.google.android.libraries.feed.api.knowncontent.KnownContentApi; import com.google.android.libraries.feed.common.functional.Consumer; @@ -19,6 +20,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; /** Provides access to native implementations of OfflineIndicatorApi. */ @JNINamespace("feed") @@ -102,7 +104,7 @@ * Filters out any {@link ContentRemoval} that was not user driven, such as old articles being * garbage collected. * - * @param contentRemovd The articles being removed, may or may not be user driven. + * @param contentRemoved The articles being removed, may or may not be user driven. * @return All and only the user driven removals. */ @VisibleForTesting @@ -121,6 +123,19 @@ return Long.valueOf(id); } + @CalledByNative + private void getKnownContent() { + mKnownContentApi.getKnownContent((List<ContentMetadata> metadataList) -> { + for (ContentMetadata metadata : metadataList) { + long time_published_ms = TimeUnit.SECONDS.toMillis(metadata.getTimePublished()); + nativeAppendContentMetadata(mNativeBridge, metadata.getUrl(), metadata.getTitle(), + time_published_ms, metadata.getImageUrl(), metadata.getPublisher(), + metadata.getFaviconUrl(), metadata.getSnippet()); + } + nativeOnGetKnownContentDone(mNativeBridge); + }); + } + private native long nativeInit(Profile profile); private native void nativeDestroy(long nativeFeedOfflineBridge); private native Object nativeGetOfflineId(long nativeFeedOfflineBridge, String url); @@ -129,4 +144,8 @@ private native void nativeOnContentRemoved(long nativeFeedOfflineBridge, String[] urlsRemoved); private native void nativeOnNewContentReceived(long nativeFeedOfflineBridge); private native void nativeOnNoListeners(long nativeFeedOfflineBridge); + private native void nativeAppendContentMetadata(long nativeFeedOfflineBridge, String url, + String title, long timePublishedMs, String imageUrl, String publisher, + String faviconUrl, String snippet); + private native void nativeOnGetKnownContentDone(long nativeFeedOfflineBridge); }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java index 887bdd4..464756b7 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java
@@ -68,7 +68,7 @@ schedulerBridge.initializeFeedDependencies( sFeedProcessScope.getRequestManager(), sFeedProcessScope.getSessionManager()); - // TODO(skym): Pass on the KnownContentApi when the FeedProcessScope provides one. + // TODO(skym): Use sFeedProcessScope.getKnownContentApi(). sFeedOfflineIndicator = new FeedOfflineBridge(profile, null); }
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 3215e0c7..236085b 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -644,6 +644,7 @@ android:label="@string/webapp_activity_title" android:launchMode="singleTop" android:documentLaunchMode="intoExisting" + android:exported="false" android:persistableMode="persistNever" {{ self.supports_video_persistence() }} {{ self.chrome_activity_common() }} @@ -662,6 +663,7 @@ android:icon="@mipmap/app_shortcut_icon" android:label="@string/webapp_activity_title" android:launchMode="singleTask" + android:exported="false" android:persistableMode="persistNever" android:taskAffinity="{{ manifest_package }}.webapps.WebappActivity{{ i }}" {{ self.supports_video_persistence() }} @@ -682,6 +684,7 @@ android:label="@string/webapp_activity_title" android:launchMode="singleTop" android:documentLaunchMode="intoExisting" + android:exported="false" android:persistableMode="persistNever" {{ self.supports_video_persistence() }} {{ self.chrome_activity_common() }} @@ -695,6 +698,7 @@ android:icon="@mipmap/app_shortcut_icon" android:label="@string/webapp_activity_title" android:launchMode="singleTask" + android:exported="false" android:persistableMode="persistNever" android:taskAffinity="{{ manifest_package }}.webapps.WebApkActivity{{ i }}" {{ self.supports_video_persistence() }}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index a713b4a..2098234 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -101,7 +101,6 @@ import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.UrlUtilities; -import org.chromium.chrome.browser.webapps.WebappActivity; import org.chromium.chrome.browser.webapps.WebappCustomTabTimeSpentLogger; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.content_public.browser.LoadUrlParams; @@ -720,8 +719,8 @@ Tab tab = new Tab(assignedTabId, parentTabId, mIntentDataProvider.isIncognito(), getWindowAndroid(), TabLaunchType.FROM_EXTERNAL_APP, null, null); if (getIntent().getIntExtra(CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, - WebappActivity.ActivityType.OTHER) - == WebappActivity.ActivityType.WEBAPK) { + CustomTabIntentDataProvider.LaunchSourceType.OTHER) + == CustomTabIntentDataProvider.LaunchSourceType.WEBAPK) { String webapkPackageName = getIntent().getStringExtra(Browser.EXTRA_APPLICATION_ID); tab.setAppAssociatedWith(webapkPackageName); } else { @@ -873,7 +872,7 @@ mIsInitialResume = false; mWebappTimeSpentLogger = WebappCustomTabTimeSpentLogger.createInstanceAndStartTimer( getIntent().getIntExtra(CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, - WebappActivity.ActivityType.OTHER)); + CustomTabIntentDataProvider.LaunchSourceType.OTHER)); if (mModuleActivityDelegate != null) { resumeModule();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java index 7b4b256..67c076f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -68,6 +68,17 @@ int OFFLINE_PAGE = 6; } + @IntDef({LaunchSourceType.OTHER, LaunchSourceType.WEBAPP, LaunchSourceType.WEBAPK, + LaunchSourceType.TWA, LaunchSourceType.MEDIA_LAUNCHER_ACTIVITY}) + @Retention(RetentionPolicy.SOURCE) + public @interface LaunchSourceType { + int OTHER = -1; + int WEBAPP = 0; + int WEBAPK = 1; + int TWA = 2; + int MEDIA_LAUNCHER_ACTIVITY = 3; + } + /** * Extra that indicates whether or not the Custom Tab is being launched by an Intent fired by * Chrome itself. @@ -133,6 +144,7 @@ private final int mTitleVisibilityState; private final String mMediaViewerUrl; private final boolean mEnableEmbeddedMediaExperience; + private final boolean mIsFromMediaLauncherActivity; private final int mInitialBackgroundColor; private final boolean mDisableStar; private final boolean mDisableDownload; @@ -248,6 +260,10 @@ mEnableEmbeddedMediaExperience = isTrustedIntent() && IntentUtils.safeGetBooleanExtra( intent, EXTRA_ENABLE_EMBEDDED_MEDIA_EXPERIENCE, false); + mIsFromMediaLauncherActivity = isTrustedIntent() + && (IntentUtils.safeGetIntExtra( + intent, EXTRA_BROWSER_LAUNCH_SOURCE, LaunchSourceType.OTHER) + == LaunchSourceType.MEDIA_LAUNCHER_ACTIVITY); mDisableStar = IntentUtils.safeGetBooleanExtra(intent, EXTRA_DISABLE_STAR_BUTTON, false); mDisableDownload = IntentUtils.safeGetBooleanExtra(intent, EXTRA_DISABLE_DOWNLOAD_BUTTON, false); @@ -619,6 +635,13 @@ } /** + * @return See {@link #EXTRA_IS_FROM_MEDIA_LAUNCHER_ACTIVITY} + */ + boolean isFromMediaLauncherActivity() { + return mIsFromMediaLauncherActivity; + } + + /** * @return If the Custom Tab is an info page. * See {@link #EXTRA_UI_TYPE}. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java index 4f6b043..f5594cdf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java
@@ -48,10 +48,13 @@ public static final int MAX_FILE_NAME_LENGTH = 25; /** - * Builds a downloads notification based on the status of the download and its information. + * Builds a downloads notification based on the status of the download and its information. All + * changes to this function should consider the difference between normal profile and off the + * record profile. * @param context of the download. * @param downloadStatus (in progress, paused, successful, failed, deleted, or summary). - * @param downloadUpdate information about the download (ie. contentId, fileName, icon, etc). + * @param downloadUpdate information about the download (ie. contentId, fileName, icon, + * isOffTheRecord, etc). * @return Notification that is built based on these parameters. */ public static Notification buildNotification(Context context, @@ -129,16 +132,12 @@ } if (!downloadUpdate.getProgress().isIndeterminate() + && !downloadUpdate.getIsOffTheRecord() && downloadUpdate.getTimeRemainingInMillis() >= 0 && !LegacyHelpers.isLegacyOfflinePage(downloadUpdate.getContentId())) { String subText = DownloadUtils.formatRemainingTime( context, downloadUpdate.getTimeRemainingInMillis()); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - builder.setSubText(subText); - } else { - builder.setContentInfo(subText); - } + setSubText(builder, subText); } if (downloadUpdate.getStartTime() > 0) { @@ -183,7 +182,8 @@ case DownloadNotificationService2.DownloadStatus.COMPLETED: Preconditions.checkArgument(downloadUpdate.getNotificationId() != -1); - if (downloadUpdate.getTotalBytes() > 0) { + // Don't show file size in incognito mode. + if (downloadUpdate.getTotalBytes() > 0 && !downloadUpdate.getIsOffTheRecord()) { contentText = context.getResources().getString( R.string.download_notification_completed_with_size, DownloadUtils.getStringForBytes( @@ -243,9 +243,17 @@ Bundle extras = new Bundle(); extras.putInt(EXTRA_NOTIFICATION_BUNDLE_ICON_ID, iconId); - builder.setContentText(contentText).setSmallIcon(iconId).addExtras(extras); + builder.setSmallIcon(iconId).addExtras(extras); - if (downloadUpdate.getFileName() != null) { + // Context text is shown as title in incognito mode as the file name is not shown. + if (downloadUpdate.getIsOffTheRecord()) { + builder.setContentTitle(contentText); + } else { + builder.setContentText(contentText); + } + + // Don't show file name in incognito mode. + if (downloadUpdate.getFileName() != null && !downloadUpdate.getIsOffTheRecord()) { builder.setContentTitle(DownloadUtils.getAbbreviatedFileName( downloadUpdate.getFileName(), MAX_FILE_NAME_LENGTH)); } @@ -260,6 +268,13 @@ downloadHomeIntent, PendingIntent.FLAG_UPDATE_CURRENT)); } + // A sub text to inform the users that they are using incognito mode. + if (downloadUpdate.getIsOffTheRecord()) { + setSubText(builder, + context.getResources().getString( + R.string.download_notification_incognito_subtext)); + } + return builder.build(); } @@ -275,6 +290,19 @@ } /** + * Helper method to set the sub text on different versions of Android. + * @param builder The builder to build notification. + * @param subText A string shown as sub text on the notification. + */ + private static void setSubText(ChromeNotificationBuilder builder, String subText) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + builder.setSubText(subText); + } else { + builder.setContentInfo(subText); + } + } + + /** * Helper method to build an download action Intent from the provided information. * @param context {@link Context} to pull resources from. * @param action Download action to perform.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java index defb95426..b8fb94fb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java
@@ -300,7 +300,7 @@ mDownloadSharedPreferenceHelper.getDownloadSharedPreferenceEntry(id); if (!isResumable) { // TODO(cmsy): Use correct FailState. - notifyDownloadFailed(id, fileName, icon, FailState.CANNOT_DOWNLOAD); + notifyDownloadFailed(id, fileName, icon, isOffTheRecord, FailState.CANNOT_DOWNLOAD); return; } // If download is already paused, do nothing. @@ -391,13 +391,15 @@ /** * Add a download failed notification. - * @param id The {@link ContentId} of the download. - * @param fileName Filename of the download. - * @param icon A {@link Bitmap} to be used as the large icon for display. + * @param id The {@link ContentId} of the download. + * @param fileName Filename of the download. + * @param icon A {@link Bitmap} to be used as the large icon for display. + * @param isOffTheRecord If the profile is off the record. + * @param failState Reason why download failed. */ @VisibleForTesting - public void notifyDownloadFailed( - ContentId id, String fileName, Bitmap icon, @FailState int failState) { + public void notifyDownloadFailed(ContentId id, String fileName, Bitmap icon, + boolean isOffTheRecord, @FailState int failState) { // If the download is not in history db, fileName could be empty. Get it from // SharedPreferences. if (TextUtils.isEmpty(fileName)) { @@ -414,6 +416,7 @@ .setContentId(id) .setFileName(fileName) .setIcon(icon) + .setIsOffTheRecord(isOffTheRecord) .setFailState(failState) .build(); Notification notification = DownloadNotificationFactory.buildNotification(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java index 8f471b3..768816c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java
@@ -137,10 +137,8 @@ @Override public void notifyDownloadFailed(DownloadInfo info, @FailState int failState) { - NotificationInfo notificationInfo = - new NotificationInfo(NotificationType.FAILED, info, NotificationPriority.HIGH); - notificationInfo.mFailState = failState; - addPendingNotification(notificationInfo); + mDownloadNotificationService.notifyDownloadFailed(info.getContentId(), info.getFileName(), + info.getIcon(), info.isOffTheRecord(), failState); } @Override @@ -260,7 +258,8 @@ break; case NotificationType.FAILED: getDownloadNotificationService().notifyDownloadFailed(info.getContentId(), - info.getFileName(), info.getIcon(), notificationInfo.mFailState); + info.getFileName(), info.getIcon(), info.isOffTheRecord(), + notificationInfo.mFailState); break; case NotificationType.INTERRUPTED: getDownloadNotificationService().notifyDownloadPaused(info.getContentId(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java index dba7fef..8c576df 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -27,12 +27,12 @@ import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.UrlConstants; +import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.LaunchSourceType; import org.chromium.chrome.browser.instantapps.InstantAppsHandler; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabRedirectHandler; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.UrlUtilities; -import org.chromium.chrome.browser.webapps.WebappActivity.ActivityType; import org.chromium.chrome.browser.webapps.WebappScopePolicy; import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.ui.base.PageTransition; @@ -770,8 +770,10 @@ } int launchSource = IntentUtils.safeGetIntExtra( - tab.getActivity().getIntent(), EXTRA_BROWSER_LAUNCH_SOURCE, ActivityType.OTHER); - if (launchSource != ActivityType.WEBAPK && launchSource != ActivityType.TWA) return false; + tab.getActivity().getIntent(), EXTRA_BROWSER_LAUNCH_SOURCE, LaunchSourceType.OTHER); + if (launchSource != LaunchSourceType.WEBAPK && launchSource != LaunchSourceType.TWA) { + return false; + } String appId = IntentUtils.safeGetStringExtra( tab.getActivity().getIntent(), Browser.EXTRA_APPLICATION_ID);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java index 605d156..c0e3567 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaLauncherActivity.java
@@ -13,6 +13,7 @@ import android.webkit.MimeTypeMap; import org.chromium.base.metrics.CachedMetrics; +import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider; import org.chromium.chrome.browser.util.IntentUtils; import java.lang.annotation.Retention; @@ -63,6 +64,8 @@ Intent intent = MediaViewerUtils.getMediaViewerIntent( contentUri, contentUri, mimeType, false /* allowExternalAppHandlers */); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.putExtra(CustomTabIntentDataProvider.EXTRA_BROWSER_LAUNCH_SOURCE, + CustomTabIntentDataProvider.LaunchSourceType.MEDIA_LAUNCHER_ACTIVITY); startActivity(intent); finish();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java index 896eb02..aff6f91 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/BaseSessionController.java
@@ -182,15 +182,23 @@ private class RemoteMediaClientCallback extends RemoteMediaClient.Callback { @Override public void onStatusUpdated() { - mNotificationController.onStatusUpdated(); + BaseSessionController.this.onStatusUpdated(); } @Override public void onMetadataUpdated() { - mNotificationController.onMetadataUpdated(); + BaseSessionController.this.onMetadataUpdated(); } } + protected void onStatusUpdated() { + mNotificationController.onStatusUpdated(); + } + + protected void onMetadataUpdated() { + mNotificationController.onMetadataUpdated(); + } + @Nullable public FlingingController getFlingingController() { return null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java index c9730cf..3eb3be58 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/FlingingControllerAdapter.java
@@ -4,35 +4,117 @@ package org.chromium.chrome.browser.media.router.caf.remoting; +import com.google.android.gms.cast.MediaStatus; import com.google.android.gms.cast.framework.media.RemoteMediaClient; +import org.chromium.base.Log; import org.chromium.chrome.browser.media.router.FlingingController; import org.chromium.chrome.browser.media.router.MediaController; +import org.chromium.chrome.browser.media.router.MediaStatusBridge; import org.chromium.chrome.browser.media.router.MediaStatusObserver; /** Adapter class for bridging {@link RemoteMediaClient} and {@link FlingController}. */ -public class FlingingControllerAdapter implements FlingingController { - FlingingControllerAdapter(RemotingSessionController sessionController) {} +public class FlingingControllerAdapter implements FlingingController, MediaController { + private static final String TAG = "FlingCtrlAdptr"; + + private final RemotingSessionController mSessionController; + private MediaStatusObserver mMediaStatusObserver; + + FlingingControllerAdapter(RemotingSessionController sessionController) { + mSessionController = sessionController; + } + + //////////////////////////////////////////// + // FlingingController implementation begin + //////////////////////////////////////////// @Override public MediaController getMediaController() { - // Not implemented. - return null; + return this; } @Override public void setMediaStatusObserver(MediaStatusObserver observer) { - // Not implemented. + assert mMediaStatusObserver == null; + mMediaStatusObserver = observer; } @Override public void clearMediaStatusObserver() { - // Not implemented. + assert mMediaStatusObserver != null; + mMediaStatusObserver = null; } @Override public long getApproximateCurrentTime() { - // Not implemented. - return 0; + return mSessionController.getRemoteMediaClient().getApproximateStreamPosition(); + } + + //////////////////////////////////////////// + // FlingingController implementation end + //////////////////////////////////////////// + + //////////////////////////////////////////// + // MediaController implementation begin + //////////////////////////////////////////// + + @Override + public void play() { + if (!mSessionController.isConnected()) return; + mSessionController.getRemoteMediaClient().play().setResultCallback( + this ::onMediaCommandResult); + } + + @Override + public void pause() { + if (!mSessionController.isConnected()) return; + mSessionController.getRemoteMediaClient().pause().setResultCallback( + this ::onMediaCommandResult); + } + + @Override + public void setMute(boolean mute) { + if (!mSessionController.isConnected()) return; + mSessionController.getRemoteMediaClient().setStreamMute(mute).setResultCallback( + this ::onMediaCommandResult); + } + + @Override + public void setVolume(double volume) { + if (!mSessionController.isConnected()) return; + mSessionController.getRemoteMediaClient().setStreamVolume(volume).setResultCallback( + this ::onMediaCommandResult); + } + + @Override + public void seek(long position) { + if (!mSessionController.isConnected()) return; + mSessionController.getRemoteMediaClient().seek(position).setResultCallback( + this ::onMediaCommandResult); + } + + //////////////////////////////////////////// + // MediaController implementation end + //////////////////////////////////////////// + + public void onStatusUpdated() { + if (mMediaStatusObserver == null) return; + + MediaStatus mediaStatus = mSessionController.getRemoteMediaClient().getMediaStatus(); + if (mediaStatus != null) { + mMediaStatusObserver.onMediaStatusUpdate(new MediaStatusBridge(mediaStatus)); + } + } + + private void onMediaCommandResult(RemoteMediaClient.MediaChannelResult result) { + // When multiple API calls are made in quick succession, "Results have already been set" + // IllegalStateExceptions might be thrown from GMS code. We prefer to catch the exception + // and noop it, than to crash. This might lead to some API calls never getting their + // onResult() called, so we should not rely on onResult() being called for every API call. + // See https://crbug.com/853923. + if (!result.getStatus().isSuccess()) { + Log.e(TAG, "Error when sending command. Status code: %d", + result.getStatus().getStatusCode()); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java index 7bbb749..21bd2c5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/caf/remoting/RemotingSessionController.java
@@ -44,6 +44,12 @@ } @Override + protected void onStatusUpdated() { + super.onStatusUpdated(); + mFlingingControllerAdapter.onStatusUpdated(); + } + + @Override public FlingingController getFlingingController() { return mFlingingControllerAdapter; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java index 1ee6751..9ba16c74f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java
@@ -7,15 +7,21 @@ import android.os.SystemClock; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.LaunchSourceType; import java.util.concurrent.TimeUnit; -/** Logs to UMA the amount of time user spends in a CCT for CCTs launched from webapps. */ +/** + * Logs to UMA the amount of time user spends in a CCT for CCTs launched from webapps. + * + * TODO(https://crbug.com/883402): Rename this to CustomTabTimeSpentLogger and refactor into the + * customtabs package. + */ public class WebappCustomTabTimeSpentLogger { private long mStartTime; - private @WebappActivity.ActivityType int mActivityType; + private @LaunchSourceType int mActivityType; - private WebappCustomTabTimeSpentLogger(@WebappActivity.ActivityType int activityType) { + private WebappCustomTabTimeSpentLogger(@LaunchSourceType int activityType) { mActivityType = activityType; mStartTime = SystemClock.elapsedRealtime(); } @@ -26,7 +32,7 @@ * @return {@link WebappCustomTabTimeSpentLogger} instance. */ public static WebappCustomTabTimeSpentLogger createInstanceAndStartTimer( - @WebappActivity.ActivityType int activityType) { + @LaunchSourceType int activityType) { return new WebappCustomTabTimeSpentLogger(activityType); } @@ -37,15 +43,18 @@ long timeSpent = SystemClock.elapsedRealtime() - mStartTime; String umaSuffix; switch (mActivityType) { - case WebappActivity.ActivityType.WEBAPP: + case LaunchSourceType.WEBAPP: umaSuffix = ".Webapp"; break; - case WebappActivity.ActivityType.WEBAPK: + case LaunchSourceType.WEBAPK: umaSuffix = ".WebApk"; break; - case WebappActivity.ActivityType.TWA: + case LaunchSourceType.TWA: umaSuffix = ".TWA"; break; + case LaunchSourceType.MEDIA_LAUNCHER_ACTIVITY: + umaSuffix = ".MediaLauncherActivity"; + break; default: umaSuffix = ".Other"; break;
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 9b3d707..81dab35 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -2273,6 +2273,9 @@ <message name="IDS_DOWNLOAD_NOTIFICATION_PENDING_ANOTHER_DOWNLOAD" desc="Download notification to be displayed when a download has been scheduled but has not started being fetched from the network because another download is currently being downloaded."> Waiting for another download… </message> + <message name="IDS_DOWNLOAD_NOTIFICATION_INCOGNITO_SUBTEXT" desc="Displayed in incognito mode download notification as subtext."> + Incognito tab + </message> <message name="IDS_DOWNLOAD_CANT_OPEN_FILE" desc="Toast that appears when a downloaded file can't be opened."> Can’t open file </message>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 84684ce..6d1948c 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -2117,6 +2117,7 @@ "javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationTest.java", + "javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappDeferredStartupTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappDisplayModeTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java index e727a96b..458c224 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService2.java
@@ -98,11 +98,11 @@ @Override public void notifyDownloadFailed(final ContentId id, final String fileName, final Bitmap icon, - @FailState int failState) { + boolean isOffTheRecord, @FailState int failState) { ThreadUtils.runOnUiThreadBlocking( () -> MockDownloadNotificationService2.super.notifyDownloadFailed( - id, fileName, icon, failState)); + id, fileName, icon, isOffTheRecord, failState)); } @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTest.java new file mode 100644 index 0000000..3266992f9 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappActivityTest.java
@@ -0,0 +1,29 @@ +// 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. + +package org.chromium.chrome.browser.webapps; + +import android.support.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider.LaunchSourceType; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; + +/** + * Tests for WebappActivity class. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +public class WebappActivityTest { + @Test + @SmallTest + public void testActivityTypeMatchesLaunchSourceType() throws Exception { + Assert.assertEquals(LaunchSourceType.OTHER, WebappActivity.ActivityType.OTHER); + Assert.assertEquals(LaunchSourceType.WEBAPP, WebappActivity.ActivityType.WEBAPP); + Assert.assertEquals(LaunchSourceType.WEBAPK, WebappActivity.ActivityType.WEBAPK); + Assert.assertEquals(LaunchSourceType.TWA, WebappActivity.ActivityType.TWA); + } +}
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 3392872..bd2127c 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-71.0.3551.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-71.0.3551.2_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java index 4862aeab..24e2e955 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java
@@ -206,7 +206,7 @@ private void uninstallBrowser(String packageName) { Intent intent = null; try { - intent = Intent.parseUri("http://", Intent.URI_INTENT_SCHEME); + intent = WebApkUtils.getQueryInstalledBrowsersIntent(); } catch (Exception e) { Assert.fail(); return; @@ -228,7 +228,7 @@ private void mockInstallBrowsers(String[] browsersToInstall, String defaultBrowser) { Intent intent = null; try { - intent = Intent.parseUri("http://", Intent.URI_INTENT_SCHEME); + intent = WebApkUtils.getQueryInstalledBrowsersIntent(); } catch (Exception e) { Assert.fail(); return;
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java index 7848a406..19d625c 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java
@@ -197,7 +197,7 @@ } private void installBrowser(String browserPackageName) { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")); + Intent intent = WebApkUtils.getQueryInstalledBrowsersIntent(); Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()) .addResolveInfoForIntent(intent, newResolveInfo(browserPackageName)); Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager())
diff --git a/chrome/android/webapk/shell_apk/shell_apk_version.gni b/chrome/android/webapk/shell_apk/shell_apk_version.gni index ebd1f62..3dfe273 100644 --- a/chrome/android/webapk/shell_apk/shell_apk_version.gni +++ b/chrome/android/webapk/shell_apk/shell_apk_version.gni
@@ -6,7 +6,7 @@ # (including AndroidManifest.xml) is updated. This version should be incremented # prior to uploading a new ShellAPK to the WebAPK Minting Server. # Does not affect Chrome.apk -template_shell_apk_version = 51 +template_shell_apk_version = 52 # The ShellAPK version expected by Chrome. Chrome will try to update the WebAPK # if the WebAPK's ShellAPK version is less than |expected_shell_apk_version|.
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java index c87056bf..74261ccd 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java
@@ -11,7 +11,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; -import android.net.Uri; import android.text.TextUtils; import org.chromium.webapk.lib.common.WebApkConstants; @@ -182,7 +181,7 @@ /** Returns the package name of the default browser on the Android device. */ private static String getDefaultBrowserPackageName(PackageManager packageManager) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")); + Intent browserIntent = WebApkUtils.getQueryInstalledBrowsersIntent(); ResolveInfo resolveInfo = packageManager.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo == null || resolveInfo.activityInfo == null) return null;
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java index 4910a04..87b249e 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java
@@ -90,10 +90,11 @@ /** Returns a list of ResolveInfo for all of the installed browsers. */ public static List<ResolveInfo> getInstalledBrowserResolveInfos(PackageManager packageManager) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")); + Intent browserIntent = getQueryInstalledBrowsersIntent(); // Note: {@link PackageManager#queryIntentActivities()} does not return ResolveInfos for // disabled browsers. - return packageManager.queryIntentActivities(browserIntent, PackageManager.MATCH_ALL); + return packageManager.queryIntentActivities( + browserIntent, PackageManager.MATCH_DEFAULT_ONLY); } /** @@ -150,4 +151,14 @@ int version = Integer.parseInt(versionName.substring(0, dotIndex)); return version < MINIMUM_REQUIRED_CHROME_VERSION; } + + /** + * Returns the Intent to query a list of installed browser apps. + */ + static Intent getQueryInstalledBrowsersIntent() { + return new Intent() + .setAction(Intent.ACTION_VIEW) + .addCategory(Intent.CATEGORY_BROWSABLE) + .setData(Uri.parse("http://")); + } }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 9f766e7b..b4a7704 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -3329,6 +3329,9 @@ <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE" desc="Text telling users that fingerprints might be less secure than strong PINs or passwords."> Note: Your fingerprint may be less secure than a strong password or PIN. </message> + <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL" desc="Aria label for the button in the fingerprint subpage that deletes a registered fingerprint. Only visible by screen reader software."> + delete [<ph name="FINGERPRINT_NAME">$1<ex>Fingerprint 1</ex></ph>], button + </message> <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NEW_FINGERPRINT_DEFAULT_NAME" desc="The default name (plus a number for a newly added fingerprint)."> Finger <ph name="NEW_FINGER_NUMBER">$1<ex>1</ex></ph> </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index cf5cf2e6..dd12cc4 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -441,6 +441,7 @@ "download/image_thumbnail_request.h", "download/offline_item_model.cc", "download/offline_item_model.h", + "download/offline_item_model_data.h", "download/offline_item_model_manager.cc", "download/offline_item_model_manager.h", "download/offline_item_model_manager_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 2155b82..829c421 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1692,6 +1692,10 @@ flag_descriptions::kAndroidMessagesIntegrationName, flag_descriptions::kAndroidMessagesIntegrationDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kAndroidMessagesIntegration)}, + {"enable_android_messages_prod_endpoint", + flag_descriptions::kAndroidMessagesProdEndpointName, + flag_descriptions::kAndroidMessagesProdEndpointDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kAndroidMessagesProdEndpoint)}, { "enable-background-blur", flag_descriptions::kEnableBackgroundBlurName, flag_descriptions::kEnableBackgroundBlurDescription, kOsCrOS,
diff --git a/chrome/browser/android/feed/feed_offline_bridge.cc b/chrome/browser/android/feed/feed_offline_bridge.cc index 62911262..05589d8 100644 --- a/chrome/browser/android/feed/feed_offline_bridge.cc +++ b/chrome/browser/android/feed/feed_offline_bridge.cc
@@ -19,7 +19,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_android.h" #include "components/feed/content/feed_host_service.h" -#include "components/offline_pages/core/offline_page_model.h" +#include "components/feed/core/content_metadata.h" #include "jni/FeedOfflineBridge_jni.h" using base::android::JavaRef; @@ -55,8 +55,11 @@ FeedOfflineBridge::FeedOfflineBridge(const JavaRef<jobject>& j_this, FeedOfflineHost* offline_host) : j_this_(ScopedJavaGlobalRef<jobject>(j_this)), - offline_host_(offline_host) { + offline_host_(offline_host), + weak_factory_(this) { DCHECK(offline_host_); + offline_host_->Initialize(base::BindRepeating( + &FeedOfflineBridge::TriggerGetKnownContent, weak_factory_.GetWeakPtr())); } FeedOfflineBridge::~FeedOfflineBridge() = default; @@ -106,4 +109,39 @@ offline_host_->OnNoListeners(); } +void FeedOfflineBridge::AppendContentMetadata( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jstring>& j_url, + const base::android::JavaRef<jstring>& j_title, + const jlong j_time_published_ms, + const base::android::JavaRef<jstring>& j_image_url, + const base::android::JavaRef<jstring>& j_publisher, + const base::android::JavaRef<jstring>& j_favicon_url, + const base::android::JavaRef<jstring>& j_snippet) { + ContentMetadata metadata; + metadata.url = base::android::ConvertJavaStringToUTF8(env, j_url); + metadata.title = base::android::ConvertJavaStringToUTF8(env, j_title); + metadata.time_published = base::Time::FromJavaTime(j_time_published_ms); + metadata.image_url = base::android::ConvertJavaStringToUTF8(env, j_image_url); + metadata.publisher = base::android::ConvertJavaStringToUTF8(env, j_publisher); + metadata.favicon_url = + base::android::ConvertJavaStringToUTF8(env, j_favicon_url); + metadata.snippet = base::android::ConvertJavaStringToUTF8(env, j_snippet); + known_content_metadata_buffer_.push_back(std::move(metadata)); +} + +void FeedOfflineBridge::OnGetKnownContentDone( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this) { + offline_host_->OnGetKnownContentDone( + std::move(known_content_metadata_buffer_)); +} + +void FeedOfflineBridge::TriggerGetKnownContent() { + DCHECK(known_content_metadata_buffer_.empty()); + JNIEnv* env = base::android::AttachCurrentThread(); + Java_FeedOfflineBridge_getKnownContent(env, j_this_); +} + } // namespace feed
diff --git a/chrome/browser/android/feed/feed_offline_bridge.h b/chrome/browser/android/feed/feed_offline_bridge.h index 594a412..9d21c90 100644 --- a/chrome/browser/android/feed/feed_offline_bridge.h +++ b/chrome/browser/android/feed/feed_offline_bridge.h
@@ -6,12 +6,13 @@ #define CHROME_BROWSER_ANDROID_FEED_FEED_OFFLINE_BRIDGE_H_ #include <jni.h> -#include <stdint.h> #include <vector> #include "base/android/scoped_java_ref.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "components/feed/content/feed_offline_host.h" +#include "components/feed/core/content_metadata.h" namespace feed { @@ -48,13 +49,45 @@ void OnNoListeners(JNIEnv* env, const base::android::JavaRef<jobject>& j_this); + // Used to convert from Java ContentMetadata to a native ContentMetadata, and + // put the resulting object into |known_content_metadata_buffer_|. When a + // GetKnownContent() call finishes, this method should be synchronously called + // for every piece of data, and then OnGetKnownContentDone() should be called. + void AppendContentMetadata( + JNIEnv* env, + const base::android::JavaRef<jobject>& j_this, + const base::android::JavaRef<jstring>& j_url, + const base::android::JavaRef<jstring>& j_title, + const jlong j_time_published_ms, + const base::android::JavaRef<jstring>& j_image_url, + const base::android::JavaRef<jstring>& j_publisher, + const base::android::JavaRef<jstring>& j_favicon_url, + const base::android::JavaRef<jstring>& j_snippet); + + // Called to flush the contents of |known_content_metadata_buffer_| to the + // |offline_host_|. This should happen at the end of a GetKnownContent() call, + // and after AppendContentMetadata() is called for all data. + void OnGetKnownContentDone(JNIEnv* env, + const base::android::JavaRef<jobject>& j_this); + private: + // Starts an the async request for ContentMetadata through KnownContentApi's + // GetKnownContent(). Assumes the caller was FeedOfflineHost and will directly + // call FeedOfflineHost::OnGetKnownContentDone() on async completion. + void TriggerGetKnownContent(); + // Reference to the Java half of this bridge. Always valid. base::android::ScopedJavaGlobalRef<jobject> j_this_; // Object to which all Java to native calls are delegated. FeedOfflineHost* offline_host_; + // Temporarily holds ContentMetadata objects during the completion of a + // GetKnownContent call. + std::vector<ContentMetadata> known_content_metadata_buffer_; + + base::WeakPtrFactory<FeedOfflineBridge> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(FeedOfflineBridge); };
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index b98091ee..ce14f12 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -886,6 +886,24 @@ static float scale() { return 2.0f; } }; +// TODO(mcnee): These tests are BrowserPlugin specific. While WebView itself +// is no longer based on BrowserPlugin, MimeHandlerViewGuest is. We'll keep +// these tests (that would otherwise be removed) so that we keep test coverage +// of functionality that could still be relevant to MimeHandlerViewGuest. Once +// MimeHandlerViewGuest is no longer based on BrowserPlugin, remove these +// tests. (See https://crbug.com/533069 and https://crbug.com/659750). +class WebViewBrowserPluginSpecificTest : public WebViewTest { + protected: + void SetUpCommandLine(base::CommandLine* command_line) override { + WebViewTest::SetUpCommandLine(command_line); + scoped_feature_list_.InitAndDisableFeature( + features::kGuestViewCrossProcessFrames); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + class WebContentsAudioMutedObserver : public content::WebContentsObserver { public: explicit WebContentsAudioMutedObserver(content::WebContents* web_contents) @@ -4039,6 +4057,71 @@ } } +class WebViewScrollGuestContentBrowserPluginSpecificTest + : public WebViewBrowserPluginSpecificTest { + public: + ~WebViewScrollGuestContentBrowserPluginSpecificTest() override {} + + void SetUpCommandLine(base::CommandLine* command_line) override { + WebViewBrowserPluginSpecificTest::SetUpCommandLine(command_line); + + command_line->AppendSwitchASCII( + switches::kTouchEventFeatureDetection, + switches::kTouchEventFeatureDetectionEnabled); + } +}; + +#if defined(USE_AURA) +// This verifies the fix for crbug.com/694393 . +IN_PROC_BROWSER_TEST_F(WebViewScrollGuestContentBrowserPluginSpecificTest, + OverscrollControllerSeesConsumedScrollsInGuest) { + // This test is only relevant for non-OOPIF WebView as OOPIF-based WebView + // uses different scroll bubbling logic. + DCHECK( + !base::FeatureList::IsEnabled(::features::kGuestViewCrossProcessFrames)); + + LoadAppWithGuest("web_view/scrollable_embedder_and_guest"); + + content::WebContents* embedder_contents = GetEmbedderWebContents(); + content::RenderFrameSubmissionObserver embedder_frame_observer( + embedder_contents); + + std::vector<content::WebContents*> guest_web_contents_list; + GetGuestViewManager()->WaitForNumGuestsCreated(1u); + GetGuestViewManager()->GetGuestWebContentsList(&guest_web_contents_list); + ASSERT_EQ(1u, guest_web_contents_list.size()); + + content::WebContents* guest_contents = guest_web_contents_list[0]; + content::RenderFrameSubmissionObserver guest_frame_observer(guest_contents); + + gfx::Rect embedder_rect = embedder_contents->GetContainerBounds(); + gfx::Rect guest_rect = guest_contents->GetContainerBounds(); + guest_rect.set_x(guest_rect.x() - embedder_rect.x()); + guest_rect.set_y(guest_rect.y() - embedder_rect.y()); + + content::RenderWidgetHostView* embedder_host_view = + embedder_contents->GetRenderWidgetHostView(); + gfx::Vector2dF default_offset; + guest_frame_observer.WaitForScrollOffset(default_offset); + embedder_frame_observer.WaitForScrollOffset(default_offset); + + // If we scroll the guest, the OverscrollController for the + // RenderWidgetHostViewAura should see that the scroll was consumed. + // If it doesn't, this test will time out indicating failure. + content::MockOverscrollController* mock_overscroll_controller = + content::MockOverscrollController::Create(embedder_host_view); + + gfx::Point guest_scroll_location(guest_rect.width() / 2, 0); + float gesture_distance = 15.f; + // It's sufficient to scroll vertically, since all we need to test is that + // the OverscrollController sees consumed scrolls. + content::SimulateGestureScrollSequence(guest_contents, guest_scroll_location, + gfx::Vector2dF(0, -gesture_distance)); + + mock_overscroll_controller->WaitForConsumedScroll(); +} +#endif + // This runs the chrome://chrome-signin page which includes an OOPIF-<webview> // of accounts.google.com. class ChromeSignInWebViewTest : public WebViewTest {
diff --git a/chrome/browser/chromeos/android_sms/BUILD.gn b/chrome/browser/chromeos/android_sms/BUILD.gn index 3531206c..3753dec 100644 --- a/chrome/browser/chromeos/android_sms/BUILD.gn +++ b/chrome/browser/chromeos/android_sms/BUILD.gn
@@ -12,6 +12,7 @@ deps = [ "//base", + "//chromeos:chromeos", "//url", ] }
diff --git a/chrome/browser/chromeos/android_sms/android_sms_urls.cc b/chrome/browser/chromeos/android_sms/android_sms_urls.cc index d5abce2..8d7e2d1 100644 --- a/chrome/browser/chromeos/android_sms/android_sms_urls.cc +++ b/chrome/browser/chromeos/android_sms/android_sms_urls.cc
@@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/optional.h" #include "chrome/browser/chromeos/android_sms/android_sms_switches.h" +#include "chromeos/chromeos_features.h" #include "url/gurl.h" namespace chromeos { @@ -18,9 +19,11 @@ namespace { // NOTE: Using internal staging server until changes roll out to prod. -const char kDefaultAndroidMessagesUrl[] = +const char kAndroidMessagesSandboxUrl[] = "https://android-messages.sandbox.google.com/"; +const char kAndroidMessagesProdUrl[] = "https://messages.android.com/"; + // NOTE: Using experiment mods until changes roll out to prod. const char kExperimentUrlParams[] = "?e=DittoServiceWorker,DittoPwa,DittoIndexedDb"; @@ -31,8 +34,11 @@ std::string url_string = command_line->GetSwitchValueASCII(switches::kAlternateAndroidMessagesUrl); + bool use_prod_url = base::FeatureList::IsEnabled( + chromeos::features::kAndroidMessagesProdEndpoint); if (url_string.empty()) - url_string = std::string(kDefaultAndroidMessagesUrl); + url_string = std::string(use_prod_url ? kAndroidMessagesProdUrl + : kAndroidMessagesSandboxUrl); if (with_experiments) url_string += std::string(kExperimentUrlParams); return GURL(url_string);
diff --git a/chrome/browser/chromeos/arc/arc_util.cc b/chrome/browser/chromeos/arc/arc_util.cc index 6ae08ce4..5a75249a 100644 --- a/chrome/browser/chromeos/arc/arc_util.cc +++ b/chrome/browser/chromeos/arc/arc_util.cc
@@ -630,6 +630,9 @@ if (chromeos::DemoSession::IsDeviceInDemoMode()) return ash::mojom::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE; + if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount()) + return ash::mojom::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION; + if (chromeos::switches::IsAssistantEnabled()) { const std::string kAllowedLocales[] = {ULOC_US, ULOC_UK, ULOC_CANADA, ULOC_CANADA_FRENCH};
diff --git a/chrome/browser/chromeos/arc/arc_util_unittest.cc b/chrome/browser/chromeos/arc/arc_util_unittest.cc index d36a5c1..e037dace 100644 --- a/chrome/browser/chromeos/arc/arc_util_unittest.cc +++ b/chrome/browser/chromeos/arc/arc_util_unittest.cc
@@ -653,6 +653,20 @@ user_manager::USER_TYPE_PUBLIC_ACCOUNT); EXPECT_EQ(ash::mojom::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE, IsAssistantAllowedForProfile(profile())); + + chromeos::DemoSession::SetDemoConfigForTesting( + chromeos::DemoSession::DemoModeConfig::kNone); +} + +TEST_F(ChromeArcUtilTest, IsAssistantAllowedForProfile_PublicSession) { + base::CommandLine::ForCurrentProcess()->InitFromArgv( + {"", "--arc-availability=officially-supported", + "--enable-voice-interaction"}); + ScopedLogIn login(GetFakeUserManager(), + AccountId::FromUserEmail(profile()->GetProfileUserName()), + user_manager::USER_TYPE_PUBLIC_ACCOUNT); + EXPECT_EQ(ash::mojom::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION, + IsAssistantAllowedForProfile(profile())); } // Test the AreArcAllOptInPreferencesIgnorableForProfile() function.
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc index f20580a..99d9b65 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -1296,45 +1296,6 @@ SendResponse(true); } -bool FileManagerPrivateInternalGetShareUrlFunction::RunAsync() { - using extensions::api::file_manager_private_internal::GetShareUrl::Params; - const std::unique_ptr<Params> params(Params::Create(*args_)); - EXTENSION_FUNCTION_VALIDATE(params); - - const base::FilePath path = file_manager::util::GetLocalPathFromURL( - render_frame_host(), GetProfile(), GURL(params->url)); - DCHECK(drive::util::IsUnderDriveMountPoint(path)); - - const base::FilePath drive_path = drive::util::ExtractDrivePath(path); - - drive::FileSystemInterface* const file_system = - drive::util::GetFileSystemByProfile(GetProfile()); - if (!file_system) { - // |file_system| is NULL if Drive is disabled. - return false; - } - - file_system->GetShareUrl( - drive_path, - GURL("chrome-extension://" + extension_id()), // embed origin - base::Bind(&FileManagerPrivateInternalGetShareUrlFunction::OnGetShareUrl, - this)); - return true; -} - -void FileManagerPrivateInternalGetShareUrlFunction::OnGetShareUrl( - drive::FileError error, - const GURL& share_url) { - if (error != drive::FILE_ERROR_OK) { - SetError("Share Url for this item is not available."); - SendResponse(false); - return; - } - - SetResult(std::make_unique<base::Value>(share_url.spec())); - SendResponse(true); -} - bool FileManagerPrivateInternalRequestDriveShareFunction::RunAsync() { using extensions::api::file_manager_private_internal::RequestDriveShare:: Params; @@ -1398,7 +1359,7 @@ ~FileManagerPrivateInternalGetDownloadUrlFunction() = default; bool FileManagerPrivateInternalGetDownloadUrlFunction::RunAsync() { - using extensions::api::file_manager_private_internal::GetShareUrl::Params; + using extensions::api::file_manager_private_internal::GetDownloadUrl::Params; const std::unique_ptr<Params> params(Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params);
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h index 6a65ea19..5cb6682 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
@@ -210,24 +210,6 @@ const std::string& access_token); }; -// Implements the chrome.fileManagerPrivate.getShareUrl method. -class FileManagerPrivateInternalGetShareUrlFunction - : public LoggedAsyncExtensionFunction { - public: - DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.getShareUrl", - FILEMANAGERPRIVATEINTERNAL_GETSHAREURL) - - protected: - ~FileManagerPrivateInternalGetShareUrlFunction() override = default; - - // ChromeAsyncExtensionFunction overrides. - bool RunAsync() override; - - // Callback with an url to the sharing dialog as |share_url|, called by - // FileSystem::GetShareUrl. - void OnGetShareUrl(drive::FileError error, const GURL& share_url); -}; - // Implements the chrome.fileManagerPrivate.requestDriveShare method. class FileManagerPrivateInternalRequestDriveShareFunction : public LoggedAsyncExtensionFunction {
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc index 8a8ecdb..a9bbb039 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
@@ -6,6 +6,7 @@ #include <memory> #include <string> +#include <utility> #include "base/files/file_util.h" #include "base/format_macros.h" @@ -135,9 +136,9 @@ } file_system->IsCacheFileMarkedAsMounted( - drive_path, base::Bind(&FileManagerPrivateAddMountFunction:: - RunAfterIsCacheFileMarkedAsMounted, - this, drive_path, cache_path)); + drive_path, base::BindOnce(&FileManagerPrivateAddMountFunction:: + RunAfterIsCacheFileMarkedAsMounted, + this, drive_path, cache_path)); } void FileManagerPrivateAddMountFunction::RunAfterIsCacheFileMarkedAsMounted( @@ -167,10 +168,9 @@ } file_system->MarkCacheFileAsMounted( drive_path, - base::Bind( + base::BindOnce( &FileManagerPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted, - this, - drive_path.BaseName())); + this, drive_path.BaseName())); } void FileManagerPrivateAddMountFunction::RunAfterMarkCacheFileAsMounted( @@ -312,9 +312,10 @@ // doesn't give bad side effect. if (is_mounted) { file_system->MarkCacheFileAsMounted( - drive_path, base::Bind(&FileManagerPrivateMarkCacheAsMountedFunction:: - RunAfterMarkCacheFileAsMounted, - this)); + drive_path, + base::BindOnce(&FileManagerPrivateMarkCacheAsMountedFunction:: + RunAfterMarkCacheFileAsMounted, + this)); } else { file_system->MarkCacheFileAsUnmounted( cache_path, base::Bind(&FileManagerPrivateMarkCacheAsMountedFunction::
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index 73328137..308b295 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -434,7 +434,9 @@ ShareAndManageDialog, /* share_and_manage_dialog.js */ FilesAppBrowserTest, ::testing::Values(TestCase("shareFileDrive"), + TestCase("shareFileDrive").EnableDriveFs(), TestCase("shareDirectoryDrive"), + TestCase("shareDirectoryDrive").EnableDriveFs(), TestCase("manageHostedFileDrive"), TestCase("manageHostedFileDrive").EnableDriveFs(), TestCase("manageFileDrive"),
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc index c51200f..9ae88bd 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -767,12 +767,6 @@ } } - // Sets the url base for the test server to be used to generate share urls - // on the files and directories. - virtual void ConfigureShareUrlBase(const GURL& share_url_base) { - fake_drive_service_->set_share_url_base(share_url_base); - } - drive::DriveIntegrationService* CreateDriveIntegrationService( Profile* profile) { if (!CreateRootDirectory(profile)) @@ -850,8 +844,6 @@ ASSERT_TRUE(UpdateModifiedTime(entry)); } - void ConfigureShareUrlBase(const GURL& share_url_base) override {} - private: base::RepeatingCallback< std::unique_ptr<drivefs::DriveFsHost::MojoConnectionDelegate>()> @@ -1048,12 +1040,9 @@ CHECK(local_volume_->Mount(profile())); if (!IsGuestModeTest()) { - // Start the embedded test server to serve the mocked share dialog. + // Start the embedded test server to serve the mocked CWS widget container. CHECK(embedded_test_server()->Start()); - const GURL share_url_base(embedded_test_server()->GetURL( - "/chromeos/file_manager/share_dialog_mock/index.html")); drive_volume_ = drive_volumes_[profile()->GetOriginalProfile()].get(); - drive_volume_->ConfigureShareUrlBase(share_url_base); test_util::WaitUntilDriveMountPointIsAdded(profile()); // Init crostini. Set prefs to enable crostini and register
diff --git a/chrome/browser/download/download_shelf_controller.cc b/chrome/browser/download/download_shelf_controller.cc index 57f24ee..38eea15 100644 --- a/chrome/browser/download/download_shelf_controller.cc +++ b/chrome/browser/download/download_shelf_controller.cc
@@ -25,7 +25,7 @@ void DownloadShelfController::OnItemRemoved(const ContentId& id) { OfflineItemModelManagerFactory::GetForBrowserContext(profile_) - ->RemoveOfflineItemModel(id); + ->RemoveOfflineItemModelData(id); } void DownloadShelfController::OnItemUpdated(const OfflineItem& item) { @@ -34,15 +34,15 @@ OfflineItemModelManager* manager = OfflineItemModelManagerFactory::GetForBrowserContext(profile_); - OfflineItemModel* model = manager->GetOrCreateOfflineItemModel(item); - - if (!model->was_ui_notified()) { - OnNewOfflineItemReady(item); - model->set_was_ui_notified(true); + OfflineItemModel model(manager, item); + if (!model.WasUINotified()) { + model.SetWasUINotified(true); + OnNewOfflineItemReady(model); } } -void DownloadShelfController::OnNewOfflineItemReady(const OfflineItem& item) { +void DownloadShelfController::OnNewOfflineItemReady( + const OfflineItemModel& item) { Browser* browser = browser = chrome::FindLastActiveWithProfile(profile_); if (browser && browser->window()) {
diff --git a/chrome/browser/download/download_shelf_controller.h b/chrome/browser/download/download_shelf_controller.h index e31acd4..6634e42087 100644 --- a/chrome/browser/download/download_shelf_controller.h +++ b/chrome/browser/download/download_shelf_controller.h
@@ -31,7 +31,7 @@ void OnItemUpdated(const OfflineItem& item) override; // Called when a new OfflineItem is to be displayed on UI. - void OnNewOfflineItemReady(const OfflineItem& item); + void OnNewOfflineItemReady(const OfflineItemModel& item); Profile* profile_;
diff --git a/chrome/browser/download/offline_item_model.cc b/chrome/browser/download/offline_item_model.cc index aae73de..5675f04c 100644 --- a/chrome/browser/download/offline_item_model.cc +++ b/chrome/browser/download/offline_item_model.cc
@@ -4,8 +4,39 @@ #include "chrome/browser/download/offline_item_model.h" +#include "chrome/browser/download/offline_item_model_manager.h" + OfflineItemModel::OfflineItemModel( + OfflineItemModelManager* manager, const offline_items_collection::OfflineItem& offline_item) - : was_ui_notified_(false) {} + : manager_(manager), offline_item_(offline_item) {} OfflineItemModel::~OfflineItemModel() = default; + +int64_t OfflineItemModel::GetCompletedBytes() const { + return offline_item_.received_bytes; +} + +int64_t OfflineItemModel::GetTotalBytes() const { + return offline_item_.total_size_bytes > 0 ? offline_item_.total_size_bytes + : 0; +} + +int OfflineItemModel::PercentComplete() const { + if (GetTotalBytes() <= 0) + return -1; + + return static_cast<int>(GetCompletedBytes() * 100.0 / GetTotalBytes()); +} + +bool OfflineItemModel::WasUINotified() const { + const OfflineItemModelData* data = + manager_->GetOrCreateOfflineItemModelData(offline_item_.id); + return data->was_ui_notified_; +} + +void OfflineItemModel::SetWasUINotified(bool was_ui_notified) { + OfflineItemModelData* data = + manager_->GetOrCreateOfflineItemModelData(offline_item_.id); + data->was_ui_notified_ = was_ui_notified; +}
diff --git a/chrome/browser/download/offline_item_model.h b/chrome/browser/download/offline_item_model.h index ee82144f..fe786d6 100644 --- a/chrome/browser/download/offline_item_model.h +++ b/chrome/browser/download/offline_item_model.h
@@ -7,23 +7,40 @@ #include "components/offline_items_collection/core/offline_item.h" +class OfflineItemModelManager; + // This class is an abstraction for common UI tasks and properties associated -// with an OfflineItem. +// with an OfflineItem. This item is short lived, all the state needs be stored +// in OfflineItemModelData. class OfflineItemModel { public: // Constructs a OfflineItemModel. - explicit OfflineItemModel( - const offline_items_collection::OfflineItem& offline_item); + OfflineItemModel(OfflineItemModelManager* manager, + const offline_items_collection::OfflineItem& offline_item); ~OfflineItemModel(); - bool was_ui_notified() const { return was_ui_notified_; } + // Get the number of bytes that has completed so far. + int64_t GetCompletedBytes() const; - void set_was_ui_notified(bool was_ui_notified) { - was_ui_notified_ = was_ui_notified; - } + // Get the total number of bytes for this download. Should return 0 if the + // total size of the download is not known. + int64_t GetTotalBytes() const; + + // Rough percent complete. Returns -1 if the progress is unknown. + int PercentComplete() const; + + // Returns |true| if the UI has been notified about this download. By default, + // this value is |false| and should be changed explicitly using + // SetWasUINotified(). + bool WasUINotified() const; + + // Change what's returned by WasUINotified(). + void SetWasUINotified(bool should_notify); private: - bool was_ui_notified_; + OfflineItemModelManager* manager_; + + offline_items_collection::OfflineItem offline_item_; DISALLOW_COPY_AND_ASSIGN(OfflineItemModel); };
diff --git a/chrome/browser/download/offline_item_model_data.h b/chrome/browser/download/offline_item_model_data.h new file mode 100644 index 0000000..bcf7ea1d --- /dev/null +++ b/chrome/browser/download/offline_item_model_data.h
@@ -0,0 +1,15 @@ +// 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 CHROME_BROWSER_DOWNLOAD_OFFLINE_ITEM_MODEL_DATA_H_ +#define CHROME_BROWSER_DOWNLOAD_OFFLINE_ITEM_MODEL_DATA_H_ + +// Per OfflineItem data used by OfflineItemModel. The model doesn't keep any +// state, all the state will be stored in this class. +struct OfflineItemModelData { + // Whether the UI has been notified about this offline item. + bool was_ui_notified_ = false; +}; + +#endif // CHROME_BROWSER_DOWNLOAD_OFFLINE_ITEM_MODEL_DATA_H_
diff --git a/chrome/browser/download/offline_item_model_manager.cc b/chrome/browser/download/offline_item_model_manager.cc index bdd9bcf..e8b8d179 100644 --- a/chrome/browser/download/offline_item_model_manager.cc +++ b/chrome/browser/download/offline_item_model_manager.cc
@@ -8,16 +8,15 @@ OfflineItemModelManager::~OfflineItemModelManager() = default; -OfflineItemModel* OfflineItemModelManager::GetOrCreateOfflineItemModel( - const OfflineItem& offline_item) { - auto it = offline_item_models_.find(offline_item.id); - if (it != offline_item_models_.end()) +OfflineItemModelData* OfflineItemModelManager::GetOrCreateOfflineItemModelData( + const ContentId& id) { + auto it = offline_item_model_data_.find(id); + if (it != offline_item_model_data_.end()) return it->second.get(); - offline_item_models_[offline_item.id] = - std::make_unique<OfflineItemModel>(offline_item); - return offline_item_models_[offline_item.id].get(); + offline_item_model_data_[id] = std::make_unique<OfflineItemModelData>(); + return offline_item_model_data_[id].get(); } -void OfflineItemModelManager::RemoveOfflineItemModel(const ContentId& id) { - offline_item_models_.erase(id); +void OfflineItemModelManager::RemoveOfflineItemModelData(const ContentId& id) { + offline_item_model_data_.erase(id); }
diff --git a/chrome/browser/download/offline_item_model_manager.h b/chrome/browser/download/offline_item_model_manager.h index c50961e..d66b00f 100644 --- a/chrome/browser/download/offline_item_model_manager.h +++ b/chrome/browser/download/offline_item_model_manager.h
@@ -7,12 +7,11 @@ #include <memory> -#include "chrome/browser/download/offline_item_model.h" +#include "chrome/browser/download/offline_item_model_data.h" #include "components/keyed_service/core/keyed_service.h" #include "components/offline_items_collection/core/offline_item.h" using ContentId = offline_items_collection::ContentId; -using OfflineItem = offline_items_collection::OfflineItem; // Class for managing all the OfflineModels for a profile. class OfflineItemModelManager : public KeyedService { @@ -23,13 +22,13 @@ // Returns the OfflineItemModel for the ContentId, if not found, an empty // OfflineItemModel will be created and returned. - OfflineItemModel* GetOrCreateOfflineItemModel( - const OfflineItem& offline_item); + OfflineItemModelData* GetOrCreateOfflineItemModelData(const ContentId& id); - void RemoveOfflineItemModel(const ContentId& id); + void RemoveOfflineItemModelData(const ContentId& id); private: - std::map<ContentId, std::unique_ptr<OfflineItemModel>> offline_item_models_; + std::map<ContentId, std::unique_ptr<OfflineItemModelData>> + offline_item_model_data_; DISALLOW_COPY_AND_ASSIGN(OfflineItemModelManager); };
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index cd8f6d3c..32f9ff29 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -287,6 +287,24 @@ std::move(params)); return loader_factory; } + + void InstallWebRequestExtension(const std::string& name) { + constexpr char kManifest[] = R"({ + "name": "%s", + "version": "1", + "manifest_version": 2, + "permissions": [ + "webRequest" + ] + })"; + auto dir = std::make_unique<TestExtensionDir>(); + dir->WriteManifest(base::StringPrintf(kManifest, name.c_str())); + LoadExtension(dir->UnpackedPath()); + test_dirs_.push_back(std::move(dir)); + } + + private: + std::vector<std::unique_ptr<TestExtensionDir>> test_dirs_; }; class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { @@ -1305,18 +1323,16 @@ if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) return; - auto* web_request_api = - extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get( - profile()); - web_request_api->OnListenerAdded( - EventListenerInfo("name", "id1", GURL(), profile())); + InstallWebRequestExtension("extension"); network::mojom::WebSocketPtr web_socket; network::mojom::WebSocketRequest request = mojo::MakeRequest(&web_socket); network::mojom::AuthenticationHandlerPtr auth_handler; content::RenderFrameHost* host = browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame(); - web_request_api->MaybeProxyWebSocket(host, &request, &auth_handler); + extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get( + profile()) + ->MaybeProxyWebSocket(host, &request, &auth_handler); content::BrowserContext::GetDefaultStoragePartition(profile()) ->GetNetworkContext() ->CreateWebSocket(std::move(request), network::mojom::kBrowserProcessId, @@ -1547,11 +1563,7 @@ loader_factory.set_connection_error_handler( base::BindLambdaForTesting([&]() { has_connection_error = true; })); - auto* web_request_api = - extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get( - profile()); - web_request_api->OnListenerAdded( - EventListenerInfo("name", "id1", GURL(), profile())); + InstallWebRequestExtension("extension1"); content::BrowserContext::GetDefaultStoragePartition(profile()) ->FlushNetworkInterfaceForTesting(); EXPECT_TRUE(has_connection_error); @@ -1561,8 +1573,7 @@ has_connection_error = false; loader_factory.set_connection_error_handler( base::BindLambdaForTesting([&]() { has_connection_error = true; })); - web_request_api->OnListenerAdded( - EventListenerInfo("name", "id2", GURL(), profile())); + InstallWebRequestExtension("extension2"); content::BrowserContext::GetDefaultStoragePartition(profile()) ->FlushNetworkInterfaceForTesting(); EXPECT_FALSE(has_connection_error); @@ -1585,14 +1596,14 @@ // Create a WebRequestAPI instance that we can control the lifetime of. auto api = std::make_unique<WebRequestAPI>(tmp_profile); - // Add a listener to make sure we proxy. - api->OnListenerAdded(EventListenerInfo("name", "id1", GURL(), tmp_profile)); + // Make sure we are proxying for |tmp_profile|. + api->ForceProxyForTesting(); content::BrowserContext::GetDefaultStoragePartition(tmp_profile) ->FlushNetworkInterfaceForTesting(); network::mojom::URLLoaderFactoryPtr factory; auto request = mojo::MakeRequest(&factory); - api->MaybeProxyURLLoaderFactory(nullptr, false, &request); + EXPECT_TRUE(api->MaybeProxyURLLoaderFactory(nullptr, false, &request)); auto params = network::mojom::URLLoaderFactoryParams::New(); params->process_id = 0; content::BrowserContext::GetDefaultStoragePartition(tmp_profile)
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc index 49ddf26..4cfcc67 100644 --- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc +++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -1019,6 +1019,13 @@ // Even with an all-hosts like pattern, we shouldn't show controls if // the extension can't run on the origin. {"https://*.com/*", "https://*.com/*", GURL("https://chromium.org"), {}}, + // No controls should ever show for restricted pages, like + // chrome:-scheme pages or the webstore. + {"<all_urls>", "<all_urls>", GURL("chrome://extensions"), {}}, + {"<all_urls>", + "<all_urls>", + ExtensionsClient::Get()->GetWebstoreBaseURL(), + {}}, }; // Add a web contents to the browser.
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc index e5b9ac55..ca31aac 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -217,13 +217,20 @@ DCHECK(granted_permissions); + const bool is_restricted_site = + extension_->permissions_data()->IsRestrictedUrl(url, /*error=*/nullptr); + // For indicating whether an extension has access to a site, we look at the // granted permissions, which could include patterns that weren't explicitly // requested. However, we should still indicate they are granted, so that the // user can revoke them (and because if the extension does request them and // they are already granted, they are silently added). - if (granted_permissions->effective_hosts().MatchesSecurityOrigin(url)) + // The extension should never have access to restricted sites (even if a + // pattern matches, as it may for e.g. the webstore). + if (!is_restricted_site && + granted_permissions->effective_hosts().MatchesSecurityOrigin(url)) { access.has_site_access = true; + } const PermissionSet& withheld_permissions = extension_->permissions_data()->withheld_permissions(); @@ -231,8 +238,11 @@ // Be sure to check |access.has_site_access| in addition to withheld // permissions, so that we don't indicate we've withheld permission if an // extension is granted https://a.com/*, but has *://*/* withheld. - if (withheld_permissions.effective_hosts().MatchesSecurityOrigin(url) && - !access.has_site_access) { + // We similarly don't show access as withheld for restricted sites, since + // withheld permissions should only include those that are conceivably + // grantable. + if (!is_restricted_site && !access.has_site_access && + withheld_permissions.effective_hosts().MatchesSecurityOrigin(url)) { access.withheld_site_access = true; } @@ -250,6 +260,10 @@ void ScriptingPermissionsModifier::GrantHostPermission(const GURL& url) { DCHECK(CanAffectExtension()); + // Check that we don't grant host permission to a restricted URL. + DCHECK( + !extension_->permissions_data()->IsRestrictedUrl(url, /*error=*/nullptr)) + << "Cannot grant access to a restricted URL."; URLPatternSet explicit_hosts; explicit_hosts.AddOrigin(Extension::kValidHostPermissionSchemes, url);
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc index 72293d7..f1e8dc63 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -594,6 +594,30 @@ EXPECT_FALSE(site_access.withheld_all_sites_access); } + // Chrome pages should be restricted, and the extension shouldn't have access + // to them granted or withheld. + const GURL chrome_extensions("chrome://extensions"); + { + const ScriptingPermissionsModifier::SiteAccess site_access = + modifier.GetSiteAccess(chrome_extensions); + EXPECT_FALSE(site_access.has_site_access); + EXPECT_FALSE(site_access.withheld_site_access); + EXPECT_TRUE(site_access.has_all_sites_access); + EXPECT_FALSE(site_access.withheld_all_sites_access); + } + + // Other restricted urls should also be protected, and the extension shouldn't + // have or want access. + const GURL webstore = ExtensionsClient::Get()->GetWebstoreBaseURL(); + { + const ScriptingPermissionsModifier::SiteAccess site_access = + modifier.GetSiteAccess(webstore); + EXPECT_FALSE(site_access.has_site_access); + EXPECT_FALSE(site_access.withheld_site_access); + EXPECT_TRUE(site_access.has_all_sites_access); + EXPECT_FALSE(site_access.withheld_all_sites_access); + } + modifier.SetWithholdHostPermissions(true); { const ScriptingPermissionsModifier::SiteAccess site_access = @@ -604,6 +628,16 @@ EXPECT_TRUE(site_access.withheld_all_sites_access); } + // Restricted sites should not be considered "withheld". + { + const ScriptingPermissionsModifier::SiteAccess site_access = + modifier.GetSiteAccess(chrome_extensions); + EXPECT_FALSE(site_access.has_site_access); + EXPECT_FALSE(site_access.withheld_site_access); + EXPECT_FALSE(site_access.has_all_sites_access); + EXPECT_TRUE(site_access.withheld_all_sites_access); + } + modifier.GrantHostPermission(example_com); { const ScriptingPermissionsModifier::SiteAccess site_access =
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index 2036d48..e080b8a5 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -284,17 +284,11 @@ EXPECT_FALSE(process_manager()->GetBackgroundHostForExtension(extension_id)); } -#if defined(OS_LINUX) -// Disabled on Linux due to flakes; see https://crbug.com/855800. -#define MAYBE_Basic DISABLED_Basic -#else -#define MAYBE_Basic Basic -#endif // After browser restarts, this test step ensures that opening a tab fires // tabs.onCreated event listener to the extension without explicitly loading the // extension. This is because the extension registered a listener before browser // restarted in PRE_Basic. -IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, MAYBE_Basic) { +IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, Basic) { ExtensionTestMessageListener newtab_listener("CREATED", false); newtab_listener.set_failure_message("CREATE_FAILED"); const GURL url = embedded_test_server()->GetURL("/extensions/test_file.html"); @@ -1064,9 +1058,7 @@ lazy_observer.Wait(); } -// Flaky: http://crbug/834200. -IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest, - DISABLED_EventsAfterRestart) { +IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest, EventsAfterRestart) { ExtensionTestMessageListener newtab_listener("hello-newtab", false); content::WebContents* new_web_contents = AddTab(browser(), GURL(url::kAboutBlankURL));
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 9fdee00..e0746e94 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -47,6 +47,12 @@ const char kAndroidMessagesIntegrationDescription[] = "Enables Chrome OS integration with Android messages."; +const char kAndroidMessagesProdEndpointName[] = + "Use Android Messages prod endpoint"; +const char kAndroidMessagesProdEndpointDescription[] = + "For Android Messages integration, point to the prod endpoint instead of " + "sandbox."; + const char kAppBannersName[] = "App Banners"; const char kAppBannersDescription[] = "Enable the display of Progressive Web App banners, which prompt a user to "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 2ef9733..b62169e 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -55,6 +55,9 @@ extern const char kAndroidMessagesIntegrationName[]; extern const char kAndroidMessagesIntegrationDescription[]; +extern const char kAndroidMessagesProdEndpointName[]; +extern const char kAndroidMessagesProdEndpointDescription[]; + extern const char kAppBannersName[]; extern const char kAppBannersDescription[];
diff --git a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc index 4475199..756ef72 100644 --- a/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc +++ b/chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_browsertest.cc
@@ -132,18 +132,6 @@ DISALLOW_COPY_AND_ASSIGN(ChromeMimeHandlerViewBrowserPluginTest); }; -class ChromeMimeHandlerViewBrowserPluginScrollTest - : public ChromeMimeHandlerViewBrowserPluginTest { - public: - void SetUpCommandLine(base::CommandLine* command_line) override { - ChromeMimeHandlerViewBrowserPluginTest::SetUpCommandLine(command_line); - - command_line->AppendSwitchASCII( - switches::kTouchEventFeatureDetection, - switches::kTouchEventFeatureDetectionEnabled); - } -}; - // Helper class to monitor focus on a WebContents with BrowserPlugin (guest). class FocusChangeWaiter { public: @@ -331,53 +319,20 @@ ASSERT_FALSE(IsWebContentsBrowserPluginFocused(guest_web_contents())); } } - -// This verifies the fix for crbug.com/694393 . -IN_PROC_BROWSER_TEST_F(ChromeMimeHandlerViewBrowserPluginScrollTest, - OverscrollControllerSeesConsumedScrollsInGuest) { - InitializeTestPage(embedded_test_server()->GetURL("/test_embedded.html")); - - // Part of set-up and making sure that pages respond to user scroll. - ASSERT_TRUE(ExecuteScript(guest_web_contents(), "ensurePageIsScrollable();")); - ASSERT_TRUE( - ExecuteScript(embedder_web_contents(), "ensurePageIsScrollable()")); - - content::RenderFrameSubmissionObserver embedder_frame_observer( - embedder_web_contents()); - content::RenderFrameSubmissionObserver guest_frame_observer( - guest_web_contents()); - - gfx::Rect embedder_rect = embedder_web_contents()->GetContainerBounds(); - gfx::Rect guest_rect = guest_web_contents()->GetContainerBounds(); - guest_rect.set_x(guest_rect.x() - embedder_rect.x()); - guest_rect.set_y(guest_rect.y() - embedder_rect.y()); - - gfx::Vector2dF default_offset; - guest_frame_observer.WaitForScrollOffset(default_offset); - embedder_frame_observer.WaitForScrollOffset(default_offset); - - content::RenderWidgetHostView* embedder_host_view = - embedder_web_contents()->GetRenderWidgetHostView(); - // If we scroll the guest, the OverscrollController for the - // RenderWidgetHostViewAura should see that the scroll was consumed. - // If it doesn't, this test will time out indicating failure. - content::MockOverscrollController* mock_overscroll_controller = - content::MockOverscrollController::Create(embedder_host_view); - - gfx::Point guest_scroll_location(guest_rect.width() / 2, - guest_rect.height() / 2); - - float gesture_distance = 15.f; - // It's sufficient to scroll vertically, since all we need to test is that - // the OverscrollController sees consumed scrolls. - content::SimulateGestureScrollSequence(guest_web_contents(), - guest_scroll_location, - gfx::Vector2dF(0, -gesture_distance)); - - mock_overscroll_controller->WaitForConsumedScroll(); -} #endif // USE_AURA +class ChromeMimeHandlerViewBrowserPluginScrollTest + : public ChromeMimeHandlerViewBrowserPluginTest { + public: + void SetUpCommandLine(base::CommandLine* command_line) override { + ChromeMimeHandlerViewBrowserPluginTest::SetUpCommandLine(command_line); + + command_line->AppendSwitchASCII( + switches::kTouchEventFeatureDetection, + switches::kTouchEventFeatureDetectionEnabled); + } +}; + #if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX) #define MAYBE_ScrollGuestContent DISABLED_ScrollGuestContent #else
diff --git a/chrome/browser/notifications/win/notification_image_retainer.cc b/chrome/browser/notifications/win/notification_image_retainer.cc index e595d41..c89d0e3 100644 --- a/chrome/browser/notifications/win/notification_image_retainer.cc +++ b/chrome/browser/notifications/win/notification_image_retainer.cc
@@ -82,8 +82,8 @@ // To minimize the risk of collisions, separate each request by subdirectory // generated from hashes of the profile and the origin. Each file within the // subdirectory will also be given a unique filename. - base::string16 directory = base::UintToString16(base::Hash( - base::UTF8ToUTF16(profile_id) + base::UTF8ToUTF16(origin.spec()))); + base::string16 directory = + base::UintToString16(base::Hash(profile_id + origin.spec())); FilePath temp_file = WriteDataToTmpFile(image_directory_, directory, image.As1xPNGBytes());
diff --git a/chrome/browser/notifications/win/notification_image_retainer_unittest.cc b/chrome/browser/notifications/win/notification_image_retainer_unittest.cc index a6a029b..5a8cf86f 100644 --- a/chrome/browser/notifications/win/notification_image_retainer_unittest.cc +++ b/chrome/browser/notifications/win/notification_image_retainer_unittest.cc
@@ -41,8 +41,7 @@ base::string16 CalculateHash(const std::string& profile_id, const GURL& origin) { - return base::UintToString16(base::Hash(base::UTF8ToUTF16(profile_id) + - base::UTF8ToUTF16(origin.spec()))); + return base::UintToString16(base::Hash(profile_id + origin.spec())); } private:
diff --git a/chrome/browser/printing/pdf_nup_converter_client.cc b/chrome/browser/printing/pdf_nup_converter_client.cc index b8adf0b..647ccd9 100644 --- a/chrome/browser/printing/pdf_nup_converter_client.cc +++ b/chrome/browser/printing/pdf_nup_converter_client.cc
@@ -23,10 +23,11 @@ int document_cookie, uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions, mojom::PdfNupConverter::NupPageConvertCallback callback) { auto& nup_converter = GetPdfNupConverterRequest(document_cookie); - nup_converter->NupPageConvert(pages_per_sheet, page_size, + nup_converter->NupPageConvert(pages_per_sheet, page_size, printable_area, std::move(pdf_page_regions), std::move(callback)); } @@ -35,11 +36,12 @@ int document_cookie, uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, base::ReadOnlySharedMemoryRegion src_pdf_document, mojom::PdfNupConverter::NupDocumentConvertCallback callback) { auto& nup_converter = GetPdfNupConverterRequest(document_cookie); nup_converter->NupDocumentConvert( - pages_per_sheet, page_size, std::move(src_pdf_document), + pages_per_sheet, page_size, printable_area, std::move(src_pdf_document), base::BindOnce(&PdfNupConverterClient::OnDidNupPdfDocumentConvert, base::Unretained(this), document_cookie, std::move(callback)));
diff --git a/chrome/browser/printing/pdf_nup_converter_client.h b/chrome/browser/printing/pdf_nup_converter_client.h index 33b0d84d..4c32505a 100644 --- a/chrome/browser/printing/pdf_nup_converter_client.h +++ b/chrome/browser/printing/pdf_nup_converter_client.h
@@ -29,12 +29,14 @@ int document_cookie, uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions, mojom::PdfNupConverter::NupPageConvertCallback callback); void DoNupPdfDocumentConvert( int document_cookie, uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, base::ReadOnlySharedMemoryRegion src_pdf_document, mojom::PdfNupConverter::NupDocumentConvertCallback callback);
diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc index 202ff9c..f2dd9861 100644 --- a/chrome/browser/printing/print_preview_message_handler.cc +++ b/chrome/browser/printing/print_preview_message_handler.cc
@@ -61,6 +61,25 @@ return page_number >= 0 && page_number < page_count; } +// Checks whether |printable_area| can be used to form a valid symmetrical +// printable area, so that margin_left equals margin_right, and margin_top +// equals margin_bottom. For example if +// printable_area.x() * 2 >= page_size.width(), then the +// content_width = page_size.width() - 2 * printable_area.x() would be zero or +// negative, which is invalid. +// |page_size| is the physical page size that includes margins. +bool IsValidPrintableArea(const gfx::Size& page_size, + const gfx::Rect& printable_area) { + return !printable_area.IsEmpty() && printable_area.x() >= 0 && + printable_area.y() >= 0 && + printable_area.right() <= page_size.width() && + printable_area.bottom() <= page_size.height() && + printable_area.x() * 2 < page_size.width() && + printable_area.y() * 2 < page_size.height() && + printable_area.right() * 2 > page_size.width() && + printable_area.bottom() * 2 > page_size.height(); +} + } // namespace PrintPreviewMessageHandler::PrintPreviewMessageHandler( @@ -339,11 +358,16 @@ std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions = print_preview_ui->TakePagesForNupConvert(); + gfx::Rect printable_area = GetSymmetricalPrintableArea( + print_preview_ui->page_size(), print_preview_ui->printable_area()); + if (printable_area.IsEmpty()) + return; + auto* client = PdfNupConverterClient::FromWebContents(web_contents()); DCHECK(client); client->DoNupPdfConvert( document_cookie, pages_per_sheet, print_preview_ui->page_size(), - std::move(pdf_page_regions), + printable_area, std::move(pdf_page_regions), base::BindOnce(&PrintPreviewMessageHandler::OnNupPdfConvertDone, weak_ptr_factory_.GetWeakPtr(), new_page_number, ids)); } @@ -395,9 +419,14 @@ auto* client = PdfNupConverterClient::FromWebContents(web_contents()); DCHECK(client); + gfx::Rect printable_area = GetSymmetricalPrintableArea( + print_preview_ui->page_size(), print_preview_ui->printable_area()); + if (printable_area.IsEmpty()) + return; + client->DoNupPdfDocumentConvert( document_cookie, pages_per_sheet, print_preview_ui->page_size(), - std::move(region), + printable_area, std::move(region), base::BindOnce(&PrintPreviewMessageHandler::OnNupPdfDocumentConvertDone, weak_ptr_factory_.GetWeakPtr(), (page_count + pages_per_sheet - 1) / pages_per_sheet, @@ -459,4 +488,24 @@ return handled; } +// static +gfx::Rect PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + const gfx::Size& page_size, + const gfx::Rect& printable_area) { + if (!IsValidPrintableArea(page_size, printable_area)) + return gfx::Rect(); + + int left_right_margin = + std::max(printable_area.x(), page_size.width() - printable_area.right()); + int top_bottom_margin = std::max( + printable_area.y(), page_size.height() - printable_area.bottom()); + int width = page_size.width() - 2 * left_right_margin; + int height = page_size.height() - 2 * top_bottom_margin; + + gfx::Rect symmetrical_printable_area = gfx::Rect(page_size); + symmetrical_printable_area.ClampToCenteredSize(gfx::Size(width, height)); + + return symmetrical_printable_area; +} + } // namespace printing
diff --git a/chrome/browser/printing/print_preview_message_handler.h b/chrome/browser/printing/print_preview_message_handler.h index 8e3dd31c..cf88ffc 100644 --- a/chrome/browser/printing/print_preview_message_handler.h +++ b/chrome/browser/printing/print_preview_message_handler.h
@@ -32,6 +32,7 @@ namespace gfx { class Rect; +class Size; } namespace printing { @@ -49,6 +50,11 @@ bool OnMessageReceived(const IPC::Message& message, content::RenderFrameHost* render_frame_host) override; + // Gets a symmetrical printable area. It is defined as a static function to + // make writing unit tests easier. + static gfx::Rect GetSymmetricalPrintableArea(const gfx::Size& page_size, + const gfx::Rect& printable_area); + private: friend class content::WebContentsUserData<PrintPreviewMessageHandler>;
diff --git a/chrome/browser/printing/print_preview_message_handler_unittest.cc b/chrome/browser/printing/print_preview_message_handler_unittest.cc new file mode 100644 index 0000000..c8401fc2 --- /dev/null +++ b/chrome/browser/printing/print_preview_message_handler_unittest.cc
@@ -0,0 +1,42 @@ +// 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. + +#include "chrome/browser/printing/print_preview_message_handler.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace printing { + +using PrintPreviewMessageHandlerTest = testing::Test; + +TEST_F(PrintPreviewMessageHandlerTest, GetSymmetricalPrintableArea) { + gfx::Rect printable_area = + PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(0, 0, 560, 750)); + EXPECT_EQ(gfx::Rect(52, 42, 508, 708), printable_area); + + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(50, 60, 550, 700)); + EXPECT_EQ(gfx::Rect(50, 60, 512, 672), printable_area); + + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(-1, 60, 520, 700)); + EXPECT_EQ(gfx::Rect(), printable_area); + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(50, -1, 520, 700)); + EXPECT_EQ(gfx::Rect(), printable_area); + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(100, 60, 520, 700)); + EXPECT_EQ(gfx::Rect(), printable_area); + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(50, 100, 520, 700)); + EXPECT_EQ(gfx::Rect(), printable_area); + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(400, 60, 212, 700)); + EXPECT_EQ(gfx::Rect(), printable_area); + printable_area = PrintPreviewMessageHandler::GetSymmetricalPrintableArea( + gfx::Size(612, 792), gfx::Rect(40, 600, 212, 192)); + EXPECT_EQ(gfx::Rect(), printable_area); +} + +} // namespace printing
diff --git a/chrome/browser/resources/about_invalidations.html b/chrome/browser/resources/about_invalidations.html index 7b892719..d49aa98 100644 --- a/chrome/browser/resources/about_invalidations.html +++ b/chrome/browser/resources/about_invalidations.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>Invalidations</title>
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html index ea388081..05135936 100644 --- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html +++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html
@@ -1,5 +1,5 @@ <!DOCTYPE HTML> -<html> +<html lang="en"> <!-- TODO(crbug.com/658814): Localize strings. --> <head>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.js index fb618d0..288e914 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel.js
@@ -847,12 +847,18 @@ // Watch for a blur on the panel. var pendingCallback = Panel.pendingCallback_; Panel.pendingCallback_ = null; - var onBlur = function(evt) { - if (evt.target.docUrl != location.href) + var onFocus = function(evt) { + if (evt.target.docUrl == location.href) return; desktop.removeEventListener( - chrome.automation.EventType.BLUR, onBlur, true); + chrome.automation.EventType.FOCUS, onFocus, true); + + // Clears focus on the page by focusing the root explicitly. This makes + // sure we don't get future focus events as a result of giving this entire + // page focus and that would have interfered with with our desired range. + if (evt.target.root) + evt.target.root.focus(); setTimeout(function() { if (pendingCallback) @@ -860,7 +866,7 @@ }, 0); }; - desktop.addEventListener(chrome.automation.EventType.BLUR, onBlur, true); + desktop.addEventListener(chrome.automation.EventType.FOCUS, onFocus, true); // Make sure all menus are cleared to avoid bogous output when we re-open. Panel.clearMenus();
diff --git a/chrome/browser/resources/chromeos/cryptohome.html b/chrome/browser/resources/chromeos/cryptohome.html index 9e11f11..64110c0 100644 --- a/chrome/browser/resources/chromeos/cryptohome.html +++ b/chrome/browser/resources/chromeos/cryptohome.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <title>About Cryptohome</title> <meta charset="utf-8">
diff --git a/chrome/browser/resources/chromeos/drive_internals.html b/chrome/browser/resources/chromeos/drive_internals.html index c67a0c0..9a3d82b 100644 --- a/chrome/browser/resources/chromeos/drive_internals.html +++ b/chrome/browser/resources/chromeos/drive_internals.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <title>drive-internals</title> <meta charset="utf-8">
diff --git a/chrome/browser/resources/chromeos/login/oobe_network.html b/chrome/browser/resources/chromeos/login/oobe_network.html index 2e4465d..67f7bdf 100644 --- a/chrome/browser/resources/chromeos/login/oobe_network.html +++ b/chrome/browser/resources/chromeos/login/oobe_network.html
@@ -14,7 +14,7 @@ icon2x="oobe-network-64:dialog-icon-wifi"> </hd-iron-icon> <h1 slot="title">[[i18nDynamic(locale, 'networkSectionTitle')]]</h1> - <div slot="subtitle"> + <div slot="subtitle" hidden$="[[isDemoModeSetup]]"> [[i18nDynamic(locale, 'networkSectionHint')]] </div> <div slot="footer" class="layout vertical">
diff --git a/chrome/browser/resources/chromeos/sys_internals/index.html b/chrome/browser/resources/chromeos/sys_internals/index.html index ecce429..1ca94540 100644 --- a/chrome/browser/resources/chromeos/sys_internals/index.html +++ b/chrome/browser/resources/chromeos/sys_internals/index.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html lang="en"> <!-- Copyright 2017 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be
diff --git a/chrome/browser/resources/chromeos/zip_archiver/unpacker-test/cpp/index.html b/chrome/browser/resources/chromeos/zip_archiver/unpacker-test/cpp/index.html index 7ab8863..a2e1e89 100644 --- a/chrome/browser/resources/chromeos/zip_archiver/unpacker-test/cpp/index.html +++ b/chrome/browser/resources/chromeos/zip_archiver/unpacker-test/cpp/index.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html lang="en"> <!-- Copyright 2014 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be
diff --git a/chrome/browser/resources/eoc_internals/eoc_internals.html b/chrome/browser/resources/eoc_internals/eoc_internals.html index a57a39f..1841605 100644 --- a/chrome/browser/resources/eoc_internals/eoc_internals.html +++ b/chrome/browser/resources/eoc_internals/eoc_internals.html
@@ -5,7 +5,7 @@ --> <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> @@ -135,4 +135,4 @@ </template> </div> </body> -</html> \ No newline at end of file +</html>
diff --git a/chrome/browser/resources/inspect/inspect.html b/chrome/browser/resources/inspect/inspect.html index 40ed76f..cdd1e51 100644 --- a/chrome/browser/resources/inspect/inspect.html +++ b/chrome/browser/resources/inspect/inspect.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <!-- Copyright (c) 2012 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be
diff --git a/chrome/browser/resources/interventions_internals/unsupported_page.html b/chrome/browser/resources/interventions_internals/unsupported_page.html index 733210f..e3cdfaf 100644 --- a/chrome/browser/resources/interventions_internals/unsupported_page.html +++ b/chrome/browser/resources/interventions_internals/unsupported_page.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width">
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css index 3c3f782..3d8910a 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.css +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -354,22 +354,27 @@ height: 64px; padding-left: 0; position: absolute; + text-align: right; user-select: none; width: 100%; } +html[dir=rtl] #bg-sel-footer { + text-align: left; +} + .bg-sel-footer-button { border: none; border-radius: 4px; - bottom: 16px; font-family: 'Roboto', arial, sans-serif; font-size: 12px; font-weight: 500; height: 32px; line-height: normal; + margin-top: 16px; min-width: 60px; padding: 0 16px; - position: absolute; + position: relative; text-align: center; transition-duration: 200ms; transition-property: background-color, color, box-shadow, border; @@ -384,12 +389,12 @@ #bg-sel-footer-done { background-color: rgb(241, 243, 244); color: rgb(128, 134, 139); - right: 16px; + margin-right: 16px; } html[dir=rtl] #bg-sel-footer-done { - left: 16px; - right: auto; + margin-left: 16px; + margin-right: 0; } #bg-sel-footer-cancel { @@ -397,13 +402,10 @@ border: 1px solid rgb(218, 220, 224); color: rgb(26, 115, 232); margin-right: 8px; - right: 78px; } html[dir=rtl] #bg-sel-footer-cancel { - left: 78px; margin-left: 8px; - right: auto; } #bg-sel-footer-cancel:hover {
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js index 16d1ea99..d32e295c 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.js +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -165,6 +165,13 @@ */ customBackgrounds.selectedTile = null; +/** + * Number of tiles that will be preloaded. + * @type {number} + * @const + */ +customBackgrounds.FIRST_N_TILES = 9; + /* Type of collection that is being browsed, needed in order * to return from the image dialog. * @type {int} @@ -612,6 +619,9 @@ imageData = photos; } + let preLoadTiles = []; + let postLoadTiles = []; + for (var i = 0; i < imageData.length; ++i) { let tileBackground = document.createElement('div'); tileBackground.classList.add( @@ -626,31 +636,23 @@ if (sourceIsChromeBackgrounds) { // TODO(crbug.com/854028): Remove this hardcoded check when wallpaper // previews are supported. - if (imageData[i].collectionId == 'solidcolors') { - var imageWithOverlay = [ - customBackgrounds.CUSTOM_BACKGROUND_OVERLAY, - 'url(' + imageData[i].thumbnailImageUrl + ')' - ].join(',').trim(); - tile.style.backgroundImage = imageWithOverlay; + if (imageData[i].collectionId === 'solidcolors') { tile.dataset.attributionLine1 = ''; tile.dataset.attributionLine2 = ''; tile.dataset.attributionActionUrl = ''; } else { - tile.style.backgroundImage = - 'url(' + imageData[i].thumbnailImageUrl + ')'; tile.dataset.attributionLine1 = - (imageData[i].attributions[0] != undefined ? + (imageData[i].attributions[0] !== undefined ? imageData[i].attributions[0] : ''); tile.dataset.attributionLine2 = - (imageData[i].attributions[1] != undefined ? + (imageData[i].attributions[1] !== undefined ? imageData[i].attributions[1] : ''); tile.dataset.attributionActionUrl = imageData[i].attributionActionUrl; } tile.setAttribute('aria-label', imageData[i].attributions[0]); tile.dataset.url = imageData[i].imageUrl; - fadeInImageTile(tile, imageData[i].thumbnailImageUrl); } else { tile.style.backgroundImage = 'url(' + imageData[i].thumbnailPhotoUrl + ')'; @@ -659,13 +661,20 @@ tile.dataset.attributionLine2 = ''; tile.dataset.attributionActionUrl = ''; tile.setAttribute('aria-label', configData.translatedStrings.photoLabel); - fadeInImageTile(tile, imageData[i].thumbnailPhotoUrl); } tile.id = 'img_tile_' + i; tile.dataset.tile_num = i; tile.tabIndex = -1; + //TODO(crbug.com/876814): Dynamically determine N based on the current + // window size + // Load the first FIRST_N_TILES tiles. + if (i < customBackgrounds.FIRST_N_TILES) + preLoadTiles.push(tile); + else + postLoadTiles.push(tile); + let tileInteraction = function(tile) { if (customBackgrounds.selectedTile) { customBackgrounds.removeSelectedState(customBackgrounds.selectedTile); @@ -738,13 +747,58 @@ tileBackground.appendChild(tile); tileContainer.appendChild(tileBackground); } + let tileGetsLoaded = 0; + for (let tile of preLoadTiles) { + loadTile(tile, imageData, () => { + // After the |FIRST_N_TILES| finish loading, the rest of the tiles start + // loading. + if (++tileGetsLoaded === preLoadTiles.length) { + postLoadTiles.forEach((tile) => loadTile(tile, imageData)); + } + }); + } + $(customBackgrounds.IDS.TILES).focus(); }; -let fadeInImageTile = (tile, imageUrl) => { +/** + * Add background image src to the tile and add animation for the tile once it + * successfully loaded. + * @param {Object} tile the tile that needs to be loaded. + * @param {object} imageData the source imageData. + * @param {?Function} countLoad If not null, called after the tile finishes + * loading. + */ +let loadTile = function(tile, imageData, countLoad) { + if (imageData[tile.dataset.tile_num].collectionId === 'solidcolors') { + tile.style.backgroundImage = [customBackgrounds.CUSTOM_BACKGROUND_OVERLAY, + 'url(' + imageData[tile.dataset.tile_num].thumbnailImageUrl + ')'].join( + ',').trim(); + } else { + tile.style.backgroundImage = 'url(' + + imageData[tile.dataset.tile_num].thumbnailImageUrl + ')' || 'url(' + + imageData[tile.dataset.tile_num].thumbnailPhotoUrl + ')'; + } + fadeInImageTile(tile, imageData[tile.dataset.tile_num].thumbnailImageUrl + || imageData[tile.dataset.tile_num].thumbnailPhotoUrl, countLoad); +}; + +/** + * Fade in effect for both collection and image tile. Once the image + * successfully loads, we can assume the background image with the same source + * has also loaded. Then, we set opacity for the tile to start the animation. + * @param {Object} tile The tile to add the fade in animation to. + * @param {string} imageUrl the image url for the tile + * @param {?Function} countLoad If not null, called after the tile finishes + * loading. + */ +let fadeInImageTile = function(tile, imageUrl, countLoad) { let image = new Image(); image.onload = () => { tile.style.opacity = '1'; + if (countLoad) { + countLoad(); + } }; image.src = imageUrl; };
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js index 03161f7..308b165 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.js +++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -330,9 +330,7 @@ let finishEditOrClose = (event) => { if (event.keyCode === KEYCODES.ENTER) { event.preventDefault(); - if ($(IDS.DONE).disabled) - closeDialog(); - else + if (!$(IDS.DONE).disabled) finishEditLink(); } };
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css index 9c11fae..fee0dc34 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.css +++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -886,16 +886,13 @@ display: none; outline: none; padding: 0 16px; + position: relative; } #error-notice:not(.has-link) #error-notice-link { display: none; } -#error-notice.has-link #error-notice-link { - display: inline; -} - #error-notice-link:hover, #error-notice-link:focus { text-decoration: underline;
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js index 46e18a4..7f2d7b0 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.js +++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -739,13 +739,14 @@ // Reset notification visibility once the animation is complete. notificationContainer.classList.remove(CLASSES.FLOAT_UP); let afterHide = (event) => { - if (event.propertyName == 'bottom') { + if (event.propertyName === 'bottom') { notification.classList.add(CLASSES.HIDE_NOTIFICATION); notification.classList.remove(CLASSES.HAS_LINK); notificationContainer.removeEventListener('transitionend', afterHide); } - // Focus on the omnibox after the notification is hidden. - window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes(); + // Blur the hidden items. + $(IDS.UNDO_LINK).blur(); + $(IDS.RESTORE_ALL_LINK).blur(); }; notificationContainer.addEventListener('transitionend', afterHide); } @@ -757,6 +758,8 @@ */ function onUndo() { hideNotification(); + // Focus on the omnibox after the notification is hidden. + window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes(); if (configData.isCustomLinksEnabled) { ntpApiHandle.undoCustomLinkAction(); } else if (lastBlacklistedTile != null) { @@ -771,6 +774,8 @@ */ function onRestoreAll() { hideNotification(); + // Focus on the omnibox after the notification is hidden. + window.chrome.embeddedSearch.searchBox.startCapturingKeyStrokes(); if (configData.isCustomLinksEnabled) { ntpApiHandle.resetCustomLinks(); } else {
diff --git a/chrome/browser/resources/local_state/local_state.html b/chrome/browser/resources/local_state/local_state.html index 0bb9e3ff..601a646 100644 --- a/chrome/browser/resources/local_state/local_state.html +++ b/chrome/browser/resources/local_state/local_state.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>Local State Debug Page</title>
diff --git a/chrome/browser/resources/media/media_engagement.html b/chrome/browser/resources/media/media_engagement.html index 8170845..3fc8168a 100644 --- a/chrome/browser/resources/media/media_engagement.html +++ b/chrome/browser/resources/media/media_engagement.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <title>Media Engagement</title> <meta charset="utf-8">
diff --git a/chrome/browser/resources/omnibox/omnibox.html b/chrome/browser/resources/omnibox/omnibox.html index 3f34ae2..ccaaa686 100644 --- a/chrome/browser/resources/omnibox/omnibox.html +++ b/chrome/browser/resources/omnibox/omnibox.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>Omnibox Debug Page</title>
diff --git a/chrome/browser/resources/print_preview/new/BUILD.gn b/chrome/browser/resources/print_preview/new/BUILD.gn index 7f7f060..bcf546e2 100644 --- a/chrome/browser/resources/print_preview/new/BUILD.gn +++ b/chrome/browser/resources/print_preview/new/BUILD.gn
@@ -72,6 +72,7 @@ "../data:invitation_store", "../data:measurement_system", "../data:user_info", + "//ui/webui/resources/cr_elements:cr_container_shadow_behavior", "//ui/webui/resources/js:event_tracker", "//ui/webui/resources/js:util", "//ui/webui/resources/js:webui_listener_tracker",
diff --git a/chrome/browser/resources/print_preview/new/app.html b/chrome/browser/resources/print_preview/new/app.html index cace13c..964e5a1 100644 --- a/chrome/browser/resources/print_preview/new/app.html +++ b/chrome/browser/resources/print_preview/new/app.html
@@ -1,5 +1,6 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_container_shadow_behavior.html"> <link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/cr.html"> @@ -60,7 +61,7 @@ width: 311px; } - #settingsSections { + #container { color: var(--google-grey-900); flex: 1; overflow: overlay; @@ -71,6 +72,21 @@ background-color: var(--google-grey-200); flex: 1; } + + #cr-container-shadow { + background-color: rgb(232, 234, 237); + height: 1px; + margin-bottom: -1px; + opacity: 0.3; + } + + #cr-container-shadow.has-shadow { + background-color: white; + box-shadow: inset 0 1px 2px 0 rgba(60, 64, 67, .3), + inset 0 1px 3px -1px rgba(60, 64, 67, .15); + height: 3px; + margin-bottom: -3px; + } </style> <print-preview-state id="state" state="{{state}}"></print-preview-state> <print-preview-model id="model" settings="{{settings}}" @@ -84,7 +100,7 @@ on-print-requested="onPrintRequested_" on-cancel-requested="onCancelRequested_"> </print-preview-header> - <div id="settingsSections"> + <div id="container"> <print-preview-destination-settings id="destinationSettings" destination="[[destination_]]" destination-store="[[destinationStore_]]"
diff --git a/chrome/browser/resources/print_preview/new/app.js b/chrome/browser/resources/print_preview/new/app.js index 07db69b7c..852c434 100644 --- a/chrome/browser/resources/print_preview/new/app.js +++ b/chrome/browser/resources/print_preview/new/app.js
@@ -14,7 +14,7 @@ Polymer({ is: 'print-preview-app', - behaviors: [SettingsBehavior], + behaviors: [SettingsBehavior, CrContainerShadowBehavior], properties: { /**
diff --git a/chrome/browser/resources/print_preview/new/header.html b/chrome/browser/resources/print_preview/new/header.html index 63d02523..a623bda 100644 --- a/chrome/browser/resources/print_preview/new/header.html +++ b/chrome/browser/resources/print_preview/new/header.html
@@ -16,7 +16,6 @@ <style include="print-preview-shared paper-button-style"> :host { background-color: white; - border-bottom: var(--print-preview-settings-border); display: block; padding-bottom: 8px; padding-inline-end: 16px;
diff --git a/chrome/browser/resources/sandbox_internals/sandbox_internals.html b/chrome/browser/resources/sandbox_internals/sandbox_internals.html index 0531ce6..7f4816b 100644 --- a/chrome/browser/resources/sandbox_internals/sandbox_internals.html +++ b/chrome/browser/resources/sandbox_internals/sandbox_internals.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1">
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html index be6cb91c..2470b37 100644 --- a/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_subpage.html
@@ -111,7 +111,7 @@ </paper-icon-button-light> </div> </div> - <cr-dialog id="forgetDeviceDialog" show-close-button="false"> + <cr-dialog id="forgetDeviceDialog"> <div slot="title">$i18n{multideviceForgetDeviceDialogHeading}</div> <div slot="body"> <div class="settings-box first">
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html index e1282d3..c2a503e 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_and_forms_page.html
@@ -59,7 +59,8 @@ <template is="dom-if" route-path="/payments"> <settings-subpage associated-control="[[$$('#paymentManagerButton')]]" - page-title="$i18n{creditCards}"> + page-title="$i18n{creditCards}" + learn-more-url="$i18n{paymentMethodsLearnMoreURL}"> <settings-payments-section id="paymentSection" prefs="{{prefs}}"> </settings-payments-section> </settings-subpage>
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_list.html b/chrome/browser/resources/settings/people_page/fingerprint_list.html index 42d5e7f..f9217a04 100644 --- a/chrome/browser/resources/settings/people_page/fingerprint_list.html +++ b/chrome/browser/resources/settings/people_page/fingerprint_list.html
@@ -55,7 +55,9 @@ <cr-input value="{{item}}" on-change="onFingerprintLabelChanged_"> </cr-input> <paper-icon-button-light class="icon-delete-gray"> - <button on-click="onFingerprintDeleteTapped_"></button> + <button on-click="onFingerprintDeleteTapped_" + aria-label$="[[getButtonAriaLabel_(item)]]"> + </button> </paper-icon-button-light> </div> </template>
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_list.js b/chrome/browser/resources/settings/people_page/fingerprint_list.js index 7c4ec5f..2a7d252 100644 --- a/chrome/browser/resources/settings/people_page/fingerprint_list.js +++ b/chrome/browser/resources/settings/people_page/fingerprint_list.js
@@ -181,5 +181,14 @@ this.onSetupFingerprintDialogClose_(); } }, + + /** + * @param {string} item + * @return {string} + * @private + */ + getButtonAriaLabel_: function(item) { + return this.i18n('lockScreenDeleteFingerprintLabel', item); + }, }); })();
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html index 15992e5..3e957d7 100644 --- a/chrome/browser/resources/settings/people_page/people_page.html +++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -401,7 +401,8 @@ <template is="dom-if" route-path="/payments"> <settings-subpage associated-control="[[$$('#paymentManagerButton')]]" - page-title="$i18n{creditCards}"> + page-title="$i18n{creditCards}" + learn-more-url="$i18n{paymentMethodsLearnMoreURL}"> <settings-payments-section id="paymentsSection" prefs="{{prefs}}"> </settings-payments-section> </settings-subpage>
diff --git a/chrome/browser/resources/supervised_user_internals.html b/chrome/browser/resources/supervised_user_internals.html index a61fa7d..3ae9ad2 100644 --- a/chrome/browser/resources/supervised_user_internals.html +++ b/chrome/browser/resources/supervised_user_internals.html
@@ -4,7 +4,7 @@ found in the LICENSE file. --> <!DOCTYPE html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>Supervised User Internals</title>
diff --git a/chrome/browser/resources/task_scheduler_internals/index.html b/chrome/browser/resources/task_scheduler_internals/index.html index 8128d32..49dbc52ce 100644 --- a/chrome/browser/resources/task_scheduler_internals/index.html +++ b/chrome/browser/resources/task_scheduler_internals/index.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html lang="en"> <head> <title>Task Scheduler Internals</title> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
diff --git a/chrome/browser/resources/usb_internals/usb_internals.html b/chrome/browser/resources/usb_internals/usb_internals.html index 51a95766..f0dd0e2 100644 --- a/chrome/browser/resources/usb_internals/usb_internals.html +++ b/chrome/browser/resources/usb_internals/usb_internals.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>USB Internals</title>
diff --git a/chrome/browser/resources/user_actions/user_actions.html b/chrome/browser/resources/user_actions/user_actions.html index 6085f5e3..d676d355 100644 --- a/chrome/browser/resources/user_actions/user_actions.html +++ b/chrome/browser/resources/user_actions/user_actions.html
@@ -1,5 +1,5 @@ <!doctype html> -<html> +<html lang="en"> <head> <meta charset="utf-8"> <title>User Actions Debug Page</title>
diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc index 8af41404..2113894 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc
@@ -318,14 +318,6 @@ return google_apis::CancelCallback(); } -google_apis::CancelCallback DriveServiceOnWorker::GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) { - NOTREACHED(); - return google_apis::CancelCallback(); -} - google_apis::CancelCallback DriveServiceOnWorker::GetAppList( const google_apis::AppListCallback& callback) { NOTREACHED();
diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h index 43e1710..2cf7a25 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h
@@ -124,10 +124,6 @@ google_apis::CancelCallback Search( const std::string& search_query, const google_apis::FileListCallback& callback) override; - google_apis::CancelCallback GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) override; google_apis::CancelCallback GetAppList( const google_apis::AppListCallback& callback) override; google_apis::CancelCallback TrashResource(
diff --git a/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm b/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm index 14a70e72..c518031e 100644 --- a/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/browser_actions_controller.mm
@@ -178,7 +178,7 @@ void StopAnimating() override; void ShowToolbarActionBubble( std::unique_ptr<ToolbarActionsBarBubbleDelegate> bubble) override; - void CloseOverflowMenuIfOpen() override; + bool CloseOverflowMenuIfOpen() override; // The owning BrowserActionsController; weak. BrowserActionsController* controller_; @@ -245,11 +245,14 @@ [controller_ createMessageBubble:std::move(bubble)]; } -void ToolbarActionsBarBridge::CloseOverflowMenuIfOpen() { +bool ToolbarActionsBarBridge::CloseOverflowMenuIfOpen() { AppMenuController* appMenuController = [[controller_ toolbarController] appMenuController]; - if ([appMenuController isMenuOpen]) - [appMenuController cancel]; + if (![appMenuController isMenuOpen]) + return false; + + [appMenuController cancel]; + return true; } } // namespace
diff --git a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.h b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.h index b133703..cf09f12 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.h +++ b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.h
@@ -29,7 +29,6 @@ std::unique_ptr<extensions::ExtensionViewHost> host, bool grant_tab_permissions, ExtensionActionViewController::PopupShowAction show_action) override; - void CloseOverflowMenu() override; void ShowContextMenu() override; // content::NotificationObserver:
diff --git a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm index 3d2896f..a64f5a2 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm
@@ -13,7 +13,6 @@ #include "chrome/browser/extensions/extension_view_host.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" -#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h" #include "chrome/browser/ui/cocoa/browser_dialogs_views_mac.h" #import "chrome/browser/ui/cocoa/browser_window_controller.h" #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h" @@ -101,18 +100,6 @@ viewsScreenPoint, popupShowAction); } -void ExtensionActionPlatformDelegateCocoa::CloseOverflowMenu() { - // If this was triggered by an action overflowed to the app menu, then the app - // menu will be open. Close it before opening the popup. - AppMenuController* appMenuController = - [[[BrowserWindowController - browserWindowControllerForWindow: - controller_->browser()->window()->GetNativeWindow()] - toolbarController] appMenuController]; - if ([appMenuController isMenuOpen]) - [appMenuController cancel]; -} - void ExtensionActionPlatformDelegateCocoa::ShowContextMenu() { // We should only use this code path for extensions shown in the toolbar. BrowserWindowController* windowController = [BrowserWindowController
diff --git a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.h b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.h index 411f1e5..42a75e2 100644 --- a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.h +++ b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.h
@@ -15,9 +15,6 @@ explicit MediaRouterActionPlatformDelegateCocoa(Browser* browser); ~MediaRouterActionPlatformDelegateCocoa() override; - // MediaRouterActionPlatformDelegate: - bool CloseOverflowMenuIfOpen() override; - private: // The corresponding browser. Browser* browser_;
diff --git a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm index c4e65c1..150d5e1 100644 --- a/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm +++ b/chrome/browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm
@@ -6,11 +6,6 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window.h" -#import "chrome/browser/ui/cocoa/app_menu/app_menu_controller.h" -#import "chrome/browser/ui/cocoa/browser_window_controller.h" -#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" #include "ui/base/ui_features.h" // static @@ -36,18 +31,3 @@ MediaRouterActionPlatformDelegateCocoa:: ~MediaRouterActionPlatformDelegateCocoa() { } - -bool MediaRouterActionPlatformDelegateCocoa::CloseOverflowMenuIfOpen() { - // TODO(apacible): This should be factored to share code with extension - // actions. - AppMenuController* appMenuController = - [[[BrowserWindowController - browserWindowControllerForWindow: - browser_->window()->GetNativeWindow()] - toolbarController] appMenuController]; - if (![appMenuController isMenuOpen]) - return false; - - [appMenuController cancel]; - return true; -}
diff --git a/chrome/browser/ui/extensions/extension_action_platform_delegate.h b/chrome/browser/ui/extensions/extension_action_platform_delegate.h index ad7cc0a..c90b034 100644 --- a/chrome/browser/ui/extensions/extension_action_platform_delegate.h +++ b/chrome/browser/ui/extensions/extension_action_platform_delegate.h
@@ -42,9 +42,6 @@ bool grant_tab_permissions, ExtensionActionViewController::PopupShowAction show_action) = 0; - // Closes the overflow menu, if it was open. - virtual void CloseOverflowMenu() = 0; - // Shows the context menu for the extension. virtual void ShowContextMenu() = 0; };
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc index f0f05292..c52eced1 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -393,7 +393,7 @@ if (toolbar_actions_bar_ && !toolbar_actions_bar_->IsActionVisibleOnMainBar(this)) { - platform_delegate_->CloseOverflowMenu(); + toolbar_actions_bar_->CloseOverflowMenuIfOpen(); toolbar_actions_bar_->PopOutAction( this, show_action == SHOW_POPUP_AND_INSPECT,
diff --git a/chrome/browser/ui/toolbar/media_router_action.cc b/chrome/browser/ui/toolbar/media_router_action.cc index 5a6a783..b2251f07 100644 --- a/chrome/browser/ui/toolbar/media_router_action.cc +++ b/chrome/browser/ui/toolbar/media_router_action.cc
@@ -180,10 +180,13 @@ GetMediaRouterDialogController()->ShowMediaRouterDialog(); if (GetPlatformDelegate()) { + // TODO(karandeepb): Instead of checking the return value of + // CloseOverflowMenuIfOpen, just check + // ToolbarActionsBar::IsActionVisibleOnMainBar. media_router::MediaRouterMetrics::RecordMediaRouterDialogOrigin( - GetPlatformDelegate()->CloseOverflowMenuIfOpen() ? - media_router::MediaRouterDialogOpenOrigin::OVERFLOW_MENU : - media_router::MediaRouterDialogOpenOrigin::TOOLBAR); + toolbar_actions_bar_->CloseOverflowMenuIfOpen() + ? media_router::MediaRouterDialogOpenOrigin::OVERFLOW_MENU + : media_router::MediaRouterDialogOpenOrigin::TOOLBAR); } return true; }
diff --git a/chrome/browser/ui/toolbar/media_router_action_platform_delegate.h b/chrome/browser/ui/toolbar/media_router_action_platform_delegate.h index b9a38ce..41df5e5 100644 --- a/chrome/browser/ui/toolbar/media_router_action_platform_delegate.h +++ b/chrome/browser/ui/toolbar/media_router_action_platform_delegate.h
@@ -11,6 +11,7 @@ class Browser; +// TODO(karandeepb): Delete this class. class MediaRouterActionPlatformDelegate { public: MediaRouterActionPlatformDelegate() {} @@ -26,10 +27,6 @@ static std::unique_ptr<MediaRouterActionPlatformDelegate> CreateCocoa( Browser* browser); #endif - - // Closes the overflow menu, if it was open. Returns whether or not the - // overflow menu was closed. - virtual bool CloseOverflowMenuIfOpen() = 0; }; #endif // CHROME_BROWSER_UI_TOOLBAR_MEDIA_ROUTER_ACTION_PLATFORM_DELEGATE_H_
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc index 5d24f5f..8cea239 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc
@@ -568,6 +568,10 @@ weak_ptr_factory_.GetWeakPtr(), std::move(bubble))); } +bool ToolbarActionsBar::CloseOverflowMenuIfOpen() { + return delegate_->CloseOverflowMenuIfOpen(); +} + void ToolbarActionsBar::MaybeShowExtensionBubble() { std::unique_ptr<extensions::ExtensionMessageBubbleController> controller = model_->GetExtensionMessageBubbleController(browser_);
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.h b/chrome/browser/ui/toolbar/toolbar_actions_bar.h index 9172f56..ccd3009 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.h +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.h
@@ -224,6 +224,10 @@ void ShowToolbarActionBubbleAsync( std::unique_ptr<ToolbarActionsBarBubbleDelegate> bubble); + // Closes the overflow menu, if it was open. Returns whether or not the + // overflow menu was closed. + bool CloseOverflowMenuIfOpen(); + // Returns the underlying toolbar actions, but does not order them. Primarily // for use in testing. const ToolbarActions& toolbar_actions_unordered() const {
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h b/chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h index 0f71d82296..0f1aaab8f 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar_delegate.h
@@ -59,8 +59,9 @@ virtual void ShowToolbarActionBubble( std::unique_ptr<ToolbarActionsBarBubbleDelegate> bubble) = 0; - // Closes the overflow menu if it's open. - virtual void CloseOverflowMenuIfOpen() = 0; + // Closes the overflow menu, if it was open. Returns whether or not the + // overflow menu was closed. + virtual bool CloseOverflowMenuIfOpen() = 0; }; #endif // CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_ACTIONS_BAR_DELEGATE_H_
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc index 4fd992c..0b9f6ecd 100644 --- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc +++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/ui/extensions/accelerator_priority.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" -#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_action_view_delegate_views.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views_mode_controller.h" @@ -95,17 +94,6 @@ popup_show_action); } -void ExtensionActionPlatformDelegateViews::CloseOverflowMenu() { - // TODO(mgiuca): Use button_provider() instead of toolbar(), so this also - // works for hosted app windows. - AppMenuButton* app_menu_button = - BrowserView::GetBrowserViewForBrowser(controller_->browser()) - ->toolbar() - ->app_menu_button(); - if (app_menu_button && app_menu_button->IsMenuShowing()) - app_menu_button->CloseMenu(); -} - void ExtensionActionPlatformDelegateViews::ShowContextMenu() { views::View* view = GetDelegateViews()->GetAsView(); view->context_menu_controller()->ShowContextMenuForView(
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h index 233ad046..fd1c48cd 100644 --- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h +++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h
@@ -37,7 +37,6 @@ std::unique_ptr<extensions::ExtensionViewHost> host, bool grant_tab_permissions, ExtensionActionViewController::PopupShowAction show_action) override; - void CloseOverflowMenu() override; void ShowContextMenu() override; // content::NotificationObserver:
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc index 1de27579a..3ba8f79 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
@@ -207,4 +207,14 @@ title()->Layout(); } +void CastDialogSinkButton::RequestFocus() { + if (enabled()) { + HoverButton::RequestFocus(); + } else { + // The sink button is disabled, but the icon within it may be enabled and + // want focus. + icon_view()->RequestFocus(); + } +} + } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.h b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.h index dc443eda..a2e991e 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.h +++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.h
@@ -27,6 +27,7 @@ bool OnMousePressed(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override; void OnEnabledChanged() override; + void RequestFocus() override; const UIMediaSink& sink() const { return sink_; }
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc index 437a072d..9824944 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -270,6 +270,19 @@ } void CastDialogView::RestoreSinkListState() { + if (selected_sink_index_ && + selected_sink_index_.value() < sink_buttons_.size()) { + CastDialogSinkButton* sink_button = + sink_buttons_.at(selected_sink_index_.value()); + // Focus on the sink so that the screen reader reads its label, which has + // likely been updated. + sink_button->RequestFocus(); + // If the state became AVAILABLE, the screen reader no longer needs to read + // the label until the user selects a sink again. + if (sink_button->sink().state == UIMediaSinkState::AVAILABLE) + selected_sink_index_.reset(); + } + views::ScrollBar* scroll_bar = const_cast<views::ScrollBar*>(scroll_view_->vertical_scroll_bar()); if (scroll_bar) { @@ -318,6 +331,7 @@ if (!controller_) return; + selected_sink_index_ = index; const UIMediaSink& sink = sink_buttons_.at(index)->sink(); if (sink.route_id.empty()) { base::Optional<MediaCastMode> cast_mode = GetCastModeToUse(sink);
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.h b/chrome/browser/ui/views/media_router/cast_dialog_view.h index a20a15b..56b62a40 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.h +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.h
@@ -191,6 +191,10 @@ // Records UMA metrics for the dialog's behavior. CastDialogMetrics metrics_; + // The sink that the user has selected to cast to. If the user is using + // multiple sinks at the same time, the last activated sink is used. + base::Optional<size_t> selected_sink_index_; + base::WeakPtrFactory<CastDialogView> weak_factory_; DISALLOW_COPY_AND_ASSIGN(CastDialogView);
diff --git a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc index 12ba7ffe..817966f6 100644 --- a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/ui/views/media_router/media_remoting_dialog_view.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/media_router/media_router_ui_service.h" #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h" +#include "chrome/browser/ui/toolbar/media_router_action_controller.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/media_router/cast_toolbar_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" @@ -28,9 +30,9 @@ DCHECK(callback); // Check whether user has set the permission. - PrefService* const pref_service = - Profile::FromBrowserContext(web_contents->GetBrowserContext()) - ->GetPrefs(); + Profile* profile = + Profile::FromBrowserContext(web_contents->GetBrowserContext()); + PrefService* const pref_service = profile->GetPrefs(); DCHECK(pref_service); const PrefService::Preference* pref = pref_service->FindPreference(::prefs::kMediaRouterMediaRemotingEnabled); @@ -47,8 +49,11 @@ } views::View* icon_view = BrowserView::GetBrowserViewForBrowser(browser)->toolbar()->cast_button(); - instance_ = - new MediaRemotingDialogView(icon_view, pref_service, std::move(callback)); + MediaRouterActionController* action_controller = + MediaRouterUIService::Get(profile)->action_controller(); + + instance_ = new MediaRemotingDialogView( + icon_view, pref_service, action_controller, std::move(callback)); views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(instance_); widget->Show(); @@ -111,20 +116,27 @@ return gfx::Size(width, GetHeightForWidth(width)); } -MediaRemotingDialogView::MediaRemotingDialogView(views::View* anchor_view, - PrefService* pref_service, - PermissionCallback callback) +MediaRemotingDialogView::MediaRemotingDialogView( + views::View* anchor_view, + PrefService* pref_service, + MediaRouterActionController* action_controller, + PermissionCallback callback) : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), permission_callback_(std::move(callback)), pref_service_(pref_service), + action_controller_(action_controller), dialog_title_( l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_REMOTING_DIALOG_TITLE)) { DCHECK(pref_service_); SetLayoutManager( std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical)); + // Depress the Cast toolbar icon. + action_controller_->OnDialogShown(); } -MediaRemotingDialogView::~MediaRemotingDialogView() = default; +MediaRemotingDialogView::~MediaRemotingDialogView() { + action_controller_->OnDialogHidden(); +} void MediaRemotingDialogView::Init() { views::Label* body_text = new views::Label(
diff --git a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.h b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.h index dd2f39c..19c903b 100644 --- a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.h +++ b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.h
@@ -7,6 +7,7 @@ #include "ui/views/bubble/bubble_dialog_delegate_view.h" +class MediaRouterActionController; class PrefService; namespace views { @@ -57,9 +58,10 @@ gfx::Size CalculatePreferredSize() const override; private: - explicit MediaRemotingDialogView(views::View* anchor_view, - PrefService* pref_service, - PermissionCallback callback); + MediaRemotingDialogView(views::View* anchor_view, + PrefService* pref_service, + MediaRouterActionController* action_controller, + PermissionCallback callback); ~MediaRemotingDialogView() override; // views::BubbleDialogDelegateView: @@ -76,6 +78,7 @@ PermissionCallback permission_callback_; PrefService* const pref_service_; + MediaRouterActionController* const action_controller_; // Title shown at the top of the dialog. base::string16 dialog_title_;
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container.cc b/chrome/browser/ui/views/toolbar/browser_actions_container.cc index 96c7716..ff55ed9 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container.cc +++ b/chrome/browser/ui/views/toolbar/browser_actions_container.cc
@@ -307,15 +307,18 @@ bubble->Show(); } -void BrowserActionsContainer::CloseOverflowMenuIfOpen() { +bool BrowserActionsContainer::CloseOverflowMenuIfOpen() { // TODO(mgiuca): Use toolbar_button_provider() instead of toolbar(), so this // also works for hosted app windows. BrowserAppMenuButton* app_menu_button = BrowserView::GetBrowserViewForBrowser(browser_) ->toolbar() ->app_menu_button(); - if (app_menu_button && app_menu_button->IsMenuShowing()) - app_menu_button->CloseMenu(); + if (!app_menu_button || !app_menu_button->IsMenuShowing()) + return false; + + app_menu_button->CloseMenu(); + return true; } void BrowserActionsContainer::OnWidgetClosing(views::Widget* widget) {
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container.h b/chrome/browser/ui/views/toolbar/browser_actions_container.h index a2aabadf..09337f88 100644 --- a/chrome/browser/ui/views/toolbar/browser_actions_container.h +++ b/chrome/browser/ui/views/toolbar/browser_actions_container.h
@@ -240,7 +240,7 @@ void StopAnimating() override; void ShowToolbarActionBubble( std::unique_ptr<ToolbarActionsBarBubbleDelegate> controller) override; - void CloseOverflowMenuIfOpen() override; + bool CloseOverflowMenuIfOpen() override; // views::WidgetObserver: void OnWidgetClosing(views::Widget* widget) override;
diff --git a/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.cc b/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.cc index 3812e76c..42651620 100644 --- a/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.cc +++ b/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.cc
@@ -4,11 +4,9 @@ #include "chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.h" +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "build/build_config.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views_mode_controller.h" // static @@ -31,17 +29,3 @@ MediaRouterActionPlatformDelegateViews:: ~MediaRouterActionPlatformDelegateViews() { } - -bool MediaRouterActionPlatformDelegateViews::CloseOverflowMenuIfOpen() { - // TODO(mgiuca): Use button_provider() instead of toolbar(), so this also - // works for hosted app windows. - AppMenuButton* app_menu_button = - BrowserView::GetBrowserViewForBrowser(browser_) - ->toolbar() - ->app_menu_button(); - if (!app_menu_button || !app_menu_button->IsMenuShowing()) - return false; - - app_menu_button->CloseMenu(); - return true; -}
diff --git a/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.h b/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.h index b2ce655..203c24e 100644 --- a/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.h +++ b/chrome/browser/ui/views/toolbar/media_router_action_platform_delegate_views.h
@@ -15,9 +15,6 @@ explicit MediaRouterActionPlatformDelegateViews(Browser* browser); ~MediaRouterActionPlatformDelegateViews() override; - // MediaRouterActionPlatformDelegate: - bool CloseOverflowMenuIfOpen() override; - private: // The corresponding browser. Browser* const browser_;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index e07213c..8e3f3e0 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -752,6 +752,8 @@ NOTREACHED(); return; } + // Save printable_area information for N-up conversion. + printable_area_ = printable_area; base::DictionaryValue layout; layout.SetDouble(printing::kSettingMarginTop, page_layout.margin_top);
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chrome/browser/ui/webui/print_preview/print_preview_ui.h index 2f3990e..5135daa 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.h +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -17,6 +17,7 @@ #include "base/memory/ref_counted.h" #include "base/time/time.h" #include "chrome/browser/ui/webui/constrained_web_dialog_ui.h" +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" class PrintPreviewHandler; @@ -65,6 +66,8 @@ int pages_per_sheet() const { return pages_per_sheet_; } + const gfx::Rect& printable_area() const { return printable_area_; } + const gfx::Size& page_size() const { return page_size_; } // Returns true if |page_number| is the last page in |pages_to_render_|. @@ -250,6 +253,9 @@ // Physical size of the page, including non-printable margins. gfx::Size page_size_; + // The printable area of the printed document pages. + gfx::Rect printable_area_; + DISALLOW_COPY_AND_ASSIGN(PrintPreviewUI); };
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index a7b7efb..b8e3f255 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1497,6 +1497,8 @@ autofill::payments::GetManageAddressesUrl(0).spec()); html_source->AddString("manageCreditCardsUrl", autofill::payments::GetManageInstrumentsUrl(0).spec()); + html_source->AddString("paymentMethodsLearnMoreURL", + chrome::kPaymentMethodsLearnMoreURL); html_source->AddBoolean( "migrationEnabled", autofill::features::GetLocalCardMigrationExperimentalFlag() == @@ -1572,6 +1574,8 @@ IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE}, {"lockScreenFingerprintWarning", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE}, + {"lockScreenDeleteFingerprintLabel", + IDS_SETTINGS_PEOPLE_LOCK_SCREEN_DELETE_FINGERPRINT_ARIA_LABEL}, {"lockScreenNotificationHide", IDS_ASH_SETTINGS_LOCK_SCREEN_NOTIFICATION_HIDE}, {"lockScreenNotificationHideSensitive",
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 42fed24..d084c97 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -671,11 +671,25 @@ if (sync_startup_tracker_) return; - if (!service->IsEngineInitialized()) { + if (!service->IsEngineInitialized() || + service->HasDisableReason( + syncer::SyncService::DISABLE_REASON_USER_CHOICE)) { // Requesting the sync service to start may trigger call to PushSyncPrefs. // Setting up the startup tracker beforehand correctly signals the // re-entrant call to early exit. - sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this)); + sync_startup_tracker_ = + std::make_unique<SyncStartupTracker>(profile_, this); + // RequestStart() does two things: + // 1) If DISABLE_REASON_USER_CHOICE is set (meaning that Sync was reset via + // the dashboard), clears it. + // 2) Pokes the sync service to start *immediately*, i.e. bypass deferred + // startup. + // It's possible that both of these are already the case, i.e. the engine is + // already in the process of initializing, in which case RequestStart() will + // effectively do nothing. It's also possible that the sync service is + // already running in standalone transport mode and so the engine is already + // initialized. In that case, this will trigger the service to switch to + // full Sync-the-feature mode. service->RequestStart(); // See if it's even possible to bring up the sync engine - if not
diff --git a/chrome/browser/ui/webui/settings/people_handler.h b/chrome/browser/ui/webui/settings/people_handler.h index bfedcdc..2998ac45 100644 --- a/chrome/browser/ui/webui/settings/people_handler.h +++ b/chrome/browser/ui/webui/settings/people_handler.h
@@ -88,7 +88,6 @@ PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndSyncStartupCompleted); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, HandleSetupUIWhenSyncDisabled); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, SelectCustomEncryption); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupCustomPassphraseRequired); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSetupEncryptAll); @@ -102,9 +101,7 @@ FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSigninOnAuthError); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSyncSetup); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, ShowSyncSetupWhenNotSignedIn); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, SuccessfullySetPassphrase); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, TestSyncEverything); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, TestSyncNothing); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, TestSyncAllManually); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, TestPassphraseStillRequired); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, TestSyncIndividualTypes); @@ -117,13 +114,13 @@ FRIEND_TEST_ALL_PREFIXES(PeopleHandlerNonCrosTest, UnrecoverableErrorInitializingSync); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerNonCrosTest, GaiaErrorInitializingSync); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerNonCrosTest, HandleCaptcha); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerNonCrosTest, HandleGaiaAuthFailure); - FRIEND_TEST_ALL_PREFIXES(PeopleHandlerNonCrosTest, - SubmitAuthWithInvalidUsername); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerFirstSigninTest, DisplayBasicLogin); FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, AcquireSyncBlockerWhenLoadingSyncSettingsSubpage); + FRIEND_TEST_ALL_PREFIXES(PeopleHandlerTest, RestartSyncAfterDashboardClear); + FRIEND_TEST_ALL_PREFIXES( + PeopleHandlerTest, + RestartSyncAfterDashboardClearWithStandaloneTransport); // SettingsPageUIHandler implementation. void RegisterMessages() override;
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc index 269c29a..0d38ac0 100644 --- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -505,6 +505,56 @@ LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); } +TEST_F(PeopleHandlerTest, RestartSyncAfterDashboardClear) { + // Clearing sync from the dashboard results in DISABLE_REASON_USER_CHOICE + // being set. + ON_CALL(*mock_pss_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_USER_CHOICE)); + ON_CALL(*mock_pss_, IsFirstSetupComplete()).WillByDefault(Return(true)); + ON_CALL(*mock_pss_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED)); + + // Attempting to open the setup UI should restart sync. + EXPECT_CALL(*mock_pss_, RequestStart()).WillOnce([&]() { + // RequestStart() clears DISABLE_REASON_USER_CHOICE, and immediately starts + // initialzing the engine. + ON_CALL(*mock_pss_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE)); + ON_CALL(*mock_pss_, GetTransportState()) + .WillByDefault( + Return(syncer::SyncService::TransportState::INITIALIZING)); + }); + + handler_->HandleShowSetupUI(nullptr); + ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); +} + +TEST_F(PeopleHandlerTest, + RestartSyncAfterDashboardClearWithStandaloneTransport) { + // Clearing sync from the dashboard results in DISABLE_REASON_USER_CHOICE + // being set. However, the sync engine has restarted in standalone transport + // mode. + ON_CALL(*mock_pss_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_USER_CHOICE)); + ON_CALL(*mock_pss_, IsFirstSetupComplete()).WillByDefault(Return(true)); + ON_CALL(*mock_pss_, GetTransportState()) + .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE)); + + // Attempting to open the setup UI should re-enable sync-the-feature. + EXPECT_CALL(*mock_pss_, RequestStart()).WillOnce([&]() { + // RequestStart() clears DISABLE_REASON_USER_CHOICE. Since the engine is + // already running, it just gets reconfigured. + ON_CALL(*mock_pss_, GetDisableReasons()) + .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE)); + ON_CALL(*mock_pss_, GetTransportState()) + .WillByDefault( + Return(syncer::SyncService::TransportState::CONFIGURING)); + }); + + handler_->HandleShowSetupUI(nullptr); + ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); +} + // Tests that signals not related to user intention to configure sync don't // trigger sync engine start. TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) {
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl index 734c3904..2cf3f536 100644 --- a/chrome/common/extensions/api/file_manager_private.idl +++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -1010,13 +1010,6 @@ static void requestWebStoreAccessToken( RequestWebStoreAccessTokenCallback callback); - // Requests a share dialog url for the specified file. - // |entry| The entry to share. - // |callback| - [nocompile] - static void getShareUrl([instanceof=Entry] object entry, - GetUrlCallback callback); - // Requests a download url to download the file contents. // |entry| The entry to download. // |callback|
diff --git a/chrome/common/extensions/api/file_manager_private_internal.idl b/chrome/common/extensions/api/file_manager_private_internal.idl index 131069a..22f87b6b 100644 --- a/chrome/common/extensions/api/file_manager_private_internal.idl +++ b/chrome/common/extensions/api/file_manager_private_internal.idl
@@ -72,7 +72,6 @@ SimpleCallback callback); static void getFileTasks(DOMString[] urls, GetFileTasksCallback callback); - static void getShareUrl(DOMString url, GetUrlCallback callback); static void getDownloadUrl(DOMString url, GetUrlCallback callback); static void requestDriveShare(DOMString url, fileManagerPrivate.DriveShareType shareType,
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc index 6ccad71..54f61ad 100644 --- a/chrome/common/url_constants.cc +++ b/chrome/common/url_constants.cc
@@ -176,6 +176,13 @@ "https://support.google.com/chrome/?p=settings_password"; #endif +const char kPaymentMethodsLearnMoreURL[] = +#if defined(OS_CHROMEOS) + "https://support.google.com/chromebook/?p=settings_autofill"; +#else + "https://support.google.com/chrome/?p=settings_autofill"; +#endif + const char kPrivacyLearnMoreURL[] = #if defined(OS_CHROMEOS) "https://support.google.com/chromebook/?p=settings_privacy";
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h index fde64b5..452cf33 100644 --- a/chrome/common/url_constants.h +++ b/chrome/common/url_constants.h
@@ -153,6 +153,8 @@ extern const char kPasswordManagerLearnMoreURL[]; +extern const char kPaymentMethodsLearnMoreURL[]; + // "Learn more" URL for the Privacy section under Options. extern const char kPrivacyLearnMoreURL[];
diff --git a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc index 2610f3f8..11122ca 100644 --- a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc +++ b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc
@@ -39,7 +39,7 @@ page_resource_data_use_.emplace( std::piecewise_construct, std::forward_as_tuple(initial_request->resource_id()), - std::forward_as_tuple(*initial_request)); + std::forward_as_tuple(std::move(initial_request))); buffer_timer_delay_ms_ = base::GetFieldTrialParamByFeatureAsInt( kPageLoadMetricsTimerDelayFeature, "BufferTimerDelayMillis", kBufferTimerDelayMillis /* default value */); @@ -97,15 +97,15 @@ auto resource_it = page_resource_data_use_.emplace( std::piecewise_construct, std::forward_as_tuple(resource_id), - std::forward_as_tuple()); - resource_it.first->second.DidStartResponse(resource_id, response_head); + std::forward_as_tuple(std::make_unique<PageResourceDataUse>())); + resource_it.first->second->DidStartResponse(resource_id, response_head); } void PageTimingMetricsSender::DidReceiveTransferSizeUpdate( int resource_id, int received_data_length) { // Transfer size updates are called in a throttled manner. - const auto& resource_it = page_resource_data_use_.find(resource_id); + auto resource_it = page_resource_data_use_.find(resource_id); // It is possible that resources are not in the map, if response headers were // not received or for failed/cancelled resources. @@ -113,8 +113,8 @@ return; } - resource_it->second.DidReceiveTransferSizeUpdate(received_data_length); - modified_resources_.insert(&resource_it->second); + resource_it->second->DidReceiveTransferSizeUpdate(received_data_length); + modified_resources_.insert(resource_it->second.get()); EnsureSendTimer(); } @@ -129,14 +129,14 @@ if (resource_it == page_resource_data_use_.end()) { auto new_resource_it = page_resource_data_use_.emplace( std::piecewise_construct, std::forward_as_tuple(resource_id), - std::forward_as_tuple()); + std::forward_as_tuple(std::make_unique<PageResourceDataUse>())); resource_it = new_resource_it.first; } - if (resource_it->second.DidCompleteResponse(status)) { + if (resource_it->second->DidCompleteResponse(status)) { EnsureSendTimer(); } - modified_resources_.insert(&resource_it->second); + modified_resources_.insert(resource_it->second.get()); } void PageTimingMetricsSender::DidCancelResponse(int resource_id) { @@ -144,7 +144,7 @@ if (resource_it == page_resource_data_use_.end()) { return; } - resource_it->second.DidCancelResponse(); + resource_it->second->DidCancelResponse(); } void PageTimingMetricsSender::UpdateResourceMetadata( @@ -157,8 +157,8 @@ // This can get called multiple times for resources, and this // flag will only be true once. if (reported_as_ad_resource) - it->second.SetReportedAsAdResource(reported_as_ad_resource); - it->second.SetIsMainFrameResource(is_main_frame_resource); + it->second->SetReportedAsAdResource(reported_as_ad_resource); + it->second->SetIsMainFrameResource(is_main_frame_resource); } void PageTimingMetricsSender::Send(mojom::PageLoadTimingPtr timing) {
diff --git a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h index bf05596..f4cf35e8 100644 --- a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h +++ b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h
@@ -87,7 +87,7 @@ // The page's resources that are currently loading, or were completed after // the last timing update. - base::small_map<std::map<int, PageResourceDataUse>, 16> + base::small_map<std::map<int, std::unique_ptr<PageResourceDataUse>>, 16> page_resource_data_use_; // Set of all resources that have completed or received a transfer
diff --git a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js index bb6f521..72fac16 100644 --- a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js +++ b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
@@ -151,11 +151,6 @@ fileManagerPrivateInternal.getFileTasks(urls, callback); }); - apiFunctions.setHandleRequest('getShareUrl', function(entry, callback) { - var url = fileManagerPrivateNatives.GetEntryURL(entry); - fileManagerPrivateInternal.getShareUrl(url, callback); - }); - apiFunctions.setHandleRequest('getDownloadUrl', function(entry, callback) { var url = fileManagerPrivateNatives.GetEntryURL(entry); fileManagerPrivateInternal.getDownloadUrl(url, callback);
diff --git a/chrome/services/printing/pdf_nup_converter.cc b/chrome/services/printing/pdf_nup_converter.cc index 7261051..281c98d 100644 --- a/chrome/services/printing/pdf_nup_converter.cc +++ b/chrome/services/printing/pdf_nup_converter.cc
@@ -60,6 +60,7 @@ void PdfNupConverter::NupPageConvert( uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions, NupPageConvertCallback callback) { std::vector<base::ReadOnlySharedMemoryMapping> pdf_mappings; @@ -67,7 +68,7 @@ CreatePdfPagesVector(pdf_page_regions, &pdf_mappings); std::vector<uint8_t> output_pdf_buffer = chrome_pdf::ConvertPdfPagesToNupPdf( - std::move(input_pdf_buffers), pages_per_sheet, page_size); + std::move(input_pdf_buffers), pages_per_sheet, page_size, printable_area); if (output_pdf_buffer.empty()) { std::move(callback).Run(mojom::PdfNupConverter::Status::CONVERSION_FAILURE, base::ReadOnlySharedMemoryRegion()); @@ -80,6 +81,7 @@ void PdfNupConverter::NupDocumentConvert( uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, base::ReadOnlySharedMemoryRegion src_pdf_region, NupDocumentConvertCallback callback) { base::ReadOnlySharedMemoryMapping pdf_document_mapping = src_pdf_region.Map(); @@ -87,7 +89,7 @@ std::vector<uint8_t> output_pdf_buffer = chrome_pdf::ConvertPdfDocumentToNupPdf(input_pdf_buffer, pages_per_sheet, - page_size); + page_size, printable_area); if (output_pdf_buffer.empty()) { std::move(callback).Run(mojom::PdfNupConverter::Status::CONVERSION_FAILURE, base::ReadOnlySharedMemoryRegion());
diff --git a/chrome/services/printing/pdf_nup_converter.h b/chrome/services/printing/pdf_nup_converter.h index 9d00c47..18473366 100644 --- a/chrome/services/printing/pdf_nup_converter.h +++ b/chrome/services/printing/pdf_nup_converter.h
@@ -24,10 +24,12 @@ void NupPageConvert( uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions, NupPageConvertCallback callback) override; void NupDocumentConvert(uint32_t pages_per_sheet, const gfx::Size& page_size, + const gfx::Rect& printable_area, base::ReadOnlySharedMemoryRegion src_pdf_region, NupDocumentConvertCallback callback) override; void SetWebContentsURL(const GURL& url) override;
diff --git a/chrome/services/printing/public/mojom/pdf_nup_converter.mojom b/chrome/services/printing/public/mojom/pdf_nup_converter.mojom index bf7f2e3..1b6dcce 100644 --- a/chrome/services/printing/public/mojom/pdf_nup_converter.mojom +++ b/chrome/services/printing/public/mojom/pdf_nup_converter.mojom
@@ -32,6 +32,8 @@ // Convert a list of PDF pages to a N-up PDF. // |pages_per_sheet| is the number of pages to put on a single sheet. // |page_size| is the output page size, measured in PDF "user space" units. + // |printable_area| is the printable area of the output page, measured in + // PDF "user space" units. // |pdf_page_regions| is a list of pdf pages to be converted to a N-up page. // The number of items in |pdf_page_regions| can be different from N. It // will return a N-up PDF document of @@ -39,14 +41,18 @@ NupPageConvert( uint32 pages_per_sheet, gfx.mojom.Size page_size, + gfx.mojom.Rect printable_area, array<mojo_base.mojom.ReadOnlySharedMemoryRegion> pdf_page_regions) => (Status status, mojo_base.mojom.ReadOnlySharedMemoryRegion? pdf_region); // Convert a PDF document to a N-up PDF document. // |pages_per_sheet| is the number of pages to put on a single sheet. // |page_size| is the output page size, measured in PDF "user space" units. + // |printable_area| is the printable area of the output page, measured in + // PDF "user space" units. NupDocumentConvert(uint32 pages_per_sheet, gfx.mojom.Size page_size, + gfx.mojom.Rect printable_area, mojo_base.mojom.ReadOnlySharedMemoryRegion src_pdf_region) => (Status status, mojo_base.mojom.ReadOnlySharedMemoryRegion? pdf_region);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index ded331c..df1b63bf 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3990,6 +3990,7 @@ sources += [ "../browser/printing/print_job_unittest.cc", "../browser/printing/print_preview_dialog_controller_unittest.cc", + "../browser/printing/print_preview_message_handler_unittest.cc", "../browser/printing/print_preview_test.cc", "../browser/printing/print_preview_test.h", "../browser/printing/print_test_utils.cc",
diff --git a/chrome/test/data/chromeos/file_manager/share_dialog_mock/index.html b/chrome/test/data/chromeos/file_manager/share_dialog_mock/index.html deleted file mode 100644 index 51ef2be..0000000 --- a/chrome/test/data/chromeos/file_manager/share_dialog_mock/index.html +++ /dev/null
@@ -1,13 +0,0 @@ -<!doctype html> -<html> - <head> - <title>Share dialog</title> - <script type="text/javascript" src="main.js"></script> - </head> - <body style="display: none"> - <div id="container"> - This is a mocked sharing dialog. - <button onclick="javascript:shareDialog.setVisible(false);">Close</button> - </div> - </body> -</html>
diff --git a/chrome/test/data/chromeos/file_manager/share_dialog_mock/main.js b/chrome/test/data/chromeos/file_manager/share_dialog_mock/main.js deleted file mode 100644 index 2030a576..0000000 --- a/chrome/test/data/chromeos/file_manager/share_dialog_mock/main.js +++ /dev/null
@@ -1,164 +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. - -// Namespace for the share dialog mock. -var shareDialog = {}; - -/** - * Origin of the Files app. - * @type {string} - * @const - */ -shareDialog.EMBEDDER_ORIGIN = - 'chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj'; - -/** - * Target width of the sharing window in pixels. - * @type {number} - * @const - */ -shareDialog.TARGET_WIDTH = 350; - -/** - * Target height of the sharing window in pixels. - * @type {number} - * @const - */ -shareDialog.TARGET_HEIGHT = 250; - -/** - * Target window of the Files app. Used to communicate over messages. Filled - * out once the first message from the embedder arrives. - * @type {Window} - */ -shareDialog.embedderTarget = null; - -/** - * List of pending messages enqueued to be sent before establishing the target. - * @type {Array<Object>} - */ -shareDialog.pendingMessages = []; - -/** - * Sends a message to the embedder. If the embedder target is not available, - * then enqueues them. Such enqueued messages will be sent as soon as the target - * is available. - * - * @param {string} type Message identifier - * @param {Object=} opt_args Arguments for the message. - * @private - */ -shareDialog.sendMessage_ = function(type, opt_args) { - if (!shareDialog.embedderTarget) { - shareDialog.pendingMessages.push({type: type, args: opt_args}); - return; - } - - var data = {}; - data.type = type; - if (opt_args) - data.args = opt_args; - - shareDialog.embedderTarget.postMessage(JSON.stringify(data), - shareDialog.EMBEDDER_ORIGIN); -}; - -/** - * Handles a request from the embedder to make the body visible. - * @private - */ -shareDialog.onMakeBodyVisible_ = function() { - document.body.style.display = ''; -}; - -/** - * Handles an event from the embedder than preparation to show the contents - * is done. - * @private - */ -shareDialog.onPrepareComplete_ = function() { - shareDialog.resize(); -}; - -/** - * Handles an event from the embedder than preparation resize the window is - * done. - * @private - */ -shareDialog.onResizeComplete_ = function() { - var container = document.querySelector('#container'); - container.style.width = shareDialog.TARGET_WIDTH + 'px'; - container.style.height = shareDialog.TARGET_HEIGHT + 'px'; -}; - -/** - * Changes the visibility of the dialog. - * @param {boolean} visible True to set the dialog visible, false to set it - * invisible. - */ -shareDialog.setVisible = function(visible) { - shareDialog.sendMessage_('setVisible', {visible: visible}); -}; - -/** - * Prepares the embedder to make the contents visible. - */ -shareDialog.prepareForVisible = function() { - shareDialog.sendMessage_('prepareForVisible'); -}; - -/** - * Resizes the embedder to the content window dimensions. - */ -shareDialog.resize = function() { - shareDialog.sendMessage_('prepareForResize'); -}; - -/** - * Handles messages sent by the embedder. If it is the first message, then - * the target is established and all enqueued messages to be sent to the - * embedder are sent before handling the message from the embedder. - * - * @param {Event} message Message event. - * @private - */ -shareDialog.onMessage_ = function(message) { - if (message.origin != shareDialog.EMBEDDER_ORIGIN) - return; - - if (!shareDialog.embedderTarget) { - shareDialog.embedderTarget = message.source; - for (var i = 0; i < shareDialog.pendingMessages.length; i++) { - shareDialog.sendMessage_(shareDialog.pendingMessages[i].type, - shareDialog.pendingMessages[i].args); - } - shareDialog.pendingMessages = []; - } - - var packet = JSON.parse(message.data) - var type = packet.type; - var args = packet.args; - - switch (type) { - case 'makeBodyVisible': - shareDialog.onMakeBodyVisible_(args); - break; - case 'prepareComplete': - shareDialog.onPrepareComplete_(args); - break; - case 'resizeComplete': - shareDialog.onResizeComplete_(args); - break; - } -}; - -/** - * Initializes the mocked share dialog. - */ -shareDialog.initialize = function() { - window.addEventListener('message', shareDialog.onMessage_); - shareDialog.prepareForVisible(); -}; - -window.addEventListener('load', shareDialog.initialize);
diff --git a/chrome/test/data/extensions/api_test/mime_handler_view/test_embedded.html b/chrome/test/data/extensions/api_test/mime_handler_view/test_embedded.html index b155002..29e9c6b 100644 --- a/chrome/test/data/extensions/api_test/mime_handler_view/test_embedded.html +++ b/chrome/test/data/extensions/api_test/mime_handler_view/test_embedded.html
@@ -1,14 +1,5 @@ <html> <body> <object id="plugin" width="200" height="200" data="testEmbedded.csv" type="text/csv"></object> -<script> - // TODO(ekaramad): Remove once MimeHandlerViewGuest is based on OOPIF (https://crbug.com/659750). - function ensurePageIsScrollable() { - var spacer = document.createElement("div"); - spacer.style = "width: 100%; height: 200%"; - document.body.appendChild(spacer); - window.scrollTo(0, 0); - } -</script> </body> </html>
diff --git a/chromecast/browser/cast_content_window.h b/chromecast/browser/cast_content_window.h index 52dd8e6..18f86ea 100644 --- a/chromecast/browser/cast_content_window.h +++ b/chromecast/browser/cast_content_window.h
@@ -63,6 +63,11 @@ // The activity should not be visible. HIDDEN = 5, + + // The activity should not be visible, but the activity will consider itself + // to be visible. This is useful for opaque overlays while the activity is + // still active. + HIDDEN_STICKY = 6, }; enum class GestureType {
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc index c940205..3740f22 100644 --- a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc +++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
@@ -163,6 +163,9 @@ } playback_start_pts_ = playback_start_pts; start_playback_asap_ = start_playback_asap; + last_push_timestamp_ = kInvalidTimestamp; + last_push_pts_ = kInvalidTimestamp; + return true; } @@ -172,6 +175,15 @@ mixer_input_->StartPlaybackAt(playback_start_timestamp); } +void AudioDecoderForMixer::RestartPlaybackAt(int64_t timestamp, int64_t pts) { + LOG(INFO) << __func__ << " pts=" << pts << " timestamp=" << timestamp; + + last_push_timestamp_ = kInvalidTimestamp; + last_push_pts_ = kInvalidTimestamp; + + mixer_input_->RestartPlaybackAt(timestamp, pts); +} + void AudioDecoderForMixer::Stop() { TRACE_FUNCTION_ENTRY0(); decoder_.reset(); @@ -225,6 +237,10 @@ return mixer_input_->SetAvSyncPlaybackRate(rate); } +// TODO(almasrymina): This function currently only really works well when +// audio is in steady playback, because it returns the timestamp at buffer +// push. We need to call into the BufferingMixerSource here to get the values +// of the last *played* buffer. bool AudioDecoderForMixer::GetTimestampedPts(int64_t* timestamp, int64_t* pts) const { if (last_push_timestamp_ == kInvalidTimestamp ||
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.h b/chromecast/media/cma/backend/audio_decoder_for_mixer.h index b4b0bae1..c12ee66 100644 --- a/chromecast/media/cma/backend/audio_decoder_for_mixer.h +++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.h
@@ -61,6 +61,7 @@ // This allows for very small changes in the rate of audio playback that are // (supposedly) imperceptible. float SetAvSyncPlaybackRate(float rate); + void RestartPlaybackAt(int64_t pts, int64_t timestamp); private: friend class MockAudioDecoderForMixer;
diff --git a/chromecast/media/cma/backend/audio_fader.cc b/chromecast/media/cma/backend/audio_fader.cc index 3cc0ba2..a6d24c0 100644 --- a/chromecast/media/cma/backend/audio_fader.cc +++ b/chromecast/media/cma/backend/audio_fader.cc
@@ -31,13 +31,16 @@ return num_fill_frames + fade_frames_ - buffered_frames_; } -int AudioFader::FillFrames(int num_frames, ::media::AudioBus* buffer) { +int AudioFader::FillFrames(int num_frames, + ::media::AudioBus* buffer, + int write_offset) { DCHECK(buffer); DCHECK_EQ(buffer->channels(), fade_buffer_->channels()); + DCHECK_LE(write_offset + num_frames, buffer->frames()); // First, copy data from buffered_frames_. int filled_frames = std::min(buffered_frames_, num_frames); - fade_buffer_->CopyPartialFramesTo(0, filled_frames, 0, buffer); + fade_buffer_->CopyPartialFramesTo(0, filled_frames, write_offset, buffer); buffered_frames_ -= filled_frames; num_frames -= filled_frames; @@ -50,8 +53,8 @@ if (num_frames > 0) { // Still need more frames; ask source to fill. - int extra_fill = - source_->FillFaderFrames(buffer, filled_frames, num_frames); + int extra_fill = source_->FillFaderFrames( + buffer, filled_frames + write_offset, num_frames); filled_frames += extra_fill; num_frames -= extra_fill; } @@ -61,14 +64,16 @@ const bool complete = (num_frames == 0 && buffered_frames_ == fade_frames_); if (complete) { - CompleteFill(buffer, filled_frames); + CompleteFill(buffer, filled_frames, write_offset); } else { - IncompleteFill(buffer, filled_frames); + IncompleteFill(buffer, filled_frames, write_offset); } return filled_frames; } -void AudioFader::CompleteFill(::media::AudioBus* buffer, int filled_frames) { +void AudioFader::CompleteFill(::media::AudioBus* buffer, + int filled_frames, + int write_offset) { switch (state_) { case State::kSilent: // Fade in. @@ -88,15 +93,17 @@ std::max(0, fade_frames_ - fade_frames_remaining_ - 1); break; } - FadeIn(buffer, filled_frames); + FadeIn(buffer, filled_frames, write_offset); } -void AudioFader::IncompleteFill(::media::AudioBus* buffer, int filled_frames) { +void AudioFader::IncompleteFill(::media::AudioBus* buffer, + int filled_frames, + int write_offset) { switch (state_) { case State::kSilent: // Remain silent. buffered_frames_ = 0; - buffer->ZeroFramesPartial(0, filled_frames); + buffer->ZeroFramesPartial(write_offset, filled_frames); return; case State::kFadingIn: // Fade back out. @@ -113,20 +120,22 @@ // Continue fading out. break; } - FadeOut(buffer, filled_frames); + FadeOut(buffer, filled_frames, write_offset); } // static void AudioFader::FadeInHelper(::media::AudioBus* buffer, int filled_frames, + int write_offset, int fade_frames, int fade_frames_remaining) { const float inverse_fade_frames = 1.0f / static_cast<float>(fade_frames); const int fade_limit = std::min(filled_frames, fade_frames_remaining + 1); + DCHECK_LE(write_offset + fade_limit, buffer->frames()); for (int c = 0; c < buffer->channels(); ++c) { float* channel_data = buffer->channel(c); - for (int f = 0; f < fade_limit; ++f) { + for (int f = write_offset; f < (write_offset + fade_limit); ++f) { const float fade_multiplier = 1.0 - (fade_frames_remaining - f) * inverse_fade_frames; channel_data[f] *= fade_multiplier; @@ -137,29 +146,34 @@ // static void AudioFader::FadeOutHelper(::media::AudioBus* buffer, int filled_frames, + int write_offset, int fade_frames, int fade_frames_remaining) { const float inverse_fade_frames = 1.0f / static_cast<float>(fade_frames); const int fade_limit = std::min(filled_frames, fade_frames_remaining + 1); + DCHECK_LE(write_offset + fade_limit, buffer->frames()); for (int c = 0; c < buffer->channels(); ++c) { float* channel_data = buffer->channel(c); - for (int f = 0; f < fade_limit; ++f) { + for (int f = write_offset; f < (write_offset + fade_limit); ++f) { const float fade_multiplier = (fade_frames_remaining - f) * inverse_fade_frames; channel_data[f] *= fade_multiplier; } } if (filled_frames > fade_frames_remaining) { - buffer->ZeroFramesPartial(fade_frames_remaining, + buffer->ZeroFramesPartial(write_offset + fade_frames_remaining, filled_frames - fade_frames_remaining); } } -void AudioFader::FadeIn(::media::AudioBus* buffer, int filled_frames) { +void AudioFader::FadeIn(::media::AudioBus* buffer, + int filled_frames, + int write_offset) { DCHECK(state_ == State::kFadingIn); - FadeInHelper(buffer, filled_frames, fade_frames_, fade_frames_remaining_); + FadeInHelper(buffer, filled_frames, write_offset, fade_frames_, + fade_frames_remaining_); fade_frames_remaining_ = std::max(0, fade_frames_remaining_ - filled_frames); if (fade_frames_remaining_ == 0) { @@ -167,10 +181,13 @@ } } -void AudioFader::FadeOut(::media::AudioBus* buffer, int filled_frames) { +void AudioFader::FadeOut(::media::AudioBus* buffer, + int filled_frames, + int write_offset) { DCHECK(state_ == State::kFadingOut); - FadeOutHelper(buffer, filled_frames, fade_frames_, fade_frames_remaining_); + FadeOutHelper(buffer, filled_frames, write_offset, fade_frames_, + fade_frames_remaining_); fade_frames_remaining_ = std::max(0, fade_frames_remaining_ - filled_frames); if (fade_frames_remaining_ == 0) {
diff --git a/chromecast/media/cma/backend/audio_fader.h b/chromecast/media/cma/backend/audio_fader.h index d0e0a15..68ae728 100644 --- a/chromecast/media/cma/backend/audio_fader.h +++ b/chromecast/media/cma/backend/audio_fader.h
@@ -47,10 +47,11 @@ int buffered_frames() const { return buffered_frames_; } - // Fills |buffer| with up to |num_frames| frames of data, fading as - // appropriate to avoid pops/clicks. This will call through to the source to - // get more data. Returns the number of frames filled. - int FillFrames(int num_frames, ::media::AudioBus* buffer); + // Fills |buffer| with up to |num_frames| frames of data, starting at + // |write_offset| within |buffer|, and fading as appropriate to avoid + // pops/clicks. This will call through to the source to get more data. Returns + // the number of frames filled. + int FillFrames(int num_frames, ::media::AudioBus* buffer, int write_offset); // Returns the total number of frames that will be requested from the source // (potentially over multiple calls to source_->FillFaderFrames()) if @@ -60,17 +61,20 @@ // Helper methods to fade in/out an AudioBus. |buffer| contains the data to // fade; |filled_frames| is the amount of data actually in |buffer| (if the // buffer was partially filled, this will not be equal to buffer->frames()). - // |fade_frames| is the number of frames over which a complete fade should + // |write_offset| is the offset within |buffer| to starting writing frames + // to. |fade_frames| is the number of frames over which a complete fade should // happen (ie, how many frames it takes to go from a 1.0 to 0.0 multiplier). // |fade_frames_remaining| is the number of frames left in the current fade // (which will be less than |fade_frames| if part of the fade has already // been completed on a previous buffer). static void FadeInHelper(::media::AudioBus* buffer, int filled_frames, + int write_offset, int fade_frames, int fade_frames_remaining); static void FadeOutHelper(::media::AudioBus* buffer, int filled_frames, + int write_offset, int fade_frames, int fade_frames_remaining); @@ -82,10 +86,14 @@ kFadingOut, }; - void CompleteFill(::media::AudioBus* buffer, int filled_frames); - void IncompleteFill(::media::AudioBus* buffer, int filled_frames); - void FadeIn(::media::AudioBus* buffer, int filled_frames); - void FadeOut(::media::AudioBus* buffer, int filled_frames); + void CompleteFill(::media::AudioBus* buffer, + int filled_frames, + int write_offset); + void IncompleteFill(::media::AudioBus* buffer, + int filled_frames, + int write_offset); + void FadeIn(::media::AudioBus* buffer, int filled_frames, int write_offset); + void FadeOut(::media::AudioBus* buffer, int filled_frames, int write_offset); Source* const source_; const int fade_frames_;
diff --git a/chromecast/media/cma/backend/audio_fader_unittest.cc b/chromecast/media/cma/backend/audio_fader_unittest.cc index c1d7047..57ae067 100644 --- a/chromecast/media/cma/backend/audio_fader_unittest.cc +++ b/chromecast/media/cma/backend/audio_fader_unittest.cc
@@ -88,7 +88,9 @@ EXPECT_EQ(frames_needed, kFadeFrames + kFillSize); auto dest = CreateAudioBus(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + // TODO(almasrymina): need to add unittests for cases where write_offset is + // non-zero. + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Test that FramesNeededFromSource() works correctly. EXPECT_EQ(source.total_requested_frames(), frames_needed); @@ -111,7 +113,7 @@ const int kFillSize = kFadeFrames * 2 / 3; int frames_needed = fader.FramesNeededFromSource(kFillSize); auto dest = CreateAudioBus(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Fader's internal buffer should be full. EXPECT_EQ(fader.buffered_frames(), kFadeFrames); @@ -122,7 +124,7 @@ // Fill more data. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); EXPECT_EQ(fader.buffered_frames(), kFadeFrames); // Test that FramesNeededFromSource() works correctly. @@ -146,14 +148,14 @@ auto dest = CreateAudioBus(kFillSize); int frames_needed = fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Test that FramesNeededFromSource() works correctly. @@ -174,21 +176,21 @@ auto dest = CreateAudioBus(kFillSize); int frames_needed = fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Now make the source not provide enough data. EXPECT_GT(fader.FramesNeededFromSource(kFillSize), 0); source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFillSize); - int filled = fader.FillFrames(kFillSize, dest.get()); + int filled = fader.FillFrames(kFillSize, dest.get(), 0); EXPECT_EQ(filled, kFadeFrames); // Test that FramesNeededFromSource() works correctly. @@ -214,21 +216,21 @@ auto dest = CreateAudioBus(kFillSize); int frames_needed = fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Data should be faded in. EXPECT_EQ(dest->channel(0)[kFadeFrames], 1.0f); // Now request more data. Data should remain fully faded in. frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); EXPECT_EQ(dest->channel(0)[0], 1.0f); // Now make the source not provide enough data. EXPECT_GT(fader.FramesNeededFromSource(kFillSize), 0); source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFadeFrames / 3); - int filled = fader.FillFrames(kFadeFrames / 3, dest.get()); + int filled = fader.FillFrames(kFadeFrames / 3, dest.get(), 0); EXPECT_EQ(filled, kFadeFrames / 3); // Data should be partially faded out. @@ -243,7 +245,7 @@ // Now let the source provide data again. source.set_max_fill_frames(std::numeric_limits<int>::max()); frames_needed += fader.FramesNeededFromSource(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Data should fade back in from the point it faded out to. EXPECT_GE(dest->channel(0)[0], fade_min); EXPECT_EQ(dest->channel(0)[kFillSize - 1], 1.0f); @@ -269,7 +271,7 @@ // from silence, the fader should output silence. auto dest = CreateAudioBus(kFillSize); source.set_max_fill_frames(10); - int filled = fader.FillFrames(kFillSize, dest.get()); + int filled = fader.FillFrames(kFillSize, dest.get(), 0); // Test that FramesNeededFromSource() works correctly. EXPECT_EQ(source.total_requested_frames(), frames_needed); @@ -294,7 +296,7 @@ int frames_needed = fader.FramesNeededFromSource(kFillSize); auto dest = CreateAudioBus(kFillSize); - EXPECT_EQ(fader.FillFrames(kFillSize, dest.get()), kFillSize); + EXPECT_EQ(fader.FillFrames(kFillSize, dest.get(), 0), kFillSize); // Fader's internal buffer should be full. EXPECT_EQ(fader.buffered_frames(), kFadeFrames); @@ -309,7 +311,7 @@ // back out to silence. source.set_max_fill_frames(0); frames_needed += fader.FramesNeededFromSource(kFillSize); - int filled = fader.FillFrames(kFillSize, dest.get()); + int filled = fader.FillFrames(kFillSize, dest.get(), 0); // Data should be faded out. EXPECT_LE(dest->channel(0)[0], fade_max);
diff --git a/chromecast/media/cma/backend/audio_output_redirector.cc b/chromecast/media/cma/backend/audio_output_redirector.cc index 2c76029..b2b81ce9 100644 --- a/chromecast/media/cma/backend/audio_output_redirector.cc +++ b/chromecast/media/cma/backend/audio_output_redirector.cc
@@ -84,13 +84,13 @@ if (previous_ended_in_silence_) { if (!redirected) { // Smoothly fade in from previous silence. - AudioFader::FadeInHelper(temp_buffer_.get(), num_frames, num_frames, + AudioFader::FadeInHelper(temp_buffer_.get(), num_frames, 0, num_frames, num_frames); } } else if (redirected) { // Smoothly fade out to silence, since output is now being redirected by a // previous output splitter. - AudioFader::FadeOutHelper(temp_buffer_.get(), num_frames, num_frames, + AudioFader::FadeOutHelper(temp_buffer_.get(), num_frames, 0, num_frames, num_frames); } previous_ended_in_silence_ = redirected;
diff --git a/chromecast/media/cma/backend/buffering_mixer_source.cc b/chromecast/media/cma/backend/buffering_mixer_source.cc index df8ff53..6f99e4b 100644 --- a/chromecast/media/cma/backend/buffering_mixer_source.cc +++ b/chromecast/media/cma/backend/buffering_mixer_source.cc
@@ -43,6 +43,7 @@ // issues with voice calling. const int64_t kCommsInputQueueMs = 200; const int64_t kCommsStartThresholdMs = 150; +const int64_t kNonCommsStartThresholdMs = 40; void PostTaskShim(scoped_refptr<base::SingleThreadTaskRunner> task_runner, base::OnceClosure task) { @@ -81,7 +82,7 @@ if (device_id == ::media::AudioDeviceDescription::kCommunicationsDeviceId) { return MsToSamples(kCommsStartThresholdMs, sample_rate); } - return 0; + return MsToSamples(kNonCommsStartThresholdMs, sample_rate); } } // namespace @@ -196,6 +197,36 @@ locked->playback_start_timestamp_ = playback_start_timestamp; } +void BufferingMixerSource::RestartPlaybackAt(int64_t timestamp, int64_t pts) { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); + + LOG(INFO) << __func__ << " timestamp=" << timestamp << " pts=" << pts; + + bool post_pcm_completion = false; + RenderingDelay cached_mixer_rendering_delay; + { + auto locked = locked_members_.Lock(); + DCHECK(locked->started_); + + playback_start_pts_ = pts; + + locked->playback_start_timestamp_ = timestamp; + locked->started_ = false; + + locked->queue_.clear(); + locked->current_buffer_offset_ = 0; + locked->queued_frames_ = 0; + if (locked->pending_data_) { + locked->pending_data_.reset(); + post_pcm_completion = true; + cached_mixer_rendering_delay = locked->mixer_rendering_delay_; + } + } + if (post_pcm_completion) { + POST_TASK_TO_CALLER_THREAD(PostPcmCompletion, cached_mixer_rendering_delay); + } +} + float BufferingMixerSource::SetAvSyncPlaybackRate(float rate) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); LOG(INFO) << __func__ << " rate=" << rate; @@ -263,7 +294,8 @@ << " difference=" << playback_start_pts_ - data->timestamp(); } else { LOG_IF(INFO, (!locked->started_ && - (data->timestamp() - playback_start_pts_) < 100000)) + (data->timestamp() - playback_start_pts_) < 100000 && + locked->playback_start_timestamp_ != INT64_MIN)) << "Queueing pts diff=" << data->timestamp() - playback_start_pts_ << " current buffered data=" << GetCurrentBufferedDataInUs() / 1000; @@ -274,8 +306,13 @@ locked->queued_frames_ += frames; locked->queue_.push_back(std::move(buffer)); - if (!locked->started_ && GetCurrentBufferedDataInUs() >= - kAudioReadyForPlaybackThresholdMs * 1000) { + // TODO(almasrymina): this needs to be called outside the lock. + // POST_TASK_TO_CALLER_THREAD should also probably DCHECK that the lock + // is not held before executing. + if (!locked->started_ && + GetCurrentBufferedDataInUs() >= + kAudioReadyForPlaybackThresholdMs * 1000 && + locked->playback_start_timestamp_ != INT64_MIN) { POST_TASK_TO_CALLER_THREAD(PostAudioReadyForPlayback); } } @@ -382,22 +419,11 @@ base::TimeDelta::FromMicroseconds(-silence_duration), input_samples_per_second_)); } else { - // Queue silence. - LOG(INFO) << "Queueing silence padding buffer. Duration=" - << silence_duration; - - scoped_refptr<DecoderBufferBase> padding( - new DecoderBufferAdapter(new ::media::DecoderBuffer( - ::media::AudioTimestampHelper::TimeToFrames( - base::TimeDelta::FromMicroseconds(silence_duration), - input_samples_per_second_) * - num_channels_ * sizeof(float)))); - - LOG(INFO) << "silence_duration=" << silence_duration - << " padding->data_size()=" << padding->data_size(); - - locked->queued_frames_ += DataToFrames(padding->data_size()); - locked->queue_.push_front(std::move(padding)); + LOG(INFO) << "Adding silence. Duration=" << silence_duration; + remaining_silence_frames_ = + DataToFrames(::media::AudioTimestampHelper::TimeToFrames( + base::TimeDelta::FromMicroseconds(silence_duration), + input_samples_per_second_)); } } @@ -445,7 +471,22 @@ locked->zero_fader_frames_ = false; } - filled = locked->fader_.FillFrames(num_frames, buffer); + DCHECK_GE(remaining_silence_frames_, 0); + if (remaining_silence_frames_ >= num_frames) { + remaining_silence_frames_ -= num_frames; + return 0; + } + + int write_offset = 0; + if (remaining_silence_frames_ > 0) { + buffer->ZeroFramesPartial(0, remaining_silence_frames_); + filled += remaining_silence_frames_; + num_frames -= remaining_silence_frames_; + write_offset = remaining_silence_frames_; + remaining_silence_frames_ = 0; + } + + filled = locked->fader_.FillFrames(num_frames, buffer, write_offset); locked->mixer_rendering_delay_ = rendering_delay; locked->extra_delay_frames_ = num_frames + locked->fader_.buffered_frames(); @@ -560,6 +601,11 @@ << " locked->current_buffer_offset_=" << locked->current_buffer_offset_ << " buffer=" << buffer->data_size(); + DCHECK_LE(frames_to_copy + frame_offset, dest->frames()) + << " frames_to_copy=" << frames_to_copy + << " dest->frames()=" << dest->frames() + << " frame_offset=" << frame_offset; + const float* buffer_samples = reinterpret_cast<const float*>(buffer->data()); for (int c = 0; c < num_channels_; ++c) {
diff --git a/chromecast/media/cma/backend/buffering_mixer_source.h b/chromecast/media/cma/backend/buffering_mixer_source.h index f3014bb..6b94f8a 100644 --- a/chromecast/media/cma/backend/buffering_mixer_source.h +++ b/chromecast/media/cma/backend/buffering_mixer_source.h
@@ -80,6 +80,14 @@ // |start_playback_asap| is false during constructing. void StartPlaybackAt(int64_t playback_start_timestamp); + // Restarts the current playback from the timestamp provided at the pts + // provided. Flushes any currently buffered audio. Generally does well if you + // require the audio to jump back and/or forth by up to 5 seconds or so, + // depending on how much data is already buffered by the upper layers and + // ready for consumption here. This API will start having problems if you try + // to do more than that, so it's not advised. + void RestartPlaybackAt(int64_t timestamp, int64_t pts); + // Queues some PCM data to be mixed. |data| must be in planar float format. // If the buffer can accept more data, the delegate's OnWritePcmCompletion() // method is called synchronously. Otherwise, OnWritePcmCompletion() will be @@ -221,7 +229,6 @@ int64_t DataToFrames(int64_t size); void CheckAndStartPlaybackIfNecessary(int num_frames, int64_t playback_absolute_timestamp); - Delegate* const delegate_; const int num_channels_; const int input_samples_per_second_; @@ -245,6 +252,8 @@ LockedMembers locked_members_; + int remaining_silence_frames_ = 0; + base::WeakPtr<BufferingMixerSource> weak_this_; base::WeakPtrFactory<BufferingMixerSource> weak_factory_;
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.cc b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.cc index d852198..c33451e 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.cc +++ b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.cc
@@ -77,7 +77,6 @@ video_ready_to_play_ = !video_decoder_; audio_ready_to_play_ = !audio_decoder_; - first_resume_processed_ = false; start_playback_timestamp_us_ = INT64_MIN; start_playback_pts_us_ = start_pts; @@ -93,11 +92,9 @@ if (video_decoder_ && !video_decoder_->Start(start_playback_pts_us_, true)) return false; - if (av_sync_) { - state_ = kStatePaused; - } else { - state_ = kStatePlaying; - } + state_ = kStatePlaying; + playback_started_ = !av_sync_; + return true; } @@ -116,13 +113,13 @@ } bool MediaPipelineBackendForMixer::Pause() { - if (av_sync_ && !first_resume_processed_) { - DCHECK_EQ(kStatePaused, state_); + DCHECK_EQ(kStatePlaying, state_); + if (!playback_started_) { + state_ = kStatePaused; + LOG(INFO) << "Pause received while playback has not started yet."; return true; } - DCHECK_EQ(kStatePlaying, state_); - if (audio_decoder_ && !audio_decoder_->Pause()) { return false; } @@ -139,10 +136,10 @@ bool MediaPipelineBackendForMixer::Resume() { DCHECK_EQ(kStatePaused, state_); - if (av_sync_ && !first_resume_processed_) { - LOG(INFO) << "First resume received."; - first_resume_processed_ = true; + if (!playback_started_) { + LOG(INFO) << "Resume received while playback has not started yet."; + state_ = kStatePlaying; TryStartPlayback(); return true; } @@ -276,13 +273,13 @@ void MediaPipelineBackendForMixer::TryStartPlayback() { DCHECK(av_sync_); - DCHECK(state_ == kStatePaused); DCHECK(!IsIgnorePtsMode()); DCHECK(video_decoder_); DCHECK(audio_decoder_); + DCHECK(!playback_started_); if (!audio_ready_to_play_ || !video_ready_to_play_ || - !first_resume_processed_) { + state_ != kStatePlaying) { return; } @@ -293,7 +290,7 @@ video_decoder_->SetPts(start_playback_timestamp_us_, start_playback_pts_us_); audio_decoder_->StartPlaybackAt(start_playback_timestamp_us_); av_sync_->NotifyStart(start_playback_timestamp_us_, start_playback_pts_us_); - state_ = kStatePlaying; + playback_started_ = true; } } // namespace media
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h index 478f900..50b35cc5 100644 --- a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h +++ b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h
@@ -95,7 +95,7 @@ // met. bool audio_ready_to_play_ = false; bool video_ready_to_play_ = false; - bool first_resume_processed_ = false; + bool playback_started_ = false; DISALLOW_COPY_AND_ASSIGN(MediaPipelineBackendForMixer); };
diff --git a/chromecast/media/cma/backend/mixer_input.cc b/chromecast/media/cma/backend/mixer_input.cc index bf83703d92..88b89ce 100644 --- a/chromecast/media/cma/backend/mixer_input.cc +++ b/chromecast/media/cma/backend/mixer_input.cc
@@ -170,11 +170,11 @@ filled = 0; } else { // Smoothly fade in from previous silence. - AudioFader::FadeInHelper(dest, filled, filled, filled); + AudioFader::FadeInHelper(dest, filled, 0, filled, filled); } } else if (redirected) { // Smoothly fade out to silence, since output is now being redirected. - AudioFader::FadeOutHelper(dest, filled, filled, filled); + AudioFader::FadeOutHelper(dest, filled, 0, filled, filled); } previous_ended_in_silence_ = redirected; first_buffer_ = false;
diff --git a/chromecast/media/cma/backend/video/av_sync_video.cc b/chromecast/media/cma/backend/video/av_sync_video.cc index 71c6b2fe..94246dea 100644 --- a/chromecast/media/cma/backend/video/av_sync_video.cc +++ b/chromecast/media/cma/backend/video/av_sync_video.cc
@@ -26,6 +26,10 @@ namespace { +// Threshold where the audio and video pts are far enough apart such that we +// want to do a hard correction. +const int kHardCorrectionThresholdUs = 100000; + // Length of time after which data is forgotten from our linear regression // models. const int kLinearRegressionDataLifetimeUs = @@ -123,6 +127,18 @@ return; } + int64_t timestamp_for_0_vpts = new_vpts_timestamp - new_raw_vpts; + int64_t timestamp_for_0_apts = new_apts_timestamp - new_raw_apts; + + // Positive difference means it looks like the audio started playing before + // the video, which means the audio is ahead the video. + int64_t raw_difference = timestamp_for_0_vpts - timestamp_for_0_apts; + + if (abs(raw_difference) > kHardCorrectionThresholdUs) { + HardCorrection(now, new_raw_vpts, new_vpts_timestamp, raw_difference); + return; + } + int64_t linear_regression_vpts = 0; int64_t linear_regression_apts = 0; double vpts_slope = 0.0; @@ -238,6 +254,22 @@ new WeightedMovingLinearRegression(kLinearRegressionDataLifetimeUs)); } +void AvSyncVideo::HardCorrection(int64_t now, + int64_t new_raw_vpts, + int64_t new_vpts_timestamp, + int64_t raw_difference) { + backend_->audio_decoder()->RestartPlaybackAt(new_vpts_timestamp, + new_raw_vpts); + + audio_pts_.reset( + new WeightedMovingLinearRegression(kLinearRegressionDataLifetimeUs)); + + LOG(INFO) << "Hard correction." + << " raw_difference=" << raw_difference + << " new_raw_vpts=" << new_raw_vpts + << " current_audio_playback_rate_=" << current_audio_playback_rate_; +} + // We calculate the desired audio playback rate, and set the rate to that if // it's different from the current rate. The desired rate of audio playback is // that one which will bring us to 0 sync difference in kReSyncDurationUs. @@ -276,10 +308,17 @@ void AvSyncVideo::GatherPlaybackStatistics() { DCHECK(backend_); - if (!backend_->video_decoder()) { + if (!backend_->video_decoder() || av_sync_difference_count_ == 0) { return; } + double average_av_sync_difference = + static_cast<double>(av_sync_difference_sum_) / + static_cast<double>(av_sync_difference_count_); + + av_sync_difference_sum_ = 0; + av_sync_difference_count_ = 0; + int64_t frame_rate_difference = (backend_->video_decoder()->GetCurrentContentRefreshRate() - backend_->video_decoder()->GetOutputRefreshRate()) / @@ -311,15 +350,6 @@ int64_t unexpected_repeated_frames = (repeated_frames - last_repeated_frames_) - expected_repeated_frames; - double average_av_sync_difference = 0.0; - - if (av_sync_difference_count_ != 0) { - average_av_sync_difference = static_cast<double>(av_sync_difference_sum_) / - static_cast<double>(av_sync_difference_count_); - } - av_sync_difference_sum_ = 0; - av_sync_difference_count_ = 0; - int64_t accurate_vpts = 0; int64_t accurate_vpts_timestamp = 0; backend_->video_decoder()->GetCurrentPts(&accurate_vpts_timestamp, @@ -331,8 +361,7 @@ &accurate_apts); LOG(INFO) << "Playback diagnostics:" - << " average_av_sync_difference=" - << average_av_sync_difference / 1000 + << " average_av_sync_difference=" << average_av_sync_difference << " content fps=" << GetContentFrameRate() << " unexpected_dropped_frames=" << unexpected_dropped_frames << " unexpected_repeated_frames=" << unexpected_repeated_frames;
diff --git a/chromecast/media/cma/backend/video/av_sync_video.h b/chromecast/media/cma/backend/video/av_sync_video.h index c15ff00..ad29901d 100644 --- a/chromecast/media/cma/backend/video/av_sync_video.h +++ b/chromecast/media/cma/backend/video/av_sync_video.h
@@ -66,6 +66,10 @@ // linear regression / the number of samples (which are unique frames). int GetContentFrameRate(); + void HardCorrection(int64_t now, + int64_t new_vpts, + int64_t new_vpts_timestamp, + int64_t difference); void AudioRateUpkeep(int64_t now, int64_t new_raw_vpts, int64_t new_raw_apts,
diff --git a/chromeos/chromeos_features.cc b/chromeos/chromeos_features.cc index 4ca6a97..2b8e7784 100644 --- a/chromeos/chromeos_features.cc +++ b/chromeos/chromeos_features.cc
@@ -12,6 +12,10 @@ const base::Feature kAndroidMessagesIntegration{ "AndroidMessagesIntegration", base::FEATURE_DISABLED_BY_DEFAULT}; +// Point to the production Android Messages URL instead of sandbox. +const base::Feature kAndroidMessagesProdEndpoint{ + "AndroidMessagesProdEndpoint", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables native ChromeVox support for Arc. const base::Feature kChromeVoxArcSupport{"ChromeVoxArcSupport", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chromeos/chromeos_features.h b/chromeos/chromeos_features.h index 5bf4b4d..9fcdab82 100644 --- a/chromeos/chromeos_features.h +++ b/chromeos/chromeos_features.h
@@ -16,6 +16,7 @@ // alongside the definition of their values in the .cc file. CHROMEOS_EXPORT extern const base::Feature kAndroidMessagesIntegration; +CHROMEOS_EXPORT extern const base::Feature kAndroidMessagesProdEndpoint; CHROMEOS_EXPORT extern const base::Feature kChromeVoxArcSupport; CHROMEOS_EXPORT extern const base::Feature kDriveFs; CHROMEOS_EXPORT extern const base::Feature kEnableUnifiedMultiDeviceSettings;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index 1abba35..c334d8c 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -346,6 +346,7 @@ <body> <style> * { + box-sizing: border-box; cursor: default; font-family: Google Sans, sans-serif; user-select: none;
diff --git a/chromeos/services/assistant/platform/system_provider_impl.cc b/chromeos/services/assistant/platform/system_provider_impl.cc index 51ab5e0..b1c8f9807 100644 --- a/chromeos/services/assistant/platform/system_provider_impl.cc +++ b/chromeos/services/assistant/platform/system_provider_impl.cc
@@ -66,14 +66,5 @@ battery_monitor_.FlushForTesting(); } -void SystemProviderImpl::ProcessTpm(TpmProcessingType type, - const std::string& data, - TpmCallback on_done) { - // This method is used for processing data from the TPM chip. This is inorder - // to access secure storage. The work is currently not complete (b:111559586). - // The default implementation by other platforms is to call on_done for now. - on_done(data); -} - } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/platform/system_provider_impl.h b/chromeos/services/assistant/platform/system_provider_impl.h index c582736..c3b035fd 100644 --- a/chromeos/services/assistant/platform/system_provider_impl.h +++ b/chromeos/services/assistant/platform/system_provider_impl.h
@@ -26,9 +26,6 @@ bool GetBatteryState(BatteryState* state) override; void UpdateTimezoneAndLocale(const std::string& timezone, const std::string& locale) override; - void ProcessTpm(TpmProcessingType type, - const std::string& data, - TpmCallback on_done) override; private: friend class SystemProviderImplTest;
diff --git a/components/blacklist/README.md b/components/blacklist/README.md index bf46565..f83cc36 100644 --- a/components/blacklist/README.md +++ b/components/blacklist/README.md
@@ -1,15 +1,43 @@ -#Blacklist component# +# Blacklist component # The goal of the blacklist component is to provide various blacklists that allow -different policies for features to consume. Currently, the only implemented -blacklist is the opt out blacklist. +different policies for features to consume. Below are various types of blacklist +included within the component. -##Opt out blacklist## +## Bloom filter blacklist ## +The Bloom filter blacklist allows blocking specific strings (hosts) based on a +probabilistic data structure that represents a host as a hashed value. +Collisions are possible (false positive matches), and the consumer is +responsible for determining what action to take when a match occurs. The +implementation uses MurmurHash3 in coordination with wherever (i.e., the server +that ships it) the bloom filter is generated. + +### Expected behavior ### +The consumer needs to supply a Bloom filter, the number of times to hash the +string, and the number of bits that the Bloom filter occupies. Calling Contains, +will inform the consumer whether the string is included in the Bloom filter, and +these should be considered strings that are not allowed to be used for the +consumer feature. + +### Host filter ### +HostFilter uses an internal Bloom filter to blacklist host names. It uses the +Bloom filter to store blacklisted host name suffixes. Given a URL, HostFilter +will check the URL's host name for any blacklisted host suffixes. The host +filter will look for matching sub-domains and the full domain in the Bloom +filter, and will treat any match as a blacklisted host. For instance, a host +like a.b.c.d.e.chromium.org would match any of the following if they appeared in +the Bloom filter: a.b.c.d.e.chromium.org, chromium.org, e.chromium.org, +d.e.chromium.org, c.d.e.chromium.org. Note that b.c.d.e.chromium.org is not +included, as the default implementation checks the full host, and four other +sub-domains, looking at the most granular to least granular. Hosts with top +level domains of more than 6 characters are not supported. + +## Opt out blacklist ## The opt out blacklist makes decisions based on user history actions. Each user action is evaluated based on action type, time of the evaluation, host name of the action (can be any string representation), and previous action history. -###Expected feature behavior### +### Expected feature behavior ### When a feature action is allowed, the feature may perform said action. After performing the action, the user interaction should be determined to be an opt out (the user did not like the action) or a non-opt out (the user was not @@ -24,7 +52,7 @@ not dismiss the InfoBar that could be considered a non-opt out. All of the information related to that action should be reported to the blacklist. -###Supported evaluation policies### +### Supported evaluation policies ### In general, policies follow a specific form: the most recent _n_ actions are evaluated, and if _t_ or more of them are opt outs the action will not be allowed for a specified duration, _d_. For each policy, the feature specifies @@ -51,7 +79,7 @@ specifies a set of enabled types and versions for each type. This allows removing past versions of types to be removed from the backing store. -###Clearing the blacklist### +### Clearing the blacklist ### Because many actions should be cleared when user clears history, the opt out blacklist allows clearing history in certain time ranges. All entries are cleared for the specified time range, and the data in memory is repopulated
diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc index eb512d8..6a8b51fc 100644 --- a/components/cast_channel/cast_socket.cc +++ b/components/cast_channel/cast_socket.cc
@@ -412,7 +412,7 @@ network::mojom::TLSClientSocketOptions::New(); // Cast code does its own authentication after SSL handshake since the devices // don't have a known hostname. - options->skip_cert_verification = true; + options->unsafely_skip_cert_verification = true; tcp_socket_->UpgradeToTLS( host_port_pair, std::move(options), net::MutableNetworkTrafficAnnotationTag(GetNetworkTrafficAnnotationTag()),
diff --git a/components/cbor/BUILD.gn b/components/cbor/BUILD.gn index ae9ec5b2..c44e464 100644 --- a/components/cbor/BUILD.gn +++ b/components/cbor/BUILD.gn
@@ -6,7 +6,7 @@ component("cbor") { sources = [ - "cbor_binary.h", + "cbor_constants.h", "cbor_reader.cc", "cbor_reader.h", "cbor_values.cc",
diff --git a/components/cbor/cbor_binary.h b/components/cbor/cbor_constants.h similarity index 87% rename from components/cbor/cbor_binary.h rename to components/cbor/cbor_constants.h index 27f675b7..69a6364c 100644 --- a/components/cbor/cbor_binary.h +++ b/components/cbor/cbor_constants.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_CBOR_CBOR_BINARY_H_ -#define COMPONENTS_CBOR_CBOR_BINARY_H_ +#ifndef COMPONENTS_CBOR_CBOR_CONSTANTS_H_ +#define COMPONENTS_CBOR_CBOR_CONSTANTS_H_ #include <stdint.h> @@ -29,7 +29,9 @@ // Indicates the integer is in the next 8 bytes. static constexpr uint8_t kAdditionalInformation8Bytes = 27u; +extern const char kUnsupportedMajorType[]; + } // namespace constants } // namespace cbor -#endif // COMPONENTS_CBOR_CBOR_BINARY_H_ +#endif // COMPONENTS_CBOR_CBOR_CONSTANTS_H_
diff --git a/components/cbor/cbor_reader.cc b/components/cbor/cbor_reader.cc index 1eda503..1c3aa754 100644 --- a/components/cbor/cbor_reader.cc +++ b/components/cbor/cbor_reader.cc
@@ -12,10 +12,14 @@ #include "base/numerics/safe_conversions.h" #include "base/stl_util.h" #include "base/strings/string_util.h" -#include "components/cbor/cbor_binary.h" +#include "components/cbor/cbor_constants.h" namespace cbor { +namespace constants { +const char kUnsupportedMajorType[] = "Unsupported major type."; +} + namespace { CBORValue::Type GetMajorType(uint8_t initial_data_byte) { @@ -28,9 +32,10 @@ return initial_data_byte & constants::kAdditionalInformationMask; } -// Error messages that correspond to each of the error codes. +// Error messages that correspond to each of the error codes. There is 1 +// exception: we declare |kUnsupportedMajorType| cbor_constants.h in the +// `constants` namespace, because we use it in several files. const char kNoError[] = "Successfully deserialized to a CBOR value."; -const char kUnsupportedMajorType[] = "Unsupported major type."; const char kUnknownAdditionalInfo[] = "Unknown additional info format in the first byte."; const char kIncompleteCBORData[] = @@ -122,6 +127,9 @@ return ReadArrayContent(*header, max_nesting_level); case CBORValue::Type::MAP: return ReadMapContent(*header, max_nesting_level); + case CBORValue::Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + return base::nullopt; case CBORValue::Type::SIMPLE_VALUE: return DecodeToSimpleValue(*header); case CBORValue::Type::NONE: @@ -141,19 +149,17 @@ const auto major_type = GetMajorType(initial_byte.value()); const uint8_t additional_info = GetAdditionalInfo(initial_byte.value()); - uint64_t value; - if (!ReadVariadicLengthInteger(additional_info, &value)) - return base::nullopt; - - return DataItemHeader{major_type, additional_info, value}; + base::Optional<uint64_t> value = ReadVariadicLengthInteger(additional_info); + return value ? base::make_optional( + DataItemHeader{major_type, additional_info, value.value()}) + : base::nullopt; } -bool CBORReader::ReadVariadicLengthInteger(uint8_t additional_info, - uint64_t* value) { +base::Optional<uint64_t> CBORReader::ReadVariadicLengthInteger( + uint8_t additional_info) { uint8_t additional_bytes = 0; if (additional_info < 24) { - *value = additional_info; - return true; + return base::make_optional(additional_info); } else if (additional_info == 24) { additional_bytes = 1; } else if (additional_info == 25) { @@ -164,13 +170,13 @@ additional_bytes = 8; } else { error_code_ = DecoderError::UNKNOWN_ADDITIONAL_INFO; - return false; + return base::nullopt; } const base::Optional<base::span<const uint8_t>> bytes = ReadBytes(additional_bytes); if (!bytes) { - return false; + return base::nullopt; } uint64_t int_data = 0; @@ -179,8 +185,9 @@ int_data |= b; } - *value = int_data; - return CheckMinimalEncoding(additional_bytes, int_data); + return CheckMinimalEncoding(additional_bytes, int_data) + ? base::make_optional(int_data) + : base::nullopt; } base::Optional<CBORValue> CBORReader::DecodeValueToNegative(uint64_t value) { @@ -365,7 +372,7 @@ case DecoderError::CBOR_NO_ERROR: return kNoError; case DecoderError::UNSUPPORTED_MAJOR_TYPE: - return kUnsupportedMajorType; + return constants::kUnsupportedMajorType; case DecoderError::UNKNOWN_ADDITIONAL_INFO: return kUnknownAdditionalInfo; case DecoderError::INCOMPLETE_CBOR_DATA:
diff --git a/components/cbor/cbor_reader.h b/components/cbor/cbor_reader.h index 4223c04..1a1589c 100644 --- a/components/cbor/cbor_reader.h +++ b/components/cbor/cbor_reader.h
@@ -16,37 +16,40 @@ #include "components/cbor/cbor_values.h" // Concise Binary Object Representation (CBOR) decoder as defined by -// https://tools.ietf.org/html/rfc7049. This decoder only accepts canonical -// CBOR as defined by section 3.9. -// Supported: -// * Major types: -// * 0: Unsigned integers, up to 64-bit. -// * 2: Byte strings. -// * 3: UTF-8 strings. -// * 4: Definite-length arrays. -// * 5: Definite-length maps. -// * 7: Simple values. +// https://tools.ietf.org/html/rfc7049. This decoder only accepts canonical CBOR +// as defined by section 3.9. +// +// This implementation supports the following major types: +// - 0: Unsigned integers, up to 64-bit values. +// - 1: Signed integers, up to 64-bit values. +// - 2: Byte strings. +// - 3: UTF-8 strings. +// - 4: Definite-length arrays. +// - 5: Definite-length maps. +// - 7: Simple values. // // Requirements for canonical CBOR representation: -// - Duplicate keys for map are not allowed. -// - Keys for map must be sorted first by length and then by byte-wise +// - Duplicate keys in maps are not allowed. +// - Keys for maps must be sorted first by length and then by byte-wise // lexical order. // -// Known limitations and interpretations of the RFC: -// - Does not support negative integers, indefinite data streams and tagging. -// - Floating point representations and BREAK stop code in major -// type 7 are not supported. -// - Non-character codepoint are not supported for Major type 3. -// - Incomplete CBOR data items are treated as syntax errors. -// - Trailing data bytes are treated as errors. -// - Unknown additional information formats are treated as syntax errors. -// - Callers can decode CBOR values with at most 16 nested depth layer. More -// strict restrictions on nesting layer size of CBOR values can be enforced -// by setting |max_nesting_level|. -// - Only CBOR maps with integer or string type keys are supported due to the -// cost of serialization when sorting map keys. -// - Simple values that are unassigned/reserved as per RFC 7049 are not -// supported and treated as errors. +// Known limitations and interpretations of the RFC (and the reasons): +// - Does not support indefinite-length data streams or semantic tags (major +// type 6). (Simplicity; security) +// - Does not support the floating point and BREAK stop code value types in +// major type 7. (Simplicity) +// - Does not support non-character codepoints in major type 3. (Security) +// - Treats incomplete CBOR data items as syntax errors. (Security) +// - Treats trailing data bytes as errors. (Security) +// - Treats unknown additional information formats as syntax errors. +// (Simplicity; security) +// - Limits CBOR value inputs to at most 16 layers of nesting. Callers can +// enforce more shallow nesting by setting |max_nesting_level|. (Efficiency; +// security) +// - Only supports CBOR maps with integer or string type keys, due to the +// cost of serialization when sorting map keys. (Efficiency; simplicity) +// - Does not support simple values that are unassigned/reserved as per RFC +// 7049, and treats them as errors. (Security) namespace cbor { @@ -74,14 +77,18 @@ ~CBORReader(); - // Reads and parses |input_data| into a CBORValue. If any one of the syntax - // formats is violated -including unknown additional info and incomplete - // CBOR data- then an empty optional is returned. Optional |error_code_out| - // can be provided by the caller to obtain additional information about - // decoding failures, which is always available if an empty value is returned. + // Reads and parses |input_data| into a CBORValue. Returns an empty Optional + // if the input violates any one of the syntax requirements (including unknown + // additional info and incomplete CBOR data). // - // Fails if not all the data was consumed and sets |error_code_out| to - // EXTRANEOUS_DATA in this case. + // The caller can optionally provide |error_code_out| to obtain additional + // information about decoding failures. + // + // If the caller provides it, |max_nesting_level| cannot exceed + // |kCBORMaxDepth|. + // + // Returns an empty Optional if not all the data was consumed, and sets + // |error_code_out| to EXTRANEOUS_DATA in this case. static base::Optional<CBORValue> Read(base::span<const uint8_t> input_data, DecoderError* error_code_out = nullptr, int max_nesting_level = kCBORMaxDepth); @@ -119,7 +126,7 @@ base::Optional<CBORValue> DecodeValueToNegative(uint64_t value); base::Optional<CBORValue> DecodeValueToUnsigned(uint64_t value); base::Optional<CBORValue> DecodeToSimpleValue(const DataItemHeader& header); - bool ReadVariadicLengthInteger(uint8_t additional_info, uint64_t* value); + base::Optional<uint64_t> ReadVariadicLengthInteger(uint8_t additional_info); base::Optional<CBORValue> ReadByteStringContent(const DataItemHeader& header); base::Optional<CBORValue> ReadStringContent(const DataItemHeader& header); base::Optional<CBORValue> ReadArrayContent(const DataItemHeader& header, @@ -128,6 +135,9 @@ int max_nesting_level); base::Optional<uint8_t> ReadByte(); base::Optional<base::span<const uint8_t>> ReadBytes(uint64_t num_bytes); + // TODO(crbug/879237): This function's only caller has to make a copy of a + // `span<uint8_t>` to satisfy this function's interface. Maybe we can make + // this function take a `const span<const uint8_t>` and avoid copying? bool HasValidUTF8Format(const std::string& string_data); bool CheckOutOfOrderKey(const CBORValue& new_key, CBORValue::MapValue* map); bool CheckMinimalEncoding(uint8_t additional_bytes, uint64_t uint_data);
diff --git a/components/cbor/cbor_reader_unittest.cc b/components/cbor/cbor_reader_unittest.cc index 902b9b9..d86866d 100644 --- a/components/cbor/cbor_reader_unittest.cc +++ b/components/cbor/cbor_reader_unittest.cc
@@ -1054,7 +1054,7 @@ // clang-format off {0xa2, // map with 2 keys with same major type and length 0x61, 0x62, // key "b" - 0x61, 0x42, // value :"B" + 0x61, 0x42, // value "B" 0x61, 0x61, // key "a" (out of order byte-wise lexically) 0x61, 0x45 // value "E" @@ -1197,7 +1197,7 @@ } } -TEST(CBORReaderTest, TestUnsupportedSimplevalue) { +TEST(CBORReaderTest, TestUnsupportedSimpleValue) { static const std::vector<uint8_t> unsupported_simple_values[] = { // Simple value (0, unassigned) {0xE0},
diff --git a/components/cbor/cbor_values.cc b/components/cbor/cbor_values.cc index 370050ae..397ce9a 100644 --- a/components/cbor/cbor_values.cc +++ b/components/cbor/cbor_values.cc
@@ -9,6 +9,7 @@ #include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" +#include "components/cbor/cbor_constants.h" namespace cbor { @@ -37,6 +38,9 @@ case Type::MAP: new (&map_value_) MapValue(); return; + case Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + return; case Type::SIMPLE_VALUE: simple_value_ = CBORValue::SimpleValue::UNDEFINED; return; @@ -152,6 +156,9 @@ return CBORValue(array_value_); case Type::MAP: return CBORValue(map_value_); + case Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + return CBORValue(); case Type::SIMPLE_VALUE: return CBORValue(simple_value_); } @@ -235,6 +242,9 @@ case Type::MAP: new (&map_value_) MapValue(std::move(that.map_value_)); return; + case Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + return; case Type::SIMPLE_VALUE: simple_value_ = that.simple_value_; return; @@ -258,6 +268,9 @@ case Type::MAP: map_value_.~MapValue(); break; + case Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + break; case Type::NONE: case Type::UNSIGNED: case Type::NEGATIVE:
diff --git a/components/cbor/cbor_values.h b/components/cbor/cbor_values.h index e035faee..39f2cca 100644 --- a/components/cbor/cbor_values.h +++ b/components/cbor/cbor_values.h
@@ -91,6 +91,7 @@ STRING = 3, ARRAY = 4, MAP = 5, + TAG = 6, SIMPLE_VALUE = 7, NONE = -1, };
diff --git a/components/cbor/cbor_writer.cc b/components/cbor/cbor_writer.cc index 47497a9..5312ab9 100644 --- a/components/cbor/cbor_writer.cc +++ b/components/cbor/cbor_writer.cc
@@ -8,7 +8,7 @@ #include "base/numerics/safe_conversions.h" #include "base/strings/string_piece.h" -#include "components/cbor/cbor_binary.h" +#include "components/cbor/cbor_constants.h" namespace cbor { @@ -96,6 +96,10 @@ return true; } + case CBORValue::Type::TAG: + NOTREACHED() << constants::kUnsupportedMajorType; + return false; + // Represents a simple value. case CBORValue::Type::SIMPLE_VALUE: { const CBORValue::SimpleValue simple_value = node.GetSimpleValue();
diff --git a/components/data_reduction_proxy/OWNERS b/components/data_reduction_proxy/OWNERS index 8bdd0837..e5bf0ff 100644 --- a/components/data_reduction_proxy/OWNERS +++ b/components/data_reduction_proxy/OWNERS
@@ -1,9 +1,9 @@ # Primary +tbansal@chromium.org dougarnett@chromium.org rajendrant@chromium.org ryansturm@chromium.org sclittle@chromium.org -tbansal@chromium.org # Secondary bengr@chromium.org @@ -54,4 +54,4 @@ # .,//(((((((((((((((((((((((((//*. # # .,,*//((((((((((((((///**, # # # -################################################################################ \ No newline at end of file +################################################################################
diff --git a/components/drive/chromeos/dummy_file_system.h b/components/drive/chromeos/dummy_file_system.h index 78de6b9e..52a5a7ca 100644 --- a/components/drive/chromeos/dummy_file_system.h +++ b/components/drive/chromeos/dummy_file_system.h
@@ -84,17 +84,14 @@ void SearchByHashes(const std::set<std::string>& hashes, SearchByHashesCallback callback) override {} void GetAvailableSpace(GetAvailableSpaceCallback callback) override {} - void GetShareUrl(const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) override {} void GetMetadata(GetFilesystemMetadataCallback callback) override {} void MarkCacheFileAsMounted(const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) override {} + MarkMountedCallback callback) override {} void MarkCacheFileAsUnmounted( const base::FilePath& cache_file_path, const FileOperationCallback& callback) override {} void IsCacheFileMarkedAsMounted(const base::FilePath& drive_file_path, - const IsMountedCallback& callback) override {} + IsMountedCallback callback) override {} void AddPermission(const base::FilePath& drive_file_path, const std::string& email, google_apis::drive::PermissionRole role,
diff --git a/components/drive/chromeos/fake_file_system.cc b/components/drive/chromeos/fake_file_system.cc index 35bc8efe4..7f7fec9 100644 --- a/components/drive/chromeos/fake_file_system.cc +++ b/components/drive/chromeos/fake_file_system.cc
@@ -137,7 +137,7 @@ void FakeFileSystem::IsCacheFileMarkedAsMounted( const base::FilePath& drive_file_path, - const IsMountedCallback& callback) { + IsMountedCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); } @@ -208,20 +208,13 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); } -void FakeFileSystem::GetShareUrl( - const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); -} - void FakeFileSystem::GetMetadata(GetFilesystemMetadataCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); } void FakeFileSystem::MarkCacheFileAsMounted( const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) { + MarkMountedCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); }
diff --git a/components/drive/chromeos/fake_file_system.h b/components/drive/chromeos/fake_file_system.h index b72f54b..9ffd054 100644 --- a/components/drive/chromeos/fake_file_system.h +++ b/components/drive/chromeos/fake_file_system.h
@@ -111,16 +111,13 @@ void SearchByHashes(const std::set<std::string>& hashes, SearchByHashesCallback callback) override; void GetAvailableSpace(GetAvailableSpaceCallback callback) override; - void GetShareUrl(const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) override; void GetMetadata(GetFilesystemMetadataCallback callback) override; void MarkCacheFileAsMounted(const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) override; + MarkMountedCallback callback) override; void MarkCacheFileAsUnmounted(const base::FilePath& cache_file_path, const FileOperationCallback& callback) override; void IsCacheFileMarkedAsMounted(const base::FilePath& drive_file_path, - const IsMountedCallback& callback) override; + IsMountedCallback callback) override; void AddPermission(const base::FilePath& drive_file_path, const std::string& email, google_apis::drive::PermissionRole role,
diff --git a/components/drive/chromeos/file_system.cc b/components/drive/chromeos/file_system.cc index b9a3964..68cb10be 100644 --- a/components/drive/chromeos/file_system.cc +++ b/components/drive/chromeos/file_system.cc
@@ -171,19 +171,19 @@ } // Runs the callback with arguments. -void RunMarkMountedCallback(const MarkMountedCallback& callback, +void RunMarkMountedCallback(MarkMountedCallback callback, base::FilePath* cache_file_path, FileError error) { DCHECK(callback); - callback.Run(error, *cache_file_path); + std::move(callback).Run(error, *cache_file_path); } // Runs the callback with arguments. -void RunIsMountedCallback(const IsMountedCallback& callback, +void RunIsMountedCallback(IsMountedCallback callback, bool* result, FileError error) { DCHECK(callback); - callback.Run(error, *result); + std::move(callback).Run(error, *result); } // Callback for internals::GetStartPageToken. @@ -763,78 +763,6 @@ about_resource->quota_bytes_used_aggregate()); } -void FileSystem::GetShareUrl(const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(callback); - - // Resolve the resource id. - ResourceEntry* entry = new ResourceEntry; - base::PostTaskAndReplyWithResult( - blocking_task_runner_.get(), - FROM_HERE, - base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath, - base::Unretained(resource_metadata_), - file_path, - entry), - base::Bind(&FileSystem::GetShareUrlAfterGetResourceEntry, - weak_ptr_factory_.GetWeakPtr(), - file_path, - embed_origin, - callback, - base::Owned(entry))); -} - -void FileSystem::GetShareUrlAfterGetResourceEntry( - const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback, - ResourceEntry* entry, - FileError error) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(callback); - - if (error != FILE_ERROR_OK) { - callback.Run(error, GURL()); - return; - } - if (entry->resource_id().empty()) { - // This entry does not exist on the server. Just return. - callback.Run(FILE_ERROR_FAILED, GURL()); - return; - } - - scheduler_->GetShareUrl( - entry->resource_id(), - embed_origin, - ClientContext(USER_INITIATED), - base::Bind(&FileSystem::OnGetResourceEntryForGetShareUrl, - weak_ptr_factory_.GetWeakPtr(), - callback)); -} - -void FileSystem::OnGetResourceEntryForGetShareUrl( - const GetShareUrlCallback& callback, - google_apis::DriveApiErrorCode status, - const GURL& share_url) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(callback); - - FileError error = GDataToFileError(status); - if (error != FILE_ERROR_OK) { - callback.Run(error, GURL()); - return; - } - - if (share_url.is_empty()) { - callback.Run(FILE_ERROR_FAILED, GURL()); - return; - } - - callback.Run(FILE_ERROR_OK, share_url); -} - void FileSystem::Search(const std::string& search_query, const GURL& next_link, SearchCallback callback) { @@ -1072,37 +1000,33 @@ std::move(callback).Run(*default_corpus_metadata, *team_drive_metadata); } -void FileSystem::MarkCacheFileAsMounted( - const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) { +void FileSystem::MarkCacheFileAsMounted(const base::FilePath& drive_file_path, + MarkMountedCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(callback); base::FilePath* cache_file_path = new base::FilePath; base::PostTaskAndReplyWithResult( - blocking_task_runner_.get(), - FROM_HERE, - base::Bind(&MarkCacheFileAsMountedInternal, - resource_metadata_, - cache_, - drive_file_path, - cache_file_path), - base::Bind( - &RunMarkMountedCallback, callback, base::Owned(cache_file_path))); + blocking_task_runner_.get(), FROM_HERE, + base::BindOnce(&MarkCacheFileAsMountedInternal, resource_metadata_, + cache_, drive_file_path, cache_file_path), + base::BindOnce(&RunMarkMountedCallback, std::move(callback), + base::Owned(cache_file_path))); } void FileSystem::IsCacheFileMarkedAsMounted( const base::FilePath& drive_file_path, - const IsMountedCallback& callback) { + IsMountedCallback callback) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(callback); bool* is_mounted = new bool(false); base::PostTaskAndReplyWithResult( blocking_task_runner_.get(), FROM_HERE, - base::Bind(&IsCacheFileMarkedAsMountedInternal, resource_metadata_, - cache_, drive_file_path, is_mounted), - base::Bind(&RunIsMountedCallback, callback, base::Owned(is_mounted))); + base::BindOnce(&IsCacheFileMarkedAsMountedInternal, resource_metadata_, + cache_, drive_file_path, is_mounted), + base::BindOnce(&RunIsMountedCallback, std::move(callback), + base::Owned(is_mounted))); } void FileSystem::MarkCacheFileAsUnmounted(
diff --git a/components/drive/chromeos/file_system.h b/components/drive/chromeos/file_system.h index d3dac43..d177fa4f 100644 --- a/components/drive/chromeos/file_system.h +++ b/components/drive/chromeos/file_system.h
@@ -147,14 +147,11 @@ ReadDirectoryEntriesCallback entries_callback, const FileOperationCallback& completion_callback) override; void GetAvailableSpace(GetAvailableSpaceCallback callback) override; - void GetShareUrl(const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) override; void GetMetadata(GetFilesystemMetadataCallback callback) override; void MarkCacheFileAsMounted(const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) override; + MarkMountedCallback callback) override; void IsCacheFileMarkedAsMounted(const base::FilePath& drive_file_path, - const IsMountedCallback& callback) override; + IsMountedCallback callback) override; void MarkCacheFileAsUnmounted(const base::FilePath& cache_file_path, const FileOperationCallback& callback) override; void AddPermission(const base::FilePath& drive_file_path, @@ -249,17 +246,6 @@ GetResourceEntryCallback callback, FileError error); - // Part of GetShareUrl. Resolves the resource entry to get the resource it, - // and then uses it to ask for the share url. |callback| must not be null. - void GetShareUrlAfterGetResourceEntry(const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback, - ResourceEntry* entry, - FileError error); - void OnGetResourceEntryForGetShareUrl(const GetShareUrlCallback& callback, - google_apis::DriveApiErrorCode status, - const GURL& share_url); - void OnGetMetadata( GetFilesystemMetadataCallback callback, drive::FileSystemMetadata* default_corpus_metadata,
diff --git a/components/drive/chromeos/file_system_interface.h b/components/drive/chromeos/file_system_interface.h index 1bbe0ea8..30976c6 100644 --- a/components/drive/chromeos/file_system_interface.h +++ b/components/drive/chromeos/file_system_interface.h
@@ -138,10 +138,6 @@ void(FileError error, int64_t bytes_total, int64_t bytes_used)> GetAvailableSpaceCallback; -// Used to get the url to the sharing dialog. -typedef base::Callback<void(FileError error, - const GURL& share_url)> GetShareUrlCallback; - // Used to get filesystem metadata. typedef base::OnceCallback<void( const FileSystemMetadata&, @@ -149,12 +145,12 @@ GetFilesystemMetadataCallback; // Used to mark cached files mounted. -typedef base::Callback<void(FileError error, - const base::FilePath& file_path)> +typedef base::OnceCallback<void(FileError error, + const base::FilePath& file_path)> MarkMountedCallback; // Used to check if a cached file is mounted. -typedef base::Callback<void(FileError error, bool is_mounted)> +typedef base::OnceCallback<void(FileError error, bool is_mounted)> IsMountedCallback; // Used to get file path. @@ -437,13 +433,6 @@ // and returns it to the callback. virtual void GetAvailableSpace(GetAvailableSpaceCallback callback) = 0; - // Fetches the url to the sharing dialog to be embedded in |embed_origin|, - // for the specified file or directory. |callback| must not be null. - virtual void GetShareUrl( - const base::FilePath& file_path, - const GURL& embed_origin, - const GetShareUrlCallback& callback) = 0; - // Returns miscellaneous metadata of the file system like the largest // timestamp. Used in chrome:drive-internals. |callback| must not be null. virtual void GetMetadata(GetFilesystemMetadataCallback callback) = 0; @@ -452,14 +441,13 @@ // If succeeded, the cached file path will be passed to the |callback|. // |callback| must not be null. virtual void MarkCacheFileAsMounted(const base::FilePath& drive_file_path, - const MarkMountedCallback& callback) = 0; + MarkMountedCallback callback) = 0; // Checks if the cached file is marked as mounted, and passes the result to // |callback| upon completion. If the file was not found in the cache, the // result is false. |callback| must not be null. - virtual void IsCacheFileMarkedAsMounted( - const base::FilePath& drive_file_path, - const IsMountedCallback& callback) = 0; + virtual void IsCacheFileMarkedAsMounted(const base::FilePath& drive_file_path, + IsMountedCallback callback) = 0; // Marks the cached file as unmounted, and runs |callback| upon completion. // Note that this method expects that the |cached_file_path| is the path
diff --git a/components/drive/file_system_unittest.cc b/components/drive/file_system_unittest.cc index 6560b57..d9483898 100644 --- a/components/drive/file_system_unittest.cc +++ b/components/drive/file_system_unittest.cc
@@ -1301,26 +1301,6 @@ EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(entry->local_id())); } -TEST_F(FileSystemTest, GetShareUrl) { - ASSERT_TRUE(LoadFullResourceList()); - - const base::FilePath kFileInRoot(FILE_PATH_LITERAL("drive/root/File 1.txt")); - const GURL kEmbedOrigin("chrome-extension://test-id"); - - // Try to fetch the URL for the sharing dialog. - FileError error = FILE_ERROR_FAILED; - GURL share_url; - file_system_->GetShareUrl( - kFileInRoot, - kEmbedOrigin, - google_apis::test_util::CreateCopyResultCallback(&error, &share_url)); - content::RunAllTasksUntilIdle(); - - // Verify the share url to the sharing dialog. - EXPECT_EQ(FILE_ERROR_OK, error); - EXPECT_TRUE(share_url.is_valid()); -} - TEST_F(FileSystemTest, FreeDiskSpaceIfNeededFor) { ASSERT_TRUE(LoadFullResourceList());
diff --git a/components/drive/job_scheduler.cc b/components/drive/job_scheduler.cc index 31523b7..8c206c7a 100644 --- a/components/drive/job_scheduler.cc +++ b/components/drive/job_scheduler.cc
@@ -482,29 +482,6 @@ StartJob(new_job); } -void JobScheduler::GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const ClientContext& context, - const google_apis::GetShareUrlCallback& callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!callback.is_null()); - - JobEntry* new_job = CreateNewJob(TYPE_GET_SHARE_URL); - new_job->context = context; - new_job->task = base::Bind( - &DriveServiceInterface::GetShareUrl, - base::Unretained(drive_service_), - resource_id, - embed_origin, - base::Bind(&JobScheduler::OnGetShareUrlJobDone, - weak_ptr_factory_.GetWeakPtr(), - new_job->job_info.job_id, - callback)); - new_job->abort_callback = CreateErrorRunCallback(callback); - StartJob(new_job); -} - void JobScheduler::TrashResource( const std::string& resource_id, const ClientContext& context, @@ -1066,18 +1043,6 @@ callback.Run(error, std::move(start_page_token)); } -void JobScheduler::OnGetShareUrlJobDone( - JobID job_id, - const google_apis::GetShareUrlCallback& callback, - google_apis::DriveApiErrorCode error, - const GURL& share_url) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!callback.is_null()); - - if (OnJobDone(job_id, error)) - callback.Run(error, share_url); -} - void JobScheduler::OnGetAppListJobDone( JobID job_id, const google_apis::AppListCallback& callback,
diff --git a/components/drive/job_scheduler.h b/components/drive/job_scheduler.h index 86ce363a..4478442 100644 --- a/components/drive/job_scheduler.h +++ b/components/drive/job_scheduler.h
@@ -150,12 +150,6 @@ const ClientContext& context, const google_apis::FileResourceCallback& callback); - // Adds a GetShareUrl operation to the queue. - void GetShareUrl(const std::string& resource_id, - const GURL& embed_origin, - const ClientContext& context, - const google_apis::GetShareUrlCallback& callback); - // Adds a TrashResource operation to the queue. void TrashResource(const std::string& resource_id, const ClientContext& context, @@ -342,13 +336,6 @@ google_apis::DriveApiErrorCode error, std::unique_ptr<google_apis::StartPageToken> start_page_token); - // Callback for job finishing with a GetShareUrlCallback. - void OnGetShareUrlJobDone( - JobID job_id, - const google_apis::GetShareUrlCallback& callback, - google_apis::DriveApiErrorCode error, - const GURL& share_url); - // Callback for job finishing with a AppListCallback. void OnGetAppListJobDone(JobID job_id, const google_apis::AppListCallback& callback,
diff --git a/components/drive/job_scheduler_unittest.cc b/components/drive/job_scheduler_unittest.cc index dc995d1..a5dda4a 100644 --- a/components/drive/job_scheduler_unittest.cc +++ b/components/drive/job_scheduler_unittest.cc
@@ -472,23 +472,6 @@ ASSERT_TRUE(entry); } -TEST_F(JobSchedulerTest, GetShareUrl) { - ConnectToWifi(); - - google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR; - GURL share_url; - - scheduler_->GetShareUrl( - "2_file_resource_id", // resource ID - GURL("chrome-extension://test-id/"), // embed origin - ClientContext(USER_INITIATED), - google_apis::test_util::CreateCopyResultCallback(&error, &share_url)); - base::RunLoop().RunUntilIdle(); - - ASSERT_EQ(google_apis::HTTP_SUCCESS, error); - ASSERT_FALSE(share_url.is_empty()); -} - TEST_F(JobSchedulerTest, TrashResource) { ConnectToWifi();
diff --git a/components/drive/service/drive_api_service.cc b/components/drive/service/drive_api_service.cc index 3ec2a27..e72a592 100644 --- a/components/drive/service/drive_api_service.cc +++ b/components/drive/service/drive_api_service.cc
@@ -44,7 +44,6 @@ using google_apis::FilesListCorpora; using google_apis::FilesListRequestRunner; using google_apis::GetContentCallback; -using google_apis::GetShareUrlCallback; using google_apis::HTTP_NOT_IMPLEMENTED; using google_apis::HTTP_SUCCESS; using google_apis::InitiateUploadCallback; @@ -85,7 +84,6 @@ const char kDriveAppsReadonlyScope[] = "https://www.googleapis.com/auth/drive.apps.readonly"; const char kDriveAppsScope[] = "https://www.googleapis.com/auth/drive.apps"; -const char kDocsListScope[] = "https://docs.google.com/feeds/"; // Mime type to create a directory. const char kFolderMimeType[] = "application/vnd.google-apps.folder"; @@ -117,8 +115,6 @@ "modifiedDate,lastViewedByMeDate,shared,modifiedByMeDate"; const char kFileResourceOpenWithLinksFields[] = "kind,id,openWithLinks/*"; -const char kFileResourceShareLinkFields[] = - "kind,id,shareLink"; const char kFileListFields[] = "kind,items(kind,id,title,createdDate,sharedWithMeDate," "mimeType,md5Checksum,fileSize,labels/trashed,labels/starred," @@ -164,12 +160,6 @@ callback.Run(DRIVE_OTHER_ERROR, GURL()); } -void ExtractShareUrlAndRun(const GetShareUrlCallback& callback, - DriveApiErrorCode error, - std::unique_ptr<FileResource> value) { - callback.Run(error, value ? value->share_link() : GURL()); -} - // Ignores the |entry|, and runs the |callback|. void EntryActionCallbackAdapter(const EntryActionCallback& callback, DriveApiErrorCode error, @@ -295,11 +285,6 @@ scopes.push_back(kDriveAppsReadonlyScope); scopes.push_back(kDriveAppsScope); - // Note: The following scope is used to support GetShareUrl on Drive API v2. - // Unfortunately, there is no support on Drive API v2, so we need to fall back - // to GData WAPI for the GetShareUrl. - scopes.push_back(kDocsListScope); - sender_ = std::make_unique<RequestSender>( std::make_unique<google_apis::AuthService>( oauth2_token_service_, account_id, url_loader_factory_, scopes), @@ -534,27 +519,6 @@ return sender_->StartRequestWithAuthRetry(std::move(request)); } -CancelCallback DriveAPIService::GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const GetShareUrlCallback& callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!callback.is_null()); - - if (!google_apis::IsGoogleChromeAPIKeyUsed()) { - LOG(ERROR) << "Only the official build of Chrome OS can open share dialogs " - << "from the file manager."; - } - - std::unique_ptr<FilesGetRequest> request = std::make_unique<FilesGetRequest>( - sender_.get(), url_generator_, google_apis::IsGoogleChromeAPIKeyUsed(), - base::Bind(&ExtractShareUrlAndRun, callback)); - request->set_file_id(resource_id); - request->set_fields(kFileResourceShareLinkFields); - request->set_embed_origin(embed_origin); - return sender_->StartRequestWithAuthRetry(std::move(request)); -} - CancelCallback DriveAPIService::GetAboutResource( const AboutResourceCallback& callback) { DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/components/drive/service/drive_api_service.h b/components/drive/service/drive_api_service.h index 9d3250d..7b842c6d 100644 --- a/components/drive/service/drive_api_service.h +++ b/components/drive/service/drive_api_service.h
@@ -161,10 +161,6 @@ google_apis::CancelCallback GetFileResource( const std::string& resource_id, const google_apis::FileResourceCallback& callback) override; - google_apis::CancelCallback GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) override; google_apis::CancelCallback GetAboutResource( const google_apis::AboutResourceCallback& callback) override; google_apis::CancelCallback GetStartPageToken(
diff --git a/components/drive/service/drive_service_interface.h b/components/drive/service/drive_service_interface.h index d5cfdcf..c27943d 100644 --- a/components/drive/service/drive_service_interface.h +++ b/components/drive/service/drive_service_interface.h
@@ -321,15 +321,6 @@ const std::string& resource_id, const google_apis::FileResourceCallback& callback) = 0; - // Fetches an url for the sharing dialog for a single entry with id - // |resource_id|, to be embedded in a webview or an iframe with origin - // |embed_origin|. The url is returned via |callback| with results on the - // calling thread. |callback| must not be null. - virtual google_apis::CancelCallback GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) = 0; - // Gets the about resource information from the server. // Upon completion, invokes |callback| with results on the calling thread. // |callback| must not be null.
diff --git a/components/drive/service/dummy_drive_service.cc b/components/drive/service/dummy_drive_service.cc index 1742acc..248f30f 100644 --- a/components/drive/service/dummy_drive_service.cc +++ b/components/drive/service/dummy_drive_service.cc
@@ -19,7 +19,6 @@ using google_apis::FileListCallback; using google_apis::FileResourceCallback; using google_apis::GetContentCallback; -using google_apis::GetShareUrlCallback; using google_apis::InitiateUploadCallback; using google_apis::ProgressCallback; using google_apis::TeamDriveListCallback; @@ -110,11 +109,6 @@ const std::string& resource_id, const FileResourceCallback& callback) { return CancelCallback(); } -CancelCallback DummyDriveService::GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const GetShareUrlCallback& callback) { return CancelCallback(); } - CancelCallback DummyDriveService::GetAboutResource( const AboutResourceCallback& callback) { return CancelCallback(); }
diff --git a/components/drive/service/dummy_drive_service.h b/components/drive/service/dummy_drive_service.h index 271ffe13..3c26e7d 100644 --- a/components/drive/service/dummy_drive_service.h +++ b/components/drive/service/dummy_drive_service.h
@@ -68,10 +68,6 @@ google_apis::CancelCallback GetFileResource( const std::string& resource_id, const google_apis::FileResourceCallback& callback) override; - google_apis::CancelCallback GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) override; google_apis::CancelCallback GetAboutResource( const google_apis::AboutResourceCallback& callback) override; google_apis::CancelCallback GetStartPageToken(
diff --git a/components/drive/service/fake_drive_service.cc b/components/drive/service/fake_drive_service.cc index 8df5fb0..07266ac 100644 --- a/components/drive/service/fake_drive_service.cc +++ b/components/drive/service/fake_drive_service.cc
@@ -53,7 +53,6 @@ using google_apis::FileResource; using google_apis::FileResourceCallback; using google_apis::GetContentCallback; -using google_apis::GetShareUrlCallback; using google_apis::HTTP_BAD_REQUEST; using google_apis::HTTP_CREATED; using google_apis::HTTP_FORBIDDEN; @@ -269,7 +268,6 @@ start_page_token_load_count_(0), offline_(false), never_return_all_file_list_(false), - share_url_base_("https://share_url/"), weak_ptr_factory_(this) { UpdateLatestChangelistId(largest_changestamp_, std::string()); about_resource_->set_quota_bytes_total(9876543210); @@ -702,31 +700,6 @@ return CancelCallback(); } -CancelCallback FakeDriveService::GetShareUrl( - const std::string& resource_id, - const GURL& /* embed_origin */, - const GetShareUrlCallback& callback) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(callback); - - if (offline_) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, DRIVE_NO_CONNECTION, GURL())); - return CancelCallback(); - } - - EntryInfo* entry = FindEntryByResourceId(resource_id); - if (entry) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, HTTP_SUCCESS, entry->share_url)); - return CancelCallback(); - } - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, HTTP_NOT_FOUND, GURL())); - return CancelCallback(); -} - CancelCallback FakeDriveService::GetAboutResource( const AboutResourceCallback& callback) { DCHECK(thread_checker_.CalledOnValidThread()); @@ -1869,9 +1842,6 @@ *new_file->mutable_parents() = parents; } - new_entry->share_url = net::AppendOrReplaceQueryParameter( - share_url_base_, "name", title); - AddNewChangestamp(new_change, team_drive_id); UpdateETag(new_file); @@ -1909,9 +1879,6 @@ team_drive->set_name(team_drive_name); change.set_team_drive(std::move(team_drive)); - new_entry->share_url = net::AppendOrReplaceQueryParameter( - share_url_base_, "name", team_drive_name); - AddNewChangestamp(&change, std::string()); change.set_modification_date(base::Time() +
diff --git a/components/drive/service/fake_drive_service.h b/components/drive/service/fake_drive_service.h index 21b56a7..7725e89 100644 --- a/components/drive/service/fake_drive_service.h +++ b/components/drive/service/fake_drive_service.h
@@ -89,12 +89,6 @@ default_max_results_ = default_max_results; } - // Sets the url to the test server to be used as a base for generated share - // urls to the share dialog. - void set_share_url_base(const GURL& share_url_base) { - share_url_base_ = share_url_base; - } - // Changes the quota fields returned from GetAboutResource(). void SetQuotaValue(int64_t used, int64_t total); @@ -207,10 +201,6 @@ google_apis::CancelCallback GetFileResource( const std::string& resource_id, const google_apis::FileResourceCallback& callback) override; - google_apis::CancelCallback GetShareUrl( - const std::string& resource_id, - const GURL& embed_origin, - const google_apis::GetShareUrlCallback& callback) override; google_apis::CancelCallback GetAboutResource( const google_apis::AboutResourceCallback& callback) override; google_apis::CancelCallback GetStartPageToken( @@ -478,7 +468,6 @@ bool offline_; bool never_return_all_file_list_; base::FilePath last_cancelled_file_; - GURL share_url_base_; std::string app_json_template_; std::string open_url_format_;
diff --git a/components/drive/service/fake_drive_service_unittest.cc b/components/drive/service/fake_drive_service_unittest.cc index 9edf94a..91ea64a 100644 --- a/components/drive/service/fake_drive_service_unittest.cc +++ b/components/drive/service/fake_drive_service_unittest.cc
@@ -1048,22 +1048,6 @@ EXPECT_FALSE(entry); } -TEST_F(FakeDriveServiceTest, GetShareUrl) { - ASSERT_TRUE(test_util::SetUpTestEntries(&fake_service_)); - - const std::string kResourceId = "2_file_resource_id"; - DriveApiErrorCode error = DRIVE_OTHER_ERROR; - GURL share_url; - fake_service_.GetShareUrl( - kResourceId, - GURL(), // embed origin - test_util::CreateCopyResultCallback(&error, &share_url)); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(HTTP_SUCCESS, error); - EXPECT_FALSE(share_url.is_empty()); -} - TEST_F(FakeDriveServiceTest, DeleteResource_ExistingFile) { ASSERT_TRUE(test_util::SetUpTestEntries(&fake_service_));
diff --git a/components/feed/content/feed_offline_host.cc b/components/feed/content/feed_offline_host.cc index 256df3eb..b71849a9 100644 --- a/components/feed/content/feed_offline_host.cc +++ b/components/feed/content/feed_offline_host.cc
@@ -15,11 +15,17 @@ namespace feed { +using offline_pages::OfflinePageItem; +using offline_pages::OfflinePageModel; +using offline_pages::PrefetchService; +using offline_pages::PrefetchSuggestion; +using offline_pages::SuggestionsProvider; + namespace { // |url| is always set. Sometimes |original_url| is set. If |original_url| is // set it is returned by this method, otherwise fall back to |url|. -const GURL& PreferOriginal(const offline_pages::OfflinePageItem& item) { +const GURL& PreferOriginal(const OfflinePageItem& item) { return item.original_url.is_empty() ? item.url : item.original_url; } @@ -39,9 +45,9 @@ on_each_result_(std::move(on_each_result)), start_time_(base::Time::Now()) {} - void OnGetPages(const std::vector<offline_pages::OfflinePageItem>& pages) { + void OnGetPages(const std::vector<OfflinePageItem>& pages) { if (!pages.empty()) { - offline_pages::OfflinePageItem newest = + OfflinePageItem newest = *std::max_element(pages.begin(), pages.end(), [](auto lhs, auto rhs) { return lhs.creation_time < rhs.creation_time; }); @@ -75,18 +81,43 @@ base::Time start_time_; }; +// Consumes |metadataVector|, moving as many of the fields as possible. +std::vector<PrefetchSuggestion> ConvertMetadataToSuggestions( + std::vector<ContentMetadata> metadataVector) { + std::vector<PrefetchSuggestion> suggestionsVector; + for (ContentMetadata& metadata : metadataVector) { + // TODO(skym): Copy over published time when PrefetchSuggestion adds + // support. + PrefetchSuggestion suggestion; + suggestion.article_url = GURL(metadata.url); + suggestion.article_title = std::move(metadata.title); + suggestion.article_attribution = std::move(metadata.publisher); + suggestion.article_snippet = std::move(metadata.snippet); + suggestion.thumbnail_url = GURL(metadata.image_url); + suggestion.favicon_url = GURL(metadata.favicon_url); + suggestionsVector.push_back(std::move(suggestion)); + } + return suggestionsVector; +} + +void RunSuggestionCallbackWithConversion( + SuggestionsProvider::SuggestionCallback suggestions_callback, + std::vector<ContentMetadata> metadataVector) { + std::move(suggestions_callback) + .Run(ConvertMetadataToSuggestions(std::move(metadataVector))); +} + } // namespace -FeedOfflineHost::FeedOfflineHost( - offline_pages::OfflinePageModel* offline_page_model, - offline_pages::PrefetchService* prefetch_service, - base::RepeatingClosure on_suggestion_consumed, - base::RepeatingClosure on_suggestions_shown) +FeedOfflineHost::FeedOfflineHost(OfflinePageModel* offline_page_model, + PrefetchService* prefetch_service, + base::RepeatingClosure on_suggestion_consumed, + base::RepeatingClosure on_suggestions_shown) : offline_page_model_(offline_page_model), prefetch_service_(prefetch_service), on_suggestion_consumed_(on_suggestion_consumed), on_suggestions_shown_(on_suggestions_shown), - weak_ptr_factory_(this) { + weak_factory_(this) { DCHECK(offline_page_model_); DCHECK(prefetch_service_); DCHECK(!on_suggestion_consumed_.is_null()); @@ -95,6 +126,13 @@ FeedOfflineHost::~FeedOfflineHost() = default; +void FeedOfflineHost::Initialize( + const base::RepeatingClosure& trigger_get_known_content) { + DCHECK(trigger_get_known_content_.is_null()); + trigger_get_known_content_ = trigger_get_known_content; + // TODO(skym): Post task to call PrefetchService::SetSuggestionProvider(). +} + base::Optional<int64_t> FeedOfflineHost::GetOfflineId(const std::string& url) { auto iter = url_hash_to_id_.find(base::Hash(url)); return iter == url_hash_to_id_.end() ? base::Optional<int64_t>() @@ -110,7 +148,7 @@ base::MakeRefCounted<CallbackAggregator>( std::move(callback), base::BindRepeating(&FeedOfflineHost::CacheOfflinePageAndId, - weak_ptr_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr())); for (std::string url : urls) { offline_page_model_->GetPagesByURL( @@ -130,10 +168,29 @@ // TODO(skym): Clear out local cache of offline data. } +void FeedOfflineHost::OnGetKnownContentDone( + std::vector<ContentMetadata> suggestions) { + // While |suggestions| are movable, there might be multiple callbacks in + // |pending_known_content_callbacks_|. All but one callback will need to + // receive a full copy of |suggestions|, and the last one will received a + // moved copy. + for (size_t i = 0; i < pending_known_content_callbacks_.size(); i++) { + bool can_move = (i + 1 == pending_known_content_callbacks_.size()); + std::move(pending_known_content_callbacks_[i]) + .Run(can_move ? std::move(suggestions) : suggestions); + } + pending_known_content_callbacks_.clear(); +} + void FeedOfflineHost::GetCurrentArticleSuggestions( - offline_pages::SuggestionsProvider::SuggestionCallback - suggestions_callback) { - // TODO(skym): Call into bridge callback. + SuggestionsProvider::SuggestionCallback suggestions_callback) { + pending_known_content_callbacks_.push_back(base::BindOnce( + &RunSuggestionCallbackWithConversion, std::move(suggestions_callback))); + // Trigger after push_back() in case triggering results in a synchronous + // response via OnGetKnownContentDone(). + if (pending_known_content_callbacks_.size() <= 1) { + trigger_get_known_content_.Run(); + } } void FeedOfflineHost::ReportArticleListViewed() { @@ -144,19 +201,17 @@ on_suggestions_shown_.Run(); } -void FeedOfflineHost::OfflinePageModelLoaded( - offline_pages::OfflinePageModel* model) { +void FeedOfflineHost::OfflinePageModelLoaded(OfflinePageModel* model) { // Ignored. } -void FeedOfflineHost::OfflinePageAdded( - offline_pages::OfflinePageModel* model, - const offline_pages::OfflinePageItem& added_page) { +void FeedOfflineHost::OfflinePageAdded(OfflinePageModel* model, + const OfflinePageItem& added_page) { // TODO(skym): Call into bridge callback. } void FeedOfflineHost::OfflinePageDeleted( - const offline_pages::OfflinePageModel::DeletedPageInfo& page_info) { + const OfflinePageModel::DeletedPageInfo& page_info) { // TODO(skym): Call into bridge callback. }
diff --git a/components/feed/content/feed_offline_host.h b/components/feed/content/feed_offline_host.h index 6816a54..d14b00c 100644 --- a/components/feed/content/feed_offline_host.h +++ b/components/feed/content/feed_offline_host.h
@@ -13,6 +13,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" +#include "components/feed/core/content_metadata.h" #include "components/offline_pages/core/offline_page_model.h" #include "components/offline_pages/core/prefetch/suggestions_provider.h" @@ -32,12 +33,20 @@ class FeedOfflineHost : public offline_pages::SuggestionsProvider, public offline_pages::OfflinePageModel::Observer { public: + using GetKnownContentCallback = + base::OnceCallback<void(std::vector<ContentMetadata>)>; + FeedOfflineHost(offline_pages::OfflinePageModel* offline_page_model, offline_pages::PrefetchService* prefetch_service, base::RepeatingClosure on_suggestion_consumed, base::RepeatingClosure on_suggestions_shown); ~FeedOfflineHost() override; + // Initialize with callbacks to call into bridge/Java side. Should only be + // called once, and done as soon as the bridge is ready. The FeedOfflineHost + // will not be fully ready to perform its function without these dependencies. + void Initialize(const base::RepeatingClosure& trigger_get_known_content); + // Synchronously returns the offline id of the given page. The host will only // have knowledge of the page if it had previously returned status about it // through GetOfflineState() or as a notification. Otherwise the caller will @@ -64,6 +73,10 @@ // to clear local tracking of offlined items. void OnNoListeners(); + // Should be called when async GetKnownContent is completed. Broadcasts to all + // waiting consumers in |pending_known_content_callbacks_|. + void OnGetKnownContentDone(std::vector<ContentMetadata> suggestions); + // offline_pages::SuggestionsProvider: void GetCurrentArticleSuggestions( offline_pages::SuggestionsProvider::SuggestionCallback @@ -99,7 +112,16 @@ // is the offline id for the given page. base::flat_map<uint32_t, int64_t> url_hash_to_id_; - base::WeakPtrFactory<FeedOfflineHost> weak_ptr_factory_; + // Starts an the async request for ContentMetadata through KnownContentApi's + // GetKnownContent(). Will only be invoked when there isn't already an + // outstanding GetKnownContent(). + base::RepeatingClosure trigger_get_known_content_; + + // Holds all consumers of GetKnownContent(). It is assumed that there's an + // outstanding GetKnownContent() if and only if this vector is not empty. + std::vector<GetKnownContentCallback> pending_known_content_callbacks_; + + base::WeakPtrFactory<FeedOfflineHost> weak_factory_; DISALLOW_COPY_AND_ASSIGN(FeedOfflineHost); };
diff --git a/components/feed/content/feed_offline_host_unittest.cc b/components/feed/content/feed_offline_host_unittest.cc index eb2e93f..dbb9c22 100644 --- a/components/feed/content/feed_offline_host_unittest.cc +++ b/components/feed/content/feed_offline_host_unittest.cc
@@ -10,30 +10,43 @@ #include <utility> #include "base/bind.h" +#include "base/location.h" #include "base/task/post_task.h" #include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" +#include "components/feed/core/content_metadata.h" #include "components/offline_pages/core/offline_page_item.h" #include "components/offline_pages/core/offline_page_types.h" #include "components/offline_pages/core/prefetch/stub_prefetch_service.h" #include "components/offline_pages/core/stub_offline_page_model.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" namespace feed { namespace { -const char kUrl1[] = "https://www.one.com/"; -const char kUrl2[] = "https://www.two.com/"; -const char kUrl3[] = "https://www.three.com/"; +using offline_pages::OfflinePageItem; +using offline_pages::StubOfflinePageModel; +using offline_pages::MultipleOfflinePageItemCallback; +using offline_pages::PrefetchSuggestion; +using offline_pages::StubPrefetchService; -class TestOfflinePageModel : public offline_pages::StubOfflinePageModel { +constexpr char kUrl1[] = "https://www.one.com/"; +constexpr char kUrl2[] = "https://www.two.com/"; +constexpr char kUrl3[] = "https://www.three.com/"; + +constexpr char kOne[] = "One"; +constexpr char kTwo[] = "Two"; +constexpr char kThree[] = "Three"; + +class TestOfflinePageModel : public StubOfflinePageModel { public: void AddOfflinedPage(const std::string& url, const std::string& original_url, int64_t offline_id, base::Time creation_time) { - offline_pages::OfflinePageItem item; + OfflinePageItem item; item.url = GURL(url); item.original_url = GURL(original_url); item.offline_id = offline_id; @@ -49,11 +62,10 @@ } private: - void GetPagesByURL( - const GURL& url, - offline_pages::MultipleOfflinePageItemCallback callback) override { + void GetPagesByURL(const GURL& url, + MultipleOfflinePageItemCallback callback) override { auto iter = url_to_offline_page_item_.equal_range(url.spec()); - std::vector<offline_pages::OfflinePageItem> ret; + std::vector<OfflinePageItem> ret; ret.resize(std::distance(iter.first, iter.second)); std::transform(iter.first, iter.second, ret.begin(), [](auto pair) { return pair.second; }); @@ -62,15 +74,19 @@ FROM_HERE, base::BindOnce(std::move(callback), std::move(ret))); } - // Maps URLs to offline_pages::OfflinePageItem. Items with both |urls| and - // |original_url| will be inserted at both locations in the multimap. - std::multimap<std::string, offline_pages::OfflinePageItem> - url_to_offline_page_item_; + // Maps URLs to OfflinePageItem. Items with both |urls| and |original_url| + // will be inserted at both locations in the multimap. + std::multimap<std::string, OfflinePageItem> url_to_offline_page_item_; }; -void CopyResults(std::vector<std::string>* actual, - std::vector<std::string> result) { - *actual = result; +void CopyStatus(std::vector<std::string>* out, + std::vector<std::string> result) { + *out = std::move(result); +} + +void CopySuggestions(std::vector<PrefetchSuggestion>* out, + std::vector<PrefetchSuggestion> result) { + *out = std::move(result); } } // namespace @@ -81,28 +97,36 @@ FeedOfflineHost* host() { return host_.get(); } int get_suggestion_consumed_count() { return suggestion_consumed_count_; } int get_suggestions_shown_count() { return suggestions_shown_count_; } + int get_get_known_content_count() { return get_known_content_count_; } void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); } - protected: - FeedOfflineHostTest() { + void ResetHost() { host_ = std::make_unique<FeedOfflineHost>( &offline_page_model_, &prefetch_service_, base::BindRepeating(&FeedOfflineHostTest::OnSuggestionConsumed, base::Unretained(this)), base::BindRepeating(&FeedOfflineHostTest::OnSuggestionsShown, base::Unretained(this))); + host_->Initialize( + base::BindRepeating(&FeedOfflineHostTest::OnGetKnownContentRequested, + base::Unretained(this))); } + protected: + FeedOfflineHostTest() { ResetHost(); } + void OnSuggestionConsumed() { ++suggestion_consumed_count_; } void OnSuggestionsShown() { ++suggestions_shown_count_; } + void OnGetKnownContentRequested() { ++get_known_content_count_; } base::test::ScopedTaskEnvironment scoped_task_environment_; TestOfflinePageModel offline_page_model_; - offline_pages::StubPrefetchService prefetch_service_; + StubPrefetchService prefetch_service_; std::unique_ptr<FeedOfflineHost> host_; int suggestion_consumed_count_ = 0; int suggestions_shown_count_ = 0; + int get_known_content_count_ = 0; }; TEST_F(FeedOfflineHostTest, ReportArticleListViewed) { @@ -125,7 +149,7 @@ TEST_F(FeedOfflineHostTest, GetOfflineStatusEmpty) { std::vector<std::string> actual; - host()->GetOfflineStatus({}, base::BindOnce(&CopyResults, &actual)); + host()->GetOfflineStatus({}, base::BindOnce(&CopyStatus, &actual)); RunUntilIdle(); EXPECT_EQ(0U, actual.size()); @@ -135,7 +159,7 @@ offline_page_model()->AddOfflinedPage(kUrl1, 4); std::vector<std::string> actual; - host()->GetOfflineStatus({kUrl2}, base::BindOnce(&CopyResults, &actual)); + host()->GetOfflineStatus({kUrl2}, base::BindOnce(&CopyStatus, &actual)); RunUntilIdle(); EXPECT_EQ(0U, actual.size()); @@ -150,7 +174,7 @@ std::vector<std::string> actual; host()->GetOfflineStatus({kUrl1, kUrl2}, - base::BindOnce(&CopyResults, &actual)); + base::BindOnce(&CopyStatus, &actual)); EXPECT_EQ(0U, actual.size()); RunUntilIdle(); @@ -167,7 +191,7 @@ offline_page_model()->AddOfflinedPage(kUrl1, kUrl2, 4, base::Time()); std::vector<std::string> actual; - host()->GetOfflineStatus({kUrl2}, base::BindOnce(&CopyResults, &actual)); + host()->GetOfflineStatus({kUrl2}, base::BindOnce(&CopyStatus, &actual)); RunUntilIdle(); EXPECT_EQ(1U, actual.size()); @@ -182,7 +206,7 @@ kUrl1, "", 5, base::Time() + base::TimeDelta::FromHours(1)); std::vector<std::string> actual; - host()->GetOfflineStatus({kUrl1}, base::BindOnce(&CopyResults, &actual)); + host()->GetOfflineStatus({kUrl1}, base::BindOnce(&CopyStatus, &actual)); RunUntilIdle(); EXPECT_EQ(1U, actual.size()); @@ -190,4 +214,82 @@ EXPECT_EQ(host()->GetOfflineId(kUrl1).value(), 5); } +TEST_F(FeedOfflineHostTest, GetCurrentArticleSuggestions) { + std::vector<PrefetchSuggestion> actual; + host()->GetCurrentArticleSuggestions( + base::BindOnce(&CopySuggestions, &actual)); + EXPECT_EQ(1, get_get_known_content_count()); + EXPECT_EQ(0U, actual.size()); + + ContentMetadata metadata; + metadata.url = kUrl1; + metadata.title = kOne; + metadata.time_published = base::Time(); + metadata.image_url = kUrl2; + metadata.publisher = kTwo; + metadata.favicon_url = kUrl3; + metadata.snippet = kThree; + host()->OnGetKnownContentDone({std::move(metadata)}); + + EXPECT_EQ(1U, actual.size()); + EXPECT_EQ(kUrl1, actual[0].article_url.spec()); + EXPECT_EQ(kOne, actual[0].article_title); + EXPECT_EQ(kTwo, actual[0].article_attribution); + EXPECT_EQ(kThree, actual[0].article_snippet); + EXPECT_EQ(kUrl2, actual[0].thumbnail_url.spec()); + EXPECT_EQ(kUrl3, actual[0].favicon_url.spec()); +} + +TEST_F(FeedOfflineHostTest, GetCurrentArticleSuggestionsMultiple) { + std::vector<PrefetchSuggestion> suggestions1; + host()->GetCurrentArticleSuggestions( + base::BindOnce(&CopySuggestions, &suggestions1)); + EXPECT_EQ(1, get_get_known_content_count()); + std::vector<PrefetchSuggestion> suggestions2; + host()->GetCurrentArticleSuggestions( + base::BindOnce(&CopySuggestions, &suggestions2)); + // This second GetCurrentArticleSuggestions() should not re-trigger since the + // host should know there's an outstanding request. + EXPECT_EQ(1, get_get_known_content_count()); + + // Use both url and title, url goes through a GURL and isn't really moved all + // the way, but title should actually be moved into one of the results. + ContentMetadata metadata1; + metadata1.url = kUrl1; + metadata1.title = kOne; + ContentMetadata metadata2; + metadata2.url = kUrl2; + metadata2.title = kTwo; + host()->OnGetKnownContentDone({std::move(metadata1), std::move(metadata2)}); + + EXPECT_EQ(2U, suggestions1.size()); + EXPECT_EQ(kUrl1, suggestions1[0].article_url.spec()); + EXPECT_EQ(kOne, suggestions1[0].article_title); + EXPECT_EQ(kUrl2, suggestions1[1].article_url.spec()); + EXPECT_EQ(kTwo, suggestions1[1].article_title); + EXPECT_EQ(2U, suggestions2.size()); + EXPECT_EQ(kUrl1, suggestions2[0].article_url.spec()); + EXPECT_EQ(kOne, suggestions2[0].article_title); + EXPECT_EQ(kUrl2, suggestions2[1].article_url.spec()); + EXPECT_EQ(kTwo, suggestions2[1].article_title); + + // Now perform another GetCurrentArticleSuggestions and make sure the + // originally bound callbacks are not invoked. + std::vector<PrefetchSuggestion> suggestions3; + host()->GetCurrentArticleSuggestions( + base::BindOnce(&CopySuggestions, &suggestions3)); + EXPECT_EQ(2, get_get_known_content_count()); + + ContentMetadata metadata3; + metadata3.url = kUrl3; + metadata3.title = kThree; + host()->OnGetKnownContentDone({std::move(metadata3)}); + + EXPECT_EQ(2U, suggestions1.size()); + EXPECT_EQ(2U, suggestions2.size()); + EXPECT_EQ(1U, suggestions3.size()); + EXPECT_EQ(kUrl3, suggestions3[0].article_url.spec()); + EXPECT_EQ(kThree, suggestions3[0].article_title); +} + } // namespace feed
diff --git a/components/feed/core/BUILD.gn b/components/feed/core/BUILD.gn index 3954cdcd..f2732b3 100644 --- a/components/feed/core/BUILD.gn +++ b/components/feed/core/BUILD.gn
@@ -8,6 +8,8 @@ source_set("feed_core") { sources = [ + "content_metadata.cc", + "content_metadata.h", "feed_content_database.cc", "feed_content_database.h", "feed_content_mutation.cc",
diff --git a/components/feed/core/content_metadata.cc b/components/feed/core/content_metadata.cc new file mode 100644 index 0000000..8f78ace --- /dev/null +++ b/components/feed/core/content_metadata.cc
@@ -0,0 +1,17 @@ +// 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. + +#include "components/feed/core/content_metadata.h" + +namespace feed { + +ContentMetadata::ContentMetadata() = default; + +ContentMetadata::ContentMetadata(const ContentMetadata&) = default; + +ContentMetadata::ContentMetadata(ContentMetadata&&) = default; + +ContentMetadata::~ContentMetadata() = default; + +} // namespace feed
diff --git a/components/feed/core/content_metadata.h b/components/feed/core/content_metadata.h new file mode 100644 index 0000000..bf31306cd --- /dev/null +++ b/components/feed/core/content_metadata.h
@@ -0,0 +1,46 @@ +// 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 COMPONENTS_FEED_CORE_CONTENT_METADATA_H_ +#define COMPONENTS_FEED_CORE_CONTENT_METADATA_H_ + +#include <string> + +#include "base/time/time.h" + +namespace feed { + +// Native counterpart of ContentMetadata.java. +struct ContentMetadata { + ContentMetadata(); + ContentMetadata(const ContentMetadata&); + ContentMetadata(ContentMetadata&&); + ~ContentMetadata(); + + // A link to the underlying article. + std::string url; + + // The title of the article. + std::string title; + + // The time the article was published, independent of when the device was + // downloaded this metadata. + base::Time time_published; + + // A link to a thumbnail. + std::string image_url; + + // The name of the publisher. + std::string publisher; + + // A link to the favicon for the publisher's domain. + std::string favicon_url; + + // A short description of the article, human readable. + std::string snippet; +}; + +} // namespace feed + +#endif // COMPONENTS_FEED_CORE_CONTENT_METADATA_H_
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn index 758caea..430c73c 100644 --- a/components/offline_items_collection/core/BUILD.gn +++ b/components/offline_items_collection/core/BUILD.gn
@@ -10,6 +10,8 @@ static_library("core") { sources = [ "fail_state.h", + "filtered_offline_item_observer.cc", + "filtered_offline_item_observer.h", "launch_location.h", "offline_content_aggregator.cc", "offline_content_aggregator.h", @@ -55,6 +57,7 @@ testonly = true sources = [ + "filtered_offline_item_observer_unittest.cc", "offline_content_aggregator_unittest.cc", "throttled_offline_content_provider_unittest.cc", ]
diff --git a/components/offline_items_collection/core/filtered_offline_item_observer.cc b/components/offline_items_collection/core/filtered_offline_item_observer.cc new file mode 100644 index 0000000..d37be51 --- /dev/null +++ b/components/offline_items_collection/core/filtered_offline_item_observer.cc
@@ -0,0 +1,61 @@ +// 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. + +#include "components/offline_items_collection/core/filtered_offline_item_observer.h" +#include <utility> + +namespace offline_items_collection { + +FilteredOfflineItemObserver::FilteredOfflineItemObserver( + OfflineContentProvider* provider) + : provider_(provider) { + provider_->AddObserver(this); +} + +FilteredOfflineItemObserver::~FilteredOfflineItemObserver() { + provider_->RemoveObserver(this); +} + +void FilteredOfflineItemObserver::AddObserver(const ContentId& id, + Observer* observer) { + if (observers_.find(id) == observers_.end()) + observers_.insert(std::make_pair(id, std::make_unique<ObserverValue>())); + + observers_[id]->AddObserver(observer); +} + +void FilteredOfflineItemObserver::RemoveObserver(const ContentId& id, + Observer* observer) { + auto it = observers_.find(id); + if (it == observers_.end()) + return; + + it->second->RemoveObserver(observer); + + if (!it->second->might_have_observers()) + observers_.erase(it); +} + +void FilteredOfflineItemObserver::OnItemsAdded( + const OfflineContentProvider::OfflineItemList& items) {} + +void FilteredOfflineItemObserver::OnItemRemoved(const ContentId& id) { + auto it = observers_.find(id); + if (it == observers_.end()) + return; + + for (auto& observer : *(it->second)) + observer.OnItemRemoved(id); +} + +void FilteredOfflineItemObserver::OnItemUpdated(const OfflineItem& item) { + auto it = observers_.find(item.id); + if (it == observers_.end()) + return; + + for (auto& observer : *(it->second)) + observer.OnItemUpdated(item); +} + +} // namespace offline_items_collection
diff --git a/components/offline_items_collection/core/filtered_offline_item_observer.h b/components/offline_items_collection/core/filtered_offline_item_observer.h new file mode 100644 index 0000000..bbb00fd --- /dev/null +++ b/components/offline_items_collection/core/filtered_offline_item_observer.h
@@ -0,0 +1,56 @@ +// 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 COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_FILTERED_OFFLINE_ITEM_OBSERVER_H_ +#define COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_FILTERED_OFFLINE_ITEM_OBSERVER_H_ + +#include <map> +#include <memory> + +#include "base/macros.h" +#include "base/observer_list.h" +#include "components/offline_items_collection/core/offline_content_provider.h" +#include "components/offline_items_collection/core/offline_item.h" + +namespace offline_items_collection { + +// Provides clients the ability to register observers interested only in the +// updates for a single offline item. +class FilteredOfflineItemObserver : public OfflineContentProvider::Observer { + public: + // Observer for a single offline item. + class Observer { + public: + virtual void OnItemRemoved(const ContentId& id) = 0; + virtual void OnItemUpdated(const OfflineItem& item) = 0; + + protected: + virtual ~Observer() = default; + }; + + FilteredOfflineItemObserver(OfflineContentProvider* provider); + ~FilteredOfflineItemObserver() override; + + void AddObserver(const ContentId& id, Observer* observer); + void RemoveObserver(const ContentId& id, Observer* observer); + + private: + using ObserverValue = base::ObserverList<Observer>::Unchecked; + using ObserversMap = std::map<ContentId, std::unique_ptr<ObserverValue>>; + + // OfflineContentProvider::Observer implementation. + void OnItemsAdded( + const OfflineContentProvider::OfflineItemList& items) override; + void OnItemRemoved(const ContentId& id) override; + void OnItemUpdated(const OfflineItem& item) override; + + OfflineContentProvider* provider_; + ObserversMap observers_; + + DISALLOW_COPY_AND_ASSIGN(FilteredOfflineItemObserver); +}; + +} // namespace offline_items_collection + +#endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_FILTERED_OFFLINE_ITEM_OBSERVER_H_
diff --git a/components/offline_items_collection/core/filtered_offline_item_observer_unittest.cc b/components/offline_items_collection/core/filtered_offline_item_observer_unittest.cc new file mode 100644 index 0000000..af362c8 --- /dev/null +++ b/components/offline_items_collection/core/filtered_offline_item_observer_unittest.cc
@@ -0,0 +1,73 @@ +// 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. + +#include "components/offline_items_collection/core/filtered_offline_item_observer.h" + +#include "base/guid.h" +#include "components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.h" +#include "components/offline_items_collection/core/test_support/mock_offline_content_provider.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; + +namespace offline_items_collection { +namespace { + +TEST(FilteredOfflineItemObserverTest, TestBasicUsage) { + ContentId id1("test", base::GenerateGUID()); + ContentId id2("test", base::GenerateGUID()); + ContentId id3("test2", id1.id); + ContentId id4("test", base::GenerateGUID()); + + OfflineItem item1(id1); + OfflineItem item2(id2); + + MockOfflineContentProvider provider; + FilteredOfflineItemObserver filter(&provider); + + MockFilteredOfflineItemObserver::ScopedMockObserver obs1(&filter, id1); + MockFilteredOfflineItemObserver::ScopedMockObserver obs2(&filter, id2); + MockFilteredOfflineItemObserver::ScopedMockObserver obs3(&filter, id3); + + EXPECT_CALL(obs2, OnItemUpdated(item2)).Times(1); + EXPECT_CALL(obs3, OnItemRemoved(id3)).Times(1); + + provider.NotifyOnItemsAdded({item1}); + provider.NotifyOnItemUpdated(item2); + provider.NotifyOnItemRemoved(id3); + provider.NotifyOnItemRemoved(id4); +} + +TEST(FilteredOfflineItemObserverTest, AddRemoveObservers) { + ContentId id1("test", base::GenerateGUID()); + OfflineItem item1(id1); + + MockOfflineContentProvider provider; + FilteredOfflineItemObserver filter(&provider); + + MockFilteredOfflineItemObserver::MockObserver obs1; + + { + EXPECT_CALL(obs1, OnItemUpdated(_)).Times(0); + provider.NotifyOnItemUpdated(item1); + } + + filter.AddObserver(id1, &obs1); + + { + EXPECT_CALL(obs1, OnItemUpdated(_)).Times(1); + provider.NotifyOnItemUpdated(item1); + } + + filter.RemoveObserver(id1, &obs1); + + { + EXPECT_CALL(obs1, OnItemUpdated(_)).Times(0); + provider.NotifyOnItemUpdated(item1); + } +} + +} // namespace +} // namespace offline_items_collection
diff --git a/components/offline_items_collection/core/test_support/BUILD.gn b/components/offline_items_collection/core/test_support/BUILD.gn index 0334a7a..f696a95 100644 --- a/components/offline_items_collection/core/test_support/BUILD.gn +++ b/components/offline_items_collection/core/test_support/BUILD.gn
@@ -6,6 +6,8 @@ testonly = true sources = [ + "mock_filtered_offline_item_observer.cc", + "mock_filtered_offline_item_observer.h", "mock_offline_content_provider.cc", "mock_offline_content_provider.h", "offline_item_test_support.cc",
diff --git a/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.cc b/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.cc new file mode 100644 index 0000000..ab7c804 --- /dev/null +++ b/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.cc
@@ -0,0 +1,23 @@ +// 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. + +#include "components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.h" + +namespace offline_items_collection { + +MockFilteredOfflineItemObserver::MockObserver::MockObserver() = default; +MockFilteredOfflineItemObserver::MockObserver::~MockObserver() = default; + +MockFilteredOfflineItemObserver::ScopedMockObserver::ScopedMockObserver( + FilteredOfflineItemObserver* observer, + const ContentId& id) + : id_(id), observer_(observer) { + observer_->AddObserver(id_, this); +} + +MockFilteredOfflineItemObserver::ScopedMockObserver::~ScopedMockObserver() { + observer_->RemoveObserver(id_, this); +} + +} // namespace offline_items_collection
diff --git a/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.h b/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.h new file mode 100644 index 0000000..6e252b3 --- /dev/null +++ b/components/offline_items_collection/core/test_support/mock_filtered_offline_item_observer.h
@@ -0,0 +1,50 @@ +// 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 COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_TEST_SUPPORT_MOCK_FILTERED_OFFLINE_ITEM_OBSERVER_H_ +#define COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_TEST_SUPPORT_MOCK_FILTERED_OFFLINE_ITEM_OBSERVER_H_ + +#include "base/macros.h" +#include "components/offline_items_collection/core/filtered_offline_item_observer.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace offline_items_collection { + +class MockFilteredOfflineItemObserver { + public: + class MockObserver : public FilteredOfflineItemObserver::Observer { + public: + MockObserver(); + ~MockObserver() override; + + // FilteredOfflineItemObserver::Observer implementation. + MOCK_METHOD1(OnItemRemoved, void(const ContentId&)); + MOCK_METHOD1(OnItemUpdated, void(const OfflineItem&)); + }; + + class ScopedMockObserver : public MockObserver { + public: + ScopedMockObserver(FilteredOfflineItemObserver* observer, + const ContentId& id); + ~ScopedMockObserver() override; + + private: + ContentId id_; + FilteredOfflineItemObserver* observer_; + + DISALLOW_COPY_AND_ASSIGN(ScopedMockObserver); + }; + + private: + // Do not allow instantiation. + MockFilteredOfflineItemObserver() = default; + ~MockFilteredOfflineItemObserver() = default; + + DISALLOW_COPY_AND_ASSIGN(MockFilteredOfflineItemObserver); +}; + +} // namespace offline_items_collection + +#endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_TEST_SUPPORT_MOCK_FILTERED_OFFLINE_ITEM_OBSERVER_H_
diff --git a/components/safe_browsing/base_ui_manager.cc b/components/safe_browsing/base_ui_manager.cc index 127a842..58509d17 100644 --- a/components/safe_browsing/base_ui_manager.cc +++ b/components/safe_browsing/base_ui_manager.cc
@@ -227,7 +227,10 @@ return; } - if (resource.threat_type != SB_THREAT_TYPE_SAFE) { + if (resource.threat_type != SB_THREAT_TYPE_SAFE && + resource.threat_type != SB_THREAT_TYPE_BILLING) { + // TODO(vakh): crbug/883462: The reports for SB_THREAT_TYPE_BILLING should + // be disabled for M70 but enabled for a later release (M71?). CreateAndSendHitReport(resource); }
diff --git a/components/test/data/search_provider_logos/ddljson_android0.json b/components/test/data/search_provider_logos/ddljson_android0.json index 84001670..ca41f5e 100644 --- a/components/test/data/search_provider_logos/ddljson_android0.json +++ b/components/test/data/search_provider_logos/ddljson_android0.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYTQ5NjhiZC05NTZhLTRjYmEtOTAyMy1jZTNhY2Q5NTMzNWUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODU5NjkwMEQxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODU5NjkwMEMxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphY2ZhNTExOC0zZTVmLTQxZjAtYTE4Yi01MzliNTczOWFiMGUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2NmViZjFlYy00OTYwLTExN2EtODBlYS1mNTE4ZDlmMDQ1NDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4GRDF8AAAC/VBMVEWavjiy11HuhigPAgKew0JLLBqmy0Six0AzJg9qcyh3hy+221VANxWFmDZeYiPJ9Vy63FvD7Vi221n///vkgilNMiO85VWkyzlMSBpVVR+y10y631Ws1kG83mXO/F6fxi+Wujj8/fWm0D3X/2PQ5ZVDQRY+IRA7GhDZ6aukxkuTuig1FBWMpDeWuzGZvjSOth/C3nKevj3vizJVMRpdPCWu01KSqjzy+OGYsUSy203I3Y389/Cnx1DvkTyaxiar1Tqu10b3++/l/2qy4ESJsxP3+ent9de98UrvhCO221HG43mpz0S46Ef1eSLviivSdyi61Xay1Fnk78aqyVaaujijvEnzmUqeuEShXiKq00fe6rzo9Mt8SRxwW1CVtDmwz1X0tYv1oleOrjSu20W3113i8LygzC+uy2BnSjZYQD2t20HmfyKu00m24E67ZCKx4Vb37+P+kSr5w5azz2iy10X2rnGupZ+s61r1hyfE+kuq007vchPA0oc4JyGVwxuHcGK9trfSpDfPaSGmui370K6my0p7qQSVin39mDezhBT81AzT/1mSszOk0ixqNRSfuh+TxDvN/06atj/JxLu84k7puwz5iTT84MrX0M/769qPeXvq5+W8w0nmjCvHlRO/6Uri3N3Qlneauj+1zXWLyj2Rmktya27Xqw3p7tT/ojHOskLWjDG1flDglS+231WxkzG71VKfzjyhujisu2729fSFOQ6x62HJyUr8oGr4/f+IqyD3hRp2bRCc0SCfqG6Uzj1COQPj/KZHICxXZwj07fK48lpxlz3018qw4VDYs2ft7fHD52lvjg6w21ey21GvyET/xXzXkk9iJAGjySqh3k+evjjt+uRmHgyBwBHMVhibsDSyzDmri26Iwiqq5UW71kGu10+apSfX+oah10qk90eV3T2p5C2v+F6m20G71E3/8/ua603d6Vec50H38/u02TiCqjCy1ySWyzTL0+Pr//smEQmu002ewztDJhiqz0mpzUiavjy12VP///8AAAACX7fCAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBm/IpZAACdA0lEQVR42uy9CXgb53kumuEY0AADYDAgMdgIoCRIgAxwG4QEQFDmHpPhEoqiFC6SyFC8V1LIUoupUEusyLLkTXaOlNSL7Mh2GifHdmI7tnOO4yRNetqmzdL0JG2enpw2SZsup8s9955zl+e5M8YgQz/3+/5/BgsJUKLs9nGfZiSCBDDr//7f973f8v//e9761fZvbnvPr5rgV6D/avsV6L/afgX6r7Zfgf52tr5ftf2/AtDr6a+13rd6ja0etj74YeBlze9f6+vzw68+zeXqDY7W+5POTr+T7xt1aZ1aUnMG15wuLdnndPpda51akPFr/vrO4Ggf7qZ1ujTYn9E0J+OED/2apsGPP+hKBvvgUJdLg7PC10Gn5vI7g0HY1eVa05xwok4n7NLS8lYTHANf+uGbzvpR5xrcstPJ9zr9TS1vaa7kqN/l7wxqLo3XRl08vHUmXXCXzqAWDAbh9hi4IVens8mpOfuCzl6XBufx46vWyfj9+Orq7IQ7XfOPOuuDyV6t06n1dfrXGK0PngQeG36Cfn9nvV/r1YJavb9+DY7rqyfNUl8PDwut5Nf66vv64Kezvt4FR/QyTnhXDzv4e3v9Tvizl9FIs/ZBi9Yz5HM4tL63vhcauLde6+slp6y/0qf54c9gk3YFPu/r7PXDZZzO3qa3ev1vvaW9BXd5i6ADKn19PDRtJzRVp4bPvmlzbnjv0lwAUhA+93ciSEGEj2HgM20tGOxzOZMIbbIpCZ9BLwBInZ3wF3w4Ct0BGg56xRqch8GTMTz0BDjW73LC9Z30Q7hCkKChOV1ro0l/MtiZbGrqg6vBobhDpzO51jc6CjfSNOqEDtGUTEJHSQKcnU683SR0oXroN/7gqAsOCDaNwpPBKfHL0WQ97NTXNEoehmHoM7nIaV3YZzQX9GJ8CCf2VHI7mvELjuThJrGX06NcLh76FD7wKPRWHu4Id4M/4FO4MjQtNhd0dCfclIs0Jo+Pgf3cif2TPCx5Ul6/D/IETvIhfgd91gUXhS4MzxXURkdHoLX82mgw2OQE7LcJuh+6FkMezOXUtrWBiIBAaq6mJhCBYBLa0zmSTDqhLzDYsNggrqbR0SAIogsaBJoEH9oF7e9kkngkCH3Q6F9+kDbAXnMx8A1+x9OehjdFnh8VQueo1guN7R8NUgRcQZ5JjjqDKLb1TU0gYQDUaJ8z6STgBEnvQQgYCicg6MSTMcFgr98F/TI4Cv0AtAx22QLm+D00LYN35Dc+xTsitwTKTKN4UFlwFUWCh8tAMxblA/p/02g9uVG8EZ5BHQg783oPgg+TPN6dRsDEQ7EvaDz2OT85e3IN2hWUkiuY5AGjJlSB2ELQt4OgT5NNWm8yuKZdabpZ0Eff6qsnLeIEzNbwXl18ZXidlfoD4sE4eZ50eycP6tfFY18kDQh3OkLuH6QFkE3qLcfQ54UOvIa/k86NGgRAQxEy3viDwU4qXqR19Z4SJBaCfAZqU4MOBz3NGRyBNmCYEV0AyZWoWMP1jd7FUyUCWgPODQq8D7W+k3RBigQfrPygRZXnKv+j+AC8foHi7bs6wbbAvRaO0Xg/73JSPUkOBW2FvSRJDJqr9KrYsRl82k5yZzwodQbaza83MdOJ5qqpj6ir3r7RlpsCHQS0F1EGrEABgspAMeRdRUVWfGjsjUVUCk+vdwXQx3wQ1TqBxw86Fu++kyiwNScRuE22wlU/2uR3upgK3Ykpuwo2GXlH2o1+51pjjFZmXGCmnWuk7f382miwr7zpSnRy6WOBsnH5oW/h/6Crz1Dvem+tZNw2PwNR50UFgY+LN4sqT9MM+XEBLQAzRuQYdqR9n6oDZ70zCX0atCBaNRc9DVVRDKJKtBlpTuMRSPclLUEvmRyF7gTQQ+ddA816E6C3jPaSc4GyhGuDDvHjg/EVVbyrtFHKsCtp3STt6dCYmtPoI37Uk50bD4aLdPKj+j7lXzqD5QJGWN3m+3GV7aRfCkDgb9Y0Qf8GMLBdXZ1MeSfv3KB5DNB5vlLv1P9kaBcAJuos6zTwOWkEFGM+SFBDkw8d1AWsZg2fD2zrGo93T0GHI/zOUWAVftJu0COD5Q1EruAcwV6HTwBHAkHpA7bZFLwR6E29vS40IGBC0bo5R9c2tv/NtJzTUG+07Ytg8FTAGWdFucH91kgHHhnRJNg+YLgJndp2t8JNJ50UvRKhdLmq3zroTY3fcp+iyqYExlW1y7vAtdANjnNjL+bBl4D+ZdwWanHkrZpGSGRS0xlE4Xoj6HjoJC7IbJRB0MlOl040XEwnaggQMiSe4Gh01m8JOuhWv6tw6yiayWSn/nD8hl4OHkzVdnEVbJqrrAGdzhu2JmySIAqCMJL/8Ee6ksD4RsFY11/prfdrt7CBjmeoRr1JaQcHwukyWNPb3KDLU13IV+qTfKe/+DkoeJDw4Ci1MSjZfa7RIFPoQ1R6GGo9XRssLRiFYKd+98Gki7Y/PDVQZf/oaB8T1LYA3Tnay1ACzBsd00ktlJ/6zqVy4g8Gt4TBtbX+rbiNMJIghKSprNVqMbmvP/rUOt1qh1paCPDaP/umy+ktIu6qoG74m+lufmqd/YXekhzFAEBFHbZZ83YGRwvKxeUqPEGQxz4MfnE5nSsHHdzozlGinJ2l9pNon00sjgk6mXe0uZkAAK4995+sKXdOjn/79JPr5dsQONxXer/Pa/+6trKGS97crkGw0ElDVTGa84ZOM+OvRCmChpQBO6wGOpC+IKgCNKhFG9dJ4wmbDDtoDuYdbH9GEkPijNU6vxyLx9y52PXPrVfaDrS89v0T/9pgr0AFbrR1gnovOnjBW7yav3hZfxXQoT91+rUyg+H6F2oLRgpJM9aleGw5NW9yL8lLj65X2b43fRFg1/4NbO9s27vWKoKuBTt5QqrXnMF/2cdjAhHhOXdUjpvc8yaTOyZff6oa5vcNd1+79kevnfk3Afs7ibmzMugkRJwEl2WUCTKd/4KQayEhkYrH3W6Q8dxyKrr8YDXI159YnO4+uDh97UWAnX8H7+Bdto38cxiwiqBjOIvpDAJtBKcl+C/WEIwQyloQ8pzJnXO73dHck1UxX59eWVw8NT1dM9794tfOnHjtFhEOBMBHEIWQECIb/B2o2uKBQHU0DFoeoL/FAGk0KVBivenhQFhKDyg7jAmJaQxDhyQ8WsBXRhTpUXBC+AJPCySXBIrhK/orNLIdhNBU9FYCvZ6n9wNEkHc6t4FZyRt6S0abiDonL/kqINE2YAqaPXTI8e1lUOpuUy5nWl5mU5+rjvl9APrBXYvTbW3Xrl27eOKfBK14Nl4qgcVoI30TSLvCfryIQAui1DXFzNgzFitumVZVxJZlJNLiEmnltCiQE4jiCL1N0vSioN80XpIRyEXgvBQWiiZPzyLQwyVyeKBrioBPPkT+gt+N0BaRslNw5wHN3ippfCABr5pgtYg8tlV6BD6yd0l45gw5u5jJ4nNKrRnoMmAW8cFultVVAL3e5aKKzoV5lJsIhIQEbElxxi4VGj6gMuT59f4awF880yVhg6a7AqTz4tOkVfIN6bHWeHzZFEU5B/Xujs9vgflnutsWu7tB0Lu7V9q6x1enviu9ho3N4wV4SSw2doCfCVDLga0SyExJDMpNRNBaM1aH12aTWZktbrLNGgjoqIkzvrQENzaVgfONCBYvqoHAXit+LdodKMeSammFDi1a8R3saZuBd8KMnBBQtG0OAQCluAlWH/nlkDUE0+IQeE2a8uHRAanZAvtLPOsN8Ywww9pDDHxmh/sPOTi4KLyxCowwBV/AoVPsDD5ZyAFn10ZCPrZVgJ5iyUg3DXpfJdB1P8x1A8GOUCUWEKz2iCiGIhwbiEgC04X6MsJxEYymTTHwOmCXVdgjYmdBdQkRmyyE4A3HC2LEh3+LoZAYWlj6djRlyplwc0dN8nx1yNdrp2sWTy4C4rC17epuGz83d9d34AJeWQxJEYZ7JCKJEasFrilGHGwGfguCtRUuKrLegVAk4uDsXlnHGn6T/3SDD6BDRJqb4e7hfjMDcL+cjIofnggUgzhgZ7si8Eg2VoR3kQzriAjCAMcKgoTfWQdglyybiASkkMg2Dwj4uPB4gQGfHIGzDOADC4LAsnDOAStrHxChHWFH+CWxvgG4agBvOBRpxq8GHN4QWh/WMiBEpnBvKdIqT8El4R6tEbwDH7t3QBiYYZsj0JcDgshsx6gXQSemIhkMbs3cxYwFejcqyVaWm8mAhpRZhz3T5ZXtVqvdKsvWhN2elW1TdmvWxjpAhWYdrHUqa7eybCJr7/KxGSYzZWMTU4mszyo9F40vtQPk+D+acsdnL9938r7bq7G4tlPTJw8i3DVtbTXD3TXXVrs/bZ/JyKy1NTtlYX0LM/YZmZ3JJjKtcO3WmazdDr/siazslRKWZh3tAtC0A+hvrXZ7Rpbh5qessiUzk4H7tWfgUTgLDyfIeFnLjN0+45WnuuyZvIO14Z42zj41Ze+CK+OeFtaabc0kHuG8WXsi0+yFZ89noKPZE9asl8tkra0zcBmrPeFjfXbYsjFoJUvCwjbb4eJWzpdJWKycNwPvHNxU1pJNyLaENWGRHXbrTMbBOqB9rVabI2u1zzg42WGxJOysRWQkASxEYOTGoPduBt3FuDCZtzXokshBxwupGYuFY2WLz2exsXKzxeLgWK/Fy3k5zuaAu2FZn8Xhk2WvD940w/1ZrRZZtlh8Vi9rtVuszZwVPoO9YnETRRz+tZtMs4ur09010ycrw35werEb2HvbdM2umpq2GkR+fOK7Fh9cG9rDx9roZawWaB4AyerAD5ut8Kksc6V4E8zlh1747AsPfSuqf+yzOmwcBw8Et+hwOKzQrBaH12GRfXYL3Gsz7OBrhqe1Wx0Ou4PlHBYvHAAXdFh8sq0ZXn2y1w5vHVxzsxeax2Z1AEYyZ7F4vRYbYmR3gIBYfDavzDVjK8kyvoMms/ksPgdn8zocXtnm8HIODtrH57Vw+JmNhbuwOJrZZmhgH+wAreizwQ1Du5L7sPBZ1hcaobxvm5JOQj+kdGeL4wICNGOXxWazWe2sTRR5aYQDY5MWfexMCMwbx0lSQMyyNk2SQMVOCZoYcrCPCMCAbLAHD2+yApzEEQoI98ejMcA7SiDPmeZS8dkvrYK9Xuw+d+ozFbV79+IiCHh3TdswAA6oA+7jl8V/4tgMqHcra8Wr2diAOBKAa2dDaT60FzRkK3bMcsQBc+7xh1944fGHH37cS75ircCJZFsgEIhY2ERoryjZ2DRY3ojPJoKFD1nZhMDzgpcFu7sQmmEtoUBAdNiAwgVEO1jdAC9m5YyQHhGmZB8YZDDfQP0WQg6bAFY35LMBo5MYWdYEHva3igFeUlmfJPFiq+wLgLRmWbuoihJnEdJpwccBhAwDbxg4rR2NZwZNuxoIeC0CnFf0gtVPw61ap6Bvxdm9AnKWwNaSXr8ZdP8NIjIYm2W0gQVWhk48JYER4kQxIIrN7FQoADYGXgFZRyTAQ5s0CxIPxrE1FBiBrzIRIPIcdIEANJ4doPd5BSlij1MhJz/tAP7E5Zrhtpqz16YXj8/t/P2WjtPzTb8/+ncPLv+n3082/f4nHv3Mta+DmO9C7U62Xbt21bTtGr98iGW7BA0bAEyq1MyB6xQAopOFRo90gbLZKONUzh9/+KHZhz6LsJvwaxaogCRzooCgQx8C0OW9IQlumBOgNUNW+X4BDLZXVgV4l5WJ+XY0wx4BeE64ciA0I0MTBEJd8PCiJFh85DgHHC5JIasvAG0lyTL8gv2zsL+gyV44PNLK+iLiSARAjwSEBa8dWIJAdhcCsgPIUJqDLgWthd/jeR0oVqFmaHxobqAKUiTB+rrg7CEZ5b1K9BcTjX0VJJ1U3VX1zxngQ8DiWsGGc8BWAkIXa4sgk7OxrRERWmoBeEbIZkG608p6gW0MZPAbYcDCzgwAK5GBK4nwhgfGZLcMROyxnJuCDpo9dTU2V7NaU3Pt8pe+9LX/AQzpQ7/5wU/+Hvvxj3/8N5vZ3/vNj3/wN38bZPZPF09hvwBRbxsmpn0X/B+/nGK1iABXy8BlIjZOQI5lYVuBBIFiqYA4YvzQw58FyOEHwCeg+wYiyN0iyMvwRAInw4lCA95mwsQsrDqA7/BDcUBls/jOYiPfAa1D6iZxU/hLlL3w6YAPuCMyOEcEuZvdJkZCkRCeMwQXmEG2psk+vNMAOXogj6eMBGQ7nsPig1NEBA6uHdHkLJ4PDoqEkKE6CFHloIVB7rwRDaVq0uETIl5UddX8dOKaVQI9uEW8lwf/RB3Y65C5BGrTAF4RyMzMAgNvu7JpB5tIA49p9u4FcmdlmzOtCTBhQECQt1gyib120KBZ+5RPtmaA81gy1jhiDhJuirbDlju+ulqzenZ1ds763c9/F/a1WxNg2ewWO9g05IgWVv6u1fLy4pdqune17WprI/od+VzN6uWcI4E7+KxwZg4oGfAiMKJwEFcRcYA49/DjL3wWIP/sQy88/ALSud+zJBxwLDruXtlrtWTsLHljhZuA3zM+4FFglXEPC3BV3MUCvoDFSkw1EAfYifORX2B1LVY7GEDYE+z5DDIaH1p/2EO22x1IGuxIBoADJOAIONqKZASICZDeZnxYejD5ZUciZ8Ff9qw1M6N6fWomM7PXxnXBc7IOMUSchy5LxsJORba26WubQK/HctSgs2r4FfqTLeFlm9NwEVtIyDpsSH6BRwBBg/aQWa+PszVzLOe1ceAYwZ/QuPDDoUEFrkJbm+PgP8txXCzejsq9PZdLRefmYnMTq7uGxy/NRlEwOeJNsboeJi8osBy54Oz4tTYi6DWUzO3a1Xa5jbpghiNWEG62CuYyO4egP/TQQwR027dA3r9FLmGciOUKZyg6eGwp4Tc+Jr+LbiD5suAU6O/If+MG6Qt9Mvpg8ZLbjxkHlxwKt4VNAm1n8xKm57ACSc5YgdxBF1/wckJAjNhA1VapXdsUnSlx2To1rM2uSuHAeLM2qwROoswCfQUMYj5rpgsI2pSYFr3sVJe6d8Hm3TvTGsiwzQuZrAa+8kzmkQD82pvNZmU2sTcz5QM/L9tl97bn2ttTpnbyq/3q8V2rz5w9ezHxaXTviO9kn7FnvbYpa2LKS1zDKSvrS4ObBGdeHK/ZNdzWBgLfTTCvqVl99bv2Vgs5NBuTM8R/km1y9Y391sOPg5wj6J99/PHHX3jIBxrMbpdj6ElZZftrMyC++q4ggAn0BtAXTdhs4DDZUcTQLeNsM+BzgTflhSuDb2WdsVqzoBvsWXu2WQZHz5rx2eCbRMYHnls2YWXhlx2cSzjaPmNl5YTVmkiwzQnyoWUG/DPW9ghoQtAP1gTcCDaWnfW1ziRAkC2tM61dezlfOs0wXUA/QhELIA/dITHARxI2YAOV2btRCeF3VpB0jMxUDb8ygRAo6OZQSBWAJHFe6xQv28BqSSG7D/ic0GrFOEXIa0UzH8CoghDJsCoYLVARC2D0QzIrENMEdn5gJo6EPQW++dzVpbnZicu76sYnFt74DnxtH6AxHtjXQV+BY8FZNDznAM9aQ2deHAfYa7oJf5+eHq6pWVn9H6HIFNuFNtjGETsLepLdAvQcQE0gf+izD79AhKs5EomwMrwMdNn2ZsHPNETdFkLLa2fT+MshB/BmBNmKdthrowabJe9akbvowRYMxyDHGXB4KSUA6yxG8LmAfSTQfANF4qzQgNAwDvgVkmxwdGSkOYHPn7WjTUeTDRyBSyADSADTgKYVZVtIhIYGSghEEk4nceCVDmSBGyIHDJVFnwsFnVhOozGuzZLemWxx+au7+MBfrTbw0iJdDpC9ANxmIoGx9bSAoX+MVGNgdS/WVYyMZNLoPQRaMTAs2n2qpI2IFi/4kdJUguGFmfZ2U649bmq/Ojc7e/za6mrd8LVZ7z8FNDHbnBUxHJ3FQGgGLsAICXRZtEA60RpgRBWe7EdnXusebyPKvbt7Vze4bzXjF0+8ErB3iaFQyG6ReDg2a0mwW4n6Qw8//jiV9IfniCL1SpLgADanZXwlMRvW5/Bh4BW8ji4Rg6CyBvcEzp0lhGFYG34nzngxDCsxDrxRCRwt/C5jF0lgHW8H2sBCwrdZjJoGVDtDnSuRZA7yezHuH5BG8JXE1mhQmw9YM3CxQICEq6cccBEGg7YCr/GSxREISDNTErSPnWV9zdaQOGURRaudD2xW73CyJqffH6wckdsi+qoCWQ9xrMNpY0H9BkSGEYT0xmIQRqSpBBp750m3g15Bep9AHlEURl75ztyfz84RwCfqai6vnq2pqRt/8d/fT0LzQjFbQVMejEjcT2gOEmAnFzjzRvc4dda7wbSD537tmR/9MCAIXRbHcwORQFobSUsRsDtVAIfNhqCjWf/sw5+lJtoXAeFqBRZXSgRYrlUkIQ9pxqphaJ5pJbFuCWwYFqim8dnTNIHCSBJViSTLxtB8DTyQni+jzSNohYwOht1Lk1T0Hc28kWwcMxKiGRmazqFZmkC2SzLORI6Eq081szZUBmBEWC4tbmbuZDBEJfX+Vie/VZWD6JN5QRB8rOyYCol709tJ+Or5RL0L8mdevVRXVzcx0XZ5dfUagFb3zHjdfz+jP/rmcOJIWaCJNsqJExfH29rQqHcPd0+3dY93u3hG3JuT5XjqOYG2acTKVkY8/q2HHn/4hdnHHwYf/WFU7uRzWwbjXBs8PDY1Q0+WFkM8xZAOsaN9MyAWypNLsrBSYEN0o+Th33ahFaOH2YvFljz47jbOHsn6kHNViMeScnMGOHoll20LyENgsKyRtDIwAyeOSJr4NpL8Z168dPbyrrOrl3fRGEvNM+e+HDyzzZOcOPNazTjIeNswSb+Aev+RBlwDHIK4nJohikIMbAzDEdcM6PrDL3wLvYSHQNY/+y2yUyxqyskVXPqoj6ourECV3q3VOoHWKckLPhG4rDMRoRqVA9CdlUGvzN2lLuuMtxnoS6QVvF8uLb2dWzzz2sT4Lj2mRrbh8S8H3/DfwnmeGa9B0Nu6p4fPfg0ACVlkUxSAiskOZ0RimHJRB0hjDnDNHn7IW3CbOPIXxoJzsUqGIBaXukj6mhkRQn/z9GvvTtSxzIJj43YtonhbN6fbcFyfy+l0Bp1rlYIzVTNrXdhCQNizPgsfkUbezh2e+OFL47vqSjCvG//yme/fyjCGMyeAxbdhYr17fPoEkDcAPZdbWsrFcnLcKohpQSvQsaKI50rkeWvEUf6zWR/qbEYMZXyz4zXau1TWxS6HbIsMhDQbPHcFJYzDhXmnxldy2arn1gJWVB+wOaTA25JzVO41NWVy/uNbVZsnzjxdc20aU20X0eDxwlJcnr/v5MGUnIuyXjHERCx6pESeAxF//LO+DRocATdFY9UYfiy6kJWnwCsJREQH++ffPDv+tTPau1TWBxZYLxh3BzsVqZBadyLkLv9o0zZsusZEWm0zezGoycp7xben3M/VlYE+/lLwlsVn5MxrFxevjY+/+CNyCsESj/3lfQdPPrskx0yyKQD+LEbYvEDbHn/hWxtyq/EoEfF4da8u7rNa4vZQeiQkwJMfX/1mzfiL71LQNeDZaK046KmyQxjZRAE7nc7OYNC5HSKn8aKFUyIDDi6dNlzMW2SgZ14aL4UczPKJt6MyT/BPf+3ii64TRiQh9+zBZ5+Fn5hsisetoYGM96GHH37csOIlMow1GzF5q83k8MVsU8IrQihrY69OXP76dA0Yoncr6JKDBrk5G+cVA5tAxzkd/M7gtkAfERycJo54rRGhQsRnG2rojafPlcv5sPb22pH/4YlCrxGsrPvgKQT95LMpwueYga/Nfiu2EXBSpbMV3iAzbq/NlrPaE4KQAc1+/JuLB+87WHPuXSvpzEgkI1tEMe1IgIs5Uin47nT6q4DurNaRbLZ0KAO8/e0VRr/yXybKBH343DtgJX80UowZup89eBBk/eWDJy/IOZMcz/6wrELqRlZc33K59px7zp79ru+Hre1//uezq6unTp48eHDXuxd0cN+nwFUXJKslJFb22XAem21JuiSAxzaQaDZicLe6/VP2kuGcE8v+zhpJAvpJhOfZg/fd96w7aoqxDl8Bdd2K3wBwmY23z83NzR6fmJ171fniV79ad/ab3zx1H/SlU8PnLr6bQcdaTbEZcx9MxbJ3rRLoW7hNYmuzN5tx2OyBtxVYeuUEEfThmmeGqXK/eOadHMkRsoB6Pzh/YT61NH/h2YMpTOrEgcc//i1WjmKCJxqXb7iZ5ijkE8cnzp4dP3d219mziwdxO/luVu+Eyck2mw1/7NVKKUa3A7rIG1XivsjbcdLBotcVxRwM+ol31O8VnoubDp6cn19Ccc4ZmwzuuSl+M4BHURXMra6eraurqzm7uords6ZupfvkwVMHv37q69PD40+/e0GXHCTjjlWWlUDnq0j6FmcMWG3NDm8zZ8u+HX9t5MyrBe3+zit3Arob7PnShWfnwXBHddDjDxnh9S02YHc5k9vkPj979mxNDUkBGZ1zeNepg4ttKys1i203BToZ5MLzNzcTwY0i7Tev3iXRYRUlIWMNSZuJFz2Zf3Nq1V+dozGhrMUSGJjyLkTejk2Xuo7XIeig3LE1x5/hX3mHQZeXl5bm3W4yIK6wReeiQOVhk+OlBj2OH8Wi0Sgp0kPIc6bzs9dAzEvDhfi/rW14uK37FKj3G4JO0CbDhBhg1CP4dpvU14/zaPbW9/Zuc6RyQPRiFWUWkN/cX4LkI//2bLoww3ml0JS39e0FZi4Sf21YF6F3XFkK2bh7/uWXl9zREshzJoCcjJ/Ry25zOfoHGVJj0jc3+er80nBNhW1lpa6tu7utZrzuv5+4AeSYmFEUJq/CpiiKyjAa6QY3LbBM0O9sgm002Nu7Tf1usUZCEUsitMXVNoO+xc5YEQ7iLmeFt6XdXz5XEJ86jHS8w+NxhUzclHLHyyDfsBVANlH8c7QjmHLuVM593j2xq6aupuK2MoyqaavR0USqGSWv5s3wPw8b/gXAKwxNvd7E04J6SLYM9ZMq/5Zgb992QOctlmx2xmoXq7GuoFPbpqSzXmkg2/y2JP0EPzFhaM26fwZBR9BzUULTy3Au+5uMq9AFnX7kpn0hh2OqVjdDXvxk11b2iAg5Ig4bAE3/gFdFNcMPc5OTDWnOpqHC2I7+luDadvxVwrRjNi5TQTJdZB5kpsoAxopbOjIFki7YbdnI2wjOvDF1qQD5MzXjNe90ohLvMneDjaDuNvR8UdTdIPrxuTKMN6M+XDXLBlIOWj2vbyr+paK4q0TcGcWsMApz44kG/MGWshE9Q/76m356MWuz+bwWry+jbnar9YkUOzeD3reFCMk2jnhtmbeh37/z6qU6A/W6W6fuPC9JZEoBAceBfv/7J058n2hPJjQJnvkWit2A2k2QN5V8gainzpsmSkCuqOWrKCfU6wpR6SDhikokHDDPK3kq8GYVewSo+RtIu187XDaMq3+o6eZBHxEzWbDpGXuk6oC2iuVS1UFPNHM+BweO/9sA/ZXJiYm6swVZ3752H9F4CctBxUAgkLFmnrPb7c9lvgbbaz86cebMdyIzsmzaypiXqXhTuayb3O7zx1fxvqrYdAp6zYkzlZwrRsnrgCvI4vIUaYUIv8oY8Cu8omxl2P31LRsG7w0eDt406lLaMSXygqX6IBdnJfVeXdLTIQH8gYhdfjsu2xtPX1ohHhsa9LrxXdsrSEC8BSGQ7nrOYvG6TfF4LB6PxmPtLx/svtbdPf3001+zx2OmMrW9Ua/TYZLG32UGH2jc+WUAvG6i4LBVFvUvn3hlk5gbAg3SrTCqGWm7ilirqNTzikbMOnyRh48YZivlThnc+uGWJl3kh0ZvGvQAY90adP9osG97YVjF5uUjeTkTumWbPnLm4qWVCV3M6+q2EYFl+IAUCjEzVqvDTQJr8Xic4NWeSuXm/hSnpbhWd+kqi5NZbG3Py17Kvll2x+eeWampmdha1DFwPLJB/ShmYsCJRlcVwJywN5UBUcePQNpB/HlGQ22gAOzVhN3vp0jXNmn+K78zSlFvumm/jRetUxFhwG4dqJIGdWKH2wR6daqYFgSbNzSQbm6NiLeKOn/ipUsTBeVed9NFKPwISLhmt7gJ3LFYAan29pyp/fzsKnjQ3d3fnDtv0mn5LW1Ly+ePnwW4z5IeWVOVzQ2Pv1Z+3wwRcxBkAjHhcmaFV4lCRz+dQA2Im+ENpfZVhN1V72ygrhrD+F3MlT0U9PqbbW+xy9aMo+p9icqFt1gm598OexezPhxFZZNtzbcchz3BA+h1htEcr+FvTrsDZVMtPhPiXcFMI+i7uqe722bPF+naLWym1Hn3M3rktW5rUX9GOlHU7AHGbCbijHocfTVq2pG1YXgGYzRE3In+px+gla8k60w9FfQDGgmN9jaRd3v6brZ6MJShw+lYuatyQSzvrDSWzb+VD2iM07NEbhX0hTqKeV1FNVlZrwshyeLLyfF4ZWqWyplevrxruHv1eHtU98BvpN4rKHf01eeXZ7vrdLpRsxXsqz997jtU+MADUzDohkqbUjWzxpgNcWcYqvNJP1B1V45+ouYr0Xi/f1CXbYJDL9XvTTcdn5E0n8WaabVYtGo1jIxrm2HYDOfNZiyyIyvdam71xJ9MoKQPkxYFk37iRqAzgVBoyuKW5VhlMFPtblM09ePLNd3Tz8yVs/HNvnkJ3qYN7xHz1NLzx19aoZiTrTrol67+jUg5Oyhqc0Go0XLnGUU37yDNfhqSw4icSqRe9+fMxBRsNuy9o0S7D+ozwuqSPtp780TOEsAwrDVUPfKzLdAZgZF9wsCU3DoQuFWbfuZpwJzKEvK4p0/cKCApiK2WuBwvEcxCEI2adFPOnUu1TbdNT89uJeXlvcGYBaFsF3fKdIHanTrjBqujfhVHqlHSzlDxJa55IRqju+cINtX0earnKY+jpr+C79ZLtfvhK/rbA9sEXUpbgL2LDke1cSguFzP21jaInCZOeb3pSNY2Fbr1bMuLCHrdxMQwvK4M3yB1wYih1pQcj5YgjhMX0Lc4lwGOcI6a5o93T093T8xVVNpVqPvm99H5C9G5ibMEcargt6DwE1/1hUgmDdU0xVwh4Oo2XYebIq0oNDinUGuOHYABQYcX8wbD7u+j2j1IUV7rpOHYm/fTA2kLj5NcOAakdMUAEsMoO7bjpzPCjM/bGrRzCfFWi975ExcnqOasewYEfethAzjy0RGTNwgoynbpJym3O9U9vbh4+bipOodzV4vEl2iN2NLy889OGKpdZ3N1FZ31s2dn23OtosYj5gq4ZSoJuqqYW1OIh44OnC76aOZRmRMvjvQPEqejUq+Wy3pvsJZod03X7kmi7Bu0m7fpPJB3h8XrtbdKlWgccxRutYKkVx2bLvE+Y9416y3K+is/fOlS3VnaqnXAgV95ZauCgMhMtNSU69PMtW9Q2u747KnpxVMrc1tod5OpVMCNHU1lncDkdi+dXKwbpgE56mCcrSLrdROzrFXASDvR1wRSMwo0wk5CcqrO1AnSKhF/8k7R9bxZN/D5MtR1G35Yl2w9OLfn5tOrQtaY/dIaqRAnVvJm1DGbw7DOaml7acQh47QhMsslbjEOeyJN3fSJOnSNxr/8Q36rqIAdp5crwQW9s/ZyLFNuUzzXvbg4fPmS3ikqSbRpg1ybKhn62PzzSy//uA04JvBMPXhUzapP1M3JPnFEpak0RXfS8K2ZoKn6qUybdf5GlLwu+zROo6ff4KeEw/NXKOhNV3RlT016y5Wbr1BJezmvz8bZHHlxU5w4DbfhqpRw0Tq3UO+a3CyFEt5M6FaDMyfSEyu6+oSf8S9vkZkWJJ9sGHNEm7wASu3l0XLQ3LOLi22Lu+bcbvdNEznah0qC7/iaev7lP3r2nCHouJ2dmKiM+sTE0vlYRlKJb6Z74opZQUeMYKoSQq9TOJXIvqEVFH0fRiW7YzCeLzps1IYnqWj30YhsrbN+G6Bb9kZCotexcYpguAZhGYxLSW8vDDvF2dIDGfnWU6snnsZmNORn/NW/CVR11DSTrEfJqYyTMtZ4LBYvxuNIdVN8abptsfty25LblLsZ0E0lKt5UYtRN7tjzp+97YmW4aMIB9bqKqNfVHU954xZJQ8HW0+aUtxHEiU5naE6dsDb4hiEQ070UM8GeKnrw3grrWvYGaYaFLmZrRGSHtlE8I3VZWkU+5LCNSBvTQYyaTpvz6QWzsq26d2Tv2kBWnrll0N948Vwd9dLh3+oli1RF0nnhuVy8yK1N7lw8FnU7cKJOh685h8gj4CjnuYlV4O6rL5lMy5VUu6kac3e7yzKtUdPy8xee/d732lYKNl0Py20mc9AX5pdSMa9EeJuu3PMk1k7Sa+QDkmVVacpNNZtR8efzniNmYspR2dM8O74tDBHTYzGHKcr12468k+HkOCWMjUxQWdKemOpbWFA1+JX2bMdlY4Q055uasXgtC7fK3t949ZJO46Dlaq5aqnmTkWzBNTeRAYYmh9WSefOX7/9I45tf+Y2vvGl15HAHt1s+//JiG45NnzufckcrRdnKRd1d+gXRFCbK7E3RpQsX/qjhzu4VoxCypgj7Rpd94tKsO2YytR4Dvk50ta7K9UQqwDwW7gl7PEfgNWwm0p9HSe9pObzPrBqB2jyN4gG5N1DvbSlBeU3X9Qe2swKhyNisaSYr2wJlM+6PKEoAtUpaVScVZTuxd0nyyl4ahl24xdj7Gz/7KbYjFpLXrc7GHZUHPPOhbLREhUdzOAGgNeWbayfczWf9yJsf+g27zxSPuc//5Z9On2vrPvVHlV010wZfzV3C7ApWg1Q959xL7gdvX//GfTUrRYQNUa8r1+1g0ufOu90xq0jK35hCyJ0hmXQ17+nxHGras+fAnj1NyeC+nl9nNCLVR0bXazWPDrZRZ4Gg6xSeqScw11K3vJ6SuvWbz6tiqNxOI+8ynRbecM7R3OglHU7laGXQK9d2BCSrzYbTG3MW/hZFHbPpNbo7VNcetwojlWvx4vESeHwWiy91VbfDMbTq8ZjPuuODv2E1tR9fBBYHXvrBVLSSQTeCraZyGk9LpUy6I2eKzi9hiu3CPbiAQNtKqVxX5PBtE7Mp6CVxh8jwGJnRiOVWKEsDt/1uz86hksqXloVwH8NoalhtWO+Y9BhSTvV8nmoI0uB9LkLc+snian3ODkrd/Z3bBR2nPPQWJgpBzM1wV0A/kL4r6UqTBzpdTOWpYRkp5POGBnhba+QGYVhXZ195PV6RyK1gKA69tsuzsVjFVH86lC7NpZncXlM8Hr3abkoVEUTgU/bfuftvL+N00dNtl/9SN9LbSKkVHbkoQIjqHReTaDh1rsyAb0IcOf3x4xgUiKdGRtAvzxNeRhEHetYT3jm4ofalSWmEr8MgurWTHrUQvysmYKiCrw+SWMwB1O6duo8+6NyOoGtSwGFPLwQstoAh6HwA+yXmAxg91VdBvfudfNVCJcFq64rY5S7hBkSu0zlaulSysxT0FWRyNTWrde3t8UoRYkaU3OWh9igZY2pyFxQytc4ye/rw797x9PR4zXTbqQsxU9kxmwJupjKqbhTQkOBODsdExOavXyetfPLcBow3vqmbmJ04DuodDtorKVjuCP9RdkkJ3FjP5NDm6cr3K72q0rgHAPXQsmhK+ZVCyC5fEo9r6SUsrnb7yh0XdfF2RQTRwRWybKjbAXQs0dNjROZtJVwCAzMcMzBl6xq4wYCNvuRhV+E8DNNSuHOUdCo9q3PxVNQrSZvVieCQNxe2tRcCL2Qwiikmy/Ogjfub/uJvp69Nnz05HzOZKtc7V4q/lxZakOL3qHt5/jpdHep7bWUobxrpUlc3cenSLLEmsZkQgk7Fh4CneHrQEtfWFkpZjaVCg0c8h0B5t/ToOXYCN6PolfGgfwOFeBzyuPpgh87itjcPj9hqmwoJAdlmGGBew/Mj64BrEU9CKYh6Sey96uT+Ac3uwJUMZJv1BqnV+uSBluJaj32HDxhOxxt/MnG2DquRztYBKYu5uzYRwhHBHi8TWAJ4OyhgXLfLHXO7l5fl2BI1wBii/Ku/ujh++YkLMT3OYqrE4kwmw4YXBZ4OdIi6UzkTavf5+dM6TAdXho1Y6wT1M4h8P2PE45956fjx2Tiplk4ImDbRo64Yc/Ec2aNDXnv4cNP+w4eHOnTY94R7dqIUH9GVOxH3Qr20CgzeZaTYRns1Rse/P7g9QdekEW9CFBiZC0X0ZZzRVSRUAxTRJPEx82oV9l4pFotxXZmyd1W4QeX2gcOFQXH1yaEOQ+5fYV5aIdKzOhvNAeybvABGTJviBXptMuhWKgXwYLHq/Pwy/Jy+p7g042DrX1xcfGJeRhSKHcXwx0o7Dx5Po/UmirmJrA2VwyoM0/zp1431v1ZWaoaLYbmauoLLjjMc1qyAep9tP+9Omdxx+4fMWPJIsy0A+liPjvlg02RjY7i+sT6YNKobR3taCKD54qYW7DoJwo/Uk6hrg7NP62vq32ZO1cDIiosvkEmacYxLgFFpwAilnDmE9dngTm5HvfNal51zgLR7s5sHqPNaZ19vfV99fV8f46pPdgwW+mh9U0d/sM/Isn15hWrMq5gKj89s7DwBsajcddYG5jxFLK8bRHJpef70hsW7Ov7qjj/9XipKPXJThXJnEsOh49SI7Lv1xUP0/ZEAxpbueb2wANi0EaApGX1laPmJuom6S8fd51N4KtkiIitjaDRWUc3hFgr5TjXcCKp77Kgy5vEcpUJ7YAxt/SHdY9NDNIVyGtQTazwhgEN9TL2TUsGW7WLOCw69XIrFVcBQt+cZLM5E2BV1QZlMH1XU7dn00Aw3BXZ9s00H1dS75kwGXcGgUwPknQdqR4ugNxR6LH/i4jiKz+pxTJKa5I3ZOiY0hcy9DLp2kHOql91LUdPpzSxp6I7J+1JR0yZr7tbfGojrMp47bzofdZ+PkpODxUDLIV8onu72k4vdJWMdDFk3YjYvzc7OcW5iO+IWUU+a5YmKD++mrG3yz+pBATBmVKmM6jlCUUc3rsO8w0iz6UVzhnmHvxoped/T26kHaYY617brE4t5XNTJytkyiDmvmPXhVaSkJ78znT4Eb8a2U0ShCbg6xgw3I26C/Erw8NBgQ+1gQ8Ng/2G+l+/oGDKMOvgeQ661gqSPn52YAO0OZro9J2N3LLvnve54eSbMBJCnSNTU5E4tz99Tafmmlr/4j3PRTf65qSTG7jY6AIho6qoJTjnXnkNGiFkacATmXy853Z3Ti22l9a8FyLG8b/X47BzyALyAbPkthdTD0Qybaj6AxG1POKyQaIwaAMzzvDJ2hPD5wX5C3hU1X6rhS94eCeri3dtEiEC/v2/bYzsl1ZGORELN3pDI8Lx+bhozBPUymYfLq0e3E5FjAhGHPDWQZTPlsXdXfW/ycClVrW1xHugo5IYQdEPXg6QDTZo4WwNtDlDGUxvmvQpZ2E3KHRfzcaNftbyUq7IsY9Nvt28OsxdpHB5NtPp509xcam42B8I6C3+5z5tiaARkU/nqzSdX2oaNcWsG3nokDjrs7Hm6Hiw46g6RROMUWujoSRI17jEzODhZUTWUc2VEMYfxi4YGaJ79YdWonzO8NSMul8/36AVxVyhzHwxuV7kj6HstU6Ko+hwjAS1QHFanZ/vGSChhbDugByQLmdoiJpeJuqve31QcbVdLoD+8p0BCOv2H1w84+wo+W93KxMrqRDtmSXMbHXVJ8sY3DSluj+oMzL1Ubcnd/udM0Y2FMEacNUqCrHrdLIAOkjo7e/XS8avwisFUtPQbbcapNiBtJKuuQ06EnZD5uuMpAjqanPgFyU8YOA3L9OzHZ98dzrt49MCYAKmHRQ1wBNU1gt7UoxfKFWx5Ucur4Z16qVTHrXjohsvmnYqEBJtNCmmK3qkKGT1C4hXzpLoNmy4FvDau2UZmPy+NxGCpdi1sDbUlQy0Ha3UW0tl3YH0wWeKon524tOs4SY+bYm5eLHPXnotvSJPh4OEUcaRjFx6svrT26WjMtKESNuU2alxJWIfE60DMwd2arTsOr8ePAwsHauiWc/fUrm9CvRtTrMNEv6+M40bqACZWdy2dx8oNZAKm+HMfLJZJqI2TDQB6yxGsfVNJUSzNv4DMe/Y1gKSDxd4ZplEZw5Ln1ZLMS5hY8g49FNfSdwuYa0Irrtzn42QbuJNmtVhzTSvv4V9a9dzsJP+4UIMmiXYgcnZbNqTRyVT4Efh1pYUId39/7YGWPUNDHTTx32AkCDvXDtcWs4MnXkOfrWbuPF1kM5YtHTwvBQyLblRB4lof8IpcO3Xh+lPVQY9tzqS6CzkWY5hq++xxAP3qT+F19qvHL52dnZ2Yk2X3g7WbT3iyu3t6uO6luppdgPczFy++9NKXzx1fObtr1h1308A9JXIoRnpcjWjnhklPXmMI2IA5o5HJCBTlyO5aVO+DqkcpyrnhsenVcmYPMf2HqWXfU38rsyNroayxdpBVzBvjJvXgkbqDlmkfvYnCSB63EY1hwJ+ycFMRe3NWIrwU80uM0ngIOzj04o6mvl7/2prfCTSktqG/dg9NCfah+1EAnX/lIqj3a3PUBcecRaB0NEVZLI5WywCNQ4c7Nn/hnupr7t4T21Qbo4NeqKwA8QSQZ6/+dPZV+9/+7Gevvjx77tLExOwcnPf1Sgu6nlqpa6t7aWW85uLPPg3bL9/821dh7/Pn3TRMhO5f7DlR1W064BY+DO2wJ0wbGvA2vGMGozDEgQeTPqYWJLxg23XQPWYK+gFK3G+tZEFstTmyj1hlr0vcQVK9RiIX72kSLM3koT7FvIV6Rz9vhEyRAwDjDAuq5JCzkQQ7I+wgYWP0Tz3hDirYeyYbx5Sjit/fd2WUeKsNlMnVB0H2iw7nmYvjYBrbozTDFS+dwTQgEkEvDZynTNEUsHxcYtt9vaE66E/m4iZTeWFkeXUd8rirE8dnfzpr93zlJzv+w45/+N03X60bn5g4+PKFykzhvrZT3SsTl1799D/84hd//dc7Pvzh3/1Kwh0HWxEtnDZu/xAZqkZU9g4FfevRRtrEZiyU1Ectw6+jHjIobWcPrZczqJvhrBFMwofwAWv7Ue8M9vXeEuZA5LwzA5EQx0mdZk0xF0bJY1pIPaQqk9gVPZUrZ4h0k7JuMl0OuiUaryiiQ85IUzarRAwEZhrGPPtRqYEJ8oRVvWSMudJEUKdMZC041FAK+tPjE7smkJ8hu47lRgrJfkaYkUt5O/HRQc5T7pgpulwIk1bc/nA5eqN4e9Q0NzvxVcvPGz/94a/89V/XN/5vv/ifn371Us3LL1dbvPm+kwenX/5//v4XH7Zav2t/8wPmDyc+3ZiKlQ6ciic+RGvk0GJ60ElvONRIkll0pLpROqUyY3lCzpJhqmgLfhrx9GgpRb5nZzHK6Ox13RroYpfNGgpIPs7sZ4g3mS+Mr1DzjaqaTsNPBfbudJJl7IGNMAqt9qJ2SzmmeEkpLMc2k6AE3r8nTdgzOCoeyhXAkDFjR/rRzCN747X60Yba2sMF0E9ou0C+roIQk4oIMIsFUQ85ZFMhCY71j7haWztRzNHc6etPbgX6hdiWaRY4JTdXd/ynr/7Df/jZLz9gtvqabc2WxC/+z1fHr52qBvr6nfd9/St/n/DFSIba8ZH6D3/kf/9fiffnppOXxNzKMdqk2E6NWNz0RfNRhQxNJ7Y+rdIKOjDXk0RNBT2FbKpakHCd2AF5r9X9n0Gt/hYx16S0D9i7aLFJjxEjYuTsdcuez0/CX42bQO916SX76MibEVmGVIPg7Bl2m2zzAjO0HtNH3OZ7Romg7zfUCDyLxuTDxIdr8eBUWr2jQFxbCu7HyBsXz9VQ9Y6yHM8Vk/1CapO/hrEZ8ju2dLp2C9DXL8g3yqbH5mZXjn/6zY94HrPqKyWyzW/+/avXFp+oetJv/Po/WgprKMYT9e/5yG84WJmN4ZyE6HCmAgFVb0/AFZ95D1ZAK3el02msi/OYdWJv9iTx7js8ZoPDlQZg6eQVqu6m1653uOq1W90Eu2zzOezNsqO1k5biGbSRSCTpkBWInIfcZdGhgD1JURAYhb8JWdjMwCO2VsGs6Mn/sQ40Qx35sN596QgPD3xcu36gEd2V+mB/Q2lt3xtPX1qdMGb6gZYrTGUi7o2WDDunAh81YeAODHLU/bmtMF+/fkPQz8/NXnr1dz+8Y8xBl+4kSGb+/qVz91U96e5/dBhzTKKKS3zg1xqfu/7g81halcI6XCDvqmKkxonDdeCufSgfHk/4U7i9eRcRL2DvxA1r6SmJuhYK3+mQRnWsUc/DD+27ZTnXRshSwqRe6vOPqUxeHyKNF1yAyxyaJL1uM+jmkiQQrQHKGyM0OhWHbI8k5IRkKKXwIaKPmo7k83pCWSHZehKnACYLoI9NdtT2N/WOEGIIrydG6lYutUf1SKlJLlC50HNy6biGHMmhk1HjqErnX98S9HvkXFXUo5iENy3NTpz72aff81sONs7pK6hyrPzv688drHbOL16xGt2D7t7q+gjG1h5dgi3nXnYnJFUhQ1UwFuNB8t7yvp///F6EOxx+06zeRcco55mj1Bvb7TGatiS5putIs8dJVdmBRo926zPriV2cNatmZE6VzLQC38gAooweSmINboUiCo8+6K6gsI2KuhHF/0kLmx2Y4aaEVoVyAxJgXO8wN+aNwJRG4n1EnfUfCoPD0nioY72hpfEoo5HJF3jtjS9fmqD5LqK4C5OZkAV3DJueoqMT29tNuBYrAHrhDyvAcvudt+sRodfBf64yTBkjcsupWGpiduLeX/61nS2ZEjjOcv/z4slqRr3pjrLJZIHKSO8lKZV7ovPLy+74sstPxjgwTs0F/RyFuQng9uyAlrvrrrvSij7EDVyc3Ri8AC9dpW46JW+GfjcT9Xh3kvrnnh1bTju2Vl+/1QwFUqsj/UnRz3FKp1kfNEkHU0G3WtDMxGJXAl1Jk9FZWBBCJkyh8ytg1aeatcqOKYvNYvbTYRpY34mhds8Y6dFIXnAgh8pQ573piKJqjTji+vARM3r2DOL+xtPnJkzo7tLK81hKoFPXhkorZnQeh5FTHL9mil6vpN5rb7/9zjtvv30QoJ+XkcBXGtZkcqdSy/NLFyZenvjb3/0Ax3Jl07r/5z++7zNVQJf+gKWzyBaO+Mjdn8AvPjf/4AVMtwggzGnmLuXo0TfvvfcOJN/7x4Ac5+/SiyqMYS5mynH2e8gsQ4oetVV02aI/HqoMahd6cKKiivodGs+/FgwG+c7eqlXR4l7OLj7WauPynSittN/p46iPMqSD5SsUUYTp3Bi6R68oxUF3x6Y4NG0sifZQ0kbCxbU7PfroPOqPwIk9DDqtLY3wcEeagNzvaSQeKxnR+aMf7VpJRTHAkSK4yFYyjykv+OQCTsYgJpPO36OxC9XUe20DIH977V/K7dFoNBYto4HonUeX3dGl1Pzz7uPPTFz8h0RByMl/kN4P3FlNvR/7PZbsWFANrOV39pNvHkzl5uPuV74/qaiesIeo85/Q+PpkI/Z7OhRZMeI2ZuqlJ8PFYBxTyKjToQ9HaGRmvV9FTatWWiGnU3NpwZahhoaOoZakv7eqek+Ikt9mGxHzmu526WRyMoiqHe1vBUnHkRdmjBznSSW/iq4bMjJ41XysdcoqWyUzcQIZ1YMVHrXJXoUWAZE5dbAThycx8dIC6kyBfgHsvpHRB2jD65mLP8Uom9tt+OMZLLSUAql4YdKvdhMZhY6TCJlS7e1ud3xpa5u+vt8WQ9Mdi0bppM44NSxJx0aXlpfml90XHjy4+PXpX1jYwuzPuKQROKA/Gax2SgVXK4d9ovG4sZy2qDOI3PL8tx0fvPdetN9/5tlhVpi0h1Q1Qv9XMShCZqNg9AGsHhUdtn7Fowdm6Pg3I5uOP/XpA3qW+IiZJL83m3XG5UoeNuJTg3ucFVHnxalmG9dMPSw9HKeHg8zA4tT8JKNUqoYlOgnrLYyB1IqutRnFD8KYHchyM5KZ1vyq4SaMv0725YkVIEoLP2f2LWDHbRnbp6AyIGkIjAnmiff3X54+dzWWSy0ZMbSYG5eeEFWdvJOPU+1zKOq4ynYqBdxdnn9qa9APOOKpnD7zJwKOyOPJo26ssZp/EvrMqVPTX/sDHXQy4Tcqb3aq6ik/hoo9niMdCZdhjLFch55Ncqdisv3/vfdTnh2MdhcDOp7RxvKDlKDT4IaCA5dIIFQx00zKkMdMZyggZXVano6FIeS38WiHfs3kEZ0KbBx6wDDBlv7SGQUrJeF4Xno/p8feHaKRaSnEAjDdgtfbHIY1MySkQDSD3hHxPUowIzpY+yftvuxIoVYkCYj2HxqjcoyDNTXi2Y/lEfQDyj4gMfjEO8MKnUENfpnvOrHrq5w7lypEYuLWEK4+QnQz/RAgJ+WQpIACa2dMsdNbYt7wx8/F3abSUUzwN4g7MP+o6cFHKe07de1LPuBxiCAqA7qQyyeq9yOQdF1rxOIyd55lHyQs4jO337Pk/rblQ3kwvc4AD0QFlDGYNPRYOjyNtO/rw1OxzXtIAKt2ZzhvRMLxYyQ4ZppW7Ul3GBW0yTD5Pn90o6j3jR4oM2q1B4KbsySaeuwRm8Vun7HJWalYh1cIA5HJCysRubF8Gsfn5Gn9pDECk1RZvSJa5cTAlDz1SSOu7EE1XptsxBoNTCSqpHOY8/sasYikgwFW78EykJZGQvfJkHiFOfPiV8/rM29TcHAcLE7ebFS6tF/FfPvV9jmMu6dyIOvu2FLDlqC/9/B1ebl8wBoq99y8e/5Jwvhuv7329pOnfiyzuPKeDmUsxsod1U+6xALauFsOJD6OmH8GtjvvrL3nweX4H3/gfoXMPgLCoGnQRj1NGIbE8LqiVykR3ZcPp8klGhY8tP3NVCcq4OYRXmQOHyIVN7WEE4RJVlbdOEVFX3LjfXZsEnWsjup8xJEPiSEfd+wxM3XUSKCAMUZSIemqEHvHAO3YWL5kyAZ2EDDv+aOdMz7OmnDYHNkRytrUfY1DcLM7PQw5O43dkbOHkboMmXcA/E39/etNHlR2ZLAfNMV/e2wWK5Z1IgcOWSzeFQpNxaOFOYAwoQrSPjd76fjs3FwsCvKa2jI6s/OB2s/F3MQn18sfc5ikWZJz1//QkA1o1W8MngT1B8IO+h8kPcayRIE8+RRxBZ6A7XuE182TmO8P3OCn4zmjceSvp9ex55BM7vyy9bfyZOQpUZc4wVTAoyBwQ2FPmji5DJWLdI+ZkoahvEfXsUpAoUVrPIMuFLq9oC5JrXSH+ahizCNcouAZf9IYQTF44PBQ5cGsZNKjY1nbI8JjCsf5/QZPNGJBejo9X2n6Ec/kJBC99JhqjKemfQWHIdwmszYS7+HEEb1DhLGTNoWJYkAnnYyTg95C8oy1kx6tzzwEoCevEEVHzgan/c6rcZOBOsms4DqJdNAiqnVSDQnCfrxtdXXxS6sTs+7o+Zjpnq1Af3MvSaq73YW6dtAjy8vR+esbo7eDz5PIag6XXkQgCRuPgcmvPfn1U6e+/nWMyp5mKYOofV43kLA9/1Rx/MI9bnuIIdAiKdPQx0q70ldILWzLkSPoosOnhLD1jOlE8XA4r88/hPaT0Yc0M2PhUXLKQ6TgbP8RYgVpdrZ0sgJdt3e0JPt6rzRVAp0nRx57P2c5Kt3G2Y6JRjrHmLSQRmIxOzK52WWb3OlJH0qrdEY8Y4Ik4CTMiJJo5hxWh+xNPMZQucaQBGZbCCNFQcZyETBWNARVe8ijKUcO4DjMRn2ue8JilBN/0o4JkqVUVI/LAerulD7aqN1EppCKzT1z+ZttNcOLi5cv//j4XIy9sDEyA1sD/Lu9oQEEfRAafDlG6h91t23Z7V6OPl8pDzufo7H3AjtsYM/jCT/zxMn7SKRGLhz25AXw+EzL86dLeeQ988993AWI3YURarN6dIfq//mbR4+GP/VFrIkaWrjjjrAnfC/883zqbsVwDnaSDJvKkCAesego7/6eIJHzfBhZWu3usFoyV7yh4f19+sTQQ/5Ov991RS+grN+MeR4MMIuRRpmzS3RiM+pwU82s6PZks00PK5PmMRo8oHWUmF7FgY8kIvf+gRFfq3C/os+U17MTQK+dbKSToxHYsbyCgt6QPKLum+zAjKPHuDRl+KJDJlVvJcMTyHyQZKZXGoy7Wrfa3b04fW761PRw2+rx2ej51zeDDh46Rmca7pgBq11754OmaMFlw1e36UG9b9TWllKChkdPn37w9D1FD/1RlsD8jWfJR2759aJFAC1PdDpei/70X5fv/b/D4U/d+/N7P3XvveHwz+/1HAWEf/6TT9GgdO3OhbvvDsPWczfGMWrpv3SYTgzNkIZSGTKbpNKTxJBi7eRfkFBfQzpcKJTE1tdR70tS3t7hWsPoljGNZG/ZVGE0siviYvEsx8lc5phaLIbVK7LotIYV1LsyqaYV82Qas+2Kfod0IA7Byv7JrI0mcIh0e9KY9G/y0Dwx9jYyFWLjZH8tjcmTEtEh8xhjFGsxPKAutWLC1Bh3ZCorhESrnor95Z/iJJAnP/PEE/edPHlw8aWXj8eql8jtfG8HLcV9MFpU76DrU8tP0r5B0SL41+p2uXx7kF0GzvC6DC/3nNeV+zrZvZYGgO40TnB77VMPTn3IvGPHmGI2m/VG1dKqlr7Lhb4ZOWB/UzA9mU6ik6WPaztAUm6E4OG4A5oKOYo59H7geGEas+toHMvnC761web8Tqrca0cJX2f6aOlxsrcMc4ps521eO7xauE7RbMR5DRWv0mhKPr257l1Jfkw5NKlQIqJ71mYs9gNqCJKeGMjaFPH+QmoQ64DWB9XGPPXYaHhfQa1PSLvqUQfRRc3rCoZSSLMassTJeKLyUcMmfRbI9vbYwZPd008UAqS3P/HsS1+9UA3zjgeMefE/Nx+NunP6JBPuXPx60cdZJ6WbDQh6Q6EbNDQUUWfnn3wy9uBpIG9bUsba9Sc/+kHo2Pk0SOpdeu4UWolHTI/sLJywv6HM3WgJqwajggYljq3qIYOXofV69KLIPT26Hc7r2TmFL5mdoMlfOl9sR7GIji8WOx/LchlBOtZsUzqNRWSMcls9eIC12hWIXDp9CDnXUTrsDZ4oT+KKZr/ZYpO9vmbOp3bqph7gpY7KEdqLGPrT2Di4js8MYPdgacB+z1HVmFXNTB5bOmaKu0vc6tJpwwD2+Nzi9GJZIuQbTz37crX4zG2tJSWScmE8U8zkfnQr9KATlADz6DIdDsRe3zog0PCDFsljLql3oi4JqRlUPZ7k0EY90nGgVjfpBplVSNJT9YztJ+nzPPSH8H4j96oXtNFaetC1fJ9fH8C65i8ldUXtzvNMgQccm7HZHzt2v8yZO0mJFCHWRgJfj6ibq+TTlX3gbCh0jCNyclJJIdpZlsR7WLtolEww+8KoWfvTHmL1MecEoGPGqb8B6XvYvB+s6e4jJDSlA0/IKdZGmUymDQNUjYHJ3PEvdZcVN3zjGz/4wZNVouRfeG+pTJ0G0o6lNrlUbml+68qLjenZ6/PXTz/6+sacTi0ygpLzHMAZRIpVEGZ9YSb0XhT1qGd304GyUcp7Jsn7Q2HqCymUo4GPu+PIHhqo61HAm+uggxxpQQLVyWQ1GMXfWzYNibHax1AfU0LhCnH8YxnbTCjk5zhRV++FiU6MiebzFWPvpDZaH8ms9w4yg7Xm35HxyRa7xWY/RhUGOeHdSaSsTXczilGokb57kjxyAxC4sPkw/D4UVowxe3qIiMnjOrgmU9k6CyajADZn+vH0qTK8al//w2rBma4HyuMWjz4fm5/PRU1o0rcO4yGcN+wKtevoIsB+d7Z84hOfGGxocTbm74JNL08gtlQjUUwyH8VRj3ly5+Gh/vUG6mLtvnuBiLPZQ50mjMzS4lkzKZBtOYLhGKxLoDV0CqMxeqqGaAXzWD19vMM0o+oPEnegwVi3i0wuQm8Do76PPYJT8js42Zf1085Y9NMNTV8R9LF9kwtmGrwhKpt65GYl7xcysnXg/bbPSwUil1fM4SEsht3ZQ2ZEhY/H/izfAY88iOpzZ1g50FDbP+nJM0a5PQ3jqPnOY14c5J0rnRQGfTXcoqkfT5/cULpUDfPdD3xxwydPXZifX46ZYqll9+ktUnOUld2kFujY+fk7fltd+HePdN39qXt37HhzB0ZQ77pLvSudVtLpu/IujU4xhJFJj2fyUHJP8vCepqY0UHhaNBM261PC0pkFwRDsQcFoCWMWRglPrutF8/oYKUxnaURSPMlv6LyNkLq1w6VzSmoBnvQ3sk5MHkReypIFdonLpqiFCky1qOArgq6qSX3eHD3NolD6jla+E4hcKNH8yDFjbA7JISmkWx/qMRPN4Akv9AOL699J8w+HGvobOszUQyeSodFwlXL/sY/75A2zgGJBJJkH1DRx+eRN4dHQ9Z4KcdRH56/H46blpdiFSmATNw8dvZvW/ftbH3hg7+EOcNZbbvPs2LEjDJ7aT8Lw+ua94TfhPTTNUTpEEHVA+i7zVzweD4APLyqJTeIMFPoMgxSI8KHBdTLMiS79YqRk9pFpQvQFnkjd/FFjMnDC24zJCgbpgH/dUyPOMulN6rHPc3ZROsrZ/I8pf0MjhjRAksfpxKgdyFcCfSFvNqcnkZwwpICCofkDOPSTDjY70MpNfdKsO2DE6b4buBw4602eHk8YfloawJ6vH97dTwbsYcLxcDhvcFKVhvNRJsyPSV45t2HNlSgG3U3uubqz990MGoPv/18qxs77H32Oi2M8jhDxBhJ6v/Mzd9JtO3AbkH+s4f/6HPjvf7j+sZ40AnsXCIwZ4UfowVu/988+9Sn4jd75TzygB3aYsS4Si2byBwq5dMKsSEl8eDdRXDvvpobX7DlMZ6vwg4+EJUYYACVJyfw+rV8XdJxXsp6uAaArd57MQk1W+SMRH4CkM+vLisfyzd6RzmItHrb8gj495eTkWL5Clg2ddGbyEPYLknIhI7OIB/dYguN8Fp/MWR9TaPqcOAVmzC/1owo8dOhQUwcZqjdkVkkxL3ThBuAnip5EVvV1L0iBvPmYSKZ/NeWKLC6H9VGm2NzlmpsBffB9XeUf7Cmo+oZDf5CTl64/WgsoU7SLtVXb2vZ0PfDA7qH1008tPfUD8Ob+7r1KoYaZSDXgD8+z4+jRo+Y3oQ94woA9llXci3/sUMOHyDUnw/q0sCQQ2rOzgfg8d+vWVu8ZTUf0ArWAmebDRhTlCK2G7zd7FI3vpSPY10evkBFljJ7T0ReEQoyOZZszIeGo12vuNBfSqiUD5/ILWBK72aank8kkJkvJhKbklDxD569/rBlDfFhrqRxTKM0g+gpHuRDnh5Dchob+9ZbJuxdIvGT3gfX+dRKPU4qVoMb06OZjH7TH4/q83NS6kzIpU3z28vDBGwM0+MDeDQB9oYMq8Dvv/D8Gf/9P/oBONnArUBf6zkdBylGZRO+5Z2n9NMtmP1CYvrkgRTTExqjExiPHI6KQxxCtSocwDJk91FLjRiIxoA6hI+hOgCdN86pHCBlkFGMaYSbAUIoPKhMwbFT0xZuOHOVJ8Rm5wlEyKQJxhPNmKSNbbvvIDo4zS7RMtWT4FGHyk/B7s3pPA3ffpy4wfkb3KgHYEYb00U6zhbMGLLJFn1lH0cEDO76ndDaljhbVQysHavf34w0bM9urpYSCVNYLqleOFaYQIEQulzufW7k8vHJDUd9/x+4yY127/wuGWAPw8NmB/2h3PLe/4dYhXx963wN76aMtp9aXHlx/lHOI+ZLJ/4y/FUWf8tecNwaxoiZQqfdKhiiTcQRkjhKskmkAPn/kqFFw3Eizrwth1UzoG5I+Bac04I82UvN1qAd8PE+THnRX/H7Kp4BHYwiEuARkliuRLrALXC4h5g2bXjok3lwR9Mn8Pmqqwbagc0/mM0TbDvdwzMLNDGQceVGvqDYmqsfYUkMB9MM4oRF52tqGITJiWy2uTUXHAOX1Ytv8/aJkzclG6cTVqyjo7TJo9+6VXZ/ZGpAmwJyQcEQa09y3f+GL6xs0eMfoR297M3ngwC1i/rEHCrG+0+wPPic/uV7faCy3VCxf1ktT9KoDtbhaCzzoDjMdxBams0+pOENBA/LeA+aeIrumJn4QIFcUY8yrQky7PmZ9cF+jojSOksH/+z3KPpIfR0z3je083KTso9V4cP7fsrOcw+GTbdapzsIqr4ZeSuuT1lWqe0dNzuNECnBVFw3qksR/XpEcXDZk5x55zMjTKbT8T1V39DhbSLFMx55DaiP21HCTMUon7dFJq9EWNHhEmd39flElK/NggXs7SblETROruGT1qSe2xPyX+9fvpJJNYuTrtTubKjlnHTvf++t372ja07FtyAd/7YFPFCYCfJ29vn7623v/UcmXlDQaA8yNuGm+ZEEHugBAmGTEag+F9b7h8ZDIK7hqYbVYJEcHt4Bbh0iDsGOCAoyqqmj6fDUtVxTzGJ2g4rDHk9dD2jgLLXgB67uPUM8AriBlOPsnQ8fkZlFqLZv7oCR8WKlyZmFyH4YbSLqMweIQha4jqSgjn3TIn4/cL88Irfpj0lp6wlAaj5gPJXeraXBTiPHQh2YNrh/wqMUKQD0op+iWnRi/Y8KM3SfL0SiqdlN7Lj67umvXcFvbuZN3Vh1n1r/zoxtR3L+7iiIfbNl999095p1Nh7eF/Bff90DpUrdL8fX1C//5lXzJKGO1aNfzasl0ImrBhOpTinTs8NBvjzTuJ8M9m8Ke4iI+0FYkCNuEZE+jVeQKTVdq+vQzO4+ojc4hmnEfM3LeWLwKvlLD+u4eWrYMnx4Dmy4qx2xyvjNfOja2dBqzisEZJeBC4p7HMcp07gr9PpiETW72emNc5piOoELrZegcwzs8jeGj+7BABh/Is0BH3g4mw8Xer0fkikO4aOtJoWOPWOKxmBw3nY9GZ2uugaAP76qZrjoO4RO3bZLqodtatoit7E9Ohh9473vDu3e2tAz13wjv/j37W3b2lGEO+v1zDb1j+cJqPPl8McaoV7YqStkoZDTj1AE/HKY9oQcHfmAlaY+52GHUPB36i/EtbEyUNN2x5Y/qgfbdjWONB2iyzqMrEbI2UHgB+xAG8jACDv+lhGyPCI85bMceu78S4sSsV4y9jxHXXFN4foSOXSBBGrOUNWLvFsFcWG4IdswbK4OTiWdJSYmieiapg7nfYyi7gt7LU9dFnw+FrjIhijMZq8URi+dmV3Gl7e62tprh6coKvmX37j2b+8F7byDGQy1Nu3fc0XPlHz+w46Of+KODJ0+evO+JL/7X/++/DhIj1N/R0TF4oGV/0+6duz92//t6doTvKO9ET7Hzf3fHbW+ajRV41OKcAsaov2IHMJrYQ0pka3ceIeOVe+jiS3vGeoxR41RJeFQ66imMskO8bkVfPuAonU9wPdh7hAz/3kNSPZiHIUFXxZj9QqW1t+AFZzmH1ZpxcPbC0KnSbYEEWDb76epkOqkoLjOx6VqA1D+reo3kI17WkrVw9mNGTJVEFLF/6EMZiiM3VI9eM9JC59ZRiwpdNSq/6WI2dMQVEAZJFL6Tmb20ugvlfHq6raZtpdI4s6Gde8vheBSzb/3/7qM3FU5tmbI4orPfPEe3lWcu/sl/+2EXwHw/hlp67rjj7jvuuOO9H5ts2n3HFzaOkZy/8p5fvufXbjMbaymWEmO1giYlgbd1A5V8GOuCSUbSU7bmKnxDKygUD609ylPdjoZVl+9B5koSRXow7GFoIYSZePIepoGMhKK6E7ujmKAFXjImxfKlMx/QLQ0KooKkOw8po06UXnphrLimM9eqZr+AY9laba3iDoYn86eRtcDNNOysGGsNUi1nbqS5/slwIZOuFsfpHtWnaKCZN6NeHm76OxfHyVxebbB1r3Rv8tv6Wz62X3ehBztQOhuekrF6rumBlpvA/Mnry3GZvUp0CV5lePzc+Euf+oue973v7p6ecM/9H1vYDQYA1Mie3/78JoYQvOP9v/zlL3/tPTvyG/IYRXO5AXrdS+84Onb/jjDODt2wPrQ7PGYESoyDwqPFunhGbws6H1kjlZwDPUGM5vQrYcTcbGYUunjIkcMFsdJvRsqwPqvVIsv2TqVs+irDJP3/7L19cBvXlS94qW73BwRAlhkLgIyEzQ5hERA+BMUWJYakpYAkaBNSKBJRDMqiLEAWbVpyrcWVyhwrsjOx7FRJSVm2K/FMXkp5kiflvLfZKtsvVZlMJZlMpt7UbFI1rzKzea+2dv7Z98+r3f92q3ENtKjac8693fggKFlb+9ertCh8NvrjnnvO+Z3Pe7Ku9UqMbPTZq5+/3aQsLsTwAqfTBHwyBhpjn7Pfq3AhX5BGRVvkKCZvTl+fSJwW6gzrdHxN0PCNmYbU53XJNt7yw1r9/yKqH5nZAlQ/8uKpv+hi1CH0uS2O3lJTuUnafhlQPrn0o3Ur9+E9SX7xeUfB5PrPvYwUP7IFz3Fk5vCF0dH5xcXnjk+PtOi8MLlBWfwxlQGac45k9z1dHZ1EWsXnXmli5LhQ6XV7gCrU14/bE6SMGz70qssqZ+wxh061PomfyOE5S+Vh64tHyVN/egIQtYiR07yzPy9yq4UfhD7aEXL2X/3CDcPYfk5rCSMZgiMzvS222pY5s/PxkzvRkY9dD0XJA4I1Stv9YtrZd/Xr0eRV2XZS5Dri7Ot7ZCvKpK3NJi45S4FjkQHUv+eMyB7wrFev1VHDK6LtGrg/+5efHj6CvXe3jANZjrQ3iugfmf9wHkywHGzJ1dXRoblLo6O/i+3+L78NPPUL9Z4kf1hBh8ADxjMvzwiiE7O/eOEf/s/hbogw/IvFjUgixzhuLsh4V6t3AvhegAmlu2jgPjGAYg8ttTN2U3Tbp6iTYMBZ4XknJ6wsAUU8hzo1flq0/cdE8/XPTwgvO+Br7E/YmBVT6viABEk4qGiybdvRDDrJA11zkUb7JHkKN3J6pX4SqPd45ejpnWQJ9nmXotWbZswwEoZhmAfONh7aqqH7CBOFnvRm6Nbb2A8VhAPqeuFX6J8bqLd8cI1GG45vg7++zofX//JPh2eID48AmDsy3mL1wQ+HLs25y6uXRuen2gD4Yw9Pv/b7iW4v/IYMiRcUR/ax2XLq2AxOKYCKYBmeOv8P64OXRjuNvNSGYqf/4cKL5bdVJDluQPWWxbXpJqX7+unLj5NoP7RnQJMtCEhUip7fgPa8hjT4+SMkYW9TO5DH4w+NyHwd4J7vUJuyOg6v8H7P9Xtptv5Me+9rirn9nB4Mvre9vdGAJ95PnjzaG70DW/ft7Ot76PN9fUdFGZvI9G1i5oxs/d08hyCdrg4ZnHw/faJPze3bj2C2TV9zgvrLDWKhjkgIqLdYvSEa27UWHa17iVzwDKy+BQz1I+NHxmf2Xjg/2Aa/Lw1Nd6vav9/9/PqJd596c+5uJP/B84ojmxHufvrbx8ZnZsaB6ED2mfELb4z8EcR5ByIYfrN7dYbvz7x6+OMPPpY0B2bnrl6/C72FdBf298jEHkopOV4ZaIguX5q3bhupSCEPprUI5dVgRTJx+u367Ucq9WnP0Tn3z5gJSyPeV9+JJWXCPBqJaG2uwRthdMEGdxkJzHRp+k6junDAalrveHoETnf6wdv1yoNH6956sViBhg7efNQJA0qIguzoI4WO19bnVThu3Xq7QdoIDgw/EMCzfygiS7Jbvc0bEr1pLVu10eYy/Jd/B1p975Ejx5D0p1Cr93t/PbZ3lb9cf/j1PW9euptk36V8KssgnAdevnDq1XGwDo7sBbR4bMupL5PpvNomzxfd7oNdwB7wMx9/8L+6PtUZU+9FdVGtur7nKLH5aMQmv2Rfw+/mh8L2dt/ASbyz+TM7hbHdR8XCderkJmoCKbB2po/mw21ZKNf02pXsGfA6CyOxdkS95oHm9vaOIg1Ef7KpTA+inwVyHn0QYRxlg9TlqgDo29/5hbCjfmV/rL5N1GORWdFHbuLbfWS3iep0xADaxJBILHvujCYCAk1xUhH5pQIQkSNC0QWtZcw1/+s/jYO5BmRHtXvs1Pf7u8jd39/pNHl9/eGLD92F0wdPKN7iTw888MBX/+YfvnzqRXT5HXlxfPzCs3/hJeD4ImQ014UPvnzqVVyt7TDwet5tbcztaQu3GWx0TVOLI/2H1qdvT3hOOL+DsKg3qaPnvR8UP41kg1pMEoqGMd0Zn5fZz2eaDwkfqSZin7MVkVwxgo0vmnLtR4qyhfPv7DMSX9vR7DAt6siH8nUPN2wdoRiQvd73OM09pDhRplE/YCqhL4SM9Hs0a/pgx/qTqMPxBeZ8iAUq8JJva9oUZUGvHyeRItCqyCcSU8kDcXLdIpmtg3v+1wao9L3jtBjWlr0z52VGsaw96KdUdGxE2y+rDH/w/sMf6pOrmzcWVFoLtDpP/+TFN9a/fOHYlvG9x47tnbnQCtNKu3zqlpvrcvedkmv5HJ5x324jug/jN9tEhA1z3wGlPYGOSg1rAhFJk5wXWfC0Wz8mFCMg3oq8tFVa6vX6d56TjWgqIEhRd/ZpovOXzIvuP237VMXVBnbsN9JXsYCxfq6D6IT4JeP38r03RKOQrfWGZOPbFK5FXn8vZOz/yjtO8ov4Cc5GWooO0zJFQ0z03TYaiONvTwytD1I3ucFGhMzPZp3ChpjoIRw+splNvd5my9HjnzX3vjK+ZZxIvvfU4fNEcszNodx1ejqEQXJsQrz+vzifAi6fzuY2Q+8XHUe2LwM+Nx498jd70R44DyQfP3XhjZbQuPSmyDhcnuSpTuvvWX/9psM//aCd0dFV09ic2aXBRq0VzwwAJWFgtzZE0hGOk6wQleAHk0fl2n4N2YK1r8+eJSDX/9yeAereSKIVEPVAfVhc+eiEF+1DxgSTLZ3Yv237jqBRP9DoMNTrviuo0RO9Uxb34wQawFKT3Uhw9wONqBEKxRJmcidc8ENIw63I5eSA1eAVZe2S4zZycmRq6tCgSP6VDc0Q5oG2vw3TGdeMam6texaktH+8zLAPfvq9H4JkJ/h+7KeL64emR0bwWINTh6YOwXFHpkZGBg/192OW9bvKC+sX/26aT1o9Per9ryu7H27lVu/66rdfFcz9F8+ef+P7nRkZCLXnF1I81+nbO//qDFp3M6htDn+rQ8AjjN9cxGOyoABhey6fJaXb1+e5aykNjtycddGcZPD0gNDkBNceQZ66ffvMQ1Myq3Zo1m4gI/Y9gn0uIkflwjCLIk+akDFBw+1pxXyk/o4RfO+c1u6ZaV/9rwfRbZTmfWdFeTqI+oaf5F1/z5C+d2Pbk01xgdSwAtcD6hMudEokgDky8Rxw5zzd9B6b7rFJZp3WuE0qvC5WGZaZw6KcW4Scm2r5g2++cnjLK6+M733le3tffPaPwyOLi4cWwUgfPATCY3B6anB6cGrkkJgIf6m8tf7aC3+tTlq92ohM9YV3P+C3sXkUM3LGN+sxM5ZDdZ7ifHK0s0fsDDmLwHwEVt/ydoeARxG/KdVFhA2z/ydkO4K6dG5I74zwqEZOTpE/bhZk6u36I8ThmLVSf9DukzSHmx5+4oyGfVtvY6rMnPQcLZLeldIdNUf9QEy0kdtl7Huvm+i+BOqF3uuNs6eP3n5QrBFcb/h9ius7A0EjGos5wRAtQkeUo3XkGiLbAvYQRXL1SAQsSxnrHB0QM0LUA5B3kWY8NbgQTntvTXF4o7t5/rb6zR/OHAGD6od7t/zj9NT8CEyfqflh2EbmF6enpkeA7odGPoSnkUMnlPfXdz2/PjbZK0Ny+vN7nt/tNQD/0gPOMz95ZfNegaNvXprLpVy3k+hfnjmM6GLm2Cny6Bz+ZherA4zfhOqRCQHCRjAtyltVQ5or9XproW0B94YvE3Rrkl6lF1vP1KfWpzzY2v/c6e+cOfM/2nak/pTnShqKaG3haiLRe8JkcwxTP7AZ3OiVRIHNpz6/Z6dY9FvT/IgSZsOajnq1Hk1u12RuNDUJoypZ0bqiT645FhkenFq3j4rBPNP0WlRRdZRoWyT8tpR12dcn1nPHn6osr/O8+sGvP/5Y/fhjV/04ueAuLyyoSVVNJlMZlfNsUmd6cmxhIbmcXG7M7t419NTuE79zr02Orneb8CN8z/pbiifbv+R898jLr57aNHtq+BdWirmcs9xwx9Ie4+MzW/aOXxif2aDVPd2u1Xv45DTZGG5Km/CKUMk0FdYv5T8KhhJm+vAEJSmhI67eh8bTgSdOA5/3T9keqhwcHtpz+qnTo34a0NBAU6u3cndwu3JjvxHYvmOHmdhxrkmO8cZnIvrZx7U+IXpksqvvN282doR3p6+mDfVcE+0+1MyUk4n309fwwmuYGHZ0fWR98bJ0Qp7BEuaGZ61oZLWR46mP9BymiAifn64zy0VfJ+Pq279+m7ZMCrdMLpPJZlkWH/EtfJpL5eBxwgz9MheqXs5YubFDXYb89JXhwfX3d+/CahesZv3G516e2bt5Ns7wL1Iud12V59qcsl8e3zKzZXxm7zF/VZeP3xYgrp3Xu6nekNmPXrtvMtFu05A2+trTCkDb1UW4BTsU3SZ/F9psfbcP2qOYgbL+4MRE2+VMrbeQy1DjpCYUYr11+vfSxr5tBw6YQW2nn9TzGYg+W29W+rDCpVlvFblKRbQ9oAB6jyaxwgUdhSI9WqPGIn1keAkVHXkOtJA2IHomPTdA7aQ9Z72IssiIQp/oaSQmq4p8xi0Yea7qLs+DoIdHeFZhZFUVKYJ/6AqFj7nO8YuVeNmNa2X3WiY13GnBj5ycE+WoINsfe+CBR7/x0svH9p7f3IMzPGkhIOf6ZJvF9v1XZwDlHxv3l28C+d5BcJihAOK712DScMVVIVNODxA7UChSZCb6XQKEABQpRsMDlCBFYrCpPW7jKl2D61MPPfFgJN4rUWD6KSyUxtNqIsuWUua0G/uU0Be3bQ9GdxzQNvMQ96pwATqcbvh1Wq10AbjIA6YRSIaMfds1gdwp0EdNC+TSRCJ7amIOpuSeCU34jEaatughJyubGlR/4zU9Em4bOBMHq1eliAbQHsmJzyonIjN8QopgkMvbRfrB4TEPU+Calbs1ODXYnlAlVfPzjz726POPAYh7+diLF3rktXtlpkB0HWSMy1It1sI12p4dP3bhiCT5zPj3Nsr3bl5vNAYuj5JnQUTJBWbTRGSyFfmqyzYjonjxuYho44ZUB+63KWN26qzdt/VB294Y/Rm1j2ptSVqy50ADo2zh9L6QYbyzc1MPQs/EyGZj6PFI42jDy7D0aiLPNQ2FGkYq5nasxKiLlrN9okOiaJVFFzEAuGt6wLNTR+q2yAz3G+IL81S8FNGDetNydSBmHuiLlFdByrr4AmjKxFTAeYCzggQBPOmu9wr5TbWupdiHgy3h1z/v6b4fPe/g+i0v/eTIq6e60q8GF0f/zE/C+fAXGV1HKZI6vj747ruvv/sjXI3x2KlTe/f6jD5zZO8r3/qAGLzNXHd5u+XWiFw+PQ/aeFB2AyS+fmSr1rhd9yuKRV68zK4hoi8OUD829Nj0xZ8YolDqdJz6sDfjZ4Y67dHn9mi61pX5hg0f+859XfG2jiSKexH9aKSuHT158mSjg9vJTG9iX02kOhbHUYUbVbT6RrZ0qg8chRs+faYhiX7oZIR2q3vLRdUFZqBJQM6phs6Iq1U3xUnGM9DewD6q4GuU5sjQrppNqYLDuWR0Mfb0aimTWj004mdAT7Vk4t//5TM/e/rYT8ZPdfH54Gjyl7//pC3HnQSJm7/8ycWLb7321muPXXz/jQvjF46Ne2FYpPkWIjrJIbenS7YxINLTDwk6zU14bZ7r7UTXmr5C0DQMnC7aZ6nxR71y5p/3iPm6GInfrveBPH3wye+cHZof9PP95uxIJxvL7sIgo3eGlUQ4Fg6CRN65WeyvB9GHjs6Cjjh61EsCqje9klftwIG0EaoHgvu2XSHgJRO5mtL50pDzY+A57KmgNSINkevzeER2sPH6EdNCRiKtDjWYjqMm+Hgsl4EXLJ9noMJTGR0xGwNaZ1WEWDm2wLmMaSOpmSA/TQyVgVZHAC+oPtihB79//sKFZ8935dEPZ/7Lm/vff8HvdHBpUhd8+9G+hx994cRjL7z2wguvXfhPz47v9YQ7uouOHP5WD/mOXhqZITfRoK5wI6fFFZzEjHdQv168w3OQ3fYlg0b5L1NHgdW12cgZ++ioiC0NfScCyI7SkvsaB/95oO/06BBsc40zkYbW7B3E17bfVAJf3HYjBuhd29RV2EO8H9W8PmKeE8HPFMBlN7+YDH5tu9BJDWyD6jce854jJ6cHR06CvJALPBwC2SEM8T4RYqWyAK/ota55rKryTGpkMZXKu6mxxQ9H2MJiTp1fXlgcy90azjGAdZPLU5jIIIjMpWAlVU+Mb13LZOYPzQuqbzDMBrsTa+cm37zy7t/96PXHPAbKZbzptBJ2sKnBYw8/f+LE+VN7j417yB3of6SF5HgPqgOCw5pdMLtFxfn8gPB8twUZZVcZnyYy8WBRuzwQiTT3zPdTIdbIHvssRtqepOIVTI2ORyYGJiYGzsxWmj2ZmEh0bh+YbOcOBGMHzjbvg+hUZK61CiO8JtCwnX0y5uz/wj4AcmQCivYLbbmBslxj9NDI/AQ1ERVEP217WVRIb5EwXb8t7EtdBdoxwueumsn0rw8+sVJY+c7vBkvf+c368d9N/eZ3I//HL6fXf/PLlcJ3/mesaqFdidQeknO5sLRcy8rmR0cGu6Jwm5RELUxO/OLE+vMPrJ94WFazTKoeGe2q8/BjtHbj8y+cOPbyXk+jY9rFzCtks/EevM7rWJpILQhOX74swNdTE15D9y4rvuUc7cMILGrwodGhRU9A4TpIKO633iZ7dutDfe2l5pu7+3fsD4a23XgvFt6+vVXS1Gh0mm69nDOwy9GGtxqACItInXHVdK58ZV94pyiTavhVkTLBWczlgeHBqT1nsBmiyP2aOj3b59tlon9Rn8SITYThBNZRfVtPxF9//fXA782AGfjVb823/uqttwK//e1rr5lv/eoifPT7t959feiXFrFjO3z37Dj8A70+v75Z5L3N3F2dBJEx/3fvXlTeXf/0NYHduVTOIOQLpiMWb3/0U+Pf/mRGyvcZxHPA6MybaawLw+uzonPQc9pE5PFDXoag0Nv1Rq/iA8En6K/1ZyolVMxNxKmdidbY+sgjFAHRfMmg1fs2ldw76zHFCAZjhhFNH/AWkGlqWrM9gbd3+5GmR/TTnWvBHgglnGAs6CT2PyLVfCvR0V//XYssDh5vVNDzYIt1JLFzoOdCaPmg+xoa4jfC6ExFLH5jNqbcdXOUIC/my8I6lla7HHlVqHnOchyXrL471YfVSZZPja2/8Fr/7hPrg7tOoNM9o0pawqXY8Zizi3pafvrw8//+2+OS08f37j285W2e9xCF2kX1TGpofap/ffRypDEh12mY6BC/vYkO8sFrRUYP008NDKBkxHURHsE4a6OuaZ2wbbNtx5I3UkpwO+bN6iqXTEFWPf0y0itdSqwlh+Q82iEWGu9FHdHkP7pNJL5qUgXUfY+bKLB/jqqxRQPo9eNNkSIkZDz1pGhuhdvgzBL2OGn0sl0MdKye0XNTnEApYpFGkJsqVboncfOZSXV45O4F55MpIFc2NXXx4fUTyg/W//7Hl/bQR56zxS3btvmos0v0qf3u+LdJvh85smXm8JZvfdCidLeMn1zG6PmeCc1LlKIFddtSUjfF0xNeCGX90NDRyAAweJNC130E/wSnNj/LdiOgxAIhsNP3qZpK+T0iBgzPjOvSm9NDvGuPP66dPi1Nv07LYLsZVOuBaKhPuI79RrOtljYwj46OTI9GKGfiDAV95yNUjCGc66JrXr2uC1ZFtxrDl1ahEFbuSXPs0houxctStDOEfzT6wJ26Z0SpqZw6OrIhw0Ya5nPJXA60gwWz44m/+rv+95W/nD7+1Js5tyuMwgtW+OHdu3d/umvXA//TyzOgyl955Xvf2/JN/nbe9UFFF9VTC+gInrsMAycTpQ6dHOjKj92E6s3L2tDx49Pzi3seHxjAUe8jPzdKdeGlAPjfqN+b7tr2EKL3bUa4GLcYa3clEOlVUjO9dbrW0gDt60M2dpjG17+oGvXtugBvdTmHaZFJGcyPHJ2aGh2gxOmBRTI97IZw4dymugwErqrFJAIXyrHMS0vGZyA5dudXErUb5bzqEYeRMtV5m4J3rVQuuzw6f6iD4fun5odHgeI5MP9oOPIDvwjPfv5Lu85gONUntjd1mF1gIfNhbAD9wOdePjyz5Yc//ebH7gcA4vJu7y2Tm14fAd4WYLYNu9+b6DhsE2cikcjEhO2Z+ygcVW9yoRbTtXtkZ5F8Dznhq8VCMLgSaZ/CLbSp98yRs+tt6Wrti0ghejed/Tv02L5zXiIryYO+vlaSbaN+Zs8hUY7dkEBu1JblyWJJkKauCwAu3C54Q+VC6TOI9paIXyoi5kc1zriU8Tpvm9VAl0xuMrWwPDr84fz8yMjw4vDQpTE1BXOBtXMnn81d5iHGW6PCPKLjY+S/rehL6VDoP/5v/+ZbH3+cf/uDD97uDqu2HY3lLoGh+OGkjpTZKN3vvWmU+iIq93GYVMa4xQTBOVdh0FTtnswORI8GAtWoU9U30FyoQa7pPYjeOCtrL9oC8NJo2246N682Ytp7HYkYfqUafRAZHTm+R6zoJwry90yI1H4svH6yrgroxqWPFf5ZvFQNKs7uz0r03YoSKNqWy9vuh3uWm/8Bd7PA1Sl3LLmwDAIf5kCWsRZB5V5qXo93MLgQhbq3j/6RHY/H30Z6v92bv32qZ7LToFDmci6OQUNg96MD90F0z79Ca9vBrGYS7biS2XHA7pV23ZCdKAB6RW3e8zpZPtu7Y2RbbV7bSbT6F0wntCMU/PqOZlNra2nhZbTLJUNHnhNpuVi3islfESrOIv8E4HW8E1TBpJFR4Ng3TEX5zCQnCa+EV+KW66O3NuOJ+dqWIW+wTCqVSWWAwTFkJyw9xlokJgC+weYWtsF9brllzKRWU8xtSq9Um3S/D7rXyaphjHdHcNFPbfG74EGES4WAYoTNQCIYSuvdJqUv4nuvwNhqIdA+sQ4kw0GEUoYSfFJ2oWmFCf3cxoG59X5axKAplqCbBkUuILtGAh2jpm0CtbyiJaSRQenaQoDfY4MrOCip3sLt3O1+AuWt69KchznApM++TSgzuZ+vOgnqws73TXORejGSycDLgfqgl7V43ySHUWKsJ7XArkVf9ebwoNHQ3ZWAElgrFYLRQry82aVmexHdz0Vuo7nQNmYCLH8gfPicDL75LlqvrQQgktMj609Rbw0x34cmMNIuDEamc13lHdImHgIaf+MbuBaWMAfFSgooxB3fPne6DfbdihOKt0n2DSazNNuJablwuSB8g2FTdZ/qXDp1eLsmZ2gQ3Cejw+7ZzDwRfRJzPETa4qFI5P5IjhgX8wl62gbowtIwDKg1NtMNcK/xgBOo6NwI8s1vIbvJWquNRqO5oehaO3vVdPJXm7GvbWu2dVrxa5Bln4P6/CHsJwXkHxXZUn11XdyHyshEazlQgae0UOAXy/M/+MH7P/rBD3707uvvv/7uu+//6N13Lz7/0ksvPS3+vvrdH79+8fXX33399YsX4eHdi6//1e9DgXQEvXncj7p5qlzoP9enIihoXfXictzl/nwgNqeL4ZK1ZOReZ3dR3Zt9lmG0GN/wsrqwIAP5Tw3cH5PXNZTIKJ06Q3i85ehFvKr3JjoFMVjcdAI21xNBjXdjztbLnpzuU7PbnX9gXyK//Z1Y8knpa6CFSFqdwkQqrjbdP30mgu4/DBkOPq6BsGR+kJS1oyZ4VdZqE09t9KD8P9/9SWv7WXeL19/8slbTfSTHuyQ7yXVE90zKfx3/VBhMHxu1SRvp1pMCg+YLc+9fpbPUkPChTnnFlceb2v3JdV2cmPEeCIzcznhPcCtaL0dNXShPEJzmCuexoK67m1Gd9QRy3QjOs8je2xYK1r/YjNW/0LwiDYtGn2ereT9qTAyPTA1dtmVvucWcy9p50Ds7EwYEatpcjx4Sr3/35S1f/dznPvfVr371c9/+w4+7SpouTbrSL+Ozeqct5ooQjh90FzKbUwKev5dgKCYRuxCgxOXqphhoYyC9pdO76qpGTjfuQvTO4UXXBTqMRMiw98nldYPK17RGL3VO4xmvKmbJtqMJ3d50eqq9s2Hbyq7bo2j734kqof2BRDhdPyu4uunFY7ySU5TqR58bAcguli9ZX85k28Sv67lkyMrGN6qq4nANzi+CNQ0bPFBdys9eMh7d9dhLux7dtfuHP2sjugiL5ngbevPD6m1MLyU30REnGPO/lZ7+tkhNGwTYXJb7h95EWeYzuQ5f0KHVrNa4G+hqE+sNsMktX/X0YPSWusLx4mo31dEscsnJdSPtBGoRPRGrYOLgZoZGL6I3ehXYN3csOaLREDx56/s12wCAH4udWAQZN/xhPwYMPUbfOIbcS4LJ51Yxc3VAH7h8+fLEwOQVQfSnnUedL/35buNR56WfvdDdVKjjqEzmU/hQnnlRNxoJi3F0CIFM6RjSFgxg/gRw2zX8xivmd0F4XJ1sF1jTY+gobNzL/Uo2uU4+GBHD4W6v8WqdWoQX1S7VW+cWKvu6bkUdA7cg/E/bm13pJiZbJ0FlS6hkKB10AiEzEQv41mK95aaRSzGBzaEeIg8ocOWHmQzr4h5v6gp0hUOOxQV/fTKrY+dkTZNLlAPRPzUe+6rx6ae7X/pD90Jbo1K8C2gGrCsNL5+Ikug4r3TyZoGK07naya3t2ILcezq5ETjrjdfurudB304ueOl2U0NjgOzggNrGkFirQS41Eta9Gcs3hY28ZVGIpEGXd6h1ilDDhVvqQdWzeeAxUPvs4j3SYZ43WlVNWn37DdPY/5X9zr6rjY4IfcNrCgc0w6HOjeFabFOg0FO5zTzVXIbS4VZSl944f+Ek0hz/fv1PP79w4T/97999evenzpe++g3g96efOXHhGGynjo2fOgXP4z+/9K+ejY2H0duyFEUSsxdrh4kFFCdmF1EZH9HwNivCx5gy4/b/85ZLLdyaG700t6qmMp75p8t2Ou3NqMQHcMMIOOmsnN/DIvQgC8grUE4q1/1DAh5gFk1r1XIP3owa4YAZCAfNkN7zmHC+sY1E95LTW41BPMJq57aHDe0recO8uqNdFIgvyYZkDM1gdXIMk35G5iZT+Q3Q0YOnvgHFkOjPUod0+H/l//74wrPPnn/tu884Dzz2zEufPvMlIPpjFy6cOnXhFD2cOnbh56v/2kYxV7KB9xbzaWWclAS/rmEwD5mZtaln3kq76sFerONFm7ek+32nXs/mJnO5yclcyo/9wq46RkbrjdZyVXij6Gjxwp68DZ7IzLGOEzJ/plLaL9wMkNdvs6uhjx7uTwehYdm64VjFQimRKNbc7tRNiXrvAuR8BN9qlVRXQ4lEaJ8ZjIZu+guAY7sjeQ9U19WghFKY83OrbJLle3s41TazmrtYXPDXE5OpHL9yOXVZiPeLf3jG+dJLTz/96NOPOS/9oVunr+YIjfkKUBKQeFyaN/iNSioAWAAYTpeuVc67ZSl8lE9Ntm9AOu9VTjzm/A/o8YN/9XZNqb1t4bYPLXKrYAsXHcU5cAWyhxca5m5rOCj9mwkfMmfdcR3R48ilCYEDzqkrjCYGlOKWbr5gG04krltgt7F26eeZJwhveplsAxTuaYhMivbuT9o2k9q9k8J45z06o45shL4u3PC4moRFGO3I5HtJdVemxPk3Sj0ABjHRc3gY/kSp61t/eGbXp85jf77LeXT30xuA3HJOlZiH4JlFd86EAeibaRwzanXhcGGu74fboLPh49TC0DBewOjQ8CilnA6Njg6LR3ovn7z3w//4j7Ar/S2kNhfKbYE/HB24FA2nn5ijzLsBoYswxgNPmlQ1rt5WQ9MuhoROYzLbH2eHxv15xyPhoBG8ppcKwXCh9XvVFxP0K7UH0VMwdOgtBeZobZqm6lrlZiDhhE0z6kQDWgVnkCR220y32N2V00ZYx1hucWPyKhAdgdxLBjaP+MOJzuWT+hdyEt0QeFMJScj5hAn0DJ1qTPU9a6pnx6vtsZkWQFNzo/fXH7rVvpQgZU9cxzcoUyZjTAzBOihCENLCXSSiQ8KHwFWapKznsLXcBJyOJjlNkB0j7ia5sKOBcKBICUaoQ6SH0bP/e4r3LMgOVXqAVFFaBOJH0xm39OumElhbU53wdWuJs57ijPFNvBeuH89qdy0jfs8NbyT6xZ89o+xW/vNL6Gb/8//84w2cjqaY2kSM5uoCTgiBKLLnREWM6klc4YUR/KXyDRNRZakP74Pi/etvHEOH2zAg1UE3dTdAv/ETS6Ael2ky7RtBGGOSiCJyzj3B73GI2hpblaQ5E/U/kmlAWuhUZlM5Vwgr4SgmyBnRpQjAGdXzO6miJEynY/fgdFA5ec7QD2yR4OaiuwpOqxVTiRUqxYARVMxaT4pj7L8X2TfgpTbNmlVXF1bnlsdurcI2N0d/n+zfFzLDga+bgUDg3339V3uWb43O0ZfLq8u3VtWshAcq4mNErvDkmdnSQ6f6g95KlSe3zAbprqKj4CQy+xA+TNN6BYsYNDmExXiHcHUKmpb984Pr08PA6M8Ork/p2DB4eDJ/P65aYj2angyNCl23PIQhjDLGux0Pbgu4iOFitBv8sJU7hNlU8KjpIZ52oisFno4KArGWz1FgWVejjPMenI7zwYLDiMIuRuSW/uh4SEkU9EBUUaJ2vJdFwPSGP9hdtPfyZJgf7PDqEPOZXCpHaMnfJic++mhlpfDffl0orKz8+l/O4LdiD2oXmQUgo6H+0/UmAjqEaq6IRogcE6nEPa+G55URIr/bDs8D+RYRTR66rJPEBhY+TkuF7JmgFSTmsbPCCFaWTq/PTf71Xxyb/mhxOHVycWhwNXcfRMcgX1NjbTLbiwQJF6XuoTW1JSc8N12HWkRTREgGobk4anbOC0Hg8HSc28VosAAkJJ1BIRw8F6lAxLOq2kunw30wEJlc11hbTQGOll4BpR5UjKATKpoBu6cqYxvEfbubs/XGg9ICvoq6ZOFQwTee89zNwyHLIKpVioqi5lGR4vSSW6B2OFpk8NaCT7nw2EgjiPnpbHRRat71xHy72AEYxwbX51JTYoGQ9akJIvfkIlA+he3UJ7Bx/ZWBwfWR1Mn+wSv6+rM/fy51fG5icXRyWM24n128tw2FTOdwhfvPoztJAm+4mQQGZMizdquLyQwROqQm7Y9afKl2zVEMeLarII9tXch0UgU0bSyM1aAJm9xI9BwKApKaIvQtRBIZ4TwSMhwnGLALYSMY1vlHQA5KeBI5R5Ze4ATk7DY3CI90FBr6NQKqoKfvkCf5JrWTW/7IxhBjntsYgodjIBvMFuiC9AM4WZllR/DE6sEDmFCiF2yrobJyfAVToFx9ViQyF+j49koegd0Ts4CbynqNlwEJ8JpvHKtA6ikdJHz/KvL00CRWCesa9oRCytPDNMbQhidH1+fB1Dh2fujk4klt8eToaO6mvYIu7nLctvBocb3s3W2ZF8RnbX79cgXhVRnGqSzpy1lehvRJDOEIWXYcyW3Zs+W8B9eBJVBAezFXmO6a5pVmkE2qB0KFQijoKGYpYptOiFIoBEzw5hpBc5SuPYiOc5eG3sKKQs8tiSYwEB3TlJeu8/hKUAmvlK4twaV9hPo+jbS0q9GqjbuVLQr+1rQyNhMhG0Wn5Ez4CHMEViJlnCIl8hjzAgWCeXzWguuKUGaXXk2LStQ8umvJjsjza4EloBd305oLQ6ZVl7CiWQ+FKjBVbsZCs3q+PBswbZATlXDURtSyFEC4ydMBBDQ8kMYruRYooxOvGsDBLDOwaTOpaaAnLgmcwpV6V1G6k7SHlyPYiuY4Poxg9dtxePHH77/65eGhucsnj58cXs1pgQDe2UehKmHk0BJeNxwUeTlAyYkktct6BcQS09NwQbodCuONA6voZWZpNU7R3zIMTM0GeQU3D9Tn2jtLCED4uQqWB/A4MtgVfQUO47KIXlZ1yz5AKFWLw4CUgk4xrBjloBItxoOGa0tPn7QLYKAYiEdyV7AeHjkUJmR96yL4oAomJGCUt7WoEi3xFTMYcAwztlQqhmIrH5ViSrXiuiVTCRW4bnMnFkd8FFjSeDxkBGpwoCWL5jPcNNwOjAbndjVcnsW1CgNL8BSpRcOliL4SiLo1rhfMWGG2YpfMaKFi68VAsFabXasq5vUDT9S4EbgerxQPOrHiuQPn1mJGrVQpWmBVrNQKxYRSKMVXioZRqtVqa2GFF+Pxoqm4pXihFEwUayvwmbtm28UlJVR8YqVQS6SLvwQZ/kfqrTuHlJ7Hh2nquzo6RyvAeB/OwdvFofWfj2ORzNHp9anfTNilsAHz1I47CRCoK1UlUOOVa4lAQecFC2TtRxzuyNb1lVCiHAfCKYm4reM4lXS94gZDNT1ejabj8L0ZhzEJm7PwQxjNONeJdJzPmqEVGCw9GoqDLFfNmxUYwTK54d65GYHpWwwFy7V4MeSAiZ5eqxpKrGyYBU+pAR4HkGPpFH/AkCNA3x6czjULpAeA4QaiRN2VtpBMxS0tgQS5GgKdHkgYRsJcijpLNt5F0Y4XA0q6CHhCdYI3Zg+WuGKuzcJXgeKsXgpEa3G7mFbCRbtmO/BYuRGCbyIcfmQWbRB4SrCm4nikC5peMw2upa/ZAaNaXtLtqFLl6bSpmMl9oWu6YeSr1f2mkrDSoZAGx18KVQOOie/SUScAj1XDsPal0+mEE4J3Vkwx4efXEjE3FLgGb0KhqmXiZ6FQQIlVf3vp/oz0U76Rvv/Nm3Y0yO3IChB4hZcLGMx2S6BSSzD3A4pja7xgGpG4C2wBBLYtJXFjdrYQUKLAHDAZzbWz1wNKoFSuBMwVfaVgGMX4wWIMhrFysBB0avFKpeQYJZj3OFi2XUo7+RpM2XCwEI+vRZWVwqwKRwvVlgIxRTEPxq0VoI8RsMmeJr0B5NZ0AZ6Af3Uk+kIP8Y5KFCORGjmsdc+uJ1TJyqWAEjSNQIGvgeGGOYrwGE44sVAsHAVLIRYLGmEnGEKnP8wJMwR6AB4DsWAsEKYVO2MxM+GY0QT8KBE1YtGgE42FjVjCMaKGEQ0qsUQigT2xDEMxDPjQSWAipLHLUeDPMRzKzRTJk4pBCwgrIpcS3YVBp/2tIzpn0I60L3VYoy/xLbxQdsPLvX8z8+KWvVtmZrYcfvFFeDVzGN/vxdK1vfB/fHxmL640sWV8fPzUqVPjp/z+o4q4wmAMrtKBq4Ynw0xEY0owaCTgsp1gFN7Co5Gg/bCwEEYlQXcXxc9guOA3MA7BaDAaiCWMWDgBSDkYhlGCCQzHSuBX4WhwVzRmBsMJIwo7BAwF7VnDicEoOzhyUSMQBGGXtxgwlhIuWdjMkpOzTMXyGAReLrnc3J5Ez1rA3mja6A0d3ZpcgH6uk5OA6SumATM04pYSip4OmHBLSIcwkBW2GFI96ARNMxyLOtEwrswaNMNhMwgXHsbvYoloNIjxXvgdUhfom8Chw18hBXfjg4OvBTnpHe6Aqc9U1yQoSut/SuoigQ1F6X7neNODMi7pUSbbKop8h+c48caFZ8XmPdN2/vx5+fCsfHjjPC7286pcV+Y/rJ/Agxu78ApxRtHlyyccC5y18OjQzWGQW9wgfJkQr/ADeNyF+8I8CMI8gT2jMRiJBE0N/DxGUwJHCccMGAKmCcwd08RJE46FTXiCaRAqhBRHOwDQNQr3p87mXc0lYOGSesZqAxWNHnTdz20kOphrMgSt6a2UFKpKQfBslUKKEgvF11CBx1Fg6/l4QKkWUAYZcRBbhbNGtDZ7MB5xwmuRWsAJFXS3FDBsO1JKgyjjs1wJF1x9JQ3yyLZmQbwVrrl63gheK2saSN/K0r5GLOHuC1zTzGA6cC1dNY1qKBAIOOF9gUA6EAyDqMcZHgiZgWowGACxEjbC8MZMRxUQ7zgTYTriUibhAMb/4UMQNvAD+HlUicExAqYCPzBDoCTMH92XcAcY52V0/W3gWjUdNapuWg8pxlK1iglqS1YFjl3h1aWA46R5qBZ2yq5uJ5R0pKqllaCu3rRDSmyWVzmI93gV9jYrodl3TF17Z1vC2FHfsSOopLdrB+qOUT+g6zXD0CtWHPYqADQOGVVVtw8aBrcPHEwoN4ucgegFBRq34W24eC0cTITK6bJGQh2BPfrQyZEBRi0qawB0vYiOXhmYEnpTpWxc4eLkqlTr50KKaSpKIm0Er8c56uC1WdA41YKmgclgAXo/qDnB92b1ig54gktwVzCDAGPiS/CRbs86UdDpJVTms5UiKn27UqgowbVzlethON65UtGMrgAiWws5pWKpdD1gFErFq4AYrsLTWjBwtVS4CorzaulG6WrAKBZLxaIThg9L12NKZK1QWEs4xWKhcD0APy8UANWmrxeKBceAYyG4ux6HQyqhq7AH3MxX7k+jv+EvIPXC76+ulK4HnZW1QpE5jr1WK5YBa9bwoGvxFTiFES8W1kwnUqyJa1jjClxD7fo1gEV28TpMjutwkbB3CRAS3oVh3LhxY1tUCX1x+7ZthnNj241SyYher52jfVfixapSXbNrRUOJF7eXgso7N2ZXABQBso2fuw7aPAo6xSrYT6AodzWiMae4HnIw+WVQdfcQ75h1oFN8ViNqazr539HpBQpBrVRjHCvPdoG9vuSuJJyyzm+EFb1Wni2EEkuFSryoKbG1ilZaAs2vlwBXF1dWSmZCj9uFqhEqRGrwfUlnAEDCJW0WaV/TuK0B/j1wtgaAx16a1cxE2a26wCWaFqraZqLq7tNhx9mlm/vKwZhWvXkz5CS0paV02XSW1KUIsFjNAhsBa7jArDMSGpiD8Vhwtmxx4LLQLI9woAtfssOYUcJBNoUP8ms2jCW/denSr378q08uXfrkrU8ufXLpV69dgu2tH1/E1yd+NXrrk1u3fnzi1idf+2T5xAtfW/7k1q9eeOGT5U/GXgAouFTlABbTVSvkONV0FbCbqYeWTCXGq9UqyNu0u1SNGaGlajnqhPQlDh9Z5bQWUBK6tcTDSuzakguPPKSbsG8ZEPhS9VoeNPbsO3nVcFRtXxJwq87fAXkQs9QlDruVl7TyLufm/n16EPe7iVC5BiIwYAZBX5laHCNvOqaNYFYFmEdcE+FcwmrwIt/DIzeG0J0JJMfQ00VeWU4ZR9jZRS9pbolHMV3OScQQpUQJjMUAthnhtAmSF4AIKnUAcgF4jEbD4UAQl4RACR2AN04sAKI1ZuATwBYzFEbpG4OfAl6IIuiLGfAF6C7QblGsrzBihq/dUUGGHU/1AwwCcINaFP5igKfCgB4Q/9FlBRNwWaD0Eqgm4VoBNxoOggo4TxC1pUH4TqG7AWWYkIUVhsCBf0uvFAkJ/tagd2LV4r9V6PT4Bepux4kqTnCXI0AI6OCEIjAJKms4JUFORdwBAkz4hUK/h1/jvnQkOAp8HkVdL/AGHEd8CYcKkqrfFaPjOQiE4DiA7BJBD73Aj8xSxSKmZZQ3BAIbVDuqciCdxkRaosU3Eh3BG/OBvi5+6rmwKR8BJECpCvQNw9gh7hKIKirgsXyHGZSGQM00SHiPMBeC9GcAjg+Ho7ti2Pwq6oQB+YdjAPuATrAnoFREv3g/SK4w7BkE3Qz7BwG3kFEAEwhuPoFvE4BpzHQYdHM0DDrdQd2eDqKRAL/B35npGKjxRNg0cFaFaH9AmQocwwxEYapFTZhR0RDaFlE4DcAlOK4JXwD+RGcEQOldBr6DvaMEzuECwmGAUXD5iKbALAH0DtAqDNMdDgroG68QJlCCfgS/DeCPYC47+FMzhvA8nAgqCThrVImGAJU5wCgBY1fYBGgGvw9G6T7xdmG0womEglcI5zEDcDjgaOAPJD1OXRizIFyQCTa6beeZXkeYTs5pTLFATI7OHw0lvE7pFxuJfucK8jlZ5zBFGGF4LlNeVJQUGNEpa7Pxlbg7C0BoCTg46IQCgLVMIwrjGabLTZtRuly8ZxOuE55igcCukFbVNSdQeeemC7Iwbi0BqjELS0t5hEJgTIOFVy2HroE0TAeqSzH4bInbAedmIQKYMV1c0WoVJVpc0YsWPJVqEVCWvGSDjkis1VbiYA5zsGAB/JQKK7XSPmOpFImXomj3FnUnVlixAUIsAYRYQ7u3YqM+XLMJlMJBluCzOOrLUhwOGCoK3USeHGWppIN5rOiw26wSXbPBpsYDxYsJ+ArsZ0VxSzaoXHNNh6PFinakAFZ3Ab6KKVqBflo8eL2qgIF98IAdrhbileI+J1SMn6uE+IFzxagyu/bEDcMpVc4VAcitVUprYKDHK4UDilIqxksskYZ3YMKH1mxAKeHiwRrfpQS0d/I3QnDxVuXcwffOuUu2pmI8AkiM7jf03qGPDTlV1TArDwMqyR5RtjsZLjKRhEeY61dU189D00WUH2aDhn5yBO9rK4WiA7cUsYvXDB2urLQCsP3cwSKA9DW7xJQQwIw1M1gorBRcI12w45oTLs5q6JUp6eicCZR0fcVWgqV4BGhSLXL0O9RW7Nm1mGIXNL0UVq7F3QLCfBdgIuyourarBItwMSthZclm8bQSW4HLq0UdPQL7BKMRmKGFsGLZrhs3Dcw5jTvGip63QzG6CStEQScrXAVVZ6fNCAq1cDXiVgJhm7srIQxXAUigQjc7GkM/mH4thNLPNgPwLh6IoZYsxII2B8AQTICtE1kKX4tw+1oihLGoUsyAr2qmUalYkWooruoR3YjVUK/GbdSymjqLLUFqwH7xQLSpsZpp2lyLm9HZWU2Pm2G4AngXONDk5MDmvBKK3kTvSc22tPqaaaiFgwcjetXmdl0Ho2s2rjaQ4mRzAxi3RPRZanOdBDUK8B5Ez/pBvbExJos+OKX1iJCNSMrE9BS3rFex21Ocqmi4HYqSE+hg1DynuTZ3AgWmu6YFp4Jbt3FYY2k7rwOsXymX7bQRqqmWvmSij7msp9FTrRMxWDwcpThpOoBxHj0dwhGthpc0BBjh0CxOSDOEUUq+FKLeI9UyTdOqcHdTmBp+FxChHAQmrpZOw51YYMmWKTAgngr4lRXBD/ENPFYw3FGmejLm2qLmJE5xZBlXcmsYSLEqdASwxuCpzG3xhIcr67UIRVquVWWwFAOAcKusjAYUKU3M81L5LJxP5shVCsCP1rka7KkfrKAw1eNx9Ie7hZrgNUpytuEEFJzWebPR2HkW1bVWY2SY1ZFUyI+I1UXuCPG6TrEL1NfwcROjkT2Irno5VSDZmej2xUUyI+YsoIhnogcTxoniOo72rC10fpUSP/RZHTPIRTKYXqCM3aU0E+4dGFCvqkQTP8L7gEGMz1o42DXsQePqFJuzZlcoNqU/kcfIYKGCWR3l+MEyQwpRDKtMhGC8QuEtK1Kh6FJEvNNrMnWMYoAVu3yPJMb2wqj2BGLmdbhhnSmq7fXw+objWBE6ISdKIBSGQ0Z4nkxmXSS84iMMJhV4wn6qipUPmPxFSS6Moopcb+BIaZRVx7Q8RkIQYLt5DWiOWBu7lGCqLYafmYqCmTyqKuV/yxZDTQ2dMxSO1ntUrYLRlsFYHiZEYDqf5if4YYIOhtlVLwDs5+7KNCxOITKUKpSNNqtTdRZqh7J2kFK6MB+H5yM47RjmdViqyjqpIDM/9Y7YvEj7ITUlM4v4/ZcYfrYCZD9P12tZ1co7FNFt1pZh+llPS7WTlJCL/g+c/eIlZRkB1VwYDa1B0lR3LZF+b2F8xXKpnQ4T2WtCv+KRLNwPnglj6QS/RG6sxlG0a6INj4X2NrXPJ4mPaVCAyrWeRFdTLI8TEX06TAS4qVIEgaBKkoc0nerN8/YaMPIDMZWmNaXs4fksylVVZY9AfK9Kp65LINFtz/xW9Q2pB5KNRF6YqjFZoOD+/7axXnmNIqmDwAx1JhYtqHV3Yw71Z5lIYgIxnPfiDjEUgo3tQee6VHcFpIJzAb3wA+b6KVNUgCumGSU5Up970llNdLKhFodfN1W90chmARkIT6o4qy6SanCu8iYmJYDw9qV7B9HvJFmGciLzlH8tqs4kd5OQxow0kbvdlgQjOZTa9DdVtb1ds0q5THpbJwBLpn5w3ioMFzVO2sbqA9ENirGuMsOOHjo9E1B78zf77EKhPZ8PvZIoIGVLYpHqdR/ZccCAFlo+Os+TgMYpjIaU5EQ6RVMjjaiReKTUZVBkumqpvC3xUGWiB7oOMkOtAwrUG020q8FUS47RAUk0ylopSs1QSdzj/AKznfck+vIlN6OKHEuZfSnILdJ7xKRX9RapWzlcXGTPonrCqLzayuGXAVrKYqPfdhad+oeRXNCROE4UZQJLMLeVMtjqPNLe0KSrV4uXO8U3o2j7YTqqSbqbErmss6b9vkjORT4qJTAS3Wjua9wrwiPcyPQmZUDpXrIYkVr1U8dkPhqyHJGHi3QXYnY4djN7clVPorVN460KFiXsoOMzSAEQk9neRL+TXR5VU+6Ypi4nqdSTUWdHvDAh1vOoY/WuqiBXNJSRqfukFZDDPa89NUuion+pEbw+n1zt4F1Smry7RJipqq5vpJo/8Sg1hnfXFbe3GeNtHajaqd1Kx27LPWT8fmDAPWnORQIy8IJF7hF0fiFeFUuUsCbhGwslJMr/etOS6dAEXQB6icRPbzYyrJSR6XUMI2jNOip39JqBeZ0ke8uyZNmUX+wB4h2dbBpXc72Jfie5OraQ5Sy5DOZb3u9oxdSkLthStETwSilZ2xjqIteWVA/j3O/exMWNtnq4ZrxkOV3tKD+A32puj5ZP5GhoFYMzibWYnCcba8dbisNVWacqaauGElfAu7NNN+C6vNslAu5jNpA2oJUrcLEX8okSA2ITKaEFqQzTVZvIkFyVMBG73ototi4ipKhu8zQXkLMp4Y1EuUa5LjAZGmiTk0FAiJfQMh1Yp+oZRNuW3mL0LqJnUgurGTXJsgT6ZYYunG4h6eGRJFxnUs/K5gJ+djYVBvv1WUJxS7hP55R6Ag6blH1d3Y5GFS4TYLSNm5lX6Ncmg9mCgBlZJswDtcXfTM5D1motQo5l1pL2MHpqR7GD32+SdbQfaKvP8IrDvS4avcyHTadBFvUrmszANQxYTScwTzyje3n5jKxq3gDCWrIbj2juOZaE609iUaBIaYZ5wgSkBYtaI3SNhriGPlcCdhblM2LeP+EFumFV5FdjCCZ/ZzOi38nJ+is3kxzLcq8sFDtkiOqEZcz9zSeT3E/rlXJSpF24ZCu4IrdeFRnnTS/PN4/6Xh3L4gzJ5jv0MAqtbCbTqS+Z6ysIyTiZ1VE1j+JxgcgJWsiVJUNMNgPz7GoyflRP3DA1k1VZF59zke7b0T++R+UTFUSOSamkup3FXPcoXBdSmApYGbqqmGxvwrzZymj6W8k6zqY+YE03n03KcyWZIDbHHG6VkVcMZw+VJACdsdAQuAokiC7mIljiGoh3TcxNstlU764ttbE50YHqdB0s6TXg94RvHsZNX1gFMDiWRU3L2no40NJarZZh5L6ThrgstuAZEhlAQaC5mxkby/KOseVZdSGZZK16CZrgC3KI80JcA/pNZVGIcCB6dmEsw1hecqqqirxqVVCaZEAW9s0kk3CmfGZ5IZP3u6AIdCH29FQ5a5Vxt+Fz1BB4FXkYbI5PbIH2zN+b7HDpY5R+BBfKkySJpOsDhsC1OG+rSsRQh968kvdb4Yh6NQHjdaK3msTCVouyWrFYQm8k0fODxYbEVnQ41JiiMAmVLByXeEFoujt3IfqdFArzTEZdhnv0/CZYEc+S+MAXXHUZGTYpllGSViGJKNm5jYt1lnS5aAMlxMP+7pjq9doAJbEs+w35lnF2bFlNZr1DCuoj0UAgZ7IyD58tL2eBEeBqMlSJBr+SkhivkGWkA0BFGQD7AL2lPFEzC0j7FhhW26vCmZ9kDqckPpMSgql5PAnIiYzXb04ID3ZP848cHuTKxBkOA4deNtEdN6uOMa/aTJxbZVbjJKMcZ9xwtEEwsSt4+iwKuCzudKXJydbTLMLueh5FPOU3N5u4X1vXZ6/eDecTwEG8lDt3JfqdZApnd3aM6sY85QS23NxCFsZ1AQS0RQpf1CnJBhnMb66KY6x5UoVZy5RXmx2bywI8EZ+pSM32pn/487Fsyl0GdmdZ2RyIVNLyMkulxpZTGVXNIrvB+GUZHYiq/4TPUZwrs0zTlMHcgik7lsLcD56UGf8wcXy3KhkbrAXu5ScSAqAO8uAMo7oMVU0tL6dIocBHSa8ouoePiPlt1kWxAZCCABtpcj15RVwFiWjXvwhXVPyqllRQeVLeSHeYqCm4b5dIIUYOW+WrsjTTwlkkOBsXLPU6EqEO5UIOo5+P7Lxr2Tv3IPodd3L1Esuk5sa80h24UzcJ9j8XXpsM4gOEtVyOlK/oZEm018aRgYTds5AhzZRlVE2ap7JFNc9TSe/wHruhvCYqCi8zjH4yN3fJXRgaXR5L8szyatLN8jFXEARFB8uPzS3jTygOBFcIHy5kQSnOLcNlZWF+AK/DNWWJiMztsuXo2tGcgMHNkxOFCWM4m211cWM4PeGCs2Oy4CiJvMC7/S+Su6WYoXmRB6WST1KpZUPFWV5XM9hC4KQ4vqVqPp2ScHB3LJkRClJNZmAGXxrLWCB3xmCYhPRhaE+JLitwIk6CHO46q6ueNyBLh8I6Bd1HwU0EirnMnXsS/c4dsNbVhUsLHtGzYwsZuFkmDHASP6qUJIg18v6kz3e238uSve+qKUtyPlXfgXYC8iVX2yQJiYxLsDd+KZxPeKdMnRubu3QrqY6usnxS9PkF7Jb3QBr1RAAxks3zJCgSQAXu2FhqAeSB6y4D5yczQuGouPCX6nn3uxEbrYMA3+Nx6MAqdTXADqBJIARM3NWxFFYhiQLJvMCMbaTOy2nPcFxU/B5uDVgvBxebpcGDc2dULXsFjmB5xWiqNGGQGRCpL+OUh3eZLKimnLoKfAJaaQ5JmemSii6tVkfcbKknUXWAiZZ3F2jC5cfyhKMYBWp0kBa5DfTtSfQ72TspF9e2xeXRMvik4jpp2VQWOytnWQrFZyYF5Mxk8Qvah7EUXB39AHfDT0AzWZmcOwdaGb6Dw8AlZJdRaNFvYWOgsPD3PAVjujqWA1EGJ8gCAbPwxcLq8qW5pDq2Cuo+h9QlWmezHPZg8OQCPIS9xlJzc6B/ABWMZReA7lmWvAVnWhjNJ5f5GEqZPNm72AM8KxUnkx5e0FZ5HF+AKu4yTGzVTS3MZbiwDjJjCyk1iaXlebKemBDN8MAWPJDNiMygVYjqLqIAdQxPmh9dBUuFpRZI1oE6Hl3ASZFRO8A/Ckscp6SnHsay+UswT1Krt1YBqKbmbuXQ9KMtS69wvWF8BkJbTId5yTL4IZBbiALUnkIBAlfkUr3I25voG7bJDZ9snD+pe++SvfeZMqnuH3tJnJk7KvxPtb6Dp1voPV7GXcZQho3dSd568w7cLkyfO9nsHRem+UIme0fFougUg8c7OZjLWPcM77E7OL1kLj7BDKFpmQMQkaVFnXMZLatmc1n4OpPET3KAHampeFLFmS1LqPEwcMwUHjiDBdWpfBbOsjw2ugyTG5mFs5N1oMDCWE7NiMWhcZ1o0Z08iwtFZ8Sh0HrCt3dSMOALk3x1MpmE28TrTqXwhjOSbzPwBC+zKUYfiC/wAnFBA7wuurnNxvgzEv1P239P25+I/iei/2n7E9H/tP2J6H/a/vvY/l8BBgBJvRCxqmGBDgAAAABJRU5ErkJggg\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAADAFBMVEVHcEwXKj8NIjodb0QiLjUhLzsbc0Q5dk8cNksVgkt8ob4fLDkbKjcZrFUsb0UVjU0aKTciMj4iLDQjKy4iKi0iKCsrRFUnPlcUn1CAi5aLlJ+GhoJpamhTdpQcIyMgJSccIyIgKiokKy8lLjIjKi0gJiglLTEmMDTM0dKmpZ8gaT81RlJ0foxedYm2vME8PzwuO0Lp6OJITEswODMjJis9UVolOTk1SmGXnaZ0dXEpOU9FYXtYZnclNC0dJSVGXF0KfkZFomg1kVp+fnlZXF1/oIeHq5BLZWEXYjhZpnPa3b8ZTTNZdGrMycPZ2dO4trBjj3Jwlnz37NHs58sTaz+hoJqcmpXl5N+ssbgpPFGry6TX1c3PzseWlI9DWHC/zLz59O9Og2FNa4jB1LC0xbPx7ujp5t5xsoOqvqz28ert6N/w6uLy7eQcJCNSdZePjomft6Pu6+STr5mUw5Zaf0FqiEUYHyBSfKkrO1HYfQATOCijnUz5hwAUGx03UW3wskX/fwCwewvXtlQ5cUL9/PiqplDxxF6DeCXtwFXkv1nrozUQFhnf3dbk4drDwbqwr6kuSD/ovlVZiGne2tPj39e7ubOtq6bjvFX6fgBFfVjU0cpIeUO0sqyqqKPp49vb18+/vbbeulT4myDIxb96j0jkw1/5kgugp7AvQlk+X4vBuWLmyWnAxcmEmE3rz3Ps1X77qDja3t+Umky2qVChfE6+nUdONB5qUzhgPCOITysKDxSNYT69d0g7JRXJrVDMhE4hFAsICQy9ajkCAQAmLCTArlLPslJ3RiecWDCrZjo+aVxEeGr61Kc1VkzTbzfKkmXhrX7Ymmm7h1/EqojitpT3vpDzy5/aonfttYDprXX73rTkoW7XklooN0vu4pKMqbjP5eu20d0gVlaTuMpig6B5mbChxtt7q9SCs92OwOpzostpl8BNlM1fi7EiQGY3eaeJuuU0VIEnSHUZNVpGZZo2TGlbgcBAhbstYZhFco4udY4oZHZQpOc7ZJBQo+hYnNZjU8jJAAABAHRSTlMAIAerf1z//xH/VU06////LW+TqsHV0bf//////9D27/v/6Pb/////////////////////////////9P///////////////////////////////////////+L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v////////7///////////b///94/v//qtyDm/v0pQAAnmpJREFUeAHsxTESgCAMBMAL0RMUlf+/Vmt7BsbcNgv5JRExQzCSfEEwsnJLCEVyIVdIKE7S0YPsGVM6Cl8VEkc+C3nRIf2kz6P5eReSl2GAbJiUVWu1PYRQ12IDIQwLreniOvDInlzm//9gZV/GY3TDMljGAm9KCaHrUqnEomamVwirOK4Z3isfglzpA2ZjU4POlKsIE6GjkEwIyvFExR+5nsASKVTCUisHZ6FcykspkqnmvzRKpSsVJVK5Ui0Fc/rQHUgXY0cMgDh3Y/X7e/rmeO1KetSUv9AkmA5ppMFiITojDgErGAouwgaTc1GOscVDLF1Z0Oul2Gy+0MGjLccKEuuRQzpZIYtmRJUEnBkdJICEcoa5TH5sydgk0Jii1oLLyQR4WVeA8FzFTDmPniKv15vter3bNMcGb7/fH47HPd7+1PetWRtgBmp2T1vv36m1E8qctx6544QHMIMazpqRNmNFAvn5YlHi0qhCLwhcccK2RG/tm8CPiYqCwLKi7p+1ssCOHAaC6DIzox2721XhDNizzHT/G+2UFHWY82213Ga9LyAAgyNhAOiuiP0wGO/Ppaf5fZlqUdMhcN1B2/uUSlAyEgFBeAPXUYZMh4wkbSura+sbOR2NxxOQRL4kpkvrI1Dseju3fQbuUHDv5aPvvd/GgFyTul4uto+OI71rqoXGHHWSXnvj+hRpQtK1D8PTMC/5GWvLTabTOU29gFmsOsITxXJLa28mJkgzXZd2U1SYd5H53TRpV8o5xkBAuIe6w1h+cXdzer82S880COLQHWeH+/3Nu7VR6Qjv309R4ByQH16zsKffRi+Sai/WPdchnil6Pwyqivf2yrGkV11XOaqk3Gp03ebvm8gaP376/FHa2tHck3zYqAgXcSgYwdqZHs7XaVSV8mDWlkAzBpwRpMo+4Jh8md2/f/+FRvryteVlnC8kPToNsS8c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\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android0_fp.json b/components/test/data/search_provider_logos/ddljson_android0_fp.json index a66e7f58..63d9351 100644 --- a/components/test/data/search_provider_logos/ddljson_android0_fp.json +++ b/components/test/data/search_provider_logos/ddljson_android0_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android1.json b/components/test/data/search_provider_logos/ddljson_android1.json index 63fd8eb..5a3e040 100644 --- a/components/test/data/search_provider_logos/ddljson_android1.json +++ b/components/test/data/search_provider_logos/ddljson_android1.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAADICAMAAACJWIs0AAAAA3NCSVQICAjb4U/gAAAC/VBMVEUAWs3sIXKzPpzz3rP/QrW0xdzf4ee1zrVPSbz/W8Cypc7fOJa1vLTewLXuvbzrR5qytrPk4sMAYte13ue+1LzjtbP2/PeWRK7rtcLiyMHg3trosLDuMnocbNz+z7MAWt745eY8ZdzRzMHvx72lYK34MpS+4uMDaeSzz+7tg6mxmNHmNIzyl8bzerjh0rftcKb9u9e9v7r/0O6MdcfDsd7u49v777y11rX70ObgVZggVdCw0sn69+3svNV2Tbr3tbXDjs/i6/D/37TzxtnuNInUN43zts203e3QmNb/M5m9vsbyjMBLft3uMZXB6++0ecAAW+cAY+YAbPfR1db+5b72zbTlys7VjtHF1sPvKnvCs7pqUMD0/f70QofSyNzvv7W13rTqXKXFwNPv7/Gz1uDlfb/qZ7L19trGxLqoRK3psLP35rT3OKP28sj85PH2R6e/zrXYY6L39/cAVNbMzMz54bzB1eBrg9csZOP41r7Ov8zvtbX5p9nrvcq25++1vcL3tdfQ4O/1MnzCcrbR3+De594AbvC0zuWMSLLg1tG9v87/57ZPWs3OxNhOXde4Rqezz9Tn7+f6VZW/zeDvO5W82Li1w9QAd/ru0bbFxM3x09vwKXPvt87SgsPUsbTTxLWLitf2M4v/7sjMX6j////77/Tw9/P+iMkZXt215ef6Va7Ez8+/3r37ybD+9/j+fcji0b73wLXl9/Y8UMb/1rQAZN6wxc7+bb7FxdbDwcX27rXUPqDyTIx1WMjNwNXnOJP55tz+/vTT2s74NpTu4sMeburFZq731bTFvs78TpnU39ULfPj2b6MAY+/5OZ3S1sX/9NkAWtby2cj348j5a7YvVc/S8fXT0LW73LfT1uFoX8z/58i3z97/Oab/RavyysnExt3kNoziytmzvs6zvtWNV8DylbFagdoJbu/2vb/nwLMrdd/+V7X+m9YQaeL57+bl6NxSVMdQcdi/1c33vNXwWpW1xbS019W1tr3h0MPAPJv8uNXo6Ob2YJmz1O9NfvOhAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5KxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAIABJREFUeJztnQlc1HX+/yUP6iGgKUwyS4GY0q5Hoj+QVZT1qFYSYzgMMyQdUlRAG8EkRHNyUHRNSZQBEsKF8aoxD0pCBQddbIRRwDSP0dV+/TQswFIUG/fx/1zfcw5g5jvan+W1GwzDOAw8531+3p/Pt1tRlzqfuj3pF9AlO6iLamdUF9XOqC6qnVFdVDujuqh2RnVRfTJS2/XZu6h2RnVRfTLqstUudVRdVDujuqh2RnVR7YzqotoZ1UW1M6qLamdUF9XOqC6qnVFdVDujuqh2RnVR7YzqoiqYVFKDwZApetIvA+oJUlXLiovtu3RhNxm9bFWmVuPqCBV1JkqjUKmeLNwnRVUt9ZsMlJvrVVxcLBP86UWit98W/EnN/jCZxpEvjULxBME+IaqGGTM+/f33kViTJ/sZpAKRfVulUr194Pz03dOHDFEJ85QmxHpmlVQR5ToGyAhsVJRCqrLfa7CkJ0JVlOGe9umnBOrvQHeB0RpscsciYJ0HJk48P2TI7t0rd78GFBs7UbAXzP9hmJVIlqnVAr87xiRULFctklgrblbJRI/LfJ8IVYM7pHoXCHG9SzQ5sViqVneILUR5fvqQ6cAyV67cDbQSfXoNYbUbVZmoSJaZqXV1RUY6xhJVNmAgjSLTxC8h+At8ElRlGe4DBnyKsRK9CoTATg4I8PJKtIxWBK1FNfHAgfPnpyOULAGaFNX7a+z0+jMN2iiYGr3zzhiu2ibr6NgSZeD/OiZA26gnQdVvRhowVSQ2VcwVkp0ckOuV6JUI8ygTeFVDAM3pQ9gs+2Ox2QJbHWKPFy8zaB1dHccYiU/PPOQWDdc4+ZQF0BOgKp1x91NGd2Fc/f1VWr9T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","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:27,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAADZCAMAAABy6UUDAAADAFBMVEVHcEyVmXmjmnp9jXpscYJpaYJhgH9Lln5UhHtCh3ZxdYKYm3mMm3uTmnqdm3l8mn2EknZscINpaYJsZoJViIFKmX9Mln9RmIFqn4J6pn9ZmH9bgYFraIJqa4Jfe4FjcIFSj4BPk39pa4NXeHxCh3ZYinVmbIJqjXZzj3Z8kXWDg3xpZ4Nydn6Ok3aflXWKinqXk3WkmXZwcIFpaoNIg3c+iHVNiXVhjHZec35QfnpmhHyrm3Z4d4BnZoJkd4Jufnt1gnx6iHpqbIJ/e3+Dmnxrcn5imH5ocYJrboNra4NjZYGIqn50mX23n3hsmH1wdoNuc4NuaYRtcYN+fot1cItybolvbYafo4Tv0sbXtq6KkJVxdYOMoIPuyLP/6dZ4co5pan5sbIVnanhgYG1YXWNPT1FKSkpISEhtYFiwlqHBuapWVlp7bmD/48VCREWShIajjKN8oolvkptxeYuSqY+7naiAqZOUvJ95gZWer6E6g3Kqya2Sn55mpZFKiX1goYxBjXu81LhuqJahwKZvdIeIs5t2rppYnIdflo5ZiYiqqo+xtZ1qh5E/lYVhiI2DeZc7oZJ1hp1yfpF8dJF/d5SstLd0jp6Lfp5olJV6hKKLtqyokK97jKSSgqWHfJuPgKHMqazlvqyYhqhwhpj/1rX/3b7/38P/2rr/4MZ+saPSs5j5zbD/4sn/7b3/5MyEiKqhhNerf/DFk/PftOFbUUrQsYWOdmVloMSxgf+2gv+ufv3yypf/2p7hv5W6hf//1pz805qylr2eiq//5dB7rc6CYcmYc9pqUbAmJmaje+eSeMS/ppQjJGI+NYCojoUrKWtUQ5h8nLv8zZT8xoz4v4jvrod4jaH4r4XTn4SEdK2/lH92b5bzrXjkrY7olGzacF3rpHSZtMGrgmv/tId3la/Yjnz+sIH/5LD/wHr/uXD/vm7/vHH9rmrrj1X1oGB6tNiNtMyAs9SBttdspchzqs1emr+/YHXPd3jGanfBZHZyjpx+h6f5wpHBZHZKSktdmr/AOsn2AAABAHRSTlMAZVx8jpGZr6a5if//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iHw/gbCdEjKUIQAAZf5JREFUeAHs0FWCRSEMA9Bh0qSF/e/3uvvns4O7/L2hnzT57xKQYJzJO4KabNsdq841H0nuwVnkYIFgNHRHNqE5u3CiHJE7UnCj6+9KXioAumdN+jq4o+5+4Q1eUPiKSHbFI+EhI9F/csN4ZrxzMqImtDwXE8SeKP6vnwTC0ixcBHu5UoVENBBsqVvf/2X2XK64mKITuxOc4TfnDJf1cmQNQRQbIu4NScKDIN4J8i/KOVRNNxDNVrujm6T61NI6+FA3u7phE+VrqAr/N83Re31T17vq+ZvBcDRWJtPZnC5c1/X8IPTcIMTLiCo8luNhbA+T4XCY3D/cXx6frIYsbHWVpEvlSvTXdwLrDG2F4YZFiGcplBruI80uUkkXRRLVRMW9MVG+CUKI3XV04xw9A2+6RFHznt7LVeVWEBu9PCmUFoEru7NisZVlf5d9m0sjr4ww9JVsH85rWWdkANaQ0BvuYShJwkE4rOn5x/q81Fa71XTyc0OdEplm6o71XYc2/6eu4ujOGF3tSPXVeDhcqU+jh2J5nHkemG1QWhR4gTw7nn80TuwUyMBs9HxJhgySYTxMVuogSa+dKfLyfHcAMnQGZhU0vBLEUJQLi9bnC8jGHJnx8g0yolqmY+g1YobGAGKEiZobjPctZMs0iW1K6EJ2i/HyeJy7s6k729PvcrN56HlBgKL9DK/33yCrguksLEdREO7W4yqtbAXRbrd0rWoib3GVabpGvnaYa2wI0QsZA2uu69o/IkuTAXmdTiYv1He9wMfPYY7o3HMxdm+nFkiarAZJHDOZPY8uZNaPS5Q2O85VZHbnwJEhKqUhyleisH2lF8gMmyP77uyTvunUefXwRte6Pfa4IwQ6024SGyepslRodzIrovnTbCqFs8DzgOO7ZPhOyETGTowfRvQrMlGsmEnQGEZRhNJgjtX523XKep/bsMacXCDratzy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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:27,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android1_fp.json b/components/test/data/search_provider_logos/ddljson_android1_fp.json index 3ccaa7d0..de50ac6 100644 --- a/components/test/data/search_provider_logos/ddljson_android1_fp.json +++ b/components/test/data/search_provider_logos/ddljson_android1_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:27,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:27,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android2.json b/components/test/data/search_provider_logos/ddljson_android2.json index e32feea..4a94989 100644 --- a/components/test/data/search_provider_logos/ddljson_android2.json +++ b/components/test/data/search_provider_logos/ddljson_android2.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android2_fp.json b/components/test/data/search_provider_logos/ddljson_android2_fp.json index 9aa57e3..87de73b 100644 --- a/components/test/data/search_provider_logos/ddljson_android2_fp.json +++ b/components/test/data/search_provider_logos/ddljson_android2_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android3.json b/components/test/data/search_provider_logos/ddljson_android3.json index 1ec3d5567..05233eb 100644 --- a/components/test/data/search_provider_logos/ddljson_android3.json +++ b/components/test/data/search_provider_logos/ddljson_android3.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJf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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJf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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android3_fp.json b/components/test/data/search_provider_logos/ddljson_android3_fp.json index f64db50..293a5ea4 100644 --- a/components/test/data/search_provider_logos/ddljson_android3_fp.json +++ b/components/test/data/search_provider_logos/ddljson_android3_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android4.json b/components/test/data/search_provider_logos/ddljson_android4.json index 5d84045..fd92c89c 100644 --- a/components/test/data/search_provider_logos/ddljson_android4.json +++ b/components/test/data/search_provider_logos/ddljson_android4.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998668000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124903000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_android4_fp.json b/components/test/data/search_provider_logos/ddljson_android4_fp.json index c3f45b2..af22359 100644 --- a/components/test/data/search_provider_logos/ddljson_android4_fp.json +++ b/components/test/data/search_provider_logos/ddljson_android4_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop0.json b/components/test/data/search_provider_logos/ddljson_desktop0.json index 478f9cb..a8dfed74 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop0.json +++ b/components/test/data/search_provider_logos/ddljson_desktop0.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYTQ5NjhiZC05NTZhLTRjYmEtOTAyMy1jZTNhY2Q5NTMzNWUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODU5NjkwMEQxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODU5NjkwMEMxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphY2ZhNTExOC0zZTVmLTQxZjAtYTE4Yi01MzliNTczOWFiMGUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2NmViZjFlYy00OTYwLTExN2EtODBlYS1mNTE4ZDlmMDQ1NDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4GRDF8AAAC/VBMVEWavjiy11HuhigPAgKew0JLLBqmy0Six0AzJg9qcyh3hy+221VANxWFmDZeYiPJ9Vy63FvD7Vi221n///vkgilNMiO85VWkyzlMSBpVVR+y10y631Ws1kG83mXO/F6fxi+Wujj8/fWm0D3X/2PQ5ZVDQRY+IRA7GhDZ6aukxkuTuig1FBWMpDeWuzGZvjSOth/C3nKevj3vizJVMRpdPCWu01KSqjzy+OGYsUSy203I3Y389/Cnx1DvkTyaxiar1Tqu10b3++/l/2qy4ESJsxP3+ent9de98UrvhCO221HG43mpz0S46Ef1eSLviivSdyi61Xay1Fnk78aqyVaaujijvEnzmUqeuEShXiKq00fe6rzo9Mt8SRxwW1CVtDmwz1X0tYv1oleOrjSu20W3113i8LygzC+uy2BnSjZYQD2t20HmfyKu00m24E67ZCKx4Vb37+P+kSr5w5azz2iy10X2rnGupZ+s61r1hyfE+kuq007vchPA0oc4JyGVwxuHcGK9trfSpDfPaSGmui370K6my0p7qQSVin39mDezhBT81AzT/1mSszOk0ixqNRSfuh+TxDvN/06atj/JxLu84k7puwz5iTT84MrX0M/769qPeXvq5+W8w0nmjCvHlRO/6Uri3N3Qlneauj+1zXWLyj2Rmktya27Xqw3p7tT/ojHOskLWjDG1flDglS+231WxkzG71VKfzjyhujisu2729fSFOQ6x62HJyUr8oGr4/f+IqyD3hRp2bRCc0SCfqG6Uzj1COQPj/KZHICxXZwj07fK48lpxlz3018qw4VDYs2ft7fHD52lvjg6w21ey21GvyET/xXzXkk9iJAGjySqh3k+evjjt+uRmHgyBwBHMVhibsDSyzDmri26Iwiqq5UW71kGu10+apSfX+oah10qk90eV3T2p5C2v+F6m20G71E3/8/ua603d6Vec50H38/u02TiCqjCy1ySWyzTL0+Pr//smEQmu002ewztDJhiqz0mpzUiavjy12VP///8AAAACX7fCAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBm/IpZAACdA0lEQVR42uy9CXgb53kumuEY0AADYDAgMdgIoCRIgAxwG4QEQFDmHpPhEoqiFC6SyFC8V1LIUoupUEusyLLkTXaOlNSL7Mh2GifHdmI7tnOO4yRNetqmzdL0JG2enpw2SZsup8s9955zl+e5M8YgQz/3+/5/BgsJUKLs9nGfZiSCBDDr//7f973f8v//e9761fZvbnvPr5rgV6D/avsV6L/afgX6r7Zfgf52tr5ftf2/AtDr6a+13rd6ja0etj74YeBlze9f6+vzw68+zeXqDY7W+5POTr+T7xt1aZ1aUnMG15wuLdnndPpda51akPFr/vrO4Ggf7qZ1ujTYn9E0J+OED/2apsGPP+hKBvvgUJdLg7PC10Gn5vI7g0HY1eVa05xwok4n7NLS8lYTHANf+uGbzvpR5xrcstPJ9zr9TS1vaa7kqN/l7wxqLo3XRl08vHUmXXCXzqAWDAbh9hi4IVens8mpOfuCzl6XBufx46vWyfj9+Orq7IQ7XfOPOuuDyV6t06n1dfrXGK0PngQeG36Cfn9nvV/r1YJavb9+DY7rqyfNUl8PDwut5Nf66vv64Kezvt4FR/QyTnhXDzv4e3v9Tvizl9FIs/ZBi9Yz5HM4tL63vhcauLde6+slp6y/0qf54c9gk3YFPu/r7PXDZZzO3qa3ev1vvaW9BXd5i6ADKn19PDRtJzRVp4bPvmlzbnjv0lwAUhA+93ciSEGEj2HgM20tGOxzOZMIbbIpCZ9BLwBInZ3wF3w4Ct0BGg56xRqch8GTMTz0BDjW73LC9Z30Q7hCkKChOV1ro0l/MtiZbGrqg6vBobhDpzO51jc6CjfSNOqEDtGUTEJHSQKcnU683SR0oXroN/7gqAsOCDaNwpPBKfHL0WQ97NTX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\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:22,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":6009591255007232,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616-sr.png","width":95},"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAADAFBMVEVHcEwXKj8NIjodb0QiLjUhLzsbc0Q5dk8cNksVgkt8ob4fLDkbKjcZrFUsb0UVjU0aKTciMj4iLDQjKy4iKi0iKCsrRFUnPlcUn1CAi5aLlJ+GhoJpamhTdpQcIyMgJSccIyIgKiokKy8lLjIjKi0gJiglLTEmMDTM0dKmpZ8gaT81RlJ0foxedYm2vME8PzwuO0Lp6OJITEswODMjJis9UVolOTk1SmGXnaZ0dXEpOU9FYXtYZnclNC0dJSVGXF0KfkZFomg1kVp+fnlZXF1/oIeHq5BLZWEXYjhZpnPa3b8ZTTNZdGrMycPZ2dO4trBjj3Jwlnz37NHs58sTaz+hoJqcmpXl5N+ssbgpPFGry6TX1c3PzseWlI9DWHC/zLz59O9Og2FNa4jB1LC0xbPx7ujp5t5xsoOqvqz28ert6N/w6uLy7eQcJCNSdZePjomft6Pu6+STr5mUw5Zaf0FqiEUYHyBSfKkrO1HYfQATOCijnUz5hwAUGx03UW3wskX/fwCwewvXtlQ5cUL9/PiqplDxxF6DeCXtwFXkv1nrozUQFhnf3dbk4drDwbqwr6kuSD/ovlVZiGne2tPj39e7ubOtq6bjvFX6fgBFfVjU0cpIeUO0sqyqqKPp49vb18+/vbbeulT4myDIxb96j0jkw1/5kgugp7AvQlk+X4vBuWLmyWnAxcmEmE3rz3Ps1X77qDja3t+Umky2qVChfE6+nUdONB5qUzhgPCOITysKDxSNYT69d0g7JRXJrVDMhE4hFAsICQy9ajkCAQAmLCTArlLPslJ3RiecWDCrZjo+aVxEeGr61Kc1VkzTbzfKkmXhrX7Ymmm7h1/EqojitpT3vpDzy5/aonfttYDprXX73rTkoW7XklooN0vu4pKMqbjP5eu20d0gVlaTuMpig6B5mbChxtt7q9SCs92OwOpzostpl8BNlM1fi7EiQGY3eaeJuuU0VIEnSHUZNVpGZZo2TGlbgcBAhbstYZhFco4udY4oZHZQpOc7ZJBQo+hYnNZjU8jJAAABAHRSTlMAIAerf1z//xH/VU06////LW+TqsHV0bf//////9D27/v/6Pb/////////////////////////////9P///////////////////////////////////////+L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v////////7///////////b///94/v//qtyDm/v0pQAAnmpJREFUeAHsxTESgCAMBMAL0RMUlf+/Vmt7BsbcNgv5JRExQzCSfEEwsnJLCEVyIVdIKE7S0YPsGVM6Cl8VEkc+C3nRIf2kz6P5eReSl2GAbJiUVWu1PYRQ12IDIQwLreniOvDInlzm//9gZV/GY3TDMljGAm9KCaHrUqnEomamVwirOK4Z3isfglzpA2ZjU4POlKsIE6GjkEwIyvFExR+5nsASKVTCUisHZ6FcykspkqnmvzRKpSsVJVK5Ui0Fc/rQHUgXY0cMgDh3Y/X7e/rmeO1KetSUv9AkmA5ppMFiITojDgErGAouwgaTc1GOscVDLF1Z0Oul2Gy+0MGjLccKEuuRQzpZIYtmRJUEnBkdJICEcoa5TH5sydgk0Jii1oLLyQR4WVeA8FzFTDmPniKv15vter3bNMcGb7/fH47HPd7+1PetWRtgBmp2T1vv36m1E8qctx6544QHMIMazpqRNmNFAvn5YlHi0qhCLwhcccK2RG/tm8CPiYqCwLKi7p+1ssCOHAaC6DIzox2721XhDNizzHT/G+2UFHWY82213Ga9LyAAgyNhAOiuiP0wGO/Ppaf5fZlqUdMhcN1B2/uUSlAyEgFBeAPXUYZMh4wkbSura+sbOR2NxxOQRL4kpkvrI1Dseju3fQbuUHDv5aPvvd/GgFyTul4uto+OI71rqoXGHHWSXnvj+hRpQtK1D8PTMC/5GWvLTabTOU29gFmsOsITxXJLa28mJkgzXZd2U1SYd5H53TRpV8o5xkBAuIe6w1h+cXdzer82S880COLQHWeH+/3Nu7VR6Qjv309R4ByQH16zsKffRi+Sai/WPdchnil6Pwyqivf2yrGkV11XOaqk3Gp03ebvm8gaP376/FHa2tHck3zYqAgXcSgYwdqZHs7XaVSV8mDWlkAzBpwRpMo+4Jh8md2/f/+FRvryteVlnC8kPToNsS8c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\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:22,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"alternate_url":"https://lh3.googleusercontent.com/s5LYQ5koym8Ha2dWFmnFwa0Y8vuGdQtwWtmLQbuawBVc_bIOe1Xo6DBVmIxHPao0P4apoMKxZo4_2OEizgouSjOLlyN0Uf-AZ-Qdn73sOQ","height":44,"image_id":6192449487634432,"image_name":"Small","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-s.png","width":120},"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop0_fp.json b/components/test/data/search_provider_logos/ddljson_desktop0_fp.json index d70ffee5..811afa1 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop0_fp.json +++ b/components/test/data/search_provider_logos/ddljson_desktop0_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:22,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":6009591255007232,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616-sr.png","width":95},"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:22,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"alternate_url":"https://lh3.googleusercontent.com/s5LYQ5koym8Ha2dWFmnFwa0Y8vuGdQtwWtmLQbuawBVc_bIOe1Xo6DBVmIxHPao0P4apoMKxZo4_2OEizgouSjOLlyN0Uf-AZ-Qdn73sOQ","height":44,"image_id":6192449487634432,"image_name":"Small","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-s.png","width":120},"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop1.json b/components/test/data/search_provider_logos/ddljson_desktop1.json index 703abab..a456c45 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop1.json +++ b/components/test/data/search_provider_logos/ddljson_desktop1.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAADICAMAAACJWIs0AAAAA3NCSVQICAjb4U/gAAAC/VBMVEUAWs3sIXKzPpzz3rP/QrW0xdzf4ee1zrVPSbz/W8Cypc7fOJa1vLTewLXuvbzrR5qytrPk4sMAYte13ue+1LzjtbP2/PeWRK7rtcLiyMHg3trosLDuMnocbNz+z7MAWt745eY8ZdzRzMHvx72lYK34MpS+4uMDaeSzz+7tg6mxmNHmNIzyl8bzerjh0rftcKb9u9e9v7r/0O6MdcfDsd7u49v777y11rX70ObgVZggVdCw0sn69+3svNV2Tbr3tbXDjs/i6/D/37TzxtnuNInUN43zts203e3QmNb/M5m9vsbyjMBLft3uMZXB6++0ecAAW+cAY+YAbPfR1db+5b72zbTlys7VjtHF1sPvKnvCs7pqUMD0/f70QofSyNzvv7W13rTqXKXFwNPv7/Gz1uDlfb/qZ7L19trGxLqoRK3psLP35rT3OKP28sj85PH2R6e/zrXYY6L39/cAVNbMzMz54bzB1eBrg9csZOP41r7Ov8zvtbX5p9nrvcq25++1vcL3tdfQ4O/1MnzCcrbR3+De594AbvC0zuWMSLLg1tG9v87/57ZPWs3OxNhOXde4Rqezz9Tn7+f6VZW/zeDvO5W82Li1w9QAd/ru0bbFxM3x09vwKXPvt87SgsPUsbTTxLWLitf2M4v/7sjMX6j////77/Tw9/P+iMkZXt215ef6Va7Ez8+/3r37ybD+9/j+fcji0b73wLXl9/Y8UMb/1rQAZN6wxc7+bb7FxdbDwcX27rXUPqDyTIx1WMjNwNXnOJP55tz+/vTT2s74NpTu4sMeburFZq731bTFvs78TpnU39ULfPj2b6MAY+/5OZ3S1sX/9NkAWtby2cj348j5a7YvVc/S8fXT0LW73LfT1uFoX8z/58i3z97/Oab/RavyysnExt3kNoziytmzvs6zvtWNV8DylbFagdoJbu/2vb/nwLMrdd/+V7X+m9YQaeL57+bl6NxSVMdQcdi/1c33vNXwWpW1xbS019W1tr3h0MPAPJv8uNXo6Ob2YJmz1O9NfvOhAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5KxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAIABJREFUeJztnQlc1HX+/yUP6iGgKUwyS4GY0q5Hoj+QVZT1qFYSYzgMMyQdUlRAG8EkRHNyUHRNSZQBEsKF8aoxD0pCBQddbIRRwDSP0dV+/TQswFIUG/fx/1zfcw5g5jvan+W1GwzDOAw8531+3p/Pt1tRlzqfuj3pF9AlO6iLamdUF9XOqC6qnVFdVDujuqh2RnVRfTJS2/XZu6h2RnVRfTLqstUudVRdVDujuqh2RnVR7YzqotoZ1UW1M6qLamdUF9XOqC6qnVFdVDujuqh2RnVR7YzqoiqYVFKDwZApetIvA+oJUlXLiovtu3RhNxm9bFWmVuPqCBV1JkqjUKmeLNwnRVUt9ZsMlJvrVVxcLBP86UWit98W/EnN/jCZxpEvjULxBME+IaqGGTM+/f33kViTJ/sZpAKRfVulUr194Pz03dOHDFEJ85QmxHpmlVQR5ToGyAhsVJRCqrLfa7CkJ0JVlOGe9umnBOrvQHeB0RpscsciYJ0HJk48P2TI7t0rd78GFBs7UbAXzP9hmJVIlqnVAr87xiRULFctklgrblbJRI/LfJ8IVYM7pHoXCHG9SzQ5sViqVneILUR5fvqQ6cAyV67cDbQSfXoNYbUbVZmoSJaZqXV1RUY6xhJVNmAgjSLTxC8h+At8ElRlGe4DBnyKsRK9CoTATg4I8PJKtIxWBK1FNfHAgfPnpyOULAGaFNX7a+z0+jMN2iiYGr3zzhiu2ibr6NgSZeD/OiZA26gnQdVvRhowVSQ2VcwVkp0ckOuV6JUI8ygTeFVDAM3pQ9gs+2Ox2QJbHWKPFy8zaB1dHccYiU/PPOQWDdc4+ZQF0BOgKp1x91NGd2Fc/f1VWr9T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","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:21,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:22,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":4785074604081152,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480-sr.png","width":95},"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAADZCAMAAABy6UUDAAADAFBMVEVHcEyVmXmjmnp9jXpscYJpaYJhgH9Lln5UhHtCh3ZxdYKYm3mMm3uTmnqdm3l8mn2EknZscINpaYJsZoJViIFKmX9Mln9RmIFqn4J6pn9ZmH9bgYFraIJqa4Jfe4FjcIFSj4BPk39pa4NXeHxCh3ZYinVmbIJqjXZzj3Z8kXWDg3xpZ4Nydn6Ok3aflXWKinqXk3WkmXZwcIFpaoNIg3c+iHVNiXVhjHZec35QfnpmhHyrm3Z4d4BnZoJkd4Jufnt1gnx6iHpqbIJ/e3+Dmnxrcn5imH5ocYJrboNra4NjZYGIqn50mX23n3hsmH1wdoNuc4NuaYRtcYN+fot1cItybolvbYafo4Tv0sbXtq6KkJVxdYOMoIPuyLP/6dZ4co5pan5sbIVnanhgYG1YXWNPT1FKSkpISEhtYFiwlqHBuapWVlp7bmD/48VCREWShIajjKN8oolvkptxeYuSqY+7naiAqZOUvJ95gZWer6E6g3Kqya2Sn55mpZFKiX1goYxBjXu81LhuqJahwKZvdIeIs5t2rppYnIdflo5ZiYiqqo+xtZ1qh5E/lYVhiI2DeZc7oZJ1hp1yfpF8dJF/d5SstLd0jp6Lfp5olJV6hKKLtqyokK97jKSSgqWHfJuPgKHMqazlvqyYhqhwhpj/1rX/3b7/38P/2rr/4MZ+saPSs5j5zbD/4sn/7b3/5MyEiKqhhNerf/DFk/PftOFbUUrQsYWOdmVloMSxgf+2gv+ufv3yypf/2p7hv5W6hf//1pz805qylr2eiq//5dB7rc6CYcmYc9pqUbAmJmaje+eSeMS/ppQjJGI+NYCojoUrKWtUQ5h8nLv8zZT8xoz4v4jvrod4jaH4r4XTn4SEdK2/lH92b5bzrXjkrY7olGzacF3rpHSZtMGrgmv/tId3la/Yjnz+sIH/5LD/wHr/uXD/vm7/vHH9rmrrj1X1oGB6tNiNtMyAs9SBttdspchzqs1emr+/YHXPd3jGanfBZHZyjpx+h6f5wpHBZHZKSktdmr/AOsn2AAABAHRSTlMAZVx8jpGZr6a5if//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iHw/gbCdEjKUIQAAZf5JREFUeAHs0FWCRSEMA9Bh0qSF/e/3uvvns4O7/L2hnzT57xKQYJzJO4KabNsdq841H0nuwVnkYIFgNHRHNqE5u3CiHJE7UnCj6+9KXioAumdN+jq4o+5+4Q1eUPiKSHbFI+EhI9F/csN4ZrxzMqImtDwXE8SeKP6vnwTC0ixcBHu5UoVENBBsqVvf/2X2XK64mKITuxOc4TfnDJf1cmQNQRQbIu4NScKDIN4J8i/KOVRNNxDNVrujm6T61NI6+FA3u7phE+VrqAr/N83Re31T17vq+ZvBcDRWJtPZnC5c1/X8IPTcIMTLiCo8luNhbA+T4XCY3D/cXx6frIYsbHWVpEvlSvTXdwLrDG2F4YZFiGcplBruI80uUkkXRRLVRMW9MVG+CUKI3XV04xw9A2+6RFHznt7LVeVWEBu9PCmUFoEru7NisZVlf5d9m0sjr4ww9JVsH85rWWdkANaQ0BvuYShJwkE4rOn5x/q81Fa71XTyc0OdEplm6o71XYc2/6eu4ujOGF3tSPXVeDhcqU+jh2J5nHkemG1QWhR4gTw7nn80TuwUyMBs9HxJhgySYTxMVuogSa+dKfLyfHcAMnQGZhU0vBLEUJQLi9bnC8jGHJnx8g0yolqmY+g1YobGAGKEiZobjPctZMs0iW1K6EJ2i/HyeJy7s6k729PvcrN56HlBgKL9DK/33yCrguksLEdREO7W4yqtbAXRbrd0rWoib3GVabpGvnaYa2wI0QsZA2uu69o/IkuTAXmdTiYv1He9wMfPYY7o3HMxdm+nFkiarAZJHDOZPY8uZNaPS5Q2O85VZHbnwJEhKqUhyleisH2lF8gMmyP77uyTvunUefXwRte6Pfa4IwQ6024SGyepslRodzIrovnTbCqFs8DzgOO7ZPhOyETGTowfRvQrMlGsmEnQGEZRhNJgjtX523XKep/bsMacXCDratzy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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:21,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:22,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"alternate_url":"https://lh3.googleusercontent.com/igEwLwnO_9Va2HJmM2Wy5RhsM2IhFIW4VFj7GCDvk2Yhs3qm-gEh4Bk9gBKaU46OQ7-_I2tufgYS_VbXqX37v_vgOY3MobKegc5Vt90","height":44,"image_id":6192449487634432,"image_name":"Small","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-s.png","width":120},"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop1_fp.json b/components/test/data/search_provider_logos/ddljson_desktop1_fp.json index 50465fba..5805e03 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop1_fp.json +++ b/components/test/data/search_provider_logos/ddljson_desktop1_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:21,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:22,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":4785074604081152,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480-sr.png","width":95},"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:21,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:22,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"small_image":{"alternate_url":"https://lh3.googleusercontent.com/igEwLwnO_9Va2HJmM2Wy5RhsM2IhFIW4VFj7GCDvk2Yhs3qm-gEh4Bk9gBKaU46OQ7-_I2tufgYS_VbXqX37v_vgOY3MobKegc5Vt90","height":44,"image_id":6192449487634432,"image_name":"Small","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-s.png","width":120},"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop2.json b/components/test/data/search_provider_logos/ddljson_desktop2.json index 8710b58b..873f664c 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop2.json +++ b/components/test/data/search_provider_logos/ddljson_desktop2.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:21,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:230px;outline:none;overflow:hidden;position:relative;width:408px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#fpdoodle #hplogo{height:360px;width:640px}#hplogo canvas{background:url(/logos/2016/halloween16/cta_bg.png) no-repeat center;background-size:contain;height:100%;width:100%}#dood #hplogo canvas{background:url(/logos/2016/halloween16/ntp_bg.jpg) no-repeat;background-size:contain;cursor:pointer;height:100%;width:100%}#fpdoodle,#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Happy Halloween!\" dir\u003d\"ltr\"\u003e\u003ccanvas width\u003d640 height\u003d360 dir\u003d\"ltr\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\";google.doodle.alt\u003d\"Happy Halloween!\";google.doodle.share\u003d\"Happy Halloween 2016! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/vu3nqy\";google.doodle.gallery\u003d\"http://www.google.com/doodles/halloween-2016?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{\"Continue\":\"Continue\",\"End Screen - New Game\":\"New Game\",\"End Screen - Replay\":\"Replay\",\"Found A Spell\":\"You found a spell!\",\"Found A Spell Tutorial\":\"Draw the magic symbol\",\"Game Over\":\"Game Over\",\"Happy Halloween!\":\"Happy Halloween!\",\"High Score\":\"High Score\",\"Level Complete\":\"Congrats!\",\"Level Start - Draw!\":\"Draw!\",\"Level Start - Level 1\":\"Level 1\",\"Level Start - Level 2\":\"Level 2\",\"Level Start - Level 3\":\"Level 3\",\"Level Start - Level 4\":\"Level 4\",\"Level Start - Level 5\":\"Level 5\",\"Level Start - Ready\":\"Ready\",\"Level Start - Set\":\"Set\",\"Score\":\"Score\",\"Search - Halloween\":\"Halloween\",\"Search - Icon\":\"Search\",\"Share\":\"Share\",\"Share - E-mail\":\"E-mail\",\"Share - Facebook\":\"Share on Facebook\",\"Share - G+\":\"Share on G+\",\"Share - Twitter\":\"Share on Twitter\",\"Share Message\":\"Swipe away \\ud83d\\udc7b\\ud83d\\udc7b\\ud83d\\udc7b in this #Halloween #GoogleDoodle Score: [POINTS]\",\"Tutorial\":\"Defeat a ghost by drawing its symbol anywhere\"}; google.doodle.doodle_args\u003d{};if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2016/halloween16/halloween16.2.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:22,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-res.png","width":95},"target_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:21,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:230px;outline:none;overflow:hidden;position:relative;width:408px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#fpdoodle #hplogo{height:360px;width:640px}#hplogo canvas{background:url(/logos/2016/halloween16/cta_bg.png) no-repeat center;background-size:contain;height:100%;width:100%}#dood #hplogo canvas{background:url(/logos/2016/halloween16/ntp_bg.jpg) no-repeat;background-size:contain;cursor:pointer;height:100%;width:100%}#fpdoodle,#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Happy Halloween!\" dir\u003d\"ltr\"\u003e\u003ccanvas width\u003d640 height\u003d360 dir\u003d\"ltr\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\";google.doodle.alt\u003d\"Happy Halloween!\";google.doodle.share\u003d\"Happy Halloween 2016! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/vu3nqy\";google.doodle.gallery\u003d\"http://www.google.com/doodles/halloween-2016?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{\"Continue\":\"Continue\",\"End Screen - New Game\":\"New Game\",\"End Screen - Replay\":\"Replay\",\"Found A Spell\":\"You found a spell!\",\"Found A Spell Tutorial\":\"Draw the magic symbol\",\"Game Over\":\"Game Over\",\"Happy Halloween!\":\"Happy Halloween!\",\"High Score\":\"High Score\",\"Level Complete\":\"Congrats!\",\"Level Start - Draw!\":\"Draw!\",\"Level Start - Level 1\":\"Level 1\",\"Level Start - Level 2\":\"Level 2\",\"Level Start - Level 3\":\"Level 3\",\"Level Start - Level 4\":\"Level 4\",\"Level Start - Level 5\":\"Level 5\",\"Level Start - Ready\":\"Ready\",\"Level Start - Set\":\"Set\",\"Score\":\"Score\",\"Search - Halloween\":\"Halloween\",\"Search - Icon\":\"Search\",\"Share\":\"Share\",\"Share - E-mail\":\"E-mail\",\"Share - Facebook\":\"Share on Facebook\",\"Share - G+\":\"Share on G+\",\"Share - Twitter\":\"Share on Twitter\",\"Share Message\":\"Swipe away \\ud83d\\udc7b\\ud83d\\udc7b\\ud83d\\udc7b in this #Halloween #GoogleDoodle Score: [POINTS]\",\"Tutorial\":\"Defeat a ghost by drawing its symbol anywhere\"}; google.doodle.doodle_args\u003d{};if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2016/halloween16/halloween16.2.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:22,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-res.png","width":95},"target_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop2_fp.json b/components/test/data/search_provider_logos/ddljson_desktop2_fp.json index 32ff6e7..084810ea 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop2_fp.json +++ b/components/test/data/search_provider_logos/ddljson_desktop2_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:21,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:230px;outline:none;overflow:hidden;position:relative;width:408px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#fpdoodle #hplogo{height:360px;width:640px}#hplogo canvas{background:url(/logos/2016/halloween16/cta_bg.png) no-repeat center;background-size:contain;height:100%;width:100%}#dood #hplogo canvas{background:url(/logos/2016/halloween16/ntp_bg.jpg) no-repeat;background-size:contain;cursor:pointer;height:100%;width:100%}#fpdoodle,#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Happy Halloween!\" dir\u003d\"ltr\"\u003e\u003ccanvas width\u003d640 height\u003d360 dir\u003d\"ltr\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\";google.doodle.alt\u003d\"Happy Halloween!\";google.doodle.share\u003d\"Happy Halloween 2016! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/vu3nqy\";google.doodle.gallery\u003d\"http://www.google.com/doodles/halloween-2016?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{\"Continue\":\"Continue\",\"End Screen - New Game\":\"New Game\",\"End Screen - Replay\":\"Replay\",\"Found A Spell\":\"You found a spell!\",\"Found A Spell Tutorial\":\"Draw the magic symbol\",\"Game Over\":\"Game Over\",\"Happy Halloween!\":\"Happy Halloween!\",\"High Score\":\"High Score\",\"Level Complete\":\"Congrats!\",\"Level Start - Draw!\":\"Draw!\",\"Level Start - Level 1\":\"Level 1\",\"Level Start - Level 2\":\"Level 2\",\"Level Start - Level 3\":\"Level 3\",\"Level Start - Level 4\":\"Level 4\",\"Level Start - Level 5\":\"Level 5\",\"Level Start - Ready\":\"Ready\",\"Level Start - Set\":\"Set\",\"Score\":\"Score\",\"Search - Halloween\":\"Halloween\",\"Search - Icon\":\"Search\",\"Share\":\"Share\",\"Share - E-mail\":\"E-mail\",\"Share - Facebook\":\"Share on Facebook\",\"Share - G+\":\"Share on G+\",\"Share - Twitter\":\"Share on Twitter\",\"Share Message\":\"Swipe away \\ud83d\\udc7b\\ud83d\\udc7b\\ud83d\\udc7b in this #Halloween #GoogleDoodle Score: [POINTS]\",\"Tutorial\":\"Defeat a ghost by drawing its symbol anywhere\"}; google.doodle.doodle_args\u003d{};if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2016/halloween16/halloween16.2.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:22,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-res.png","width":95},"target_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:21,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:230px;outline:none;overflow:hidden;position:relative;width:408px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#fpdoodle #hplogo{height:360px;width:640px}#hplogo canvas{background:url(/logos/2016/halloween16/cta_bg.png) no-repeat center;background-size:contain;height:100%;width:100%}#dood #hplogo canvas{background:url(/logos/2016/halloween16/ntp_bg.jpg) no-repeat;background-size:contain;cursor:pointer;height:100%;width:100%}#fpdoodle,#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Happy Halloween!\" dir\u003d\"ltr\"\u003e\u003ccanvas width\u003d640 height\u003d360 dir\u003d\"ltr\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\";google.doodle.alt\u003d\"Happy Halloween!\";google.doodle.share\u003d\"Happy Halloween 2016! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/vu3nqy\";google.doodle.gallery\u003d\"http://www.google.com/doodles/halloween-2016?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{\"Continue\":\"Continue\",\"End Screen - New Game\":\"New Game\",\"End Screen - Replay\":\"Replay\",\"Found A Spell\":\"You found a spell!\",\"Found A Spell Tutorial\":\"Draw the magic symbol\",\"Game Over\":\"Game Over\",\"Happy Halloween!\":\"Happy Halloween!\",\"High Score\":\"High Score\",\"Level Complete\":\"Congrats!\",\"Level Start - Draw!\":\"Draw!\",\"Level Start - Level 1\":\"Level 1\",\"Level Start - Level 2\":\"Level 2\",\"Level Start - Level 3\":\"Level 3\",\"Level Start - Level 4\":\"Level 4\",\"Level Start - Level 5\":\"Level 5\",\"Level Start - Ready\":\"Ready\",\"Level Start - Set\":\"Set\",\"Score\":\"Score\",\"Search - Halloween\":\"Halloween\",\"Search - Icon\":\"Search\",\"Share\":\"Share\",\"Share - E-mail\":\"E-mail\",\"Share - Facebook\":\"Share on Facebook\",\"Share - G+\":\"Share on G+\",\"Share - Twitter\":\"Share on Twitter\",\"Share Message\":\"Swipe away \\ud83d\\udc7b\\ud83d\\udc7b\\ud83d\\udc7b in this #Halloween #GoogleDoodle Score: [POINTS]\",\"Tutorial\":\"Defeat a ghost by drawing its symbol anywhere\"}; google.doodle.doodle_args\u003d{};if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2016/halloween16/halloween16.2.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:22,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-res.png","width":95},"target_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop3.json b/components/test/data/search_provider_logos/ddljson_desktop3.json index 3722b03f..8e270ce 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop3.json +++ b/components/test/data/search_provider_logos/ddljson_desktop3.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJflNVjDz9unYX87VHA26z7Pu5L+f+sEYX0h/BkZs/XLmtaSGH9r6hEQhQtKnlTJZghL1Sq58a1bz4BH717VsK0vfk/2O66D23DQ9Cn5s/eO/OPnwlpKlFZisqkQ1UZ02sEO0xK9P9EQJoy+7GZMT9JZh7PjGkS/R9v938p4SnozBl/ZJ6V//A3mRCIylJC1Jww3UVlExQ2h4mKqTvYS5n92e9anv6fxGYlPDJNBf6DjbiUs6AbP/nZ4b8OsH5WiZFnHc9gQt5WVPagglHELuS1enm85/diaPyAOqDT7d/f7kugDsy9T17WRT8zdChcLBQ/iszQgoYQuSzhR/vWX8y8N+YP8ZCPftxX9v96I87+Vz71sGxKODqC3NIYaoxLgXIDYYEMBIWUP5/54NPTmPkPtfsfQN/j97/ytL3nSS4YRZKAQpGiMl6mGFxACVEFxhq3RZyyPVE26y8f/cR0JPrf2x6gMa+YTz74rctcH3HDYSgoRRj9SA2mBC9du37t2vUrl5h0hGMaUr/2qRgSgkt4alo0v3UjaiwZDMzDYGCECmM6TOW9LzFlob7I2yCLG7du3bp5A3+vX+FajR0p9I2ZMdTcPPRxX+f/e20G9pv50zP/xHBXmCozbIcimxjuz5D9Ll2/fhMEc+vatVuk3bgQYrvyIz12zxdENG26/Vbt0WSz5atPGOMcEUN0UYDaDUrDwt1LHgm4dJMK5Na1i+zJ9aDwhNiTbzyYyadDp9udthkY2/rEHz5e9DXBkGUbw6XBLL8MGvpHuU6lcePmhYu4IZLBDxjYU4Pa5Z7HH/2DGB5kmG530D4/K+FRtMwzv6ZJ/qPKbQhXa8LyS6iitoeosJtvzJu3aN6ivGVzF8Hra8EwtUeOoz92D3zL555KmE7nuLP2mWQavHz4ChWCCI9JdJk9uF9j/I/0O9Flb84RLe/mrRvICcJUIyo/IAL/DZnGl6ZRcyeNzEB+6Z7Z10KMjfEImbA1ksUXgqL7hghdRvV1Y54hmTmg025cvaIEJSHSTz4z89M4d5MwTZ7vpH0GSdkXvnE5pMp0ShIER5IIixmIoSYEtdmFOfNeYMKZO+ckMTtXJCHyg33rCZyLe2oaM3fUHnr66dxxjXMoFgzjCo1HkbnXyPmWQFMweP4qyOGtZVtWv7JszpxnX3hlyyu7CXO+YgjYEOZEz1Pmp6btzEe2Gffj6P30p/5aU41ZZB6FESZfIMaw6Ya6u3KVuDJvLpozd+6iZXMWLXth7ryXCCW4rkqsWchTf+JTd4tvnm5TtAdmJTwFjPneb2k8YilYMZGBIsXHBG2jYmKvL91gDsybi964MD7vhUVz8i6eyctj/uYl5qGGZO/0/MMxhA9O5wxO3UjI/4sx92pGlF+wYsnoGD5JeIATjf91Jphbu194c/cr85YBaF5666Vl7M0bQUUSqXBQZ8fcjzk50xMDUzYypfWVT31DRPuFRFThukf4JJSNGb4Od/5vnZzzLPLlZfh3zhv83UtBGXFcu+kPfxYZ2lN3f9wd8F+2IWYsj39LwIXFhyUqJlRaBBsT8bIrXDQX5xJPJo+Qs3EuGRFxM+Z4cKv1fWV6Mu227XOznv4qsrKw2DH3VYSFiWRjEmO7IOzMxUWAlrmvvALM+dlFJ43oGcbdJGeTHUfr+Ipl2s7crs34vSc0CS4SIKhFUY1QmeFlyoztCkfHzUUAmnmL8O+zz7K45jXYJSTbJnGY0F/PnM5Dm6Ld99AjGPd9WKMKS5WmjLkgVD47GZT8EZGnyXAgDM1ugMxLL+WtBtAsom9e5drPiCbwKWtV/ea9MTF3ff6RB6a5c0S7D8NXvx8zU/S3mDwWRj/steHJy5ll8PwaF83N1XPmnblx68YLc+ZO3GKSuaCGBQBEYgf+/vm9JN1weiotopHs2EfuDYj+DgtShht9mpUp8SuhldSgMTWDopmT99K8OfOE/b96xRAynd7hZA83j31qOoQWpX2e0LK/EGZfRoVs9CMzZXgmMxNn8NIto918BYnZvDPGOzeCYdSbazJ6OO1rX5yWzOSG2swyoAuvXprvl+mtHF2eLER43Lglt/FXli1b9Jb0xrUgyVKXogkKnSXFAwRKADTTK6Ai230PPfTgZWmOJRhuTySDb8ybMSPBlBmRX7hkbm2ZN3fOGfmNK0EjadAIkBJZhbQ/e/APpxlAlHbPNzQxGWMk+kV6+jJowpQSdUovhQnmDEYARuV3rp03TJjIWQ8xoGoPf9x98F+tPfDI5z8REzM7xIL6PM1F5RHhCOfDCHIas5qcpxkODYqBTNCMRWJGBiJLD+TRoJkxMfc/9Mj0pABrDyVjZGTmlZAc0Q8pkjy4YxPiCTIiRiDR3yAQACBnwM0YPbu4iEycyXbmujQJJyZ9JFLw5zEzv5qQMGtaNKTNwNll86euhVROtziBktIAWPfLPABFQTNkUaTqpUtXrl69eunqxMTNG2fAg7nyxrN0SpOHMzEjUJ4NlSdL+V/t4S+Yp7PQeJuBTqblm9zR5xmYRi4yn0ILc0Yw4eLSFRDGtWsgkCsXLkycObn7lSWL5j07Z9myOXOWvTCXJwHMYzMDNy+dl9JuOS7ZfA2HzZUv2KfdTdFAm5nzA8KISzl9TNmEFGGxud2/cvXalYtjZ97a/cZLq5ctWjRv7rPPGgkZ0lNsq4Uqi5jbkRQmD2Nrw5ZpbWa0Bx558Imgyk2KwZYMsAjjQ4zMpQtn39qSB9KYE7U9++2IN7ZQ23Pt6rUw30igRxKPqj340EPTgjHazK8zpISIUEIGW5IiY5SkgWCUF6aQCW3fjpTMnEVvnTlz8ZW58964eiloMD7JmBnfoD75cffFf5V21/0Yfp99LciRwlUadzVYrjJHVDB4dWLR7eQCklkwN/KtZ+fOJeJ64eKl4IWItZ2KtA4K3tRm8pP63W73fQnzMWfeDPI8ZSMaY8wBGOQW/nX1zUn9LhrRb3NjF8wPf3vewoXzv00/Ne/sRTHzI+cSGNEG9esx9zw9TQJI8QTLZx/T2LojntwfUiQ6YFjoYPDS1dVcCqSFq7V5u+c9++yC2NgF8tvzEjNSEuO+zd5apDL3Ul7bKcflFG0mYc6/66sEsMKPpf1Jvu6IwYYOXmnCmek35WqAa7LVr7yxu/fk2ZNvvfXmW2++8QoQNODLYFDmPRsXHxcvQPPst1OyM5JSkhYK27PlimB8YZObBnr++KtYheuBj7trPuaGJcgsA7oczGdxeWmijCIJ/Mlrb3FN9oqvuL7N5/ft7e49dqx3t+/NXpDR7jfytrz17XhHfFzct5lcEtNTkpISkxIN0zN3TMSoVbQ54c4mvtZqzLy64O9wm/HorKcf1FlHhQVkDBrAjEDw0rVXOBJ2n27x+30+nxd+6ovzCpYvX55XWrulxffGlqTUeFt8/ALQc89+e2F6Yjy+ilso6bclEfnNhmDYl2tfe2TWrN91yECb8emZE0ZYUVIrPLLF05euXuSabNHJ0y0+Khd/W21BcUFB7e53z46NjZ1917c01RafZIuLnT/32/MTE+PiQSyxoN9kTrD7qrD5nKHxiAMV0rfumU6lJW32+yExfMNnLmX2dO0kS+2f98ZYbwsoMsSLv2U1yKX+3aB6iVj2i2fdjnibLSk+Nm7BgtjEuLg4oAOxtsSkFIkTzB27wumflEQrrWFTpmcD7nvgc58AyhyS+ocxJOZjhtjr4BWuyea9cea010sB4/NvKS4uKD3GI22wZ2+qLQlAkxQXHwuiAbHAX8CQI2MuRtM4W7t6MSTon6zHuPZ85l48td9h3HxmVkLCo5988iqnr9I0v5hzpDHla8oLpEvz3hw77WtjcgHEgGDqx1Qjjh/sTrUlxselJiU5mFwWLAA5JSWllL7k2yJws+yayhPYwiNpzAJpM3H2+9HfXdE8Ds6M+cFvqBF6nrwOsC3pwOvIyeblvXXm7DFfCxULsTOlIJjzqnBD4c+xnCSwLK5UV2qsy01kE5sEILI5lryxZItgdnPeuMbjDWFLC3gCovbEQ7/TpTfv/qo5OcHSpfNuFXpe5cEzIqfzV66+BMN891sne71tTI+RH39tQR4iRu7as+vSgYyllrtSPeVgb8DaxDtQvdmW9rYs33JSiObM1SDPjJLmgThFVJ9xJvxOuzSYyvRX39T4cDXcDOa+EB0FmmzRnNUnd5fWt1GseBlo/C0FxaVnWc1GoQ67cxzxLtf6leXlqS5H7II4B0AGTI9rldfvW/LSGb56c97FSyyNZvJ6HEzWaDL/Thd2vOvzX3r0s5eFQ0FFwW0+i5hcAu9y3pmTyxcVAx0TcCGyAV3WfSliBlQda8t2xJevbwbUJMWnriwH7ybRFu9yb/D56kuX7x7lonnhujRjGs4C4Vihxx54/NHf6fjMXTEzDRecGxbZv7ykgCZb3ftCcf3qWq+MGIBMcUHteXnSmFrw9wtdqanr17tWQgPUxIEqi3e4czb764trffW9EyKKcJ1/pYQYMQHx5/d+3F3zsbfHFINYSR3F82XfwDH+UnGp318LHeuXQVNbnNcrT35xQ7ExNS7eluRIddli5y+Ii8MYgMu9xteyuhS8oM0nx7loTl4LCltmpOZy/jzz4+6Yj7Pd/8D9Mfc+I8esiOHnlBnevfTm3NVbYHjX+wEipcX1DDTkr7e0oHTM6FTO7FTVn4oRmVRogBu3y+VyuMpdG7zs4y3vn2Hkee7FKyKdkM9yGnJ+OOauz33c5c/4ql6xvS9yO+OOtnexz0/ezoi6xQJmD8wc5VPKosyiQWZDV14oPXblpTm9GCLz168urjdAg8psi0i04KJEMe3JiY8FEgC6zL0SNuUry5vXV9SXFtfSj7YoXDSLrhnxOXn5Bnn6p59+VJQ/u49Rgf/L28/NIsVdJ2+fir4F95AUChfbpya9nhWxFfuhg3A/e5+kzMx6EMtjXpCnMo3My+CV3XndbS0n553xkhBZbXFpi5/TM199cV43RouDRudSIR1zJyUBXFId8bG2pFT3ypXr12eswc8ymbZc4KJ56bq8lMCwNfjz9S9YWBLNXY8kkFK18had0Lseus12hrHFDBS2nfWlqK/Zumq+/Xwy2ZI6Yl+6i26fYh321F2/5XYGrRQ3667JW1I8dsakLf1Cy8hl1aBmfIqZ0Vf17Gq/vzRvy0vHqBfjr80r5QTA668vKDgm8CZpQ/WdwnSbIzXVDTIp95QDbMrdq+qLJby1XJhgDO3N60GjgLDIDyDPtRoLSzx7gJWqjdx+7k62INrPsVvk8O1nJm3pFxlbeP8RWksElybQ7d3s1kczptjeJ7b33dH2/knbGWwb8wlcR/TVoAj3RswuwnPtpNdf+0L3S2/5mXFpA5Xk46CpLS5494JhpDA9kx7lbEU6MgBHUrwtDgPNrpU59asLav0Gs2sZC1DRzJ2gpsaomSYoiN7zNIsCPMIq1PEtFvXG1bZ3vE2mW1pP56O3D7DtjL9MwDX4Mf/t6Ygtrvb94t0xn8DXf8S2+Brf/0oM294ttneHbT9hvP4j9lre/uUn4IrvfvQrf0i9Gb6KhUOGLQYMdvvrlxSfPdnNA5i+Fj70iW4rOM1QRgpl8kOoY+sKHbGx8Rj/j4Pf1HL3htJiA2y+lrbu3ivX6HL0RReNUvXGmk+yfewzj3+RBAH+AHv4f3z09vcRZP8zytYcfXu/vP3DyduYmU8lPP6pmHtjZn4x+fFP3QOvH5e2+P6XrI9/mmyT2Va8/uqnY2Lu/dRT7PWj+FreWo3X9Hhsa8Et+gv3fnLmhKE/IqfM1F5f27ICb/dZg4+BCltdTx1Of21BwUkNRnsweOHK1es3btwk7caVd9pWISdLdbscKJyklSvX1havbmFHaGvpHrtw4eQrSxZRW5OHczUXRPKh5PT++T33fBJOMebee77wV9YvfJJv742558FktrXy13/1hd+D/z8I/5e2MU980cy2CV/4PdyPvf/w0wli+ymyNYe9nmk2wzZm9mPfHPmzJ2f/Cd0+OXv2k3/Gtl/D9/8U3//al2d/mfyfbL+Gr/+EbP909mz2+ssR2z81Xv8Z7AfHe/jPhr/2ZbIlr+HZ7D958hkjJCIlYFIMnfb68paB7W+T3H6QB2UBXh/YmV747KVr8pKZ64EDa9KTkuIc5etXrkwFxrzS46kwjEyL792LF99cJiffvHGJp+XS/AxjkHzjyS//OZzmk0/+8cg3nyDbb4488eQTs5/802+O/DHbPvHk19l29pf59i/YdvZjg9984ht8+8TsL9P3n5z9x98chvdxO/LEl9mWvf6zJ8XrmK8rmqahIrgAW0XV1Ish3KraRXwdou/jqZItmNgLfH8VX2ugR9j/VfZ/VdqPv4Yd8bhqkB4fXqtaCP4VEPojDDkwitUxn790SYvf55MEQ8LLVDGBS5/nv3L15i25XXp9VQqYlvjY2FiQzfr15eu3NXs2rKbWyQtwuTK6OiInKi+s0oCi8lwRNtNJZlbpBdMt/A2Re3mENJW+DpEtDie2pa/hItjrAN0vyI/D/g+G1NgG6RZ67IJKPvf1mGeETyDCu1IX8X+FjOQvNuUkqsFxoxC2rJV9SDgbSph1lXV62MSIWHMEn+r11i+pDRMMNzWUBbQV57WEy+XW2Np0nMSMjYW/CxbE2twr129bv5bKsq2l98KVky+Ei2XOojev8IwZjt0w9SouWbwVNtMqLtFg38Zkgrx4Iaga74uVCPxzIZ69I7/1TMwzYesWDKdLjBtxOpEjS6KYYtWWCHOIbxf/F5dozPMHJaPLZ7JYiEY73eZbnudnU2SGpUGsMN1UWlB8NXyFWUY8FUws3eCsWaqrYDkYmRbvOxcv7pbLBM55dt6yN8auXeOp7LxzwtVrBKNX+UI1MfPKr0kJG5fi/aA0EsMdL9Y/qtxXAVbhA4/7DGJGOjE5widFTbi2kUeWqMgrjfqIBC7ez+wtWTDGSiUZNAx5sOt5v4/oMm8EaNCrofYctstPhiEmg8kllm1wutkWn7K81tt9/srES1yNPTt3Ud6WN88oF8+cPdYb5MnU8tUayJHP1ohEG4OSjUdDK0ipJpLdMpY2qHJH8YPIZVrYNzHM8L0lGBvv8HkTxRCRKu0hrkVCnKGsJmXBqkZ8SpEXKRmHpCg75mtZIlwQn09yRhAspW0s1nzdEMyFwnhDMHyqOXZBXOLy7rHAW0SNzV205KXdb41fuKCcB6H485a0eE/TSxQdbjBDGdA8t5rZHgMGRsJ1+LUzSEhahO+hhvU3nw+S7t/CuothxlD4UvQoHAy8bpKQjfgGqWyyELr8aen/hsMgzSEaQuSHDKL5z1vO0zB8fq+3BbMy/H4aMWMmvbZg+TEul5tXX7bZ4iVNBoKZT9IA4o69QooDLXvlrZOnTx7b3dKypa2tpQ2Ps6TU332eXbIRB4iMBshKyhiLQoQSm5M0i4EQQ30Lq6REqPWg0R/CZDHMKEZnyasfxRlH113yeJcYjbyfbFMN/cogrISbfeM1mH9f/ZJ6Esf0e1tqS1cXw6O0tr7FR2ObwAIw+lxcXHyBryc7kJGSRK0/PBbQ3AzSMrZgtabVb/bubmup31C7obYUPk04n78WQaPQ2BvXO8bpGkOS9VDIGEgCWWGA57opKCNEMdQVmf8xbKqYD5LQJvqcYSaSN3E1qIR/R4iv/pK0s0QeZEzJhl70uMhbNsyhTDqMI4x5qfmH3q9dXQwiqW+pr6+tLcawpJ+YGGQBsMmrpSTgxvvrPC4Cmdh4BxXMfC6ZZUDBzmxp2dzm83d3d4PpaiOBZzz8slKfn/e96GLjdCXgGwo9pBhXaahAeVgHI3og3DZFXLPc+eKzSlBgRlZHYQzNGD3S7StVwTQN9sKviItWWEZZhzJ9G5RVMTskt1/U+/fXo/n3e2uLS+tbvLRL/d62FnQ0UTalNOxcWpxXTwqaX9tTVW6LBUOzIGllvCQY+BvbO2/O3N1nfcfOjp0PKsHzY8d6fd761avx+Bw0AqxT2Vq5m4PSYh7ZQgbDrl1+X8TkxAjlFy32MrJTghGYkcVhKDTp5PgZ8RHEv8QwmwaKjKEmtoYV4ycWTs4N+wW/Y35fXp6fGJR6r6+b9Cl06eleUG0kqOnHaTMvmU3Lq0WFdmlnhS0uyRYb6yq3EcO/YD5XafMLT85dPW/iimq0syCb2gLUlgAaZmkEaKLb2ggVLqltwb6ifkIVmkJCIceKbF9Fyj37rIyZSMkbCJqMKuk/HDG08lHIOJrQrYYy5aMkKBkpQ7Dik8eIlcGJ+zZf71mpS88fwwTzUujSltUFKKGW0oK84pM3br6/Mi4+yWGLW7neAU4MdWWQDKDlWfDaGy/lzbsiXGRwltSzfl89iAZA4207K13fZFtrCMywmRL5ketFG7YzfBVbWK9xL0YN/5wEDfonDDNsEAfl3cKtgDzCZY0sOlY2kOJYzBcT+lR4ROK5OFPy57zfX7wcBFMAxuCsyrw4Zu+unG5rWV3KHE4imuKC5fXvFMbbbA6bzbPNFbvAkUrsjcOGCc62+HhbrP+tN+aOXQwZJwoy7vbW57X4vUtqfb3GOcvUNVyhcZspgYcPLEkA4RZBHC8MReHqT3zO6B6Vs2YDM4rQnZEIMp4zhJDXwo5TxOB/jRlGab4jxOsj8X4JSl9kGD/RDWe9LQCZLQX14CHyjGV6LKxdEvCCaPw4P1PcgpQaHM+CWBRCkqNq28r4OMdKG4IlzuXCSRoQlyPjtbEzozfO82HOvrcXjFhLd+kyr29MpIhy2xg2NMNtptHzVA8p3DFTg8J2isqFHAGRdkcSr2FowrVHOGY4SNlYCB/pqqYbTdNC3MIIEs85oOE9GrqVcY7wgTnpmCodz70+6C8v2JPuoOz94ecwUHbB24KkGUzN6jZC31ZhfowjPbXqSLnNllrustlwXsa9MsXhSHHYklw525dsuXXrynnZ91MQNaWl4NPUe4+pGHGlTWXXJUavpOgjLU6k1ydjLXzgRdgdBgVx/2+xq0TZo2JGds2ZQKHfAiMn+rramxobm9q7+k6MBKBTeXalbAklOxKF4RjXGdTIMQcOd7Y30mMOjtJjgv1fXuovLSWIYaaJfuY8dfkDbfXFwKzQ1AAL8K9LTEqMz3C4yo+sdyS5mj2Ak/j4xPiVHsAMICnb5alqw9udieHARsmYrwW4d16xrzukq4HxkZGR4ZHRcbxWnYc9pEimFBajP3QU4XMSTlJFTRyV21Qp2iEKggjDFaKWM6TypyH6hJOFqTEjtE5I07XR/qZ8e4LZkmBNTrYnW+GZxV7U1D8O/5I+LeM5nO2JQcEvjx/TQo5pT05OgGcWZ0n7wLh+2guUuaWgxTdmjE8yXM7zOkzvwGgnpgZYgLcwMTUl0eFylb/d7Eh1Na93pDuSADSJ7nLYJtlSXNmeincIsw4qvEAXHSvv+mpLkQPs/ceiLHtCggVaQrIzv6Zj4ByIh4f5Ip15oeIZAERPcXsermm4MIQup11LNHyIiyPE3lANbhsNM0pYlFXXRjrzLRZrbl1n/9DI+EQgMDE+MtzfWZObYE4o6hrVdH7ykkHitFp+XzpzXTvXlZ9gSsBjDvNjDvZ31GRZzNayN32ly32ra73vcqiEeEkNHvS/QUa7z1eft3qzO8WVnujIdpe/vW1ltqt8V2pKqsMFxj/OVZVqSwQrk+7OLt9OZtcuSREhMnL2thS3tC2p3/u9rJK69q4eaB1NNflOizkht+mEIqkEmfaSH20wsx8uvLIG1GB/5pCmBvJbNRmRXA7ki7QhsncN2TsL9y7LynRmQoM/zqxM+pz8HdHYUIyKGYOnhPRgX5HFnNU6MK4RS6AROWv4Qh0faMw0WyoHVD0kujDIPXx+/ZOzIEF19JdYzJlNYcfU6DFH++uy/t6/fDV0GfoZfAiRcwoaMf+xtlokAd7aNekp7qWJ6Skrq94+WO7xuCsOpjoc6a4kG+i39bCx2VIc7pVVGy+xEloS8dL08R97S2tBnfm7VdncBUb72/MTzM7GYU0XQgw3kYo+YOrR1VBmVkjVe0yD0NfWMt1QRaphU8lMGd07i+49oIcCdntNJW9llcbTmlGuhG7DzaBH9UCX0+RsmjaLngAAIABJREFUHVYR29h7krHGmTtdHWy0m3L7VF1IVLLWBr4NswjHVHqyTPamIUXXqb6Fw2g6nScljOCsD6wydPy7msFgqb425slu+OvRh/e9nJHiWpGyNMNd9fbb6ysqKjxV21zpqeluFElGgzuFcOnsivLqU3TKMyjGsqaPNFozvfWr/bWEndERR1ULWrvRwzB6ivqpbFTO2QXytQHzYTj/3FxMsjEPaqFAcqXO9NgkmxrU5b2JHO2Vl3VdYw/6Q58JfnA7bqaFetKez+8L4O4gG00ZHerv6ers7OzpHxoN6ERamj7Rk2nKHYD/ht0jRlbMssXRAPumzB44Zgg/DB8bHxkaPDEwNDw6odJDHvPWLmtbXe8boDbMELg8TXa6BTM1thauyFmauKIwu2Lne9sqqsorKpo9rmxXBpFMarPbAerMYXOUe147cJOChtlBkEudBeDe3VLc1rJks++0rioT4+OgVwlbVKkhbLeb8gc0TbKiAvm0r0O5uZqi91hO6NjXuhSrUuTPqNoJcw/ZGxRGj1nsHa0JshHdzqDsQ/pgLnS5qhOxTAy0l6ShjQRDCRtzgrOofWCCXAOAIM1UOarzCxC2RfID2J+QPlJich5W6aWD6moqcVrR9pvR9mZVdgxMaHq3r7igpdj7fWvNuB7WIfLU8oW20lrQZuvXlS5dscGzbuORI1XlVVUVm6pc2W6Xy4OmP71hZToIyOFIKq94bf8VGpGmF64H2i2WuhFd7/XCEFhWu/fHZblOrGtmtWfm13UOEGYDZxjoSjOVjejGwBLXJDCjEczQvpbdTBH4IGN8kO0d4ggDzGhRm9CbU9gZzKRoNdtJH8IJ9lcmmxMyazr6BoFXjo4MD/Z1VGYlmJMr+xFQcKGtlsV9usY5Dzc14QwlqGhal8XaEdBRx2vD7bloaSubuvr6Bwb6D3c2ljjR/vf4vctLW1Z7e1vN5Jj8TM/LBTJvXQVaBZLZurFw1WZP9daNR7ahYBqaXdkV7gwXgAXapgrYJDlSbe5q//b36ceCZHwMOE2VI9j577aU1vsL8vZ+P7OoprG9o721rgz5YkJRB2hwcmUdloQuTZNGF2WLBmagry1MmxmuixJuYmFvhhmVYcZpL8qP+kAGQPpxKjujj+aaYMyGUB+32k32mv5RlZpr0oix7quxm9LaR6H3NH0o11QX1LkuY0c0fALSufpEmSl/BPWeHjic/7wlFygyM73EgIG67Gu0/213y5It9aVt717GYyoat3rBa7Jkbvi3lHq9Wzdv3V69qnz7xqqdzVVVVQ07PWBTHK4M8DFBj60vzwbIJLpsjuoDB/YTxN3AAaw2mZyopGDY/TNQgO7S5S17x4QJVQMj/U3AEXN7JohsAOVFoBAkNU3socCMYmBGyC8MPEg2ToRbJZRMfvQ2ytPnp7Az+oDVepj04Sjo4zKAhk4zkVg/EgKu64G+IrO1CZQOXGSjKXecURmDCEjREEUfdpo6SIegksjsGIGDESeNwZia3gv/7Ktf4gVAnL6gK014TG6ywvJkbnZvLm7b2raxbV1FdfWGVeXNDVUNDTur3BUNnkS325PiSIxPLK9ypwM1S3Uklvce2H6FcQAcc3UB1AVa/3e/sxfIGXhPvjGNeRf0ItWRjixTcitekA5At5/QwzyJyZhRCQMwiJ8gAUT5gTajmAlRzNxOm3GGHt3OwMczR7C/lXarpW6YmURdGR8e6O8D5TM8rmqUF2hDlabFXSEcXIctaSN6mGD4sgtmM62L+y+TDnGa8vsVImocoxOj4H2PjFP/HxQMEAB/ba33rA5QhGMOM94XXoj5Zm99KQrGs6K8YoUbNFlDQ8OuBrenqtkR7/F4MD5jK2/wuBIdDocr3r3nn7cxdaYP2smY0/TBfFPaP3pBmwEV9J2+DH0SIJyNnAUMvoESk7VTgQ7VB9MsPTonIjQeGGlnQowBcCNjDFGCsEmYuQ0DYComKmb0TlP+hI4cIBMNIDGGweHOykziqFvQb8+s7BpBTQy/cIX5RIwDixcP66qhavn4Ik/1fiI4VR8tM2UCGQ3hR8cH2svA+0ZiYbXn1nQNATZ7fcV5/tpS749RkemDixcPEnGfD1Nmt250b17btnHzqhXl6zJy1rs9DQ1Vu5o92SCgOFu2GxhAXFyiB96wOVJTXIkZ29/ZQ9nZjQFL2hAiYaLOZO9SiJ0hFKCmKMtptztzyxp78Cxw1GiDRaasQTzn8VxTpy5YM2Fb0TBjsFAuIuZmC8xI3OyyHrVxWh4NMyiYMgU0mdZhtvfT3h9uBZ/SWdbaMzA4NDw40NNelmaxZHWM0P92oeqDJ0P2xcO6sDRGNABR2G/JHMXx17/Y0qEQXjFxuMwKHK+krgO87672miIwvc66gW5vXnF3bSn45USQI/bFQ4SOXg+TzHX/uuKtm7NXlFdn5DS7s7c2V+3YWeUor2p2xyW5PJ5EkIzN3QzgcbhsrpT06mPvbCOk+9+sTmSRlwfSnm8EOwKsucXnW1669/v23LKaurrKkqxki9le2TdBr+yw3dQOGkZTSlA0wrMBm3lbOxNGz1TJnxHczOmsqampjPKDnibpviiYAV+oDM5FD5SZKieIoh0osViKukYCOuMAuA0MY8ymcohayVxTqwYfGbKm8SMrYdQZVFkmWIyQ1m7KGiK6ZKQp2ZRW1z+qSL73cE9ZgvXv9y4r9QNrfsNq7cdvB9Gc0yLNzK2xjQVrXs5Ir65akb7Nk7FxV0PzrgaHu6FqE7AxT9XKRFt8XKK7ucKTkuS2ZWSkrD1wZucH+Lnf/GAUU347gQNg7HRv/eo2nz+v2NsdoJelqRNDPcBs7I0j5MrGK01FEyAatQS9eBENnIKbSXRHEbELEjGYxM2szqiNRmfwg5MxA0fJB12qAYI7CAcYKjHZ20c06vermuGta8ONVnPNKLFHNaYaVQvqJyy5Ssigy2zCS9VG7GmjIBgVdgsgcsYbLeaygQAGddUw33v8sM+7BFR/8ebukSxTF4pmyJo5oUm3lSFmZmf98hWupVXVq9Kb16ds3Fmxft+OlUnNVc2eeJuromqlDSRjc4FkHCnuRFBnOXvO7D9KjnAF7XydqWwCT/ssUg2fv3Q5mW9gEV84iwCMRXPNCKH3nSYwuXAh+ab+y0Y0MKo/o/C4oBFIYREDYWdCws5onCMoQrEIOeDLSZjRRhc7x2GQjGda+rBflFZwQQi2sePUifHRc+PcW9f00SaLtQsT0/VWBBrirUZngVVBUNRQIMs6hIIpM7WisLWexeaaYTIfg8cMgPc9QSYa4JBje3HWzAd+5PugQjqw//rNZVpYuX+QzIE1iUtXVGwqzGhen+TZ40kFXWarAlvjSrS5QTKJiYAZF2izDJs7KSUjZemmYwd2XqUejaaUEYSHtIFXvSQFBySzNyQHnuDFSJOFqN3g5X6rHWSkTTgXj+iC0ES1M1yLG76cETGYxM1IvEs8xI+IWUZiJqTmW4bxPDLNAzi4h4lbQ3RuYBDcSwyWJ9jBWx8MUGYwkm8qQT2lt5tqcLdGE6MxEpPRa0x9SLTLiLJGtyZ3kDnZg52VuWnJYP+d+XU9yCnex6iZHyhAW6+uVlLRdMAmXDJX68vTl1ZUr8vZ1Jzk2uixVeyrSl3ZDCotKd7mqVifY4tPjLWlN5RXZMe5MhJz0lPK97zTHMBPXgup1Gbogbrv7K4vJitxlnl9A51NdZU1de09QxNIOzF+U2nKha5QLg9agbugqs41bvYQaWdIX5P1pvJEgYgYDE7mZpejUwAxVReJGehglK6STwXTbyV+OPCUgTq7yWIvqmlqb28ixtreOKgRr6DT7EQbDahpxU9mWakba8xj6H2mRviPVof9HLw8lPZ8O8YWgPvU2YFXkGM2VuYnWyy5HePv+0g+E0b5wccoM+HI1Eosg+HUrHvF0vLCdZ41zc1JqYWeJNeuTa5U4M37qoEsV1Q0ZyfGxccmOhqqyt1xqRmJYGhWbT+wnaiz61oNFcxIruX7ezEPx0skY4UBZ7fDOZitJXRqQ9P7FlsO6yFFH7SAkQyCPmjSuSGJjhluX6Tr5xGDCG7mdLa3NkV5tI6rbA4nAjPaMGgO0ol4JDiXrFHqk+WbEsp6yDwmN9YYikVPGrj1YiuKUatEZGhDlhJNVSXQaOP2TGDAehfKB1iRdTHGPzVtAI5ZeVg65lBnrsX8w73o+PmQN3cDD8m1DMJwHV2cJYczb55ZtXzpmoZVOc3bHOnZhY6k9TuzXeXrGxoOemLjHRVA0Gxx4NCkr6+qcC9wuBJTchJXbO/deQCPcaMdB1DwMpz09/fWFpPs3PolbT7w0XCa6NxgT40TpzaISzyab2qn+rQInbcy7FR6YXo0OyO5/fyHxg2FnTG4WYI1OcrDmjzM7o0YaWe0fOuoRkcHdHmXqSiAimq4yGTvHKUharIuhoZiO+wk3AfM1onRVg2syTkNsdOvi3wDJCZ1JuzdQXORhoIxO+lnyuCY45HHHK75zl6aAwig8b17QR+1p02gwnju55IvE8A45qqN1du2ZThcblcSRpjLgZjt2plqi3NUVW3LtsUlxdpSGta7kxYmuhemFKYsrd6zZyeqs18/X0nHR9qP97YUkOUeJOtwTKfTRDBGlME6q6kE+b8G+rQJz7YLxQkmOEtl93aIys3k0FpYHoDhz3BuZi9TJqI2lU9zhWMG9E4ndOKIFWCHSqiIuDU0DMmC4WL6Ei4i0G6xolXRR51o4fVhC3S+NmF3ktwzps20IXMdvBtw2sdB5oNW5zhBo9US/ZhnfAQzOJXc4jsLdNtUiSYq6yeGYK761xYsX7Om8OC2jIzU1GzHyk1VKeVuF0CmwYZTmUQywAAc6xtcSQsXuhcudGWkFO55vfmdG7du/SIzoAXRdPzzXprnQTBDZ7Z5IFLTx9utlnaVag/U0XqlaQAusIuwRdwpetyMWuowM0P6WR+IEgPQJAJgPLhgQmGYCSmZTiTMRRa0eIPAgEHrACEuGrmsCnc+KML8IDyw/3Xo+wArBkIHDBMEBYjr0g1lq5UADBW9CZAEoy5tMWHPjSS0KYYEP6aCGU31bNlMaWkbiOYyflDR+w3JXPNvrl2+Zq1nZ3OOy5XqSndvrMrwlNuqmncd8cShZBp2ulEy8bZyT0ZK3EJ3/PwkV0pOc3fzAaARv8IeHkm2v7m3DdPWaGWBJSSzySBWIIrRSlM+nKoGZqkHGZEdJKqqmfYJ4q9NwkxkDMCw/3g4MT8jcTPj6sMflHmHwjGjHwaDi8DpuKwgS0SnLJCPFJOfsxhWLFSpq02mkkCIOEHI+rIWowVz2gMhzpu1QbSbACcy9IvQbCBJa5SmQYOqccwLOKPZQlfMoGjeVZXMNOiT878QguneUFqwYW3Frm1EMBnZmza7Xc0OV3PDkX3ZtvjY7KqGg+4UkIzNVrEyJSVxoTtpfqJr4dL1oM7GyYyzNpH7nVf3biZJa3RV7rI2gRnmxQNuejBmBwYyH845qPeDxQli1+gkkyLSzlAebEzCBkUKG9EbUbiZPM8m/w0yFzUMM2oWQibgzEQ41JjQrAfyn+/hg1uOo/IeDemdixtR9XWl9cNJDqT14KkuHuCebFCvBMggcBCGnUiLQoQMa0Exr6rIJ0TmmukyGW/p6hZf99gAWmHuz9wY83lLl9a+XLF/WyEIBpRZ9cZCx3qPrWrHjiMNDkdcnKeh6qAbk8/jU9yeRJCMyzV/oTtuoWf79v2gzq5ryvkff3+vt5YswWGL2JZ5/ee5HmEDhsTsrNCJYF1QHwA/BM6pZlnHNUVENKP4M4p8GB43nszNEDPCEoX95T0iYwZ0ehdRRn2oPgiTAr7VoxvBYx5HNaZyYHBNjCto5IJ4+1j8C+8GAvybtBFLnU6Ac1mF50XI5RqJl2Jgns2E0kOOealkfCStvLje6+/9Hrq+yKtuXhvrbmspLd6wZt3BbYU5gBhXRvnGdY7yZptnB0CmypYUH1cB9iYHMQOupmdhYuLC9JUL57uS5qdXrGp+7Z0LZ3txUQEtLsQWsTHJqLxKFB+C+nDnAA74kb5RuL5R+BvUhg+PUk8gmp2ZrMfYqJ/MzeyVRoBRzoxURT/LmIHhDV0QdCIBCWbZQYeAd9N+eRLUeLYrC73wkr68hwmE+eye3mEeggFXhkfWKsF+BUFl1k2ax1FFn4z525bV8goxQANK6717//7NY++evXD+dK+vraW2uLTNj4JxZ6c6HBnl1S87XNtcqTt27Dqyz53kiIuvAslkO8DgxC5M9SxcmLgw0bNwgSN9/sLynKp1a+rb2lrqa4vp8hm28tO/mkRnpFAJ00U0m06hWRoh8ldjHRqJGR43E8EPmZtFiZsRzChhQpRDOkpYvpk6bq0ByPQzK36YMN0yjcnAiOhTARm5T0IKinRlorszczFsZmmkwEESQIhf2DFVo09w5Sxbn0nr/tUWr65taWvzeVtaWjbXlxaXbmjb/PLBnW5AjMOR6nGvyU5qXg+6rPnIkR02zGJuaGgGOxMbHx+70FEBglmIFCAxe+EC96rCquUFpauLUdpG5Uf4kuI8f7dIj1D5KZELD/AhGOJzx6Gp/ZmgyAQMGvmY4dwsJNmZIJ+aj0AP/ZiEGRjMwIK0EqQfABw4hRAYdO5v8A434qhG8M04BXFlTFJAmcGy6K3mYQIctDhllmFNWHx2REX0iRrs9uUVG93m9+ECseLS0lKyJLC2ZcOG0rUHdxa63CAYx8rClPTE8m2p7h07drwNygwTMhoakAHE2uIXLEysSgFtNt+duGChO3FhUlV1w5rSDWShFC/4TDfLS729atgFBQVNYt1scHslIndGtjNRM4bUYNQ5TU3OtOFfLFEICTN6ZXIAhjTaBQGcHu7zsvkGMRAMUUlqLhh+ZSTYQ+TgzA/hrd0QOCfMrbrK1QU/pvRJpddbnBe2khmFU18LbXOLz7umoAAQswoFk5rkdielJDq2eRwNO3YcfHuHB5dkOJoxFIDTMyCZ8nQQzfxs1/z5qSkLFpav21C/wecXxZ542WfvslrfMW6vhUZR+OqQoLHolfa1ok72Z0Jifsbw/A31FH1O0/A/RBhTfC7MzoBfSoJDQMkYcNLQ4vBPG1iXRoShyETQW+JwcEr5mUhyzF0COEXJE1qY8pOOSE7tmK90eVgRAGRPPj80X0vt8qUFa/bs9OS4XfEOm9udGJcYh+Z/F0DmYLMrFQSSvaOh4uAq24J4x4KFcVXpSM4cK+cDb56/MBvMzObIQ2Oh9CX1bPF5MOxkBFAkZHPpReVmVAlKaoSP0ym4maw5JJNAx4GBGdp/WhlY/tBoAgIHvZuIzCQGZkHNJL9KWHFp/aU2Tg7UjoSTAmfI3C7Peko6lh8I883bInoPgeMFrbZ0+dINe47ud3tSgXulrkyKW7ggdZvb0bxrx5EPdjU4PDZHvHtHxcqDoL/ikhYsXFiegZJJ9MQtjAVDk1hV0OYXRVJ9HDskBHCW+yLhI435I4b257fJjR43Uw23OaygRrR8M13lrCmoCuJknIAUN9O7LEMMZiATBE4+CElov6AQBLcywbC0WFk24l04fwxy5oODBCeHFqfRck4TWBPOjOD/sOUOjVxrBuACPLdg+fJVG/Ycf2//Jlc8qK2VKfFxC+Kay+Mrdu3Yte+DIzs8DleVw92Q7T5YYYuNc6BkXEjOFq4EQ5OdsnBBRU5BLbEyYWLnpDmMIkk6QgnPzVb4lU3mZoYmMdZPkcMZOZoGN+PzM3zikM3TiBOQMFOTPIGR4i7gZJXwNHTO0mQMb5FlqYboAcKCPSqvK8Exw8Svd6KZGbcicDrwacBeokkjKnydIx09Y34v0mZpZKMaA0ZVULBmzZqt+4/u31SdHR/vXpmeCJDxNDti3Tt27dqx7719u6ocVR63x+U6ApJBbTbf7UbWPN+TOn9+EggpozyvAIhZW1hFDi+hZsFIwbCqGXxUGsONdt7U+WaSNhDxsyhxs6kimgp3GI16AKF8jjVQPCUEpOQmVzJfgBcB8sA7Jgfk3wCOk8AE7jSBlbEUfCMI0g6gmcHIU4kzoFGOwrNqRHZNGOqAnBXkScPaj2oMOrR2zdo1qzZu33Nw+6YUd0ZSuSMxLm6+bZs7Nt4Dgtm14+234Y/b5nDbso9UxMfZHAsWzMcgAEYB3KDKED7Va2pXFyDDE7LB32Wl/mOKFnUey8hnIYNU11AoujoVNxMrnAVVolc4eU7zI2YBZMxQ1ac3JYxr2kgC8CfEkCbUP3VlR532KVpa1qimDdt79JCSWwdn2+EcxUnLfLB5Gj3ztDIGnLDFT3LQiGkCzDgX95fxtdWiXGpbNm9Yu2pV9dat+3fuWbkqI6ccb/e3MHb9+rg4RzkIZteufe/hpsLmAsl4gAGkxs5f6CpfsXbtmpT08tiFCwtBrXk21jM5bxHUGQjAZu9pbaSdto729rBn8PcwGvwmuJ7RRrgQtadLnZwHEJLyACRtwEzuZMxMMXPW1DquMbkKzGijKA6tzAnO7gBOgamZ+ZoaYUfGG+umaCXmAU0jrqpGRkYXrkWAoVEGurE1AaR2ztJO+IUob6Iyd1U1tBlVaGd9m5fQMlmoxqAfS+tbfBs2rFtTsXHrpj07DzVv376uvHBVRUrcgpXbHLE2RwUKZgdKZseOXW6HbeXbnhRbXGrswsSM9Wte27x2aVK1K8ezKSdxYUrVZnZQ7m2SEide35jeb0mwkgfb4N0B6UuzfQLdiH5dGzWjq1xkDUzBzbgm4/6PGH9R8s1qppxtZkxQYAbcjS78cD4CDrgA0KpGYWYU7vNPhffLoxaMVWYVwYlW2gM4C9gPBnHcCsegb5yw4KjJLNGYzReUgrM5seyOLtPkcimurff6vRteXrehauv27Yf2H9q/59Sh/dXVG9c6Fjq2rQRLb6vYUdXcsGvfEcRMQ6rD5nnbbctwuFNSUlZsKnzt5XWF7m3lhfCBFUsT16wjAm/bAn5rKVVqZKFmkKSJRG0K4lwbweuD/kQSk4CzGtHsjMgDMPw9anOjx82iTc8Ya/cNzJxAGqWQQd4OBAok1akr4cZZiZ7wiV9NZKCVZGLAMoEwCbQtowQoReAW6X2YWDCRXMeyUMNWosleHjzvxkAWVssoLaa917KhZfM6Kpj9Hxx47/ip/Vv3VK9KsTU3x8XabKnrG1yeivU7DoKd2VXucDg8b7vi09M96SCZ9S+/XFhdnVPlzlj18v53VoFktvg52SstBYOD3gz6mXAJUzwuD8AgUyeAxYTU3HyNUZkp4mYG+Q/zUaLHzcAaT/7htsqwMwBn0Eek6/TGZDA2RFKMiVDNGSA5YdEvQCFWiqCjI4HIFTiewCFmAeDIQ0nJAe9wCsMKbain2+qXbMHQJcIF+3FNfduadRu37zywZ/+hDz48Be3DPesSE9fvSl0Qb7O5d2Ht/+zmfaDTQJk5XBVvu+IcKJmlGZvWvVxYmJNSWLVi7cZTY91LN6+rFQXsiHBqW1CZnSWrt6dQByMwyEAvV2psjPWQGO3t8wCkYImqqFHiZrfPBMTxKjAD+meADg2w/ahZB4g+EhQKvyE0mp+VO0VLgDPX64A0AFMeYeinyCEqjL9rzHYyQxPBVvFnzOddsqyUs1ssgbm2dsXm5u2Hjm4/8N6HH5764MMPP9yfEec+WA66zGFzV+FEjWMbCmaXw0Ulk+HwZCxNSamuXrvKk7Mip7lw4/4zB45u2tiwhpfmJN5rS23tkjysPBM61zNFO9yBl6KiogYrDB3Vh2Zl6hiAYigZHkFQonAzzJ6d3DB7NigyARlm+izwCWoYauyBEMGQwewJOLXxspKykmitrMRaRiXD0DGS0KEHdSKZYGYJsrKEEYokER8SqlKMLx5+7q5d9sJmn3EHAL93+Zo28GSOH9j5wYcf/PLDX354qjo9Y39zfGySw5aK98pwOdzbADP7diRlO1zl76XGudLd6UtTEj3Vq9ILCzMymjftefv4gaOv+bduLm6R3Ew/Vp/DSg1g4i1TtAQhGb0yDXRCH6qj6HEzopblKAJnAFHiZlNmnLORGhUzpIMHcOI+KEJhLFCgTfVwlnGRRscMkQzBjBxXEr52WCz82JbNS4yJLei/LQVrNu85euSdA6cOnfrlB6c+PLW/cMW2g+7YuCQbgMThyHbZXLsOgmSaQUjZIJl4kEwGEGt3dUaSuyInfduRI4f+7p1Tbd2v7i4tNQIMmDnLqpsERqZqAxK5ccL14RC+ozwAfjlK1LUAt1unqcrzMzAIBjTBPsaRTPXp3BekNu3C1BRAox+EM0cLGWFnyEUJJElVAfnMbGQI/Pxe4mwa0eDSWu/L7xw/euCdDz84dfzA+x+cqs4p3FadiCUy3I6kOJCGzXFwH7QGW7bLXfWeKz473b0CJJOxPiXJVV2YUX1wz4FXXz/6ctv3dpPyG0bcDNxMUkMlFH2hkaZdpsPJWcJ9isPmwansjOyUS9soawFut06T+kIGZk6QfERnmTG+O0W4gQcwQ8b66PCHPkG8oXy0kI3J4L4MIkkmkmB2E69HI3EaLhcR0FVlIkD+HqOJmjwK0FLc8vft7x47/voZsP/7j35w6kBh4apmh82RbnOnuoADuFzxK4/s27frYJUjOzu7HLgZCChnRUpK0vr0pIxqzwrP8a1bX3710MbeohfbiqUi0LT0HPnaKRnAEFAh6MoaDR3nEB1jU3CzoJwHYBibqOs0p1gNSBhAMAwzZHxrufmiF4GmiSi1yu0MGBr8mdSKmEXBOWXqzwACQ+MJTYSxkfgEUj0UvJiBEsRfDbc3KinWWMxHttePq2k69dNHf3zgg1P7D5w69cFazyrPpvikdEeKKyPblgGSASdm3659+zwut8dDJJPuzslYmphUnZ2SUb1uXeGRjVtfff3U3j2VmRvWlPJbN/jwa0i5RjjVgSnaYDt0PPjhTRz9OG6jx80m5QEATokaAAAgAElEQVRwYxNtnSaul81nf8QWV9AyX0hgJjRq9CLxCkNZ+Zo8p6NgdCY3KzcLfyJbrt0CVpA4pzCwNOqsqtT9wogPTjh3kOCZIuqvhpSQmLLmwufauddXK4GmtHbvd3r0C++++MO39+85furD7YXrMprdtqT01Jx0l9vl8biykxreBsHsc2d7KirK305NRMksTU9JrHan51Rv2li4f/9+kMyevT9MaFkj1BlmmrV4ya1SgAGYLeZoPyZL8iizmBNEZddZJ6aOm0XkAbDL+S3WafLVAMb8DIv/tyaMciHhGYSkeUys1U8LTURxxxqt4yx0yeNvSP9UIiVpeqHdMsqLufCZQ4URGgEf/Pu+z4ugYSO7tN5nH9THjma+uKf50PEP3ylcV1hdnpSU4cgoRMRUVXkqHDtBMrv2AWIaqqqOuGzZGe7CFRnpiesLM3Kqd75cuPPInldff3f/3r9L/v6G5eLGT/5lxX7/eZoEceLEwOAA/tK/J/jzwVw0Lugo8wgTjq6o+WbheQCS2v4t1mnyTjEww4wEcdVVhAvotAFdMYo0MwGqov6T1EIkyEZEwMBR5sQq6tT1JBehFTnZSJs8CWIQc25/FLwpwBZ2O5OW1S1/7zx3/vjw916r3nno1IfrctZVN+fEp6aDo1JY4QE6lur2HDkCmNnhqapobm7YBZJJdxeuWpGTWL113ap1O9eu3XRk/+uvHt2/58eWFzfzhCZqZY7xeHB00qmrYqRRjUz48xRxs7A8AEWYgqj5ZlOxZh4RkeZnECNgbToIXMZRtTbqUvoA6ceprOQwTovhfCiqBfSDnJhejjxthOloMrGpTZDzDxr6mNNx/g28KhNYmrzlDDQtxW3fzz9/9Pw7aws37TnyIZj/dTurM6DlrMopbGioaq4Cz/8IUjMMoO3AyQAHkcyqNbEucGYqdr768sYjh/a8emD//l7797AKENVlXiBmPkahpuJml5kIsthsE4snTr1O00CMGIDR1mmmgVc5+YEVgUhSuLx+hn0BmZrBeCQmAwQ0xdD/oHKmijU35VuHtdDE4koW8Auds7TqNOTTz0YWndbTa6zjmhpuIjm9lOSloKXZvKSWlTQv9n6/7vj777+WUbhp/wcfbKoo3LkzB/zHVdD3nqqq5n37Du7aQZTZDpALCGhXRTaRzNq1GTmbNm7cuP31V5vfOw60+dDRd79DSgBQyJQu8dIEAPjeieHo7RzmmGpkFpHMxBOTMXnNWShaHoDQDJPXAjitmc6ojxGNzZwamAEjh9PBZDpzwlpJ8pv7xHpe8p2hKednTESeZPIgK1fjoWZusZrQuuB0JksDDaqGW2lEZTllowThvN+/egklZ4iZV999f09hSvXGtz/cs/PlTQfX5awiglm3rgIls2/XkfdwJgAbTtU0e7IzsgsL164pLNy6dfvW7Qdef/vQoaMgmUPv/+P3/AwzJJbZzc5gyhhAghm7guStEPpFreZvmQcQLd9MU5UoD5V3RUTujEaTzlQ5WzMscyQQtWmdJNG/zDoRYuoQgUNkT+BOtCymAICFQntqzP0bWThktPHb3+DbJ73eZTTxrG315t3vHDm6MWNt+f4PD23avv+9Q4WrctIL1+asBcmUozR2vP3ekeOn3jv13vG3jx/ct2uHx2HLqVj78qrCnGoUzaHX9+zZf/zA60ffH/vn72NxBmJnluf5vWe5Thg9fLgvyqO/zExSIpwBNjFJVPYUa86mygOIEjejswDRGQC1IGH5ZtizOPuFQ7uTZDgdNhxDKv1ocwpawI7qimQw6+2Yu6Q686kzC3ABcZDZf0B0O8lk6+LTPmFZODwxh2sDrfL7e/mdgVbX733/6P6KFdWbwPvftPXIB0fWrcsoXLdiI5A0T9Xx93556foNsfT55s3r1y6d2r4mp3DF2vRVK1Zt375968HXX993/PjrL75++uxYd0vxZhqXWdLiOyYyvKPHmi+rTry0YVTOdGiR3C91irgZtzMSDyDdEI2b0RTLyQ9GieT1M6C9cOQTuKi5uDRCzUqbYIvT+Jcq/AZO0q/eiFjX61AmQXIlQwgcReUL4fU6VGdaPiaxafm4+EOYE5GFEzQuiwyTPtMP94I+I65Haa3v2J6t214vf/uDjZ7q7e+d2r7V8/KhdRvXrNr4zi/DKzgYKwav/bL35cQV2as27tm+df+B1w9tP7Tnxb97Xw12b8aadejK1Pr9QT4xFIx6ZcrlJnppmJZFxhetBTh5zdnt8wCix804H1VU4zR4/mFYfbPQOLEudEFAP66n0AZNNbqw1UFjskuRt3CSOMk8YjGyoknSH/WSED0MLgO4BgCkVsaXwkdUp2QTNHiK2vjirAun8bYNXr/PX1/qbdtT+NrBIx/urKjeePzUnv1bC49vX3f0bMRdziZJ58I7G5dWHd2zdc/x17dv33/0xb89q56l5bf8viXFPq7LqK1TjEHCf/VBC4ztEL20PtQgel0CYU9R7cxH5wFIcTOj+h/ZXbjzrJ9lO6NQ66JmOdF252NKs95KFmmEhxqCqrhXEEmYH7c7cdlAGY4rxAW8mZYfYqIDdUbfxmm3fDy+3oFC56APx72hy4osQzo4NS1LVmOl+eINbRtffnXnh+9VV28/fmr/9uPV299958ptpWII5/j+PXuOvP7anj2HXv/bH17uJaTZj3cd9L7LNVn4FB4/MVDTmaQXKkmkDNPvQhMkLWsKbsY/OykPINqcpkSEJCUe5JPusp0JMrgcJsOewCWkFqEBNPAmLI7ghlogFzsRwNJKYNHOgcOyNIfNreS/ZFLAjHZPKzP1XTaSbMMTp+gTnayt1sbe8FNTU1qwpu2Hr773wZEjYP6hpysOXbrx0VJh7cYvj24/dODV7XsOHfve357cuwWDM0RP7g5wk8ApiBAPFZhWZu4nWqSRI54SJHUKf2bqPIAo6zQ5Zvj+BmhoJ8iYQbiQJX1pcMp6E4JXm8iyDMgjXByGvdAD+WQd5ShZxxjKpabEHmD3EsRlmpjITP/BjhnIRXfJGJty4hTh71ojihnsVybeHRhv3bB86drvvP7eoe1HTh0/vn//1jO312KTZXPqwKuvHep998fPveLHKo9g/YGfWZt0gwDIbJEpBq2OLJELpKG1BSVCrsMZoAPyI+oBCHHfhpuFdarUAxRAMmb4qpl+XnJhGF6MZ5r7pLWu3GzRL1WxjBueIVnMqNC1sxpdvsd2InDBcdfEyjjoijaRayJLDJXwscVGCxaxaSSr8E01p720E0sLVqx4HfjZ/g+Ob9//Sxkv/3JHsrn54asvHj327pnvv4zTM/5aROLZRlOjpgWlVEqZLSqaWiMvaz7MLoNSm+j5ZrxzJuUBRFunqRmLko3+VMQNHCMwo5Almlol0U8jWF4pqE3km5oUuUyRMdJDer8dCyqFQPt0kfXyuGhJQxNFk0BxJ43iqNI8SI85AZtACS3LF5SvhUEfC6p0sEpAAe2Y118Miqdlde2adWffP3r86MH3w8nYj35wZ7K59sN/fOf0sc0bCmpRMKV+7+lLWqupZIKbUWN2iD70cVKlIQRmEeUzYccFRRoCh8ay/n15ABHczOCmhnHiflAYZnClHu1hPA04XBYpINVoyhzgdYuDhhYO6eN1pqxhnay8bGJFSAjkOtjoYUgmVQ7G6TH7zfmo9dRWk7Of16k2GKaiYUnRxaJ6Fnyu1+srANHAUF/Xff78qVNXI3r8R89Zf/JvdySbn5/pBcGU+ohgWv4Za2R0WUgBN0VMvvPhpGv9i8lUCJYUw7WlNQQ4/RwyH10PIHoewGRuJgQjWTvyDWGYgaPm4ngHgohzj3qfOYtWi8s0lZzQdC0kRIulpkbbrebWIBYtazTVaWR0daBadjox3MZnYYK4ymxEHPNyDys3OJBlyh9QSNlmPm7A2ZvoSnueFBi+PIwV5+AI+S/uBdHU760tbtnaO3ZpkoH5kSXhubSf35HduXFsTWmxlwhm74skpo6FWcuG6NpLg4FiNcASU+4IFUy+IoqKkAXw1AxEXQsQXnhJ2kapoSEyASP/KIY2kzxwRp/Qd+wkmt6SRqoVBjrtpqzOYSMtWx3tK0swVWJxRiy91IiC6cfRFaQlGQS3xuE1Ys0HAcA/yDEPm1iJTixz2j4UEMfUxvvrrGYsXa2QUkRDtJbN4WNtvmKwC7XF9ZsvTu7uHz3/83+wPPfdX9+JaG6eyWsDuwWq7N1zWdhXcBadVnNJ/4ROq2fSEq4TfUUmexepoNFhAogr+pAF9JCit9NAYjhmDH9GjR67CgSUKHGzsin2FglEYZgJkopLhzGJooQEZvRBu6VLw1KjgZ5ciyWtrKnrcH9/T0dNVoLZ3jRMquYNZpo6NQ2dMtB9yLxrpOrGBDR6Fy0DUEIintDp1j5eGthisZc0dh7u7+vpqMu1mq01AE1QgGq7KfMcIqsJdH2o10u6s7Q2mgfzo+d/fetX333e8g93ZG4u+fJAyHvfVdCMNKqk6l9H2vP2sq4T5yYCQWV8dKCzzGp2dpDCdBM1pkqsZTRqx7iFPkTXE1NOOsnOOBPsyVEf1txo+WbR97baWaErNZybkZ9cQp+ADJNuHC8yFVEJaCM9lVlWeisQZ1E7udVESJ9oMtuJXhi0YtU/HdzOcU1Ec9hBtRI0/4wtq1jbsWb0Mimnfa6nJiuZxnTt+U04dnFh92Aulg4k5ezqcJbqx5v31i5Z3hs1DvOj538Ff3+e9tzin/7mDkRzdXWt/+//7qIGHV5HCkditeyBGrx9RrIzzW63kFqeWBFH0wfSsIimglV1BlFNZ5K4EnOFJ8fNnE2NUVtdh4QZYy1A9L2bRjVGgMPtDCrQEaREWAEEFwcGNa3LasY67aQssDoxMjw0NELu4EOrs9tNNROojwewsiypW3dCl2Zf6DNt3J42jmLLMh8WdQYDrCywOnEOjjnMjqnq+kidefFhoLPo1tRgzwws/uFef+2W6L4lYObmv9669W8/SXgu6+dR9whvN3r3/qO5kqClb7G5blQnhQmVkf6uppq6mqau/nNBLAtICs9lkjE36rSQImE1XE0zDyWSm02V3a/rwWj3BbjNWgAl0p+h3i/YixJQqlqgyNRE6jCPknsbKLpO729CkqJCeAeHEXJHA6KYusyZWOkHzr7rsny3WhYEwupCVNyklrZUm1Nlx+S1udXBGoulkdTmDpQRfwOrDZ0723Z6CiMPkvm3NITLv/zg+ed/8Ks7EE0QdGUR0VbjdRZrIzmLkLGwibzQhuA02knJz0E7Vm/DknytusqTF6aYn4ma3a+qU6zTjL4WgOFkkp0JkqLANThqAO75o6TI50gjqN46GE0GA5g40ZFrMZeQGzrogRq8VGIWWgW75v4JDbccRnGrmlJJaotiPdsiUs82SDqDVZ+fGGzPMlnraIH6oUwzcWtG08DjDV6Yin2hZJKf/y4WDPrFd5+z/NO/frRsLsFAcg6SCrjDlRZzUc8ITgHggGN19Ue68k0JjefIHj2EBCFJq+R3UzA8zUncLGoLRV0LMNXeXHlF2BlqsVuJFoGzwfKlRPNPHC6htZXbO7u6OhrLcq0WSy4OeuJuOk2tqkYEUyfuBSGpNBJe6DKVYO0HrcNi1IAG7e4sae3pPzE4ONDXVVeU/Lwlv4tW7VRxP7BF+jknlkqaOnoJkvlNcgLABdjZzZ+lPWf/2Ueam5uX9AG7uUOlo67dabZk1XUNDI+OT4yPDg901mRazFmdo7woMBmdMLLygxr3dqL6M05rVmb0VhJtzdkUe2eNaCzAOsnOkBHeaipTEAMj+aZcZEvYkRMDHZW5dqAACQl2Z0lT37kQLVI6TPQxqD+tzlQX0lQRmJMDoajwJtdNV4e6KjOtWDMdf+y5dYfJQbFqJ+xE3Johu/WEHpzsxoRhJuG7BC7gcP7rPwGD/sWUO3PRqNjluQPUWCqDHUXkfmsJVnLHFXtJ5xA9DbVnMa0/h25NQFSsCqrRuJndSe6+FOWnMRo3S4u6a1klnQtW1Ch2hrh8naZcvH+EHuqxm1Bl8Rr+gfHRcyPjE6x6PimvaMHifrDrRAm6NQZhllaq0ahLjyVzGFFA7jVA4BYk9xoYGRzo7x8YPIe1hqnABopMzj5ij4hbM7UqY5hJ+O6t3/zM/lwawuXXP3iO4OcjRBPC8uVlpEYrmpWJkYGezvbW9s6eASzsSS5X7c815Q8Su9NOymkLR12JGjeruayzm4JwiyUsV9Tas5P2o/syE6BEsTMkybfPgnVIAT6BDnQyWSFttNYhes9JWva6yGwh+hig4GSVDGXZkMNxLE55fw5qZMhR4WvGu3JN9k6MqulqKw6QoHq7iD/FzC0JLoCfhI8K2NzAK2u3mov6A+xGYXLf4MAb78mi9zAK6oFKU40iBMPc5+ix5ilMR/S42dRmJjIGwO0MRo/AAJsa6T18JnpyzZb89hPj8m1JtYnhLnTJ8PYz8M1gFhYPyJVUjPyxgMonkcg9bSaIBpHvaaOLW9poweGekgRzVleAcgDYHZR7cIr55DDM/Mu/GnD5zU8RP7cP2FzDGB04mSZ7Xf+EFnFvPW20r9JqyuoJgJImY65DMxDDQuhR4mZT5MNqWtS42W3WAhBJRLEzNMimB+po0BFxPUTur5RV1tTZ09fff7irvSYXKy1TlwyEdyLXVDZurCYTsWsxQ8em0ch9oEK6dB+oyo7DA0O4SmVwoKepJA0oQeOgSiMErZbFADH1fGQMMypmfroYVdkvsp6z/ARk9K8YsLk9g75CWHqgH4aXNb/p8ODIOKlrMA5qrS43AYbNCXYaTaa0AZ6xbMxWTOZmTntJUfRWE3UtwBR7n2Or8qPYGf714ANnmoq4JlZH+1tLMpMtCWYaBMiv6xlWWAn64RqTHVxDRTL6/AJ4JggTGrt3GuUU5N5pTrC55M5pYHqtWZVdQ0EMckKHgIEjtxy4nfWXMPPz5wlzFnD5FeDnR7cL2NwcCRGNoI/3NwLTNGOZdWeaHW/impzfSm5ZgMXmDjsJzFk2jJjGiRI3cybn50Z/lEWJmzntU+xN79gA0plsZ8TEJ4b7FoPLQu7hQ+7lS9z1wcFhdhsfMuq0oUqLpXVCl+LX0nx+UFUlQoC+s9qTJt0XCO83OHC4p6unpw9vN6Szt8c7ncSHhQ8FP2JamWHmZxa7hagyAhc0Nz9Pe876k9sw6F+UDHIWoo0P93e11tXU1NS1d/UPT5BoBJb/68s1ZQ2Qe62JCS7WOVHsTM1ttNlvsRaAzwtEszMcs3hnMnDzs+h9r/A9kvxL732J80hwST35JmvjqJj0NDwlkd3PZ8dYrm8I76X1vLN90j06aRiA3MiixgrCY7M3t9dlAjM/e+6nvwLm/A/c3ABcfvOT5OfSbhOw+YGpqI/a/6AWRo/wYnCWozPT5OxRufUMhU2IRb0vwO0YQLQ5zWiNZr9ExppF3gWb0AqxILM5t31Q3C+We8paYLgLzHVmJ5dLWOqYUGVcQSqCDtL72lqymuj959gxKTsKnuurcZqsNYMhrto/QjACM8/9lDDnZAzU/BxkhOzsX35kea5oSnPzmw4nshBq/42uofc5Gz0M15Z7WJHWxISBPypmogbCoP02awFEHkw0f8ZIMyZjHO+vmGBi920mjvLI8EBPI3pnmcRcG3xMMpFyap8xc0mvkt4LOsGckFvT0T8IxxyfGAXv+3B7mdNitpcdnhBFPm7Py8IxAy/+7Z+sJK75m58mM3OD8wNTBWyun++vRPvfCgqMLnREGSnjQ32NcMFOvCMFmWLia2KIKqDUVaX3+8UqoeiGkr6210VdSF5T0xik+YNq+N2BozfmaU6en2GRLp7nR6fToCP7G/Pt5AZnVmtyAnrKybk1lAMwMYThTpo6VST08KxSld0/vbXInkBvdm4lx0zILOvE26eKhJCI2859BGZuAEx+/SOgAr+S2NnPwNxMMT9w8xKwELD/YPStzqKymrrGupqyfCfQAWt+O72Li6KKCCPXZfTy6B21Q2U1IUXHO2qHAiWZ0WsvONOKFB3vqK2EKiuhM+n9t6fce0Rj2XzR/RnOQISsEPGBkcH+no721taOrsMDI8Rj55XMg2LdS2RWmmAEHDJcWxKloQVG2THR+x4ax1trqcQHosGjjzL/4Zj5X39z7haBCWFlnJ3h/MB3o5ub6+dJeHv0RE9TWX4mrnNwZuVXtpJb0BD7oxr20VhUInSCYugCfDb1Az7MdsFe4v7eFPvyBKsp/Bl+LjKOQuFRhJCU1yD62wCFEJlkv7imM+i1KtleQkzYtTLS8NGQkTHzv/7mb14cAigQVgb4+XkWDQaQ+YGoARtWrZReEJnrVTXOAYLSSDJYpxi6rE9UQxFM1cjdhPiVhXh+a2iKpQDiaFP5MyKdRYoY86SLEH8aZDUCuC5UQmK3IB35HDJCKkFptTSVDdPf5IfrdKYP7wAy4ZiB9uL/YqwMzMxvfmql2RtTzQ9cF3CXyyWGwV2AhQ8q7p8pEV2jBqd4yL626HiWfhhtKYARnYnmz0QWUKAYYP3Fd6RjgJw2O3slaHxzULYzYQgUattQm1w1cF1OcXoHkInADLYfI0z+wUI8z3/9kYWYnd+AuUmbPD9wU4wBcjasyyX+ooRfreTXGEIzLkho7LCHwY+4RlCkjqQD3HjGZadM6c8Yu0gRYxlLBsEWaz6Chn4LVwFh92QJ027yBCgfjVxS4XdqvkPMYAPY3PqF3fLcj5CdOS3P/whE8m8/sDyfNSkocO08L64WlKPjilhgxIadxDoN/0x6rfKVElFBEzJEIWgVA40BH2NMTF4LIHpM4d+lcF0l5f8aBSIMSIvdDIFErLoKE6fBdThGxfmFsbk7ySKbjJm/+THorV/8gKbT/Ms/JQBobiJonk+bzNFu8HOTwuOcjYkxJ6HecMQVafAbnxfYkB6qfAxx5YKpqrIeol9KJDm1P2PkPysiYhyUj60IMxEykKAEw1FmfCHbPyifsZFmPtkeqR/p/kfHzIvXbt769Q+efw5zAn7zEzsNA+DMwD9Fmxm4EuRcSFyHyumXMSZDzI8Rpl/yqA2RGAMw/CfschVqm0U3sDVD4rAKn3ec2p9h26DYKpFfI44V3q+CEkjgMkibPBBlPE22R3di/ydh5sVhNlOD8vh52vMkdPbrKckZ4wB8sBrDX1hp7sMIQ6gYPSXO3WBehp6Qf1Tjbd5R4SY/co2XGj0PQPZLDAhzVWggIJJKck0r9KIkzjC7I72vyt9Ovi/EXYA7UmYRmDl3k4SbSTLAr4pMFuLQ3G4G+iYGTfHbcCOcMkMoDCNCWKI2i5CnZIbC7Yh0jazaIXvKP8NtU4hVTje0Oj6Z2p+R1KfBB/j/ZWMjay7ZLPKX0khQJXEKm6Ma3x7G6+9ImYVh5h9vEieGZAT8yz/QYADJ2rhNkuCVYIQ3IURiDDZVkcaixKEilLEi94vQeHx4qwY6ZS6tyN0oDh41D0B8i2DrErZ5LXOZYUgCNEaToarCo87yJRnvM/V16abc7kgw4XEz4viTODP3ZHgAesoW9pU3rwZF1wjSojKNEZKRIY83QzvIITZptIb1kvDQxa/Rn7JdZphRw/qSnwiHb8iAiXROgsHIb8vw4RcU5KPQUGhK2BEYgm6Tu3RbyXDMkNgyCZYBcKw02Hxn2YGiXaOdFM5BuZS4chJnLaM/TJ8L0xlOYidpdKlLOcMQ/0bM0Fkx8i98RgcHeUZOgubJBNl/KZ51jS99w2fEuIVEJDLEUkAUlR+YRkDoe/y//MB4Xjr52n+vZChmfvabn3CciIiZ9c4yaiXJnCf30JKul2LB6BdMW6QooP9FiZEUBiJNXWdrgkIkqki8V+wh8ll2OJXOGVJxYBIkVemsr1jXU8xoo42V/aS3tKGamkHyGa2/snGUruIdpu/h/fAq68hkaEjtKWvHG0uG1BB7Bp/uKOsi40kbbyrrpx+gH8VPjDdVHibp2tpwXc0JevuwkRp8htc9UEMO/B/BzPM/cNI5TBFl/vnUUeapJYM3nKurGWDXW1NDU/O1E+QZXlxfGRaIB0BpgzU1dG291lfZiCVHoDs6yzoCtLB/F3kGB5lorewJkbmukbrKAfoB+lGcNx2tq+ynvQFd/7+bu37XRpIs7H/mLl6W22FnufSQaApEg0EIBIYBJU4WBQocKHGkZKGjQYHAoSIlBicbGAfmFElwIAWiQT4kZLTNVRdHb7DLBXfv+15V68fuzHnkgZ1hGN68VldXvVfd9b0f9WquoldKNGM3l5ExY5S5SRuROU9ZVsVE1RYLNC+FF+94a4sDUSJTvYaXzoHqCoXtpqY6ZCJgu2rMIzI3nnArzmzKs3Y1wh6urVtdVE2Myi1u6SnpaBxVL1Yna4bvjKmY97/sR2Y61cr7F6TSHmnm2a4upNOYT24eR6a5ykmZiAcdFA8iA5wcKjNMrjYQTSkeweO7MxQZJEyLGikl3GuhUIgzX7dELtB5vqhXosYS6tq0IvK2LgUP2qcShBLNuJmpoe4NUlwjoW5B9YQykyJDCSfhjcBLwKMG23IHKstslZIG8zXOp29haszRXBfJgf7WDNVo5GqXQwNviOY8haxbbfh16wzXkxDNpL/sRbudjjSzLcbo1kBzzKVb2E1UDMED5broKiZbMQLvvuTN4X1/hwTWNWZnS6j6Goc9inxMO2fEWW7gXr7yVpnsQvUgq1t5WISaycVtRAqaSWumhlTxDMcW1CooQo9emRreOPIw3aUvgeeuhWri8OcCVIO7SltRLepgMi1jaW5Q+L7om7KsC48HdKIvLBBSBEpeQYhg5l7zzvzzH0L/+3tziMw+XTPPnKec5MU9uoXTzTnFWL66SCo1U0cVDXl7lIdddp7nOiIDzE5PYUfq+gLlnvgKQswyT63eii0fKnpO+0fPUyUIxXXmLjadNVflfs0kjCGsr0ydG2Ft3o9Njx/WDbGiNrIAAAnPSURBVHhMX0hbpvGIZcOll0JpiZymQbROrt7Hpr1CrUY70FsxynPTXnI9uqnF14Q+DhSPRN1cm3j4unXmv/sLzPcv3lX7G81I94exYbfyTc/EA00yuo7NDQW0bJvGvW4Lk6t9Bp5XwrsDz83fmSaXkpKSRahhLrk6u1FsrvQI2F5s+mzO3QpvzbwM8ggIExMn3p5xyzmsjn/J9zNdOAJuZ+dpONZ7kVo9g1t4CrXcZr5SICGU34jlVnPN/c21Oa6X/tZteASupgtL1EKKtdadXaDh17wzu0wzumJethP9dzTzjA89uwUZoFsEZ/ki9ePdcrwUq/B0SOTx6npPLiyxB8XNN2438iyMl/VfAg9KAo/A10EJopnvIDeHNxDLlHP6D3gf+KcIP0ECg/UU/vG8zDe3u4tpXeiKv6q8HeV/95p3BrExZme+aDPAhzWzZZz1eNDZbuSHMtgbptuTi91RvIi6IDpyirls0x3z8iI8Mf/u7NuN04jeYralBePsbB6mxREFxLeZ+henWE38lky3mix1c4l7mmrdLTSX6ZYNt5wQYQOAzzYsE2ntfG79eWjzWekUOfmdaXmXpe4IOGWBCZrxB2vLJ2OmfnRQ+slw2XThR6QUv8kqIRygPn3ycllO/IsTKHz/pxsvF2lOt8i4dLaTlfJcVoo5+/bsG5wiL/8ZGKNbEWQ58V+8TdeY5IASEH1p4lvcXUyb2KSEx85ISdNYTlgJMpflJOoAI2TFg/AI/N3QmPYa8yC7NljPMDahempgnfw1+099twvgRZvOPqKZrdqJtmfMtXawpNaCQ4ccB6gbLiJCmRvyFu9MfE+5jBumSSvOBYrLySVhssU2CCoJq3vracfDlwyiH+D1yDdX35y94e4Khc63ATorECE4KamIQCQRIBIDiFjpnmlt0LRS8m1eNUogAoQzIowHD6XNlTfkDi4Aw/EBhc/5qZoxfufMB339L9fMM32DCp2523dHAa4CHHvgiskNuErArHC1AdyzEcBs2lxQhIoAmN0T4GoS4KqWSF3GIo1ECwwrGtwSOiOtENSbszcA7xl7gAKrVsH7I/tS9goI3KDBomt8Xzx4x1sYYLwH72gZ0I/gnT1gTwOgB2SvhOZu0dydHg51smZ+5ObmVy0wQTPq0Szu0K1bQmd0FVOsSAiTIY0jCp+L0sSzatjhE0bqAguXN/Eyq/gbs9MtIKsrzk5Dww7F4Pw8BfXm7C+w0gVVtIJtvjg30TtoH5TY5qDSRlXMYVwdi8GLHZcCAsX8H2hVZqH6weDljLCbyyotaZkcPeHdYUc6fA3xJJi5zaU2rJY0fc2naQZA+f/5+l+smWdFVsumqTaQlLdHTeOocsnqpvBZlFQFu7Zh8hjdY+v61agCs8W6gYxcTY+rqlEDBh6G85QmhfB4gBndIuc4MxFeh0prTdQdf3OWzNQ1tByQwlcn6afel3NE4XfjZLhmBmB+37vz6FgpHP046j2qK0yam+r6lpW81Q0cZfwqsznIYBEaPvmd+Umz/z7q63+xZnSdgfMsWbDCOykOxE2SG51DbkoKrrVZMvDuxcfeCB90Ge9d797DG1IAx+thb6I/S/vJXB2I61FvrHJ5Ig9XtTlAkFly9vW+h5NoiY7VkndMFftUntF3GjKlWZiGjWTqSLbqhD7gBSe0Rj93DZ+MzX55X6l0XrnABM08+xhUKY3s0Ad8KI3sUC78mY5XXfugNJxw6Ei2+3fY4KY/fMTXZ29piRQeLfr9aLlFyqTmyB3y1PrkVSJhUurd1xxLNrJrrrAlb3dV4z0FqL1HnKYZ80Pjo5sxPk0zW3am0PBkGK+XC8kwXnZ/nxdiBNbHA3aUPZAGMFjZnIo+PEwfq9JgtNmlvc49P1Bu0r2aqCv6vnO90C/PtHs1ZuU59xB4dtROVmrIjzqJpq+v++3hhlBSmrvTRmZyq34hn4RH/C28DkMOmafwOo873fmp3hlTiX98hQVzpJln+cR3O4/+w93pMiaSufFV10dC7jqarh94kIbwvItg2O6vGQ/IPGXzVdIeWXqjFtedBx9i6XanPk5y3bmnDArh+Q/e5AoUogBY/LnzxqXIgycIlIU+uuBalNaFN1PfJgFBBrBoWAJFF/8OrUh4uwf4gGHxZ4kqLu+8NVceGkZkoIZROoQXABHh2zSRwICTNPPD3z666e9TNbPNlw1Dx7zMIXaLC31NcMoTHMb3Mg5d/Oc1E9WxCnPxv+TRIf0qYUDGxZ8UKlQZLcWHhV5d9Qgq1KnLtfBoNJCHYEvG8IKgshAFMLsoAGuK+CgA+3IUBUABRkBE1JI/igJcwNKaeY+/v5UQcV5CREYGboIpY0j1FaefpJm/vxopH2jmuXhEZ3hcxo0JRsONmg+oOmU0CuCNC40CmBAFuFDzQV4BGBL1FSq/14LRUBoSP/tbUS0YtyIK8PNIzQeYMmUUIKfbnnhaLA6odes9/qlOaOE9+hACeNI/0ZthEdaiJ7wLRgEuo1p0halGjz+DClM8TYFhQyMDGSYiQx1WbdsHgny13E7SzOf98+tW7WGGKR4gjZkPKnlqoAYlCibiPMcJfid681GAK5HBJTc1kkLMdyPaqvaKzHv8acuPeSu+JZ4nt4o9aWDLU4N4abnOPDTVHZ/lw7h+w0D1phfT2y0PGZ7XB1witsK7o3tu2Y7fTZTqeKqYtWJ6u7PisRl3oSwxeerxQL+xY/DY3KgR9wkq3e15XaltEjduT1xnPrNmZJ25a8QJDMXc9rVbIg+hGP+w627cHKs1EHg5eI8aHbmMWxoJSdtxi0aIm7yLO/Qqurtm3NvS4z+IG0Nda+8bcY+Rgfwmrg/pq3E39XgYogCrpdVUGaH8diW3XHkc5pZLX3NDeIoMnU03LlBr77TbpFYRn1unzpXN+WSHdZp7HpsjIluV1BJFZr4EzWx9tyhBdnVbdloDFhxvdshbBt9/RrlkJcWIicoljHe7a5gxgqVGQkoxh6ua1ZR7M0M9214hNqQnKnQkbHA+fyd3NqQtlXvmbMDptmwOlM/lcSXPqia3/iozR06PAnxmzTwHP7+aXX5y2pJny5H/hve7ctGrIaXJC9Lz1OPsQhJg7kLOE68yq2k/6Skcg24PuEdJVJ6rZMhT9tlVZQbhfi5oVv58l48ZUgbLpNsvQTPb3bB3mY2+f/v5l54XxrGXthmu7sukTP/O9m6yIfU1pKQd7rLQd6ZssTwGfa8Xdj9d3O76aXc68rIOO9CsH1P5uGx/K1dWdrYcg8/R/AI081wKMXRxX1p5uRmj3IpSJjrawLOBd5i7XQpyp8aszAI/ykHGj96e/fnt26++lL9//aP//PrVHy4D//ftn/4Hjz2wigAOmqwAAAAASUVORK5CYII\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:21,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:220px;margin:auto;position:relative;text-align:center;width:391px}#hplogop{cursor:pointer}#hplogoy{left:0;overflow:hidden;position:absolute}#hplogo,#hplogoy{outline:none;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoy,#hplogoyt{height:100%;width:100%}#hplogo\u003ediv{direction:ltr}.hplogoytb{opacity:0.8}.hplogoytb:active{margin:1px}#hplogose,#hplogosh{cursor:pointer;opacity:0.6}.hplogoytb:hover,#hplogose:hover,#hplogosh:hover{opacity:1}#hplogose:active,#hplogosh:active{margin:1px;opacity:1}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Hedy Lamarr\u0026#39;s 101st birthday\"\u003e\u003cdiv id\u003d\"hplogoy\"\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\";google.doodle.alt\u003d\"Hedy Lamarr\\\u0027s 101st birthday\";google.doodle.shortlink\u003d\"//g.co/doodle/pzx7av\";google.doodle.gallery\u003d\"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.id\u003d\"24101651\"; google.doodle.video\u003d{ytid:\"Z0gu2QhV1dc\",height:parseInt(\"220\",10),width:parseInt(\"391\",10),animatedcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vacta.gif\",staticcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-vscta.png\",play:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vpb.png\",playheight:parseInt(\"220\",10),playwidth:parseInt(\"391\",10)}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2014/simplevideo/simplevideo14.9.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:22,type:1,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-res.png","width":95},"target_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJf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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:21,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:220px;margin:auto;position:relative;text-align:center;width:391px}#hplogop{cursor:pointer}#hplogoy{left:0;overflow:hidden;position:absolute}#hplogo,#hplogoy{outline:none;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoy,#hplogoyt{height:100%;width:100%}#hplogo\u003ediv{direction:ltr}.hplogoytb{opacity:0.8}.hplogoytb:active{margin:1px}#hplogose,#hplogosh{cursor:pointer;opacity:0.6}.hplogoytb:hover,#hplogose:hover,#hplogosh:hover{opacity:1}#hplogose:active,#hplogosh:active{margin:1px;opacity:1}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Hedy Lamarr\u0026#39;s 101st birthday\"\u003e\u003cdiv id\u003d\"hplogoy\"\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\";google.doodle.alt\u003d\"Hedy Lamarr\\\u0027s 101st birthday\";google.doodle.shortlink\u003d\"//g.co/doodle/pzx7av\";google.doodle.gallery\u003d\"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.id\u003d\"24101651\"; google.doodle.video\u003d{ytid:\"Z0gu2QhV1dc\",height:parseInt(\"220\",10),width:parseInt(\"391\",10),animatedcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vacta.gif\",staticcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-vscta.png\",play:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vpb.png\",playheight:parseInt(\"220\",10),playwidth:parseInt(\"391\",10)}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2014/simplevideo/simplevideo14.9.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:22,type:1,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-res.png","width":95},"target_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop3_fp.json b/components/test/data/search_provider_logos/ddljson_desktop3_fp.json index 9dc9c0fea..a042f91 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop3_fp.json +++ b/components/test/data/search_provider_logos/ddljson_desktop3_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:21,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:220px;margin:auto;position:relative;text-align:center;width:391px}#hplogop{cursor:pointer}#hplogoy{left:0;overflow:hidden;position:absolute}#hplogo,#hplogoy{outline:none;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoy,#hplogoyt{height:100%;width:100%}#hplogo\u003ediv{direction:ltr}.hplogoytb{opacity:0.8}.hplogoytb:active{margin:1px}#hplogose,#hplogosh{cursor:pointer;opacity:0.6}.hplogoytb:hover,#hplogose:hover,#hplogosh:hover{opacity:1}#hplogose:active,#hplogosh:active{margin:1px;opacity:1}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Hedy Lamarr\u0026#39;s 101st birthday\"\u003e\u003cdiv id\u003d\"hplogoy\"\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\";google.doodle.alt\u003d\"Hedy Lamarr\\\u0027s 101st birthday\";google.doodle.shortlink\u003d\"//g.co/doodle/pzx7av\";google.doodle.gallery\u003d\"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.id\u003d\"24101651\"; google.doodle.video\u003d{ytid:\"Z0gu2QhV1dc\",height:parseInt(\"220\",10),width:parseInt(\"391\",10),animatedcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vacta.gif\",staticcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-vscta.png\",play:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vpb.png\",playheight:parseInt(\"220\",10),playwidth:parseInt(\"391\",10)}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2014/simplevideo/simplevideo14.9.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:22,type:1,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-res.png","width":95},"target_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:21,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003\u0026ntp\u003d1","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","interactive_html":"\u003cstyle\u003e#hplogo{height:220px;margin:auto;position:relative;text-align:center;width:391px}#hplogop{cursor:pointer}#hplogoy{left:0;overflow:hidden;position:absolute}#hplogo,#hplogoy{outline:none;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoy,#hplogoyt{height:100%;width:100%}#hplogo\u003ediv{direction:ltr}.hplogoytb{opacity:0.8}.hplogoytb:active{margin:1px}#hplogose,#hplogosh{cursor:pointer;opacity:0.6}.hplogoytb:hover,#hplogose:hover,#hplogosh:hover{opacity:1}#hplogose:active,#hplogosh:active{margin:1px;opacity:1}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"Hedy Lamarr\u0026#39;s 101st birthday\"\u003e\u003cdiv id\u003d\"hplogoy\"\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\";google.doodle.alt\u003d\"Hedy Lamarr\\\u0027s 101st birthday\";google.doodle.shortlink\u003d\"//g.co/doodle/pzx7av\";google.doodle.gallery\u003d\"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den\";google.doodle.large_image\u003d\"{{HOMEPAGE_IMAGE_URL}}\";google.doodle.id\u003d\"24101651\"; google.doodle.video\u003d{ytid:\"Z0gu2QhV1dc\",height:parseInt(\"220\",10),width:parseInt(\"391\",10),animatedcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vacta.gif\",staticcta:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-vscta.png\",play:\"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.3-vpb.png\",playheight:parseInt(\"220\",10),playwidth:parseInt(\"391\",10)}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2014/simplevideo/simplevideo14.9.js\";e.async\u003d!0;document.body.appendChild(e)};}).call(this);\u003c\/script\u003e","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":21,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":22,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:22,type:1,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5770237022568448,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.5-res.png","width":95},"target_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop4.json b/components/test/data/search_provider_logos/ddljson_desktop4.json index 5fae51c..5209922 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop4.json +++ b/components/test/data/search_provider_logos/ddljson_desktop4.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004\u0026ntp\u003d1","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","interactive_html":"\u003cstyle\u003e#hplogo{cursor:pointer;height:225px;outline:none;overflow:hidden;position:relative;width:400px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoc{background:url(/logos/2015/ponyexpress/static.png) no-repeat}#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\"\u003e\u003ccanvas id\u003d\"hplogoc\" style\u003d\"height:100%;width:100%\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\";google.doodle.alt\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\";google.doodle.share\u003d\"Join the Pony Express to deliver 100 letters! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/7j375g\";google.doodle.gallery\u003d\"//www.google.com/doodles/155th-anniversary-of-the-pony-express\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{}; google.doodle.score\u003d{rate:1,time:1429254E6,total:972152E3}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}if(window.navigator\u0026\u0026window.navigator.userAgent\u0026\u0026-1\u003d\u003dwindow.navigator.userAgent.indexOf(\"Firefox\")){var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2015/ponyexpress/ponyexpress15-5.js\";e.async\u003d!0;document.body.appendChild(e)}else{var f\u003ddocument.getElementById(\"hplogoc\"); f\u0026\u0026(f.style.background\u003d\"url(/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg)\",f.style.cursor\u003d\"default\")}};}).call(this);\u003c\/script\u003e","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:22,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5910974510923776,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592-res.png","width":95},"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004\u0026ntp\u003d1","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","interactive_html":"\u003cstyle\u003e#hplogo{cursor:pointer;height:225px;outline:none;overflow:hidden;position:relative;width:400px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoc{background:url(/logos/2015/ponyexpress/static.png) no-repeat}#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\"\u003e\u003ccanvas id\u003d\"hplogoc\" style\u003d\"height:100%;width:100%\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\";google.doodle.alt\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\";google.doodle.share\u003d\"Join the Pony Express to deliver 100 letters! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/7j375g\";google.doodle.gallery\u003d\"//www.google.com/doodles/155th-anniversary-of-the-pony-express\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{}; google.doodle.score\u003d{rate:1,time:1429254E6,total:972152E3}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}if(window.navigator\u0026\u0026window.navigator.userAgent\u0026\u0026-1\u003d\u003dwindow.navigator.userAgent.indexOf(\"Firefox\")){var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2015/ponyexpress/ponyexpress15-5.js\";e.async\u003d!0;document.body.appendChild(e)}else{var f\u003ddocument.getElementById(\"hplogoc\"); f\u0026\u0026(f.style.background\u003d\"url(/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg)\",f.style.cursor\u003d\"default\")}};}).call(this);\u003c\/script\u003e","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:22,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5910974510923776,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592-res.png","width":95},"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_desktop4_fp.json b/components/test/data/search_provider_logos/ddljson_desktop4_fp.json index 686f5509..34f9030 100644 --- a/components/test/data/search_provider_logos/ddljson_desktop4_fp.json +++ b/components/test/data/search_provider_logos/ddljson_desktop4_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004\u0026ntp\u003d1","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","interactive_html":"\u003cstyle\u003e#hplogo{cursor:pointer;height:225px;outline:none;overflow:hidden;position:relative;width:400px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoc{background:url(/logos/2015/ponyexpress/static.png) no-repeat}#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\"\u003e\u003ccanvas id\u003d\"hplogoc\" style\u003d\"height:100%;width:100%\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\";google.doodle.alt\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\";google.doodle.share\u003d\"Join the Pony Express to deliver 100 letters! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/7j375g\";google.doodle.gallery\u003d\"//www.google.com/doodles/155th-anniversary-of-the-pony-express\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{}; google.doodle.score\u003d{rate:1,time:1429254E6,total:972152E3}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}if(window.navigator\u0026\u0026window.navigator.userAgent\u0026\u0026-1\u003d\u003dwindow.navigator.userAgent.indexOf(\"Firefox\")){var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2015/ponyexpress/ponyexpress15-5.js\";e.async\u003d!0;document.body.appendChild(e)}else{var f\u003ddocument.getElementById(\"hplogoc\"); f\u0026\u0026(f.style.background\u003d\"url(/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg)\",f.style.cursor\u003d\"default\")}};}).call(this);\u003c\/script\u003e","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:22,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5910974510923776,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592-res.png","width":95},"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004\u0026ntp\u003d1","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","interactive_html":"\u003cstyle\u003e#hplogo{cursor:pointer;height:225px;outline:none;overflow:hidden;position:relative;width:400px;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none}#hplogoc{background:url(/logos/2015/ponyexpress/static.png) no-repeat}#sadoodle{background:#000}\u003c\/style\u003e\u003cdiv id\u003d\"hplogo\" tabindex\u003d\"0\" title\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\"\u003e\u003ccanvas id\u003d\"hplogoc\" style\u003d\"height:100%;width:100%\"\u003e\u003c\/canvas\u003e\u003c\/div\u003e\u003cscript\u003e(function(){window.google||(window.google\u003d{});google.doodle||(google.doodle\u003d{});google.doodle.url\u003d\"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\";google.doodle.alt\u003d\"155th Anniversary of the Pony Express (Test Interactive Doodle)\";google.doodle.share\u003d\"Join the Pony Express to deliver 100 letters! #GoogleDoodle\";google.doodle.shortlink\u003d\"//g.co/doodle/7j375g\";google.doodle.gallery\u003d\"//www.google.com/doodles/155th-anniversary-of-the-pony-express\";google.doodle.hl\u003d\"en\";google.doodle.msgs\u003d{}; google.doodle.score\u003d{rate:1,time:1429254E6,total:972152E3}; if(!google.doodle||!google.doodle.loaded){var a\u003d[\"google\",\"doodle\",\"loaded\"],b\u003dthis;a[0]in b||!b.execScript||b.execScript(\"var \"+a[0]);for(var c;a.length\u0026\u0026(c\u003da.shift());){var d;if(d\u003d!a.length)d\u003d!0;d?b[c]\u003d!0:b[c]\u0026\u0026b[c]!\u003d\u003dObject.prototype[c]?b\u003db[c]:b\u003db[c]\u003d{}}if(window.navigator\u0026\u0026window.navigator.userAgent\u0026\u0026-1\u003d\u003dwindow.navigator.userAgent.indexOf(\"Firefox\")){var e\u003ddocument.createElement(\"script\");e.src\u003d\"/logos/2015/ponyexpress/ponyexpress15-5.js\";e.async\u003d!0;document.body.appendChild(e)}else{var f\u003ddocument.getElementById(\"hplogoc\"); f\u0026\u0026(f.style.background\u003d\"url(/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg)\",f.style.cursor\u003d\"default\")}};}).call(this);\u003c\/script\u003e","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":22,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:22,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"small_image":{"height":41,"image_id":5910974510923776,"image_name":"Smaller","is_animated_gif":false,"slot":23,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592-res.png","width":95},"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios0.json b/components/test/data/search_provider_logos/ddljson_ios0.json index 84001670..e670e3d 100644 --- a/components/test/data/search_provider_logos/ddljson_ios0.json +++ b/components/test/data/search_provider_logos/ddljson_ios0.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYTQ5NjhiZC05NTZhLTRjYmEtOTAyMy1jZTNhY2Q5NTMzNWUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODU5NjkwMEQxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODU5NjkwMEMxQzk3MTFFN0FBRjZGREQ2RkFFRUEyMzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphY2ZhNTExOC0zZTVmLTQxZjAtYTE4Yi01MzliNTczOWFiMGUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2NmViZjFlYy00OTYwLTExN2EtODBlYS1mNTE4ZDlmMDQ1NDgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4GRDF8AAAC/VBMVEWavjiy11HuhigPAgKew0JLLBqmy0Six0AzJg9qcyh3hy+221VANxWFmDZeYiPJ9Vy63FvD7Vi221n///vkgilNMiO85VWkyzlMSBpVVR+y10y631Ws1kG83mXO/F6fxi+Wujj8/fWm0D3X/2PQ5ZVDQRY+IRA7GhDZ6aukxkuTuig1FBWMpDeWuzGZvjSOth/C3nKevj3vizJVMRpdPCWu01KSqjzy+OGYsUSy203I3Y389/Cnx1DvkTyaxiar1Tqu10b3++/l/2qy4ESJsxP3+ent9de98UrvhCO221HG43mpz0S46Ef1eSLviivSdyi61Xay1Fnk78aqyVaaujijvEnzmUqeuEShXiKq00fe6rzo9Mt8SRxwW1CVtDmwz1X0tYv1oleOrjSu20W3113i8LygzC+uy2BnSjZYQD2t20HmfyKu00m24E67ZCKx4Vb37+P+kSr5w5azz2iy10X2rnGupZ+s61r1hyfE+kuq007vchPA0oc4JyGVwxuHcGK9trfSpDfPaSGmui370K6my0p7qQSVin39mDezhBT81AzT/1mSszOk0ixqNRSfuh+TxDvN/06atj/JxLu84k7puwz5iTT84MrX0M/769qPeXvq5+W8w0nmjCvHlRO/6Uri3N3Qlneauj+1zXWLyj2Rmktya27Xqw3p7tT/ojHOskLWjDG1flDglS+231WxkzG71VKfzjyhujisu2729fSFOQ6x62HJyUr8oGr4/f+IqyD3hRp2bRCc0SCfqG6Uzj1COQPj/KZHICxXZwj07fK48lpxlz3018qw4VDYs2ft7fHD52lvjg6w21ey21GvyET/xXzXkk9iJAGjySqh3k+evjjt+uRmHgyBwBHMVhibsDSyzDmri26Iwiqq5UW71kGu10+apSfX+oah10qk90eV3T2p5C2v+F6m20G71E3/8/ua603d6Vec50H38/u02TiCqjCy1ySWyzTL0+Pr//smEQmu002ewztDJhiqz0mpzUiavjy12VP///8AAAACX7fCAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBm/IpZAACdA0lEQVR42uy9CXgb53kumuEY0AADYDAgMdgIoCRIgAxwG4QEQFDmHpPhEoqiFC6SyFC8V1LIUoupUEusyLLkTXaOlNSL7Mh2GifHdmI7tnOO4yRNetqmzdL0JG2enpw2SZsup8s9955zl+e5M8YgQz/3+/5/BgsJUKLs9nGfZiSCBDDr//7f973f8v//e9761fZvbnvPr5rgV6D/avsV6L/afgX6r7Zfgf52tr5ftf2/AtDr6a+13rd6ja0etj74YeBlze9f6+vzw68+zeXqDY7W+5POTr+T7xt1aZ1aUnMG15wuLdnndPpda51akPFr/vrO4Ggf7qZ1ujTYn9E0J+OED/2apsGPP+hKBvvgUJdLg7PC10Gn5vI7g0HY1eVa05xwok4n7NLS8lYTHANf+uGbzvpR5xrcstPJ9zr9TS1vaa7kqN/l7wxqLo3XRl08vHUmXXCXzqAWDAbh9hi4IVens8mpOfuCzl6XBufx46vWyfj9+Orq7IQ7XfOPOuuDyV6t06n1dfrXGK0PngQeG36Cfn9nvV/r1YJavb9+DY7rqyfNUl8PDwut5Nf66vv64Kezvt4FR/QyTnhXDzv4e3v9Tvizl9FIs/ZBi9Yz5HM4tL63vhcauLde6+slp6y/0qf54c9gk3YFPu/r7PXDZZzO3qa3ev1vvaW9BXd5i6ADKn19PDRtJzRVp4bPvmlzbnjv0lwAUhA+93ciSEGEj2HgM20tGOxzOZMIbbIpCZ9BLwBInZ3wF3w4Ct0BGg56xRqch8GTMTz0BDjW73LC9Z30Q7hCkKChOV1ro0l/MtiZbGrqg6vBobhDpzO51jc6CjfSNOqEDtGUTEJHSQKcnU683SR0oXroN/7gqAsOCDaNwpPBKfHL0WQ97NTX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\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAADAFBMVEVHcEwXKj8NIjodb0QiLjUhLzsbc0Q5dk8cNksVgkt8ob4fLDkbKjcZrFUsb0UVjU0aKTciMj4iLDQjKy4iKi0iKCsrRFUnPlcUn1CAi5aLlJ+GhoJpamhTdpQcIyMgJSccIyIgKiokKy8lLjIjKi0gJiglLTEmMDTM0dKmpZ8gaT81RlJ0foxedYm2vME8PzwuO0Lp6OJITEswODMjJis9UVolOTk1SmGXnaZ0dXEpOU9FYXtYZnclNC0dJSVGXF0KfkZFomg1kVp+fnlZXF1/oIeHq5BLZWEXYjhZpnPa3b8ZTTNZdGrMycPZ2dO4trBjj3Jwlnz37NHs58sTaz+hoJqcmpXl5N+ssbgpPFGry6TX1c3PzseWlI9DWHC/zLz59O9Og2FNa4jB1LC0xbPx7ujp5t5xsoOqvqz28ert6N/w6uLy7eQcJCNSdZePjomft6Pu6+STr5mUw5Zaf0FqiEUYHyBSfKkrO1HYfQATOCijnUz5hwAUGx03UW3wskX/fwCwewvXtlQ5cUL9/PiqplDxxF6DeCXtwFXkv1nrozUQFhnf3dbk4drDwbqwr6kuSD/ovlVZiGne2tPj39e7ubOtq6bjvFX6fgBFfVjU0cpIeUO0sqyqqKPp49vb18+/vbbeulT4myDIxb96j0jkw1/5kgugp7AvQlk+X4vBuWLmyWnAxcmEmE3rz3Ps1X77qDja3t+Umky2qVChfE6+nUdONB5qUzhgPCOITysKDxSNYT69d0g7JRXJrVDMhE4hFAsICQy9ajkCAQAmLCTArlLPslJ3RiecWDCrZjo+aVxEeGr61Kc1VkzTbzfKkmXhrX7Ymmm7h1/EqojitpT3vpDzy5/aonfttYDprXX73rTkoW7XklooN0vu4pKMqbjP5eu20d0gVlaTuMpig6B5mbChxtt7q9SCs92OwOpzostpl8BNlM1fi7EiQGY3eaeJuuU0VIEnSHUZNVpGZZo2TGlbgcBAhbstYZhFco4udY4oZHZQpOc7ZJBQo+hYnNZjU8jJAAABAHRSTlMAIAerf1z//xH/VU06////LW+TqsHV0bf//////9D27/v/6Pb/////////////////////////////9P///////////////////////////////////////+L////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v////////7///////////b///94/v//qtyDm/v0pQAAnmpJREFUeAHsxTESgCAMBMAL0RMUlf+/Vmt7BsbcNgv5JRExQzCSfEEwsnJLCEVyIVdIKE7S0YPsGVM6Cl8VEkc+C3nRIf2kz6P5eReSl2GAbJiUVWu1PYRQ12IDIQwLreniOvDInlzm//9gZV/GY3TDMljGAm9KCaHrUqnEomamVwirOK4Z3isfglzpA2ZjU4POlKsIE6GjkEwIyvFExR+5nsASKVTCUisHZ6FcykspkqnmvzRKpSsVJVK5Ui0Fc/rQHUgXY0cMgDh3Y/X7e/rmeO1KetSUv9AkmA5ppMFiITojDgErGAouwgaTc1GOscVDLF1Z0Oul2Gy+0MGjLccKEuuRQzpZIYtmRJUEnBkdJICEcoa5TH5sydgk0Jii1oLLyQR4WVeA8FzFTDmPniKv15vter3bNMcGb7/fH47HPd7+1PetWRtgBmp2T1vv36m1E8qctx6544QHMIMazpqRNmNFAvn5YlHi0qhCLwhcccK2RG/tm8CPiYqCwLKi7p+1ssCOHAaC6DIzox2721XhDNizzHT/G+2UFHWY82213Ga9LyAAgyNhAOiuiP0wGO/Ppaf5fZlqUdMhcN1B2/uUSlAyEgFBeAPXUYZMh4wkbSura+sbOR2NxxOQRL4kpkvrI1Dseju3fQbuUHDv5aPvvd/GgFyTul4uto+OI71rqoXGHHWSXnvj+hRpQtK1D8PTMC/5GWvLTabTOU29gFmsOsITxXJLa28mJkgzXZd2U1SYd5H53TRpV8o5xkBAuIe6w1h+cXdzer82S880COLQHWeH+/3Nu7VR6Qjv309R4ByQH16zsKffRi+Sai/WPdchnil6Pwyqivf2yrGkV11XOaqk3Gp03ebvm8gaP376/FHa2tHck3zYqAgXcSgYwdqZHs7XaVSV8mDWlkAzBpwRpMo+4Jh8md2/f/+FRvryteVlnC8kPToNsS8c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\u003d\u003d","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios0_fp.json b/components/test/data/search_provider_logos/ddljson_ios0_fp.json index a66e7f58..63d9351 100644 --- a/components/test/data/search_provider_logos/ddljson_ios0_fp.json +++ b/components/test/data/search_provider_logos/ddljson_ios0_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Tama\u0027s 18th Birthday","doodle_type":"SIMPLE","fingerprint":"735c8999","gallery_url":"http://www.google.com/doodles/tamas-18th-birthday","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/wyeF_2wwEDE_ln_ZBDbWYHMFkfhFCHZuXG68UBqCrJEMdHmzG7bOuVJFfKYfK96FgpyO98XDNdkko4vEoXC2EpZYu_HA7jtQd7N9fPmc","height":200,"image_id":6291066231717888,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2017/tamas-18th-birthday-4812762818543616.2-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Tama\u0027s 18th birthday! #GoogleDoodle\nhttps://g.co/doodle/mzbmtf","short_link":"//g.co/doodle/mzbmtf","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Mary G. Ross\u0027 110th birthday","doodle_type":"SIMPLE","fingerprint":"151314e7","gallery_url":"http://www.google.com/doodles/mary-g-ross-110th-birthday?hl\u003den","header_layout":"LEGACY","id":0,"intent":"BUILTIN","large_image":{"alternate_url":"https://lh3.googleusercontent.com/4WMMyZBIzhWnJi-lfknABhr9C0wdLV3LHhoOSxVJEX0ml6i8KxAfBs5lYvVgqeJ2QtDDm5ARqzOjXxOP0tRgHsAAl427PNU9rjcpshQ","height":200,"image_id":5629499534213120,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2018/mary-g-ross-110th-birthday-4781894964084736-l.png","width":500},"log_url":"/async/ddllog?async\u003ddoodle:0,slot:27,type:1,cta:0","search_url":"/search?q\u003dtest","share_text":"Mary G. Ross\u0027 110th birthday! #GoogleDoodle\nhttps://g.co/doodle/b8nb2p","short_link":"//g.co/doodle/b8nb2p","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dtest\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios1.json b/components/test/data/search_provider_logos/ddljson_ios1.json index 9dbb5383..5a3e040 100644 --- a/components/test/data/search_provider_logos/ddljson_ios1.json +++ b/components/test/data/search_provider_logos/ddljson_ios1.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAADICAMAAACJWIs0AAAAA3NCSVQICAjb4U/gAAAC/VBMVEUAWs3sIXKzPpzz3rP/QrW0xdzf4ee1zrVPSbz/W8Cypc7fOJa1vLTewLXuvbzrR5qytrPk4sMAYte13ue+1LzjtbP2/PeWRK7rtcLiyMHg3trosLDuMnocbNz+z7MAWt745eY8ZdzRzMHvx72lYK34MpS+4uMDaeSzz+7tg6mxmNHmNIzyl8bzerjh0rftcKb9u9e9v7r/0O6MdcfDsd7u49v777y11rX70ObgVZggVdCw0sn69+3svNV2Tbr3tbXDjs/i6/D/37TzxtnuNInUN43zts203e3QmNb/M5m9vsbyjMBLft3uMZXB6++0ecAAW+cAY+YAbPfR1db+5b72zbTlys7VjtHF1sPvKnvCs7pqUMD0/f70QofSyNzvv7W13rTqXKXFwNPv7/Gz1uDlfb/qZ7L19trGxLqoRK3psLP35rT3OKP28sj85PH2R6e/zrXYY6L39/cAVNbMzMz54bzB1eBrg9csZOP41r7Ov8zvtbX5p9nrvcq25++1vcL3tdfQ4O/1MnzCcrbR3+De594AbvC0zuWMSLLg1tG9v87/57ZPWs3OxNhOXde4Rqezz9Tn7+f6VZW/zeDvO5W82Li1w9QAd/ru0bbFxM3x09vwKXPvt87SgsPUsbTTxLWLitf2M4v/7sjMX6j////77/Tw9/P+iMkZXt215ef6Va7Ez8+/3r37ybD+9/j+fcji0b73wLXl9/Y8UMb/1rQAZN6wxc7+bb7FxdbDwcX27rXUPqDyTIx1WMjNwNXnOJP55tz+/vTT2s74NpTu4sMeburFZq731bTFvs78TpnU39ULfPj2b6MAY+/5OZ3S1sX/9NkAWtby2cj348j5a7YvVc/S8fXT0LW73LfT1uFoX8z/58i3z97/Oab/RavyysnExt3kNoziytmzvs6zvtWNV8DylbFagdoJbu/2vb/nwLMrdd/+V7X+m9YQaeL57+bl6NxSVMdQcdi/1c33vNXwWpW1xbS019W1tr3h0MPAPJv8uNXo6Ob2YJmz1O9NfvOhAAAA/3RSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5KxIAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAIABJREFUeJztnQlc1HX+/yUP6iGgKUwyS4GY0q5Hoj+QVZT1qFYSYzgMMyQdUlRAG8EkRHNyUHRNSZQBEsKF8aoxD0pCBQddbIRRwDSP0dV+/TQswFIUG/fx/1zfcw5g5jvan+W1GwzDOAw8531+3p/Pt1tRlzqfuj3pF9AlO6iLamdUF9XOqC6qnVFdVDujuqh2RnVRfTJS2/XZu6h2RnVRfTLqstUudVRdVDujuqh2RnVR7YzqotoZ1UW1M6qLamdUF9XOqC6qnVFdVDujuqh2RnVR7YzqoiqYVFKDwZApetIvA+oJUlXLiovtu3RhNxm9bFWmVuPqCBV1JkqjUKmeLNwnRVUt9ZsMlJvrVVxcLBP86UWit98W/EnN/jCZxpEvjULxBME+IaqGGTM+/f33kViTJ/sZpAKRfVulUr194Pz03dOHDFEJ85QmxHpmlVQR5ToGyAhsVJRCqrLfa7CkJ0JVlOGe9umnBOrvQHeB0RpscsciYJ0HJk48P2TI7t0rd78GFBs7UbAXzP9hmJVIlqnVAr87xiRULFctklgrblbJRI/LfJ8IVYM7pHoXCHG9SzQ5sViqVneILUR5fvqQ6cAyV67cDbQSfXoNYbUbVZmoSJaZqXV1RUY6xhJVNmAgjSLTxC8h+At8ElRlGe4DBnyKsRK9CoTATg4I8PJKtIxWBK1FNfHAgfPnpyOULAGaFNX7a+z0+jMN2iiYGr3zzhiu2ibr6NgSZeD/OiZA26gnQdVvRhowVSQ2VcwVkp0ckOuV6JUI8ygTeFVDAM3pQ9gs+2Ox2QJbHWKPFy8zaB1dHccYiU/PPOQWDdc4+ZQF0BOgKp1x91NGd2Fc/f1VWr9T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","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:27,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAADZCAMAAABy6UUDAAADAFBMVEVHcEyVmXmjmnp9jXpscYJpaYJhgH9Lln5UhHtCh3ZxdYKYm3mMm3uTmnqdm3l8mn2EknZscINpaYJsZoJViIFKmX9Mln9RmIFqn4J6pn9ZmH9bgYFraIJqa4Jfe4FjcIFSj4BPk39pa4NXeHxCh3ZYinVmbIJqjXZzj3Z8kXWDg3xpZ4Nydn6Ok3aflXWKinqXk3WkmXZwcIFpaoNIg3c+iHVNiXVhjHZec35QfnpmhHyrm3Z4d4BnZoJkd4Jufnt1gnx6iHpqbIJ/e3+Dmnxrcn5imH5ocYJrboNra4NjZYGIqn50mX23n3hsmH1wdoNuc4NuaYRtcYN+fot1cItybolvbYafo4Tv0sbXtq6KkJVxdYOMoIPuyLP/6dZ4co5pan5sbIVnanhgYG1YXWNPT1FKSkpISEhtYFiwlqHBuapWVlp7bmD/48VCREWShIajjKN8oolvkptxeYuSqY+7naiAqZOUvJ95gZWer6E6g3Kqya2Sn55mpZFKiX1goYxBjXu81LhuqJahwKZvdIeIs5t2rppYnIdflo5ZiYiqqo+xtZ1qh5E/lYVhiI2DeZc7oZJ1hp1yfpF8dJF/d5SstLd0jp6Lfp5olJV6hKKLtqyokK97jKSSgqWHfJuPgKHMqazlvqyYhqhwhpj/1rX/3b7/38P/2rr/4MZ+saPSs5j5zbD/4sn/7b3/5MyEiKqhhNerf/DFk/PftOFbUUrQsYWOdmVloMSxgf+2gv+ufv3yypf/2p7hv5W6hf//1pz805qylr2eiq//5dB7rc6CYcmYc9pqUbAmJmaje+eSeMS/ppQjJGI+NYCojoUrKWtUQ5h8nLv8zZT8xoz4v4jvrod4jaH4r4XTn4SEdK2/lH92b5bzrXjkrY7olGzacF3rpHSZtMGrgmv/tId3la/Yjnz+sIH/5LD/wHr/uXD/vm7/vHH9rmrrj1X1oGB6tNiNtMyAs9SBttdspchzqs1emr+/YHXPd3jGanfBZHZyjpx+h6f5wpHBZHZKSktdmr/AOsn2AAABAHRSTlMAZVx8jpGZr6a5if//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////iHw/gbCdEjKUIQAAZf5JREFUeAHs0FWCRSEMA9Bh0qSF/e/3uvvns4O7/L2hnzT57xKQYJzJO4KabNsdq841H0nuwVnkYIFgNHRHNqE5u3CiHJE7UnCj6+9KXioAumdN+jq4o+5+4Q1eUPiKSHbFI+EhI9F/csN4ZrxzMqImtDwXE8SeKP6vnwTC0ixcBHu5UoVENBBsqVvf/2X2XK64mKITuxOc4TfnDJf1cmQNQRQbIu4NScKDIN4J8i/KOVRNNxDNVrujm6T61NI6+FA3u7phE+VrqAr/N83Re31T17vq+ZvBcDRWJtPZnC5c1/X8IPTcIMTLiCo8luNhbA+T4XCY3D/cXx6frIYsbHWVpEvlSvTXdwLrDG2F4YZFiGcplBruI80uUkkXRRLVRMW9MVG+CUKI3XV04xw9A2+6RFHznt7LVeVWEBu9PCmUFoEru7NisZVlf5d9m0sjr4ww9JVsH85rWWdkANaQ0BvuYShJwkE4rOn5x/q81Fa71XTyc0OdEplm6o71XYc2/6eu4ujOGF3tSPXVeDhcqU+jh2J5nHkemG1QWhR4gTw7nn80TuwUyMBs9HxJhgySYTxMVuogSa+dKfLyfHcAMnQGZhU0vBLEUJQLi9bnC8jGHJnx8g0yolqmY+g1YobGAGKEiZobjPctZMs0iW1K6EJ2i/HyeJy7s6k729PvcrN56HlBgKL9DK/33yCrguksLEdREO7W4yqtbAXRbrd0rWoib3GVabpGvnaYa2wI0QsZA2uu69o/IkuTAXmdTiYv1He9wMfPYY7o3HMxdm+nFkiarAZJHDOZPY8uZNaPS5Q2O85VZHbnwJEhKqUhyleisH2lF8gMmyP77uyTvunUefXwRte6Pfa4IwQ6024SGyepslRodzIrovnTbCqFs8DzgOO7ZPhOyETGTowfRvQrMlGsmEnQGEZRhNJgjtX523XKep/bsMacXCDratzy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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:27,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios1_fp.json b/components/test/data/search_provider_logos/ddljson_ios1_fp.json index ba37e4ac..84a3072 100644 --- a/components/test/data/search_provider_logos/ddljson_ios1_fp.json +++ b/components/test/data/search_provider_logos/ddljson_ios1_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Gilbert Baker\u0027s 66th birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"b2d3e5e8","gallery_url":"http://www.google.com/doodles/gilbert-bakers-66th-birthday","header_layout":"LEGACY","id":37727880,"intent":"BUILTIN","large_cta_image":{"height":200,"image_id":4817033455730688,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.2-scta.png","width":469},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/zCtRFJP-Rz8iKp1XXnazo9vWr2YMBb-vEzhr1C3-QfEQpEhzMyajvLqSMDS6wPpOEImC7RdfdwxiI9ofoKahlSCu5HJ65bc0lIeHyHs0","height":200,"image_id":5661458385862656,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2017/gilbert-bakers-66th-birthday-6016396013076480.8-law.gif","width":469},"log_url":"/async/ddllog?async\u003ddoodle:37727880,slot:27,type:1,cta:0","search_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480","share_text":"Gilbert Baker\u0027s 66th birthday\nhttps://g.co/doodle/2ythp4","short_link":"//g.co/doodle/2ythp4","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dGilbert+Baker\u0026oi\u003dddle\u0026ct\u003dgilbert-bakers-66th-birthday-6016396013076480\u0026source\u003ddoodle-ntp","time_to_live_ms":486998666000}} \ No newline at end of file +{"ddljson":{"alt_text":"Prayoon Yomyiam\u0027s 85th Birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:26,type:1,cta:1","doodle_type":"ANIMATED","fingerprint":"9eefd996","gallery_url":"http://www.google.com/doodles/prayoon-yomyiams-85th-birthday?hl\u003den","header_layout":"LEGACY","id":69128162,"iframe_height_px":217,"iframe_width_px":434,"intent":"BUILTIN","large_cta_image":{"height":217,"image_id":4905660105883648,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904.2-scta.png","width":434},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/RMr0-ruAIq-5Z5He0s8p8tmIsP_GVONwIDEEiOWtzOeFLQ9xsM9JluujPSmpokDR_bDlo-oNzuyMZQmjb3p_gJEijB3QJmaEte_XJDW0nA","height":215,"image_id":5750085036015616,"image_name":"LargeAnimatedWhite","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2018/prayoon-yomyiams-85th-birthday-4927560591867904-law.gif","width":430},"log_url":"/async/ddllog?async\u003ddoodle:69128162,slot:27,type:1,cta:0","search_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den","share_text":"Prayoon Yomyiam\u0027s 85th Birthday #GoogleDoodle\nhttps://g.co/doodle/2645d6","short_link":"//g.co/doodle/2645d6","show_now_header_search_affordance":false,"show_now_header_share_button":true,"target_url":"/search?q\u003dPrayoon+Yomyiam\u0026oi\u003dddle\u0026ct\u003dprayoon-yomyiams-85th-birthday-4927560591867904-law\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124901000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios2.json b/components/test/data/search_provider_logos/ddljson_ios2.json index e32feea..4a94989 100644 --- a/components/test/data/search_provider_logos/ddljson_ios2.json +++ b/components/test/data/search_provider_logos/ddljson_ios2.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_data_uri":"data:image/png;base64,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","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios2_fp.json b/components/test/data/search_provider_logos/ddljson_ios2_fp.json index 9aa57e3..87de73b 100644 --- a/components/test/data/search_provider_logos/ddljson_ios2_fp.json +++ b/components/test/data/search_provider_logos/ddljson_ios2_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Happy Halloween!","cta_log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:26,type:1,cta:1","doodle_type":"INTERACTIVE","fingerprint":"4438a87d","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","gallery_url":"http://www.google.com/doodles/halloween-2016?hl\u003den","header_layout":"LEGACY","id":28464230,"iframe_height_px":230,"iframe_width_px":460,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2016/halloween-2016-5643419163557888.5-scta.png","width":460},"large_image":{"height":220,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2016/halloween-2016-5643419163557888-cta.gif","width":429},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:28464230,slot:27,type:1,cta:0","screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dHalloween\u0026oi\u003dddle\u0026ct\u003dhalloween-2016-5643419163557888\u0026hl\u003den","share_text":"Happy Halloween 2016! #GoogleDoodle\nhttps://g.co/doodle/vu3nqy","short_link":"//g.co/doodle/vu3nqy","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d28464230\u0026hl\u003den\u0026data_push_epoch\u003d2000000002","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios3.json b/components/test/data/search_provider_logos/ddljson_ios3.json index 1ec3d5567..05233eb 100644 --- a/components/test/data/search_provider_logos/ddljson_ios3.json +++ b/components/test/data/search_provider_logos/ddljson_ios3.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJf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\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_data_uri":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAADmCAMAAAAweAhcAAAAA3NCSVQICAjb4U/gAAADAFBMVEX/////1hD/zhD2xg+UhCqMey4pMUj/1hD/zhCUhCr/zhCchSn/1hD/zhC1myH/2Qj/zhC1myH/2Qj/zhAiLUn/2Qj/zhD/2Qj/zhC+pR//2Qj/zhDctxgiLUn/zhD/zhApMUj/2Qj/1hD/zhDvxRI8QkI4OkAyOUIvNUYpMUgiLUn/1hD/zhD2xg9KSkBFSEAyOUIvNUYpMUgiLUn/2Qj/1hD/zhD3zhBSUjsyOUIvNUYpMUgAAAD////1+Pj//5nu7u7j4+PM6+G86di26tb/5hKt58//3hH/3gm03c7/2Qio3sz/1hCl3cbMzMz/zhCn1sX3zhDmzj6c1cTvzhCd1L/Ew8P2xg+fzr7vxRKUz72RzrfnwQ+YyLqzvL3mvRaTxbSdwrjevhiLxbWxtrTctxiJv7OLvq6jtbSUu7DWtRmEvq3MtD57vaelra7Urg6JtavPrRmcrayFtaW7rVDHrBt6taicqKucpafGph6JqqWop2KVo6W+pR+EqZtwrpx2rKN6qZy7nSGZmZmYoFpspZxupZR/oZS1myGMm5xjp5ODnZuZmWa5mAyUlJSjl0StlCOElJV7m2ttmZNlnI1hnJSwkgt6lJSnkSVxloeCkoWHjpCljSdbmYl7jI6ejChlko10jIxTlIVokW1hj4SEhISlhwuchSlyhouIhlFTjopWjoNzhISUhCqdggptg4VMiYV3fH2PfSxbhH9pfoeMey58e1ZJhIFSg3tWgnCReAloeHtCg3Zxc3SEczBOe3Z8cjFAfHFicXNPc3J6bDJobV2DbAl0ajNZamxmZmY4cmpBb2xQaWVpYjllYzlgYWFPY2t1YAg8aGEzZmZiWzlbWTlNWGNOWFNoVgdZVDtLVVtSUjs+VFkrV1NKSkBNSjlYSgZBSVBFSEBCQkIgS0c8QkI6QkonRkQ4PklKPQU4OkA8PCU1OjsyOUIxOUkvNUYzMzM+MgQoMzgpMUgiLUkmKjE0KQMhJSooIAIaHSEVGRkdGAIWEAEPEBMICAgAAACHvmIfAAABAHRSTlMAERERERERIiIiMzNERERVVVVmZmZ3d4iIiJmZmZmqu7vMzMzMzMzMzMzM3d3d3d3d3d3d7u7u7u7u7u7u////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xmmAmwAAAAlwSFlzAAAt+wAALfsB/IdK5wAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHic7H0PQFTnlS9Nmjw3fem2W19es2n+dJvsbtO0291m3WarWa2GjMMgzI4EZgAHGQFlKhUogxgQJAsBbVOIUsnKHzFmmdVhR1GqFoOKbDExaGpAiyRYIGOn93nnWq+uq1v1nfP9u98Mg7G7b1/2vfINcGeGO3fu/c73O+d3zne+c2Niptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SbbtNtuk236Tbdptt0m27TbbpNt+k23abbdJtu0226TbfpNt2m23SLbHfxJzMe+tJDMyLfnG4fW/v8V7/6OfLkrkcTEhIeJSKZ8chTX7r/Yz2r3+V2/wNEIA8kgzw+Q95IwEYE8oWEhOSnET4zHvjcjNscY7r9J7TPgRQeuTsm5vFkc3LCQ/jOfxeSuZs8A8HdPysh4UvTovm/1O66D7v6rqeg75NBDI+gEP4H+c8jFovlEXxy9xet8OZ/Z//8PL5137R8/rPbfU8lzAI03DULO/0PQApftVge/+S99947857PfqHmC5/9vZn33hsz86vmWSiQP8KdHkITlJz80DQp+M9tX8XOvi8m5iFzgvlLn4y5d+anTvQ98adfV4LPKH+t67qmPxN4ZvZj3+z52u/NjImZ+bQ5wQLY+Xwy1W7T7T+lzcBBfzealYTfh2cPfrfkazNnjwUv63pIVYKqElJJg2faBV1XLj8ze/bMf8p//NOwL7K2hEfEQabb/8l210OzngIFddcXoY+f/nTMzJmPfT0E8ggSUbBNSMG34Ie8o4S0C98K/cnDM++95wEzxcyMR2c99ZmP+0r+f2ufT6Ds+L7H/9L+4MOzr19FiCBOgkQK+Ajic7Lh0oJflNVjDz9unYX87VHA26z7Pu5L+f+sEYX0h/BkZs/XLmtaSGH9r6hEQhQtKnlTJZghL1Sq58a1bz4BH717VsK0vfk/2O66D23DQ9Cn5s/eO/OPnwlpKlFZisqkQ1UZ02sEO0xK9P9EQJoy+7GZMT9JZh7PjGkS/R9v938p4SnozBl/ZJ6V//A3mRCIylJC1Jww3UVlExQ2h4mKqTvYS5n92e9anv6fxGYlPDJNBf6DjbiUs6AbP/nZ4b8OsH5WiZFnHc9gQt5WVPagglHELuS1enm85/diaPyAOqDT7d/f7kugDsy9T17WRT8zdChcLBQ/iszQgoYQuSzhR/vWX8y8N+YP8ZCPftxX9v96I87+Vz71sGxKODqC3NIYaoxLgXIDYYEMBIWUP5/54NPTmPkPtfsfQN/j97/ytL3nSS4YRZKAQpGiMl6mGFxACVEFxhq3RZyyPVE26y8f/cR0JPrf2x6gMa+YTz74rctcH3HDYSgoRRj9SA2mBC9du37t2vUrl5h0hGMaUr/2qRgSgkt4alo0v3UjaiwZDMzDYGCECmM6TOW9LzFlob7I2yCLG7du3bp5A3+vX+FajR0p9I2ZMdTcPPRxX+f/e20G9pv50zP/xHBXmCozbIcimxjuz5D9Ll2/fhMEc+vatVuk3bgQYrvyIz12zxdENG26/Vbt0WSz5atPGOMcEUN0UYDaDUrDwt1LHgm4dJMK5Na1i+zJ9aDwhNiTbzyYyadDp9udthkY2/rEHz5e9DXBkGUbw6XBLL8MGvpHuU6lcePmhYu4IZLBDxjYU4Pa5Z7HH/2DGB5kmG530D4/K+FRtMwzv6ZJ/qPKbQhXa8LyS6iitoeosJtvzJu3aN6ivGVzF8Hra8EwtUeOoz92D3zL555KmE7nuLP2mWQavHz4ChWCCI9JdJk9uF9j/I/0O9Flb84RLe/mrRvICcJUIyo/IAL/DZnGl6ZRcyeNzEB+6Z7Z10KMjfEImbA1ksUXgqL7hghdRvV1Y54hmTmg025cvaIEJSHSTz4z89M4d5MwTZ7vpH0GSdkXvnE5pMp0ShIER5IIixmIoSYEtdmFOfNeYMKZO+ckMTtXJCHyg33rCZyLe2oaM3fUHnr66dxxjXMoFgzjCo1HkbnXyPmWQFMweP4qyOGtZVtWv7JszpxnX3hlyyu7CXO+YgjYEOZEz1Pmp6btzEe2Gffj6P30p/5aU41ZZB6FESZfIMaw6Ya6u3KVuDJvLpozd+6iZXMWLXth7ryXCCW4rkqsWchTf+JTd4tvnm5TtAdmJTwFjPneb2k8YilYMZGBIsXHBG2jYmKvL91gDsybi964MD7vhUVz8i6eyctj/uYl5qGGZO/0/MMxhA9O5wxO3UjI/4sx92pGlF+wYsnoGD5JeIATjf91Jphbu194c/cr85YBaF5666Vl7M0bQUUSqXBQZ8fcjzk50xMDUzYypfWVT31DRPuFRFThukf4JJSNGb4Od/5vnZzzLPLlZfh3zhv83UtBGXFcu+kPfxYZ2lN3f9wd8F+2IWYsj39LwIXFhyUqJlRaBBsT8bIrXDQX5xJPJo+Qs3EuGRFxM+Z4cKv1fWV6Mu227XOznv4qsrKw2DH3VYSFiWRjEmO7IOzMxUWAlrmvvALM+dlFJ43oGcbdJGeTHUfr+Ipl2s7crs34vSc0CS4SIKhFUY1QmeFlyoztCkfHzUUAmnmL8O+zz7K45jXYJSTbJnGY0F/PnM5Dm6Ld99AjGPd9WKMKS5WmjLkgVD47GZT8EZGnyXAgDM1ugMxLL+WtBtAsom9e5drPiCbwKWtV/ea9MTF3ff6RB6a5c0S7D8NXvx8zU/S3mDwWRj/steHJy5ll8PwaF83N1XPmnblx68YLc+ZO3GKSuaCGBQBEYgf+/vm9JN1weiotopHs2EfuDYj+DgtShht9mpUp8SuhldSgMTWDopmT99K8OfOE/b96xRAynd7hZA83j31qOoQWpX2e0LK/EGZfRoVs9CMzZXgmMxNn8NIto918BYnZvDPGOzeCYdSbazJ6OO1rX5yWzOSG2swyoAuvXprvl+mtHF2eLER43Lglt/FXli1b9Jb0xrUgyVKXogkKnSXFAwRKADTTK6Ai230PPfTgZWmOJRhuTySDb8ybMSPBlBmRX7hkbm2ZN3fOGfmNK0EjadAIkBJZhbQ/e/APpxlAlHbPNzQxGWMk+kV6+jJowpQSdUovhQnmDEYARuV3rp03TJjIWQ8xoGoPf9x98F+tPfDI5z8REzM7xIL6PM1F5RHhCOfDCHIas5qcpxkODYqBTNCMRWJGBiJLD+TRoJkxMfc/9Mj0pABrDyVjZGTmlZAc0Q8pkjy4YxPiCTIiRiDR3yAQACBnwM0YPbu4iEycyXbmujQJJyZ9JFLw5zEzv5qQMGtaNKTNwNll86euhVROtziBktIAWPfLPABFQTNkUaTqpUtXrl69eunqxMTNG2fAg7nyxrN0SpOHMzEjUJ4NlSdL+V/t4S+Yp7PQeJuBTqblm9zR5xmYRi4yn0ILc0Yw4eLSFRDGtWsgkCsXLkycObn7lSWL5j07Z9myOXOWvTCXJwHMYzMDNy+dl9JuOS7ZfA2HzZUv2KfdTdFAm5nzA8KISzl9TNmEFGGxud2/cvXalYtjZ97a/cZLq5ctWjRv7rPPGgkZ0lNsq4Uqi5jbkRQmD2Nrw5ZpbWa0Bx558Imgyk2KwZYMsAjjQ4zMpQtn39qSB9KYE7U9++2IN7ZQ23Pt6rUw30igRxKPqj340EPTgjHazK8zpISIUEIGW5IiY5SkgWCUF6aQCW3fjpTMnEVvnTlz8ZW58964eiloMD7JmBnfoD75cffFf5V21/0Yfp99LciRwlUadzVYrjJHVDB4dWLR7eQCklkwN/KtZ+fOJeJ64eKl4IWItZ2KtA4K3tRm8pP63W73fQnzMWfeDPI8ZSMaY8wBGOQW/nX1zUn9LhrRb3NjF8wPf3vewoXzv00/Ne/sRTHzI+cSGNEG9esx9zw9TQJI8QTLZx/T2LojntwfUiQ6YFjoYPDS1dVcCqSFq7V5u+c9++yC2NgF8tvzEjNSEuO+zd5apDL3Ul7bKcflFG0mYc6/66sEsMKPpf1Jvu6IwYYOXmnCmek35WqAa7LVr7yxu/fk2ZNvvfXmW2++8QoQNODLYFDmPRsXHxcvQPPst1OyM5JSkhYK27PlimB8YZObBnr++KtYheuBj7trPuaGJcgsA7oczGdxeWmijCIJ/Mlrb3FN9oqvuL7N5/ft7e49dqx3t+/NXpDR7jfytrz17XhHfFzct5lcEtNTkpISkxIN0zN3TMSoVbQ54c4mvtZqzLy64O9wm/HorKcf1FlHhQVkDBrAjEDw0rVXOBJ2n27x+30+nxd+6ovzCpYvX55XWrulxffGlqTUeFt8/ALQc89+e2F6Yjy+ilso6bclEfnNhmDYl2tfe2TWrN91yECb8emZE0ZYUVIrPLLF05euXuSabNHJ0y0+Khd/W21BcUFB7e53z46NjZ1917c01RafZIuLnT/32/MTE+PiQSyxoN9kTrD7qrD5nKHxiAMV0rfumU6lJW32+yExfMNnLmX2dO0kS+2f98ZYbwsoMsSLv2U1yKX+3aB6iVj2i2fdjnibLSk+Nm7BgtjEuLg4oAOxtsSkFIkTzB27wumflEQrrWFTpmcD7nvgc58AyhyS+ocxJOZjhtjr4BWuyea9cea010sB4/NvKS4uKD3GI22wZ2+qLQlAkxQXHwuiAbHAX8CQI2MuRtM4W7t6MSTon6zHuPZ85l48td9h3HxmVkLCo5988iqnr9I0v5hzpDHla8oLpEvz3hw77WtjcgHEgGDqx1Qjjh/sTrUlxselJiU5mFwWLAA5JSWllL7k2yJws+yayhPYwiNpzAJpM3H2+9HfXdE8Ds6M+cFvqBF6nrwOsC3pwOvIyeblvXXm7DFfCxULsTOlIJjzqnBD4c+xnCSwLK5UV2qsy01kE5sEILI5lryxZItgdnPeuMbjDWFLC3gCovbEQ7/TpTfv/qo5OcHSpfNuFXpe5cEzIqfzV66+BMN891sne71tTI+RH39tQR4iRu7as+vSgYyllrtSPeVgb8DaxDtQvdmW9rYs33JSiObM1SDPjJLmgThFVJ9xJvxOuzSYyvRX39T4cDXcDOa+EB0FmmzRnNUnd5fWt1GseBlo/C0FxaVnWc1GoQ67cxzxLtf6leXlqS5H7II4B0AGTI9rldfvW/LSGb56c97FSyyNZvJ6HEzWaDL/Thd2vOvzX3r0s5eFQ0FFwW0+i5hcAu9y3pmTyxcVAx0TcCGyAV3WfSliBlQda8t2xJevbwbUJMWnriwH7ybRFu9yb/D56kuX7x7lonnhujRjGs4C4Vihxx54/NHf6fjMXTEzDRecGxbZv7ykgCZb3ftCcf3qWq+MGIBMcUHteXnSmFrw9wtdqanr17tWQgPUxIEqi3e4czb764trffW9EyKKcJ1/pYQYMQHx5/d+3F3zsbfHFINYSR3F82XfwDH+UnGp318LHeuXQVNbnNcrT35xQ7ExNS7eluRIddli5y+Ii8MYgMu9xteyuhS8oM0nx7loTl4LCltmpOZy/jzz4+6Yj7Pd/8D9Mfc+I8esiOHnlBnevfTm3NVbYHjX+wEipcX1DDTkr7e0oHTM6FTO7FTVn4oRmVRogBu3y+VyuMpdG7zs4y3vn2Hkee7FKyKdkM9yGnJ+OOauz33c5c/4ql6xvS9yO+OOtnexz0/ezoi6xQJmD8wc5VPKosyiQWZDV14oPXblpTm9GCLz168urjdAg8psi0i04KJEMe3JiY8FEgC6zL0SNuUry5vXV9SXFtfSj7YoXDSLrhnxOXn5Bnn6p59+VJQ/u49Rgf/L28/NIsVdJ2+fir4F95AUChfbpya9nhWxFfuhg3A/e5+kzMx6EMtjXpCnMo3My+CV3XndbS0n553xkhBZbXFpi5/TM199cV43RouDRudSIR1zJyUBXFId8bG2pFT3ypXr12eswc8ymbZc4KJ56bq8lMCwNfjz9S9YWBLNXY8kkFK18had0Lseus12hrHFDBS2nfWlqK/Zumq+/Xwy2ZI6Yl+6i26fYh321F2/5XYGrRQ3667JW1I8dsakLf1Cy8hl1aBmfIqZ0Vf17Gq/vzRvy0vHqBfjr80r5QTA668vKDgm8CZpQ/WdwnSbIzXVDTIp95QDbMrdq+qLJby1XJhgDO3N60GjgLDIDyDPtRoLSzx7gJWqjdx+7k62INrPsVvk8O1nJm3pFxlbeP8RWksElybQ7d3s1kczptjeJ7b33dH2/knbGWwb8wlcR/TVoAj3RswuwnPtpNdf+0L3S2/5mXFpA5Xk46CpLS5494JhpDA9kx7lbEU6MgBHUrwtDgPNrpU59asLav0Gs2sZC1DRzJ2gpsaomSYoiN7zNIsCPMIq1PEtFvXG1bZ3vE2mW1pP56O3D7DtjL9MwDX4Mf/t6Ygtrvb94t0xn8DXf8S2+Brf/0oM294ttneHbT9hvP4j9lre/uUn4IrvfvQrf0i9Gb6KhUOGLQYMdvvrlxSfPdnNA5i+Fj70iW4rOM1QRgpl8kOoY+sKHbGx8Rj/j4Pf1HL3htJiA2y+lrbu3ivX6HL0RReNUvXGmk+yfewzj3+RBAH+AHv4f3z09vcRZP8zytYcfXu/vP3DyduYmU8lPP6pmHtjZn4x+fFP3QOvH5e2+P6XrI9/mmyT2Va8/uqnY2Lu/dRT7PWj+FreWo3X9Hhsa8Et+gv3fnLmhKE/IqfM1F5f27ICb/dZg4+BCltdTx1Of21BwUkNRnsweOHK1es3btwk7caVd9pWISdLdbscKJyklSvX1havbmFHaGvpHrtw4eQrSxZRW5OHczUXRPKh5PT++T33fBJOMebee77wV9YvfJJv742558FktrXy13/1hd+D/z8I/5e2MU980cy2CV/4PdyPvf/w0wli+ymyNYe9nmk2wzZm9mPfHPmzJ2f/Cd0+OXv2k3/Gtl/D9/8U3//al2d/mfyfbL+Gr/+EbP909mz2+ssR2z81Xv8Z7AfHe/jPhr/2ZbIlr+HZ7D958hkjJCIlYFIMnfb68paB7W+T3H6QB2UBXh/YmV747KVr8pKZ64EDa9KTkuIc5etXrkwFxrzS46kwjEyL792LF99cJiffvHGJp+XS/AxjkHzjyS//OZzmk0/+8cg3nyDbb4488eQTs5/802+O/DHbPvHk19l29pf59i/YdvZjg9984ht8+8TsL9P3n5z9x98chvdxO/LEl9mWvf6zJ8XrmK8rmqahIrgAW0XV1Ish3KraRXwdou/jqZItmNgLfH8VX2ugR9j/VfZ/VdqPv4Yd8bhqkB4fXqtaCP4VEPojDDkwitUxn790SYvf55MEQ8LLVDGBS5/nv3L15i25XXp9VQqYlvjY2FiQzfr15eu3NXs2rKbWyQtwuTK6OiInKi+s0oCi8lwRNtNJZlbpBdMt/A2Re3mENJW+DpEtDie2pa/hItjrAN0vyI/D/g+G1NgG6RZ67IJKPvf1mGeETyDCu1IX8X+FjOQvNuUkqsFxoxC2rJV9SDgbSph1lXV62MSIWHMEn+r11i+pDRMMNzWUBbQV57WEy+XW2Np0nMSMjYW/CxbE2twr129bv5bKsq2l98KVky+Ei2XOojev8IwZjt0w9SouWbwVNtMqLtFg38Zkgrx4Iaga74uVCPxzIZ69I7/1TMwzYesWDKdLjBtxOpEjS6KYYtWWCHOIbxf/F5dozPMHJaPLZ7JYiEY73eZbnudnU2SGpUGsMN1UWlB8NXyFWUY8FUws3eCsWaqrYDkYmRbvOxcv7pbLBM55dt6yN8auXeOp7LxzwtVrBKNX+UI1MfPKr0kJG5fi/aA0EsMdL9Y/qtxXAVbhA4/7DGJGOjE5widFTbi2kUeWqMgrjfqIBC7ez+wtWTDGSiUZNAx5sOt5v4/oMm8EaNCrofYctstPhiEmg8kllm1wutkWn7K81tt9/srES1yNPTt3Ud6WN88oF8+cPdYb5MnU8tUayJHP1ohEG4OSjUdDK0ipJpLdMpY2qHJH8YPIZVrYNzHM8L0lGBvv8HkTxRCRKu0hrkVCnKGsJmXBqkZ8SpEXKRmHpCg75mtZIlwQn09yRhAspW0s1nzdEMyFwnhDMHyqOXZBXOLy7rHAW0SNzV205KXdb41fuKCcB6H485a0eE/TSxQdbjBDGdA8t5rZHgMGRsJ1+LUzSEhahO+hhvU3nw+S7t/CuothxlD4UvQoHAy8bpKQjfgGqWyyELr8aen/hsMgzSEaQuSHDKL5z1vO0zB8fq+3BbMy/H4aMWMmvbZg+TEul5tXX7bZ4iVNBoKZT9IA4o69QooDLXvlrZOnTx7b3dKypa2tpQ2Ps6TU332eXbIRB4iMBshKyhiLQoQSm5M0i4EQQ30Lq6REqPWg0R/CZDHMKEZnyasfxRlH113yeJcYjbyfbFMN/cogrISbfeM1mH9f/ZJ6Esf0e1tqS1cXw6O0tr7FR2ObwAIw+lxcXHyBryc7kJGSRK0/PBbQ3AzSMrZgtabVb/bubmup31C7obYUPk04n78WQaPQ2BvXO8bpGkOS9VDIGEgCWWGA57opKCNEMdQVmf8xbKqYD5LQJvqcYSaSN3E1qIR/R4iv/pK0s0QeZEzJhl70uMhbNsyhTDqMI4x5qfmH3q9dXQwiqW+pr6+tLcawpJ+YGGQBsMmrpSTgxvvrPC4Cmdh4BxXMfC6ZZUDBzmxp2dzm83d3d4PpaiOBZzz8slKfn/e96GLjdCXgGwo9pBhXaahAeVgHI3og3DZFXLPc+eKzSlBgRlZHYQzNGD3S7StVwTQN9sKviItWWEZZhzJ9G5RVMTskt1/U+/fXo/n3e2uLS+tbvLRL/d62FnQ0UTalNOxcWpxXTwqaX9tTVW6LBUOzIGllvCQY+BvbO2/O3N1nfcfOjp0PKsHzY8d6fd761avx+Bw0AqxT2Vq5m4PSYh7ZQgbDrl1+X8TkxAjlFy32MrJTghGYkcVhKDTp5PgZ8RHEv8QwmwaKjKEmtoYV4ycWTs4N+wW/Y35fXp6fGJR6r6+b9Cl06eleUG0kqOnHaTMvmU3Lq0WFdmlnhS0uyRYb6yq3EcO/YD5XafMLT85dPW/iimq0syCb2gLUlgAaZmkEaKLb2ggVLqltwb6ifkIVmkJCIceKbF9Fyj37rIyZSMkbCJqMKuk/HDG08lHIOJrQrYYy5aMkKBkpQ7Dik8eIlcGJ+zZf71mpS88fwwTzUujSltUFKKGW0oK84pM3br6/Mi4+yWGLW7neAU4MdWWQDKDlWfDaGy/lzbsiXGRwltSzfl89iAZA4207K13fZFtrCMywmRL5ketFG7YzfBVbWK9xL0YN/5wEDfonDDNsEAfl3cKtgDzCZY0sOlY2kOJYzBcT+lR4ROK5OFPy57zfX7wcBFMAxuCsyrw4Zu+unG5rWV3KHE4imuKC5fXvFMbbbA6bzbPNFbvAkUrsjcOGCc62+HhbrP+tN+aOXQwZJwoy7vbW57X4vUtqfb3GOcvUNVyhcZspgYcPLEkA4RZBHC8MReHqT3zO6B6Vs2YDM4rQnZEIMp4zhJDXwo5TxOB/jRlGab4jxOsj8X4JSl9kGD/RDWe9LQCZLQX14CHyjGV6LKxdEvCCaPw4P1PcgpQaHM+CWBRCkqNq28r4OMdKG4IlzuXCSRoQlyPjtbEzozfO82HOvrcXjFhLd+kyr29MpIhy2xg2NMNtptHzVA8p3DFTg8J2isqFHAGRdkcSr2FowrVHOGY4SNlYCB/pqqYbTdNC3MIIEs85oOE9GrqVcY7wgTnpmCodz70+6C8v2JPuoOz94ecwUHbB24KkGUzN6jZC31ZhfowjPbXqSLnNllrustlwXsa9MsXhSHHYklw525dsuXXrynnZ91MQNaWl4NPUe4+pGHGlTWXXJUavpOgjLU6k1ydjLXzgRdgdBgVx/2+xq0TZo2JGds2ZQKHfAiMn+rramxobm9q7+k6MBKBTeXalbAklOxKF4RjXGdTIMQcOd7Y30mMOjtJjgv1fXuovLSWIYaaJfuY8dfkDbfXFwKzQ1AAL8K9LTEqMz3C4yo+sdyS5mj2Ak/j4xPiVHsAMICnb5alqw9udieHARsmYrwW4d16xrzukq4HxkZGR4ZHRcbxWnYc9pEimFBajP3QU4XMSTlJFTRyV21Qp2iEKggjDFaKWM6TypyH6hJOFqTEjtE5I07XR/qZ8e4LZkmBNTrYnW+GZxV7U1D8O/5I+LeM5nO2JQcEvjx/TQo5pT05OgGcWZ0n7wLh+2guUuaWgxTdmjE8yXM7zOkzvwGgnpgZYgLcwMTUl0eFylb/d7Eh1Na93pDuSADSJ7nLYJtlSXNmeincIsw4qvEAXHSvv+mpLkQPs/ceiLHtCggVaQrIzv6Zj4ByIh4f5Ip15oeIZAERPcXsermm4MIQup11LNHyIiyPE3lANbhsNM0pYlFXXRjrzLRZrbl1n/9DI+EQgMDE+MtzfWZObYE4o6hrVdH7ykkHitFp+XzpzXTvXlZ9gSsBjDvNjDvZ31GRZzNayN32ly32ra73vcqiEeEkNHvS/QUa7z1eft3qzO8WVnujIdpe/vW1ltqt8V2pKqsMFxj/OVZVqSwQrk+7OLt9OZtcuSREhMnL2thS3tC2p3/u9rJK69q4eaB1NNflOizkht+mEIqkEmfaSH20wsx8uvLIG1GB/5pCmBvJbNRmRXA7ki7QhsncN2TsL9y7LynRmQoM/zqxM+pz8HdHYUIyKGYOnhPRgX5HFnNU6MK4RS6AROWv4Qh0faMw0WyoHVD0kujDIPXx+/ZOzIEF19JdYzJlNYcfU6DFH++uy/t6/fDV0GfoZfAiRcwoaMf+xtlokAd7aNekp7qWJ6Skrq94+WO7xuCsOpjoc6a4kG+i39bCx2VIc7pVVGy+xEloS8dL08R97S2tBnfm7VdncBUb72/MTzM7GYU0XQgw3kYo+YOrR1VBmVkjVe0yD0NfWMt1QRaphU8lMGd07i+49oIcCdntNJW9llcbTmlGuhG7DzaBH9UCX0+RsmjaLngAAIABJREFUHVYR29h7krHGmTtdHWy0m3L7VF1IVLLWBr4NswjHVHqyTPamIUXXqb6Fw2g6nScljOCsD6wydPy7msFgqb425slu+OvRh/e9nJHiWpGyNMNd9fbb6ysqKjxV21zpqeluFElGgzuFcOnsivLqU3TKMyjGsqaPNFozvfWr/bWEndERR1ULWrvRwzB6ivqpbFTO2QXytQHzYTj/3FxMsjEPaqFAcqXO9NgkmxrU5b2JHO2Vl3VdYw/6Q58JfnA7bqaFetKez+8L4O4gG00ZHerv6ers7OzpHxoN6ERamj7Rk2nKHYD/ht0jRlbMssXRAPumzB44Zgg/DB8bHxkaPDEwNDw6odJDHvPWLmtbXe8boDbMELg8TXa6BTM1thauyFmauKIwu2Lne9sqqsorKpo9rmxXBpFMarPbAerMYXOUe147cJOChtlBkEudBeDe3VLc1rJks++0rioT4+OgVwlbVKkhbLeb8gc0TbKiAvm0r0O5uZqi91hO6NjXuhSrUuTPqNoJcw/ZGxRGj1nsHa0JshHdzqDsQ/pgLnS5qhOxTAy0l6ShjQRDCRtzgrOofWCCXAOAIM1UOarzCxC2RfID2J+QPlJich5W6aWD6moqcVrR9pvR9mZVdgxMaHq3r7igpdj7fWvNuB7WIfLU8oW20lrQZuvXlS5dscGzbuORI1XlVVUVm6pc2W6Xy4OmP71hZToIyOFIKq94bf8VGpGmF64H2i2WuhFd7/XCEFhWu/fHZblOrGtmtWfm13UOEGYDZxjoSjOVjejGwBLXJDCjEczQvpbdTBH4IGN8kO0d4ggDzGhRm9CbU9gZzKRoNdtJH8IJ9lcmmxMyazr6BoFXjo4MD/Z1VGYlmJMr+xFQcKGtlsV9usY5Dzc14QwlqGhal8XaEdBRx2vD7bloaSubuvr6Bwb6D3c2ljjR/vf4vctLW1Z7e1vN5Jj8TM/LBTJvXQVaBZLZurFw1WZP9daNR7ahYBqaXdkV7gwXgAXapgrYJDlSbe5q//b36ceCZHwMOE2VI9j577aU1vsL8vZ+P7OoprG9o721rgz5YkJRB2hwcmUdloQuTZNGF2WLBmagry1MmxmuixJuYmFvhhmVYcZpL8qP+kAGQPpxKjujj+aaYMyGUB+32k32mv5RlZpr0oix7quxm9LaR6H3NH0o11QX1LkuY0c0fALSufpEmSl/BPWeHjic/7wlFygyM73EgIG67Gu0/213y5It9aVt717GYyoat3rBa7Jkbvi3lHq9Wzdv3V69qnz7xqqdzVVVVQ07PWBTHK4M8DFBj60vzwbIJLpsjuoDB/YTxN3AAaw2mZyopGDY/TNQgO7S5S17x4QJVQMj/U3AEXN7JohsAOVFoBAkNU3socCMYmBGyC8MPEg2ToRbJZRMfvQ2ytPnp7Az+oDVepj04Sjo4zKAhk4zkVg/EgKu64G+IrO1CZQOXGSjKXecURmDCEjREEUfdpo6SIegksjsGIGDESeNwZia3gv/7Ktf4gVAnL6gK014TG6ywvJkbnZvLm7b2raxbV1FdfWGVeXNDVUNDTur3BUNnkS325PiSIxPLK9ypwM1S3Uklvce2H6FcQAcc3UB1AVa/3e/sxfIGXhPvjGNeRf0ItWRjixTcitekA5At5/QwzyJyZhRCQMwiJ8gAUT5gTajmAlRzNxOm3GGHt3OwMczR7C/lXarpW6YmURdGR8e6O8D5TM8rmqUF2hDlabFXSEcXIctaSN6mGD4sgtmM62L+y+TDnGa8vsVImocoxOj4H2PjFP/HxQMEAB/ba33rA5QhGMOM94XXoj5Zm99KQrGs6K8YoUbNFlDQ8OuBrenqtkR7/F4MD5jK2/wuBIdDocr3r3nn7cxdaYP2smY0/TBfFPaP3pBmwEV9J2+DH0SIJyNnAUMvoESk7VTgQ7VB9MsPTonIjQeGGlnQowBcCNjDFGCsEmYuQ0DYComKmb0TlP+hI4cIBMNIDGGweHOykziqFvQb8+s7BpBTQy/cIX5RIwDixcP66qhavn4Ik/1fiI4VR8tM2UCGQ3hR8cH2svA+0ZiYbXn1nQNATZ7fcV5/tpS749RkemDixcPEnGfD1Nmt250b17btnHzqhXl6zJy1rs9DQ1Vu5o92SCgOFu2GxhAXFyiB96wOVJTXIkZ29/ZQ9nZjQFL2hAiYaLOZO9SiJ0hFKCmKMtptztzyxp78Cxw1GiDRaasQTzn8VxTpy5YM2Fb0TBjsFAuIuZmC8xI3OyyHrVxWh4NMyiYMgU0mdZhtvfT3h9uBZ/SWdbaMzA4NDw40NNelmaxZHWM0P92oeqDJ0P2xcO6sDRGNABR2G/JHMXx17/Y0qEQXjFxuMwKHK+krgO87672miIwvc66gW5vXnF3bSn45USQI/bFQ4SOXg+TzHX/uuKtm7NXlFdn5DS7s7c2V+3YWeUor2p2xyW5PJ5EkIzN3QzgcbhsrpT06mPvbCOk+9+sTmSRlwfSnm8EOwKsucXnW1669/v23LKaurrKkqxki9le2TdBr+yw3dQOGkZTSlA0wrMBm3lbOxNGz1TJnxHczOmsqampjPKDnibpviiYAV+oDM5FD5SZKieIoh0osViKukYCOuMAuA0MY8ymcohayVxTqwYfGbKm8SMrYdQZVFkmWIyQ1m7KGiK6ZKQp2ZRW1z+qSL73cE9ZgvXv9y4r9QNrfsNq7cdvB9Gc0yLNzK2xjQVrXs5Ir65akb7Nk7FxV0PzrgaHu6FqE7AxT9XKRFt8XKK7ucKTkuS2ZWSkrD1wZucH+Lnf/GAUU347gQNg7HRv/eo2nz+v2NsdoJelqRNDPcBs7I0j5MrGK01FEyAatQS9eBENnIKbSXRHEbELEjGYxM2szqiNRmfwg5MxA0fJB12qAYI7CAcYKjHZ20c06vermuGta8ONVnPNKLFHNaYaVQvqJyy5Ssigy2zCS9VG7GmjIBgVdgsgcsYbLeaygQAGddUw33v8sM+7BFR/8ebukSxTF4pmyJo5oUm3lSFmZmf98hWupVXVq9Kb16ds3Fmxft+OlUnNVc2eeJuromqlDSRjc4FkHCnuRFBnOXvO7D9KjnAF7XydqWwCT/ssUg2fv3Q5mW9gEV84iwCMRXPNCKH3nSYwuXAh+ab+y0Y0MKo/o/C4oBFIYREDYWdCws5onCMoQrEIOeDLSZjRRhc7x2GQjGda+rBflFZwQQi2sePUifHRc+PcW9f00SaLtQsT0/VWBBrirUZngVVBUNRQIMs6hIIpM7WisLWexeaaYTIfg8cMgPc9QSYa4JBje3HWzAd+5PugQjqw//rNZVpYuX+QzIE1iUtXVGwqzGhen+TZ40kFXWarAlvjSrS5QTKJiYAZF2izDJs7KSUjZemmYwd2XqUejaaUEYSHtIFXvSQFBySzNyQHnuDFSJOFqN3g5X6rHWSkTTgXj+iC0ES1M1yLG76cETGYxM1IvEs8xI+IWUZiJqTmW4bxPDLNAzi4h4lbQ3RuYBDcSwyWJ9jBWx8MUGYwkm8qQT2lt5tqcLdGE6MxEpPRa0x9SLTLiLJGtyZ3kDnZg52VuWnJYP+d+XU9yCnex6iZHyhAW6+uVlLRdMAmXDJX68vTl1ZUr8vZ1Jzk2uixVeyrSl3ZDCotKd7mqVifY4tPjLWlN5RXZMe5MhJz0lPK97zTHMBPXgup1Gbogbrv7K4vJitxlnl9A51NdZU1de09QxNIOzF+U2nKha5QLg9agbugqs41bvYQaWdIX5P1pvJEgYgYDE7mZpejUwAxVReJGehglK6STwXTbyV+OPCUgTq7yWIvqmlqb28ixtreOKgRr6DT7EQbDahpxU9mWakba8xj6H2mRviPVof9HLw8lPZ8O8YWgPvU2YFXkGM2VuYnWyy5HePv+0g+E0b5wccoM+HI1Eosg+HUrHvF0vLCdZ41zc1JqYWeJNeuTa5U4M37qoEsV1Q0ZyfGxccmOhqqyt1xqRmJYGhWbT+wnaiz61oNFcxIruX7ezEPx0skY4UBZ7fDOZitJXRqQ9P7FlsO6yFFH7SAkQyCPmjSuSGJjhluX6Tr5xGDCG7mdLa3NkV5tI6rbA4nAjPaMGgO0ol4JDiXrFHqk+WbEsp6yDwmN9YYikVPGrj1YiuKUatEZGhDlhJNVSXQaOP2TGDAehfKB1iRdTHGPzVtAI5ZeVg65lBnrsX8w73o+PmQN3cDD8m1DMJwHV2cJYczb55ZtXzpmoZVOc3bHOnZhY6k9TuzXeXrGxoOemLjHRVA0Gxx4NCkr6+qcC9wuBJTchJXbO/deQCPcaMdB1DwMpz09/fWFpPs3PolbT7w0XCa6NxgT40TpzaISzyab2qn+rQInbcy7FR6YXo0OyO5/fyHxg2FnTG4WYI1OcrDmjzM7o0YaWe0fOuoRkcHdHmXqSiAimq4yGTvHKUharIuhoZiO+wk3AfM1onRVg2syTkNsdOvi3wDJCZ1JuzdQXORhoIxO+lnyuCY45HHHK75zl6aAwig8b17QR+1p02gwnju55IvE8A45qqN1du2ZThcblcSRpjLgZjt2plqi3NUVW3LtsUlxdpSGta7kxYmuhemFKYsrd6zZyeqs18/X0nHR9qP97YUkOUeJOtwTKfTRDBGlME6q6kE+b8G+rQJz7YLxQkmOEtl93aIys3k0FpYHoDhz3BuZi9TJqI2lU9zhWMG9E4ndOKIFWCHSqiIuDU0DMmC4WL6Ei4i0G6xolXRR51o4fVhC3S+NmF3ktwzps20IXMdvBtw2sdB5oNW5zhBo9US/ZhnfAQzOJXc4jsLdNtUiSYq6yeGYK761xYsX7Om8OC2jIzU1GzHyk1VKeVuF0CmwYZTmUQywAAc6xtcSQsXuhcudGWkFO55vfmdG7du/SIzoAXRdPzzXprnQTBDZ7Z5IFLTx9utlnaVag/U0XqlaQAusIuwRdwpetyMWuowM0P6WR+IEgPQJAJgPLhgQmGYCSmZTiTMRRa0eIPAgEHrACEuGrmsCnc+KML8IDyw/3Xo+wArBkIHDBMEBYjr0g1lq5UADBW9CZAEoy5tMWHPjSS0KYYEP6aCGU31bNlMaWkbiOYyflDR+w3JXPNvrl2+Zq1nZ3OOy5XqSndvrMrwlNuqmncd8cShZBp2ulEy8bZyT0ZK3EJ3/PwkV0pOc3fzAaARv8IeHkm2v7m3DdPWaGWBJSSzySBWIIrRSlM+nKoGZqkHGZEdJKqqmfYJ4q9NwkxkDMCw/3g4MT8jcTPj6sMflHmHwjGjHwaDi8DpuKwgS0SnLJCPFJOfsxhWLFSpq02mkkCIOEHI+rIWowVz2gMhzpu1QbSbACcy9IvQbCBJa5SmQYOqccwLOKPZQlfMoGjeVZXMNOiT878QguneUFqwYW3Frm1EMBnZmza7Xc0OV3PDkX3ZtvjY7KqGg+4UkIzNVrEyJSVxoTtpfqJr4dL1oM7GyYyzNpH7nVf3biZJa3RV7rI2gRnmxQNuejBmBwYyH845qPeDxQli1+gkkyLSzlAebEzCBkUKG9EbUbiZPM8m/w0yFzUMM2oWQibgzEQ41JjQrAfyn+/hg1uOo/IeDemdixtR9XWl9cNJDqT14KkuHuCebFCvBMggcBCGnUiLQoQMa0Exr6rIJ0TmmukyGW/p6hZf99gAWmHuz9wY83lLl9a+XLF/WyEIBpRZ9cZCx3qPrWrHjiMNDkdcnKeh6qAbk8/jU9yeRJCMyzV/oTtuoWf79v2gzq5ryvkff3+vt5YswWGL2JZ5/ee5HmEDhsTsrNCJYF1QHwA/BM6pZlnHNUVENKP4M4p8GB43nszNEDPCEoX95T0iYwZ0ehdRRn2oPgiTAr7VoxvBYx5HNaZyYHBNjCto5IJ4+1j8C+8GAvybtBFLnU6Ac1mF50XI5RqJl2Jgns2E0kOOealkfCStvLje6+/9Hrq+yKtuXhvrbmspLd6wZt3BbYU5gBhXRvnGdY7yZptnB0CmypYUH1cB9iYHMQOupmdhYuLC9JUL57uS5qdXrGp+7Z0LZ3txUQEtLsQWsTHJqLxKFB+C+nDnAA74kb5RuL5R+BvUhg+PUk8gmp2ZrMfYqJ/MzeyVRoBRzoxURT/LmIHhDV0QdCIBCWbZQYeAd9N+eRLUeLYrC73wkr68hwmE+eye3mEeggFXhkfWKsF+BUFl1k2ax1FFn4z525bV8goxQANK6717//7NY++evXD+dK+vraW2uLTNj4JxZ6c6HBnl1S87XNtcqTt27Dqyz53kiIuvAslkO8DgxC5M9SxcmLgw0bNwgSN9/sLynKp1a+rb2lrqa4vp8hm28tO/mkRnpFAJ00U0m06hWRoh8ldjHRqJGR43E8EPmZtFiZsRzChhQpRDOkpYvpk6bq0ByPQzK36YMN0yjcnAiOhTARm5T0IKinRlorszczFsZmmkwEESQIhf2DFVo09w5Sxbn0nr/tUWr65taWvzeVtaWjbXlxaXbmjb/PLBnW5AjMOR6nGvyU5qXg+6rPnIkR02zGJuaGgGOxMbHx+70FEBglmIFCAxe+EC96rCquUFpauLUdpG5Uf4kuI8f7dIj1D5KZELD/AhGOJzx6Gp/ZmgyAQMGvmY4dwsJNmZIJ+aj0AP/ZiEGRjMwIK0EqQfABw4hRAYdO5v8A434qhG8M04BXFlTFJAmcGy6K3mYQIctDhllmFNWHx2REX0iRrs9uUVG93m9+ECseLS0lKyJLC2ZcOG0rUHdxa63CAYx8rClPTE8m2p7h07drwNygwTMhoakAHE2uIXLEysSgFtNt+duGChO3FhUlV1w5rSDWShFC/4TDfLS729atgFBQVNYt1scHslIndGtjNRM4bUYNQ5TU3OtOFfLFEICTN6ZXIAhjTaBQGcHu7zsvkGMRAMUUlqLhh+ZSTYQ+TgzA/hrd0QOCfMrbrK1QU/pvRJpddbnBe2khmFU18LbXOLz7umoAAQswoFk5rkdielJDq2eRwNO3YcfHuHB5dkOJoxFIDTMyCZ8nQQzfxs1/z5qSkLFpav21C/wecXxZ542WfvslrfMW6vhUZR+OqQoLHolfa1ok72Z0Jifsbw/A31FH1O0/A/RBhTfC7MzoBfSoJDQMkYcNLQ4vBPG1iXRoShyETQW+JwcEr5mUhyzF0COEXJE1qY8pOOSE7tmK90eVgRAGRPPj80X0vt8qUFa/bs9OS4XfEOm9udGJcYh+Z/F0DmYLMrFQSSvaOh4uAq24J4x4KFcVXpSM4cK+cDb56/MBvMzObIQ2Oh9CX1bPF5MOxkBFAkZHPpReVmVAlKaoSP0ym4maw5JJNAx4GBGdp/WhlY/tBoAgIHvZuIzCQGZkHNJL9KWHFp/aU2Tg7UjoSTAmfI3C7Peko6lh8I883bInoPgeMFrbZ0+dINe47ud3tSgXulrkyKW7ggdZvb0bxrx5EPdjU4PDZHvHtHxcqDoL/ikhYsXFiegZJJ9MQtjAVDk1hV0OYXRVJ9HDskBHCW+yLhI435I4b257fJjR43Uw23OaygRrR8M13lrCmoCuJknIAUN9O7LEMMZiATBE4+CElov6AQBLcywbC0WFk24l04fwxy5oODBCeHFqfRck4TWBPOjOD/sOUOjVxrBuACPLdg+fJVG/Ycf2//Jlc8qK2VKfFxC+Kay+Mrdu3Yte+DIzs8DleVw92Q7T5YYYuNc6BkXEjOFq4EQ5OdsnBBRU5BLbEyYWLnpDmMIkk6QgnPzVb4lU3mZoYmMdZPkcMZOZoGN+PzM3zikM3TiBOQMFOTPIGR4i7gZJXwNHTO0mQMb5FlqYboAcKCPSqvK8Exw8Svd6KZGbcicDrwacBeokkjKnydIx09Y34v0mZpZKMaA0ZVULBmzZqt+4/u31SdHR/vXpmeCJDxNDti3Tt27dqx7719u6ocVR63x+U6ApJBbTbf7UbWPN+TOn9+EggpozyvAIhZW1hFDi+hZsFIwbCqGXxUGsONdt7U+WaSNhDxsyhxs6kimgp3GI16AKF8jjVQPCUEpOQmVzJfgBcB8sA7Jgfk3wCOk8AE7jSBlbEUfCMI0g6gmcHIU4kzoFGOwrNqRHZNGOqAnBXkScPaj2oMOrR2zdo1qzZu33Nw+6YUd0ZSuSMxLm6+bZs7Nt4Dgtm14+234Y/b5nDbso9UxMfZHAsWzMcgAEYB3KDKED7Va2pXFyDDE7LB32Wl/mOKFnUey8hnIYNU11AoujoVNxMrnAVVolc4eU7zI2YBZMxQ1ac3JYxr2kgC8CfEkCbUP3VlR532KVpa1qimDdt79JCSWwdn2+EcxUnLfLB5Gj3ztDIGnLDFT3LQiGkCzDgX95fxtdWiXGpbNm9Yu2pV9dat+3fuWbkqI6ccb/e3MHb9+rg4RzkIZteufe/hpsLmAsl4gAGkxs5f6CpfsXbtmpT08tiFCwtBrXk21jM5bxHUGQjAZu9pbaSdto729rBn8PcwGvwmuJ7RRrgQtadLnZwHEJLyACRtwEzuZMxMMXPW1DquMbkKzGijKA6tzAnO7gBOgamZ+ZoaYUfGG+umaCXmAU0jrqpGRkYXrkWAoVEGurE1AaR2ztJO+IUob6Iyd1U1tBlVaGd9m5fQMlmoxqAfS+tbfBs2rFtTsXHrpj07DzVv376uvHBVRUrcgpXbHLE2RwUKZgdKZseOXW6HbeXbnhRbXGrswsSM9Wte27x2aVK1K8ezKSdxYUrVZnZQ7m2SEide35jeb0mwkgfb4N0B6UuzfQLdiH5dGzWjq1xkDUzBzbgm4/6PGH9R8s1qppxtZkxQYAbcjS78cD4CDrgA0KpGYWYU7vNPhffLoxaMVWYVwYlW2gM4C9gPBnHcCsegb5yw4KjJLNGYzReUgrM5seyOLtPkcimurff6vRteXrehauv27Yf2H9q/59Sh/dXVG9c6Fjq2rQRLb6vYUdXcsGvfEcRMQ6rD5nnbbctwuFNSUlZsKnzt5XWF7m3lhfCBFUsT16wjAm/bAn5rKVVqZKFmkKSJRG0K4lwbweuD/kQSk4CzGtHsjMgDMPw9anOjx82iTc8Ya/cNzJxAGqWQQd4OBAok1akr4cZZiZ7wiV9NZKCVZGLAMoEwCbQtowQoReAW6X2YWDCRXMeyUMNWosleHjzvxkAWVssoLaa917KhZfM6Kpj9Hxx47/ip/Vv3VK9KsTU3x8XabKnrG1yeivU7DoKd2VXucDg8b7vi09M96SCZ9S+/XFhdnVPlzlj18v53VoFktvg52SstBYOD3gz6mXAJUzwuD8AgUyeAxYTU3HyNUZkp4mYG+Q/zUaLHzcAaT/7htsqwMwBn0Eek6/TGZDA2RFKMiVDNGSA5YdEvQCFWiqCjI4HIFTiewCFmAeDIQ0nJAe9wCsMKbain2+qXbMHQJcIF+3FNfduadRu37zywZ/+hDz48Be3DPesSE9fvSl0Qb7O5d2Ht/+zmfaDTQJk5XBVvu+IcKJmlGZvWvVxYmJNSWLVi7cZTY91LN6+rFQXsiHBqW1CZnSWrt6dQByMwyEAvV2psjPWQGO3t8wCkYImqqFHiZrfPBMTxKjAD+meADg2w/ahZB4g+EhQKvyE0mp+VO0VLgDPX64A0AFMeYeinyCEqjL9rzHYyQxPBVvFnzOddsqyUs1ssgbm2dsXm5u2Hjm4/8N6HH5764MMPP9yfEec+WA66zGFzV+FEjWMbCmaXw0Ulk+HwZCxNSamuXrvKk7Mip7lw4/4zB45u2tiwhpfmJN5rS23tkjysPBM61zNFO9yBl6KiogYrDB3Vh2Zl6hiAYigZHkFQonAzzJ6d3DB7NigyARlm+izwCWoYauyBEMGQwewJOLXxspKykmitrMRaRiXD0DGS0KEHdSKZYGYJsrKEEYokER8SqlKMLx5+7q5d9sJmn3EHAL93+Zo28GSOH9j5wYcf/PLDX354qjo9Y39zfGySw5aK98pwOdzbADP7diRlO1zl76XGudLd6UtTEj3Vq9ILCzMymjftefv4gaOv+bduLm6R3Ew/Vp/DSg1g4i1TtAQhGb0yDXRCH6qj6HEzopblKAJnAFHiZlNmnLORGhUzpIMHcOI+KEJhLFCgTfVwlnGRRscMkQzBjBxXEr52WCz82JbNS4yJLei/LQVrNu85euSdA6cOnfrlB6c+PLW/cMW2g+7YuCQbgMThyHbZXLsOgmSaQUjZIJl4kEwGEGt3dUaSuyInfduRI4f+7p1Tbd2v7i4tNQIMmDnLqpsERqZqAxK5ccL14RC+ozwAfjlK1LUAt1unqcrzMzAIBjTBPsaRTPXp3BekNu3C1BRAox+EM0cLGWFnyEUJJElVAfnMbGQI/Pxe4mwa0eDSWu/L7xw/euCdDz84dfzA+x+cqs4p3FadiCUy3I6kOJCGzXFwH7QGW7bLXfWeKz473b0CJJOxPiXJVV2YUX1wz4FXXz/6ctv3dpPyG0bcDNxMUkMlFH2hkaZdpsPJWcJ9isPmwansjOyUS9soawFut06T+kIGZk6QfERnmTG+O0W4gQcwQ8b66PCHPkG8oXy0kI3J4L4MIkkmkmB2E69HI3EaLhcR0FVlIkD+HqOJmjwK0FLc8vft7x47/voZsP/7j35w6kBh4apmh82RbnOnuoADuFzxK4/s27frYJUjOzu7HLgZCChnRUpK0vr0pIxqzwrP8a1bX3710MbeohfbiqUi0LT0HPnaKRnAEFAh6MoaDR3nEB1jU3CzoJwHYBibqOs0p1gNSBhAMAwzZHxrufmiF4GmiSi1yu0MGBr8mdSKmEXBOWXqzwACQ+MJTYSxkfgEUj0UvJiBEsRfDbc3KinWWMxHttePq2k69dNHf3zgg1P7D5w69cFazyrPpvikdEeKKyPblgGSASdm3659+zwut8dDJJPuzslYmphUnZ2SUb1uXeGRjVtfff3U3j2VmRvWlPJbN/jwa0i5RjjVgSnaYDt0PPjhTRz9OG6jx80m5QEATokaAAAgAElEQVRwYxNtnSaul81nf8QWV9AyX0hgJjRq9CLxCkNZ+Zo8p6NgdCY3KzcLfyJbrt0CVpA4pzCwNOqsqtT9wogPTjh3kOCZIuqvhpSQmLLmwufauddXK4GmtHbvd3r0C++++MO39+85furD7YXrMprdtqT01Jx0l9vl8biykxreBsHsc2d7KirK305NRMksTU9JrHan51Rv2li4f/9+kMyevT9MaFkj1BlmmrV4ya1SgAGYLeZoPyZL8iizmBNEZddZJ6aOm0XkAbDL+S3WafLVAMb8DIv/tyaMciHhGYSkeUys1U8LTURxxxqt4yx0yeNvSP9UIiVpeqHdMsqLufCZQ4URGgEf/Pu+z4ugYSO7tN5nH9THjma+uKf50PEP3ylcV1hdnpSU4cgoRMRUVXkqHDtBMrv2AWIaqqqOuGzZGe7CFRnpiesLM3Kqd75cuPPInldff3f/3r9L/v6G5eLGT/5lxX7/eZoEceLEwOAA/tK/J/jzwVw0Lugo8wgTjq6o+WbheQCS2v4t1mnyTjEww4wEcdVVhAvotAFdMYo0MwGqov6T1EIkyEZEwMBR5sQq6tT1JBehFTnZSJs8CWIQc25/FLwpwBZ2O5OW1S1/7zx3/vjw916r3nno1IfrctZVN+fEp6aDo1JY4QE6lur2HDkCmNnhqapobm7YBZJJdxeuWpGTWL113ap1O9eu3XRk/+uvHt2/58eWFzfzhCZqZY7xeHB00qmrYqRRjUz48xRxs7A8AEWYgqj5ZlOxZh4RkeZnECNgbToIXMZRtTbqUvoA6ceprOQwTovhfCiqBfSDnJhejjxthOloMrGpTZDzDxr6mNNx/g28KhNYmrzlDDQtxW3fzz9/9Pw7aws37TnyIZj/dTurM6DlrMopbGioaq4Cz/8IUjMMoO3AyQAHkcyqNbEucGYqdr768sYjh/a8emD//l7797AKENVlXiBmPkahpuJml5kIsthsE4snTr1O00CMGIDR1mmmgVc5+YEVgUhSuLx+hn0BmZrBeCQmAwQ0xdD/oHKmijU35VuHtdDE4koW8Auds7TqNOTTz0YWndbTa6zjmhpuIjm9lOSloKXZvKSWlTQv9n6/7vj777+WUbhp/wcfbKoo3LkzB/zHVdD3nqqq5n37Du7aQZTZDpALCGhXRTaRzNq1GTmbNm7cuP31V5vfOw60+dDRd79DSgBQyJQu8dIEAPjeieHo7RzmmGpkFpHMxBOTMXnNWShaHoDQDJPXAjitmc6ojxGNzZwamAEjh9PBZDpzwlpJ8pv7xHpe8p2hKednTESeZPIgK1fjoWZusZrQuuB0JksDDaqGW2lEZTllowThvN+/egklZ4iZV999f09hSvXGtz/cs/PlTQfX5awiglm3rgIls2/XkfdwJgAbTtU0e7IzsgsL164pLNy6dfvW7Qdef/vQoaMgmUPv/+P3/AwzJJbZzc5gyhhAghm7guStEPpFreZvmQcQLd9MU5UoD5V3RUTujEaTzlQ5WzMscyQQtWmdJNG/zDoRYuoQgUNkT+BOtCymAICFQntqzP0bWThktPHb3+DbJ73eZTTxrG315t3vHDm6MWNt+f4PD23avv+9Q4WrctIL1+asBcmUozR2vP3ekeOn3jv13vG3jx/ct2uHx2HLqVj78qrCnGoUzaHX9+zZf/zA60ffH/vn72NxBmJnluf5vWe5Thg9fLgvyqO/zExSIpwBNjFJVPYUa86mygOIEjejswDRGQC1IGH5ZtizOPuFQ7uTZDgdNhxDKv1ocwpawI7qimQw6+2Yu6Q686kzC3ABcZDZf0B0O8lk6+LTPmFZODwxh2sDrfL7e/mdgVbX733/6P6KFdWbwPvftPXIB0fWrcsoXLdiI5A0T9Xx93556foNsfT55s3r1y6d2r4mp3DF2vRVK1Zt375968HXX993/PjrL75++uxYd0vxZhqXWdLiOyYyvKPHmi+rTry0YVTOdGiR3C91irgZtzMSDyDdEI2b0RTLyQ9GieT1M6C9cOQTuKi5uDRCzUqbYIvT+Jcq/AZO0q/eiFjX61AmQXIlQwgcReUL4fU6VGdaPiaxafm4+EOYE5GFEzQuiwyTPtMP94I+I65Haa3v2J6t214vf/uDjZ7q7e+d2r7V8/KhdRvXrNr4zi/DKzgYKwav/bL35cQV2as27tm+df+B1w9tP7Tnxb97Xw12b8aadejK1Pr9QT4xFIx6ZcrlJnppmJZFxhetBTh5zdnt8wCix804H1VU4zR4/mFYfbPQOLEudEFAP66n0AZNNbqw1UFjskuRt3CSOMk8YjGyoknSH/WSED0MLgO4BgCkVsaXwkdUp2QTNHiK2vjirAun8bYNXr/PX1/qbdtT+NrBIx/urKjeePzUnv1bC49vX3f0bMRdziZJ58I7G5dWHd2zdc/x17dv33/0xb89q56l5bf8viXFPq7LqK1TjEHCf/VBC4ztEL20PtQgel0CYU9R7cxH5wFIcTOj+h/ZXbjzrJ9lO6NQ66JmOdF252NKs95KFmmEhxqCqrhXEEmYH7c7cdlAGY4rxAW8mZYfYqIDdUbfxmm3fDy+3oFC56APx72hy4osQzo4NS1LVmOl+eINbRtffnXnh+9VV28/fmr/9uPV299958ptpWII5/j+PXuOvP7anj2HXv/bH17uJaTZj3cd9L7LNVn4FB4/MVDTmaQXKkmkDNPvQhMkLWsKbsY/OykPINqcpkSEJCUe5JPusp0JMrgcJsOewCWkFqEBNPAmLI7ghlogFzsRwNJKYNHOgcOyNIfNreS/ZFLAjHZPKzP1XTaSbMMTp+gTnayt1sbe8FNTU1qwpu2Hr773wZEjYP6hpysOXbrx0VJh7cYvj24/dODV7XsOHfve357cuwWDM0RP7g5wk8ApiBAPFZhWZu4nWqSRI54SJHUKf2bqPIAo6zQ5Zvj+BmhoJ8iYQbiQJX1pcMp6E4JXm8iyDMgjXByGvdAD+WQd5ShZxxjKpabEHmD3EsRlmpjITP/BjhnIRXfJGJty4hTh71ojihnsVybeHRhv3bB86drvvP7eoe1HTh0/vn//1jO312KTZXPqwKuvHep998fPveLHKo9g/YGfWZt0gwDIbJEpBq2OLJELpKG1BSVCrsMZoAPyI+oBCHHfhpuFdarUAxRAMmb4qpl+XnJhGF6MZ5r7pLWu3GzRL1WxjBueIVnMqNC1sxpdvsd2InDBcdfEyjjoijaRayJLDJXwscVGCxaxaSSr8E01p720E0sLVqx4HfjZ/g+Ob9//Sxkv/3JHsrn54asvHj327pnvv4zTM/5aROLZRlOjpgWlVEqZLSqaWiMvaz7MLoNSm+j5ZrxzJuUBRFunqRmLko3+VMQNHCMwo5Almlol0U8jWF4pqE3km5oUuUyRMdJDer8dCyqFQPt0kfXyuGhJQxNFk0BxJ43iqNI8SI85AZtACS3LF5SvhUEfC6p0sEpAAe2Y118Miqdlde2adWffP3r86MH3w8nYj35wZ7K59sN/fOf0sc0bCmpRMKV+7+lLWqupZIKbUWN2iD70cVKlIQRmEeUzYccFRRoCh8ay/n15ABHczOCmhnHiflAYZnClHu1hPA04XBYpINVoyhzgdYuDhhYO6eN1pqxhnay8bGJFSAjkOtjoYUgmVQ7G6TH7zfmo9dRWk7Of16k2GKaiYUnRxaJ6Fnyu1+srANHAUF/Xff78qVNXI3r8R89Zf/JvdySbn5/pBcGU+ohgWv4Za2R0WUgBN0VMvvPhpGv9i8lUCJYUw7WlNQQ4/RwyH10PIHoewGRuJgQjWTvyDWGYgaPm4ngHgohzj3qfOYtWi8s0lZzQdC0kRIulpkbbrebWIBYtazTVaWR0daBadjox3MZnYYK4ymxEHPNyDys3OJBlyh9QSNlmPm7A2ZvoSnueFBi+PIwV5+AI+S/uBdHU760tbtnaO3ZpkoH5kSXhubSf35HduXFsTWmxlwhm74skpo6FWcuG6NpLg4FiNcASU+4IFUy+IoqKkAXw1AxEXQsQXnhJ2kapoSEyASP/KIY2kzxwRp/Qd+wkmt6SRqoVBjrtpqzOYSMtWx3tK0swVWJxRiy91IiC6cfRFaQlGQS3xuE1Ys0HAcA/yDEPm1iJTixz2j4UEMfUxvvrrGYsXa2QUkRDtJbN4WNtvmKwC7XF9ZsvTu7uHz3/83+wPPfdX9+JaG6eyWsDuwWq7N1zWdhXcBadVnNJ/4ROq2fSEq4TfUUmexepoNFhAogr+pAF9JCit9NAYjhmDH9GjR67CgSUKHGzsin2FglEYZgJkopLhzGJooQEZvRBu6VLw1KjgZ5ciyWtrKnrcH9/T0dNVoLZ3jRMquYNZpo6NQ2dMtB9yLxrpOrGBDR6Fy0DUEIintDp1j5eGthisZc0dh7u7+vpqMu1mq01AE1QgGq7KfMcIqsJdH2o10u6s7Q2mgfzo+d/fetX333e8g93ZG4u+fJAyHvfVdCMNKqk6l9H2vP2sq4T5yYCQWV8dKCzzGp2dpDCdBM1pkqsZTRqx7iFPkTXE1NOOsnOOBPsyVEf1txo+WbR97baWaErNZybkZ9cQp+ADJNuHC8yFVEJaCM9lVlWeisQZ1E7udVESJ9oMtuJXhi0YtU/HdzOcU1Ec9hBtRI0/4wtq1jbsWb0Mimnfa6nJiuZxnTt+U04dnFh92Aulg4k5ezqcJbqx5v31i5Z3hs1DvOj538Ff3+e9tzin/7mDkRzdXWt/+//7qIGHV5HCkditeyBGrx9RrIzzW63kFqeWBFH0wfSsIimglV1BlFNZ5K4EnOFJ8fNnE2NUVtdh4QZYy1A9L2bRjVGgMPtDCrQEaREWAEEFwcGNa3LasY67aQssDoxMjw0NELu4EOrs9tNNROojwewsiypW3dCl2Zf6DNt3J42jmLLMh8WdQYDrCywOnEOjjnMjqnq+kidefFhoLPo1tRgzwws/uFef+2W6L4lYObmv9669W8/SXgu6+dR9whvN3r3/qO5kqClb7G5blQnhQmVkf6uppq6mqau/nNBLAtICs9lkjE36rSQImE1XE0zDyWSm02V3a/rwWj3BbjNWgAl0p+h3i/YixJQqlqgyNRE6jCPknsbKLpO729CkqJCeAeHEXJHA6KYusyZWOkHzr7rsny3WhYEwupCVNyklrZUm1Nlx+S1udXBGoulkdTmDpQRfwOrDZ0723Z6CiMPkvm3NITLv/zg+ed/8Ks7EE0QdGUR0VbjdRZrIzmLkLGwibzQhuA02knJz0E7Vm/DknytusqTF6aYn4ma3a+qU6zTjL4WgOFkkp0JkqLANThqAO75o6TI50gjqN46GE0GA5g40ZFrMZeQGzrogRq8VGIWWgW75v4JDbccRnGrmlJJaotiPdsiUs82SDqDVZ+fGGzPMlnraIH6oUwzcWtG08DjDV6Yin2hZJKf/y4WDPrFd5+z/NO/frRsLsFAcg6SCrjDlRZzUc8ITgHggGN19Ue68k0JjefIHj2EBCFJq+R3UzA8zUncLGoLRV0LMNXeXHlF2BlqsVuJFoGzwfKlRPNPHC6htZXbO7u6OhrLcq0WSy4OeuJuOk2tqkYEUyfuBSGpNBJe6DKVYO0HrcNi1IAG7e4sae3pPzE4ONDXVVeU/Lwlv4tW7VRxP7BF+jknlkqaOnoJkvlNcgLABdjZzZ+lPWf/2Ueam5uX9AG7uUOlo67dabZk1XUNDI+OT4yPDg901mRazFmdo7woMBmdMLLygxr3dqL6M05rVmb0VhJtzdkUe2eNaCzAOsnOkBHeaipTEAMj+aZcZEvYkRMDHZW5dqAACQl2Z0lT37kQLVI6TPQxqD+tzlQX0lQRmJMDoajwJtdNV4e6KjOtWDMdf+y5dYfJQbFqJ+xE3Johu/WEHpzsxoRhJuG7BC7gcP7rPwGD/sWUO3PRqNjluQPUWCqDHUXkfmsJVnLHFXtJ5xA9DbVnMa0/h25NQFSsCqrRuJndSe6+FOWnMRo3S4u6a1klnQtW1Ch2hrh8naZcvH+EHuqxm1Bl8Rr+gfHRcyPjE6x6PimvaMHifrDrRAm6NQZhllaq0ahLjyVzGFFA7jVA4BYk9xoYGRzo7x8YPIe1hqnABopMzj5ij4hbM7UqY5hJ+O6t3/zM/lwawuXXP3iO4OcjRBPC8uVlpEYrmpWJkYGezvbW9s6eASzsSS5X7c815Q8Su9NOymkLR12JGjeruayzm4JwiyUsV9Tas5P2o/syE6BEsTMkybfPgnVIAT6BDnQyWSFttNYhes9JWva6yGwh+hig4GSVDGXZkMNxLE55fw5qZMhR4WvGu3JN9k6MqulqKw6QoHq7iD/FzC0JLoCfhI8K2NzAK2u3mov6A+xGYXLf4MAb78mi9zAK6oFKU40iBMPc5+ix5ilMR/S42dRmJjIGwO0MRo/AAJsa6T18JnpyzZb89hPj8m1JtYnhLnTJ8PYz8M1gFhYPyJVUjPyxgMonkcg9bSaIBpHvaaOLW9poweGekgRzVleAcgDYHZR7cIr55DDM/Mu/GnD5zU8RP7cP2FzDGB04mSZ7Xf+EFnFvPW20r9JqyuoJgJImY65DMxDDQuhR4mZT5MNqWtS42W3WAhBJRLEzNMimB+po0BFxPUTur5RV1tTZ09fff7irvSYXKy1TlwyEdyLXVDZurCYTsWsxQ8em0ch9oEK6dB+oyo7DA0O4SmVwoKepJA0oQeOgSiMErZbFADH1fGQMMypmfroYVdkvsp6z/ARk9K8YsLk9g75CWHqgH4aXNb/p8ODIOKlrMA5qrS43AYbNCXYaTaa0AZ6xbMxWTOZmTntJUfRWE3UtwBR7n2Or8qPYGf714ANnmoq4JlZH+1tLMpMtCWYaBMiv6xlWWAn64RqTHVxDRTL6/AJ4JggTGrt3GuUU5N5pTrC55M5pYHqtWZVdQ0EMckKHgIEjtxy4nfWXMPPz5wlzFnD5FeDnR7cL2NwcCRGNoI/3NwLTNGOZdWeaHW/impzfSm5ZgMXmDjsJzFk2jJjGiRI3cybn50Z/lEWJmzntU+xN79gA0plsZ8TEJ4b7FoPLQu7hQ+7lS9z1wcFhdhsfMuq0oUqLpXVCl+LX0nx+UFUlQoC+s9qTJt0XCO83OHC4p6unpw9vN6Szt8c7ncSHhQ8FP2JamWHmZxa7hagyAhc0Nz9Pe876k9sw6F+UDHIWoo0P93e11tXU1NS1d/UPT5BoBJb/68s1ZQ2Qe62JCS7WOVHsTM1ttNlvsRaAzwtEszMcs3hnMnDzs+h9r/A9kvxL732J80hwST35JmvjqJj0NDwlkd3PZ8dYrm8I76X1vLN90j06aRiA3MiixgrCY7M3t9dlAjM/e+6nvwLm/A/c3ABcfvOT5OfSbhOw+YGpqI/a/6AWRo/wYnCWozPT5OxRufUMhU2IRb0vwO0YQLQ5zWiNZr9ExppF3gWb0AqxILM5t31Q3C+We8paYLgLzHVmJ5dLWOqYUGVcQSqCDtL72lqymuj959gxKTsKnuurcZqsNYMhrto/QjACM8/9lDDnZAzU/BxkhOzsX35kea5oSnPzmw4nshBq/42uofc5Gz0M15Z7WJHWxISBPypmogbCoP02awFEHkw0f8ZIMyZjHO+vmGBi920mjvLI8EBPI3pnmcRcG3xMMpFyap8xc0mvkt4LOsGckFvT0T8IxxyfGAXv+3B7mdNitpcdnhBFPm7Py8IxAy/+7Z+sJK75m58mM3OD8wNTBWyun++vRPvfCgqMLnREGSnjQ32NcMFOvCMFmWLia2KIKqDUVaX3+8UqoeiGkr6210VdSF5T0xik+YNq+N2BozfmaU6en2GRLp7nR6fToCP7G/Pt5AZnVmtyAnrKybk1lAMwMYThTpo6VST08KxSld0/vbXInkBvdm4lx0zILOvE26eKhJCI2859BGZuAEx+/SOgAr+S2NnPwNxMMT9w8xKwELD/YPStzqKymrrGupqyfCfQAWt+O72Li6KKCCPXZfTy6B21Q2U1IUXHO2qHAiWZ0WsvONOKFB3vqK2EKiuhM+n9t6fce0Rj2XzR/RnOQISsEPGBkcH+no721taOrsMDI8Rj55XMg2LdS2RWmmAEHDJcWxKloQVG2THR+x4ax1trqcQHosGjjzL/4Zj5X39z7haBCWFlnJ3h/MB3o5ub6+dJeHv0RE9TWX4mrnNwZuVXtpJb0BD7oxr20VhUInSCYugCfDb1Az7MdsFe4v7eFPvyBKsp/Bl+LjKOQuFRhJCU1yD62wCFEJlkv7imM+i1KtleQkzYtTLS8NGQkTHzv/7mb14cAigQVgb4+XkWDQaQ+YGoARtWrZReEJnrVTXOAYLSSDJYpxi6rE9UQxFM1cjdhPiVhXh+a2iKpQDiaFP5MyKdRYoY86SLEH8aZDUCuC5UQmK3IB35HDJCKkFptTSVDdPf5IfrdKYP7wAy4ZiB9uL/YqwMzMxvfmql2RtTzQ9cF3CXyyWGwV2AhQ8q7p8pEV2jBqd4yL626HiWfhhtKYARnYnmz0QWUKAYYP3Fd6RjgJw2O3slaHxzULYzYQgUattQm1w1cF1OcXoHkInADLYfI0z+wUI8z3/9kYWYnd+AuUmbPD9wU4wBcjasyyX+ooRfreTXGEIzLkho7LCHwY+4RlCkjqQD3HjGZadM6c8Yu0gRYxlLBsEWaz6Chn4LVwFh92QJ027yBCgfjVxS4XdqvkPMYAPY3PqF3fLcj5CdOS3P/whE8m8/sDyfNSkocO08L64WlKPjilhgxIadxDoN/0x6rfKVElFBEzJEIWgVA40BH2NMTF4LIHpM4d+lcF0l5f8aBSIMSIvdDIFErLoKE6fBdThGxfmFsbk7ySKbjJm/+THorV/8gKbT/Ms/JQBobiJonk+bzNFu8HOTwuOcjYkxJ6HecMQVafAbnxfYkB6qfAxx5YKpqrIeol9KJDm1P2PkPysiYhyUj60IMxEykKAEw1FmfCHbPyifsZFmPtkeqR/p/kfHzIvXbt769Q+efw5zAn7zEzsNA+DMwD9Fmxm4EuRcSFyHyumXMSZDzI8Rpl/yqA2RGAMw/CfschVqm0U3sDVD4rAKn3ec2p9h26DYKpFfI44V3q+CEkjgMkibPBBlPE22R3di/ydh5sVhNlOD8vh52vMkdPbrKckZ4wB8sBrDX1hp7sMIQ6gYPSXO3WBehp6Qf1Tjbd5R4SY/co2XGj0PQPZLDAhzVWggIJJKck0r9KIkzjC7I72vyt9Ovi/EXYA7UmYRmDl3k4SbSTLAr4pMFuLQ3G4G+iYGTfHbcCOcMkMoDCNCWKI2i5CnZIbC7Yh0jazaIXvKP8NtU4hVTje0Oj6Z2p+R1KfBB/j/ZWMjay7ZLPKX0khQJXEKm6Ma3x7G6+9ImYVh5h9vEieGZAT8yz/QYADJ2rhNkuCVYIQ3IURiDDZVkcaixKEilLEi94vQeHx4qwY6ZS6tyN0oDh41D0B8i2DrErZ5LXOZYUgCNEaToarCo87yJRnvM/V16abc7kgw4XEz4viTODP3ZHgAesoW9pU3rwZF1wjSojKNEZKRIY83QzvIITZptIb1kvDQxa/Rn7JdZphRw/qSnwiHb8iAiXROgsHIb8vw4RcU5KPQUGhK2BEYgm6Tu3RbyXDMkNgyCZYBcKw02Hxn2YGiXaOdFM5BuZS4chJnLaM/TJ8L0xlOYidpdKlLOcMQ/0bM0Fkx8i98RgcHeUZOgubJBNl/KZ51jS99w2fEuIVEJDLEUkAUlR+YRkDoe/y//MB4Xjr52n+vZChmfvabn3CciIiZ9c4yaiXJnCf30JKul2LB6BdMW6QooP9FiZEUBiJNXWdrgkIkqki8V+wh8ll2OJXOGVJxYBIkVemsr1jXU8xoo42V/aS3tKGamkHyGa2/snGUruIdpu/h/fAq68hkaEjtKWvHG0uG1BB7Bp/uKOsi40kbbyrrpx+gH8VPjDdVHibp2tpwXc0JevuwkRp8htc9UEMO/B/BzPM/cNI5TBFl/vnUUeapJYM3nKurGWDXW1NDU/O1E+QZXlxfGRaIB0BpgzU1dG291lfZiCVHoDs6yzoCtLB/F3kGB5lorewJkbmukbrKAfoB+lGcNx2tq+ynvQFd/7+bu37XRpIs7H/mLl6W22FnufSQaApEg0EIBIYBJU4WBQocKHGkZKGjQYHAoSIlBicbGAfmFElwIAWiQT4kZLTNVRdHb7DLBXfv+15V68fuzHnkgZ1hGN68VldXvVfd9b0f9WquoldKNGM3l5ExY5S5SRuROU9ZVsVE1RYLNC+FF+94a4sDUSJTvYaXzoHqCoXtpqY6ZCJgu2rMIzI3nnArzmzKs3Y1wh6urVtdVE2Myi1u6SnpaBxVL1Yna4bvjKmY97/sR2Y61cr7F6TSHmnm2a4upNOYT24eR6a5ykmZiAcdFA8iA5wcKjNMrjYQTSkeweO7MxQZJEyLGikl3GuhUIgzX7dELtB5vqhXosYS6tq0IvK2LgUP2qcShBLNuJmpoe4NUlwjoW5B9YQykyJDCSfhjcBLwKMG23IHKstslZIG8zXOp29haszRXBfJgf7WDNVo5GqXQwNviOY8haxbbfh16wzXkxDNpL/sRbudjjSzLcbo1kBzzKVb2E1UDMED5broKiZbMQLvvuTN4X1/hwTWNWZnS6j6Goc9inxMO2fEWW7gXr7yVpnsQvUgq1t5WISaycVtRAqaSWumhlTxDMcW1CooQo9emRreOPIw3aUvgeeuhWri8OcCVIO7SltRLepgMi1jaW5Q+L7om7KsC48HdKIvLBBSBEpeQYhg5l7zzvzzH0L/+3tziMw+XTPPnKec5MU9uoXTzTnFWL66SCo1U0cVDXl7lIdddp7nOiIDzE5PYUfq+gLlnvgKQswyT63eii0fKnpO+0fPUyUIxXXmLjadNVflfs0kjCGsr0ydG2Ft3o9Njx/WDbGiNrIAAAnPSURBVHhMX0hbpvGIZcOll0JpiZymQbROrt7Hpr1CrUY70FsxynPTXnI9uqnF14Q+DhSPRN1cm3j4unXmv/sLzPcv3lX7G81I94exYbfyTc/EA00yuo7NDQW0bJvGvW4Lk6t9Bp5XwrsDz83fmSaXkpKSRahhLrk6u1FsrvQI2F5s+mzO3QpvzbwM8ggIExMn3p5xyzmsjn/J9zNdOAJuZ+dpONZ7kVo9g1t4CrXcZr5SICGU34jlVnPN/c21Oa6X/tZteASupgtL1EKKtdadXaDh17wzu0wzumJethP9dzTzjA89uwUZoFsEZ/ki9ePdcrwUq/B0SOTx6npPLiyxB8XNN2438iyMl/VfAg9KAo/A10EJopnvIDeHNxDLlHP6D3gf+KcIP0ECg/UU/vG8zDe3u4tpXeiKv6q8HeV/95p3BrExZme+aDPAhzWzZZz1eNDZbuSHMtgbptuTi91RvIi6IDpyirls0x3z8iI8Mf/u7NuN04jeYralBePsbB6mxREFxLeZ+henWE38lky3mix1c4l7mmrdLTSX6ZYNt5wQYQOAzzYsE2ntfG79eWjzWekUOfmdaXmXpe4IOGWBCZrxB2vLJ2OmfnRQ+slw2XThR6QUv8kqIRygPn3ycllO/IsTKHz/pxsvF2lOt8i4dLaTlfJcVoo5+/bsG5wiL/8ZGKNbEWQ58V+8TdeY5IASEH1p4lvcXUyb2KSEx85ISdNYTlgJMpflJOoAI2TFg/AI/N3QmPYa8yC7NljPMDahempgnfw1+099twvgRZvOPqKZrdqJtmfMtXawpNaCQ4ccB6gbLiJCmRvyFu9MfE+5jBumSSvOBYrLySVhssU2CCoJq3vracfDlwyiH+D1yDdX35y94e4Khc63ATorECE4KamIQCQRIBIDiFjpnmlt0LRS8m1eNUogAoQzIowHD6XNlTfkDi4Aw/EBhc/5qZoxfufMB339L9fMM32DCp2523dHAa4CHHvgiskNuErArHC1AdyzEcBs2lxQhIoAmN0T4GoS4KqWSF3GIo1ECwwrGtwSOiOtENSbszcA7xl7gAKrVsH7I/tS9goI3KDBomt8Xzx4x1sYYLwH72gZ0I/gnT1gTwOgB2SvhOZu0dydHg51smZ+5ObmVy0wQTPq0Szu0K1bQmd0FVOsSAiTIY0jCp+L0sSzatjhE0bqAguXN/Eyq/gbs9MtIKsrzk5Dww7F4Pw8BfXm7C+w0gVVtIJtvjg30TtoH5TY5qDSRlXMYVwdi8GLHZcCAsX8H2hVZqH6weDljLCbyyotaZkcPeHdYUc6fA3xJJi5zaU2rJY0fc2naQZA+f/5+l+smWdFVsumqTaQlLdHTeOocsnqpvBZlFQFu7Zh8hjdY+v61agCs8W6gYxcTY+rqlEDBh6G85QmhfB4gBndIuc4MxFeh0prTdQdf3OWzNQ1tByQwlcn6afel3NE4XfjZLhmBmB+37vz6FgpHP046j2qK0yam+r6lpW81Q0cZfwqsznIYBEaPvmd+Umz/z7q63+xZnSdgfMsWbDCOykOxE2SG51DbkoKrrVZMvDuxcfeCB90Ge9d797DG1IAx+thb6I/S/vJXB2I61FvrHJ5Ig9XtTlAkFly9vW+h5NoiY7VkndMFftUntF3GjKlWZiGjWTqSLbqhD7gBSe0Rj93DZ+MzX55X6l0XrnABM08+xhUKY3s0Ad8KI3sUC78mY5XXfugNJxw6Ei2+3fY4KY/fMTXZ29piRQeLfr9aLlFyqTmyB3y1PrkVSJhUurd1xxLNrJrrrAlb3dV4z0FqL1HnKYZ80Pjo5sxPk0zW3am0PBkGK+XC8kwXnZ/nxdiBNbHA3aUPZAGMFjZnIo+PEwfq9JgtNmlvc49P1Bu0r2aqCv6vnO90C/PtHs1ZuU59xB4dtROVmrIjzqJpq+v++3hhlBSmrvTRmZyq34hn4RH/C28DkMOmafwOo873fmp3hlTiX98hQVzpJln+cR3O4/+w93pMiaSufFV10dC7jqarh94kIbwvItg2O6vGQ/IPGXzVdIeWXqjFtedBx9i6XanPk5y3bmnDArh+Q/e5AoUogBY/LnzxqXIgycIlIU+uuBalNaFN1PfJgFBBrBoWAJFF/8OrUh4uwf4gGHxZ4kqLu+8NVceGkZkoIZROoQXABHh2zSRwICTNPPD3z666e9TNbPNlw1Dx7zMIXaLC31NcMoTHMb3Mg5d/Oc1E9WxCnPxv+TRIf0qYUDGxZ8UKlQZLcWHhV5d9Qgq1KnLtfBoNJCHYEvG8IKgshAFMLsoAGuK+CgA+3IUBUABRkBE1JI/igJcwNKaeY+/v5UQcV5CREYGboIpY0j1FaefpJm/vxopH2jmuXhEZ3hcxo0JRsONmg+oOmU0CuCNC40CmBAFuFDzQV4BGBL1FSq/14LRUBoSP/tbUS0YtyIK8PNIzQeYMmUUIKfbnnhaLA6odes9/qlOaOE9+hACeNI/0ZthEdaiJ7wLRgEuo1p0halGjz+DClM8TYFhQyMDGSYiQx1WbdsHgny13E7SzOf98+tW7WGGKR4gjZkPKnlqoAYlCibiPMcJfid681GAK5HBJTc1kkLMdyPaqvaKzHv8acuPeSu+JZ4nt4o9aWDLU4N4abnOPDTVHZ/lw7h+w0D1phfT2y0PGZ7XB1witsK7o3tu2Y7fTZTqeKqYtWJ6u7PisRl3oSwxeerxQL+xY/DY3KgR9wkq3e15XaltEjduT1xnPrNmZJ25a8QJDMXc9rVbIg+hGP+w627cHKs1EHg5eI8aHbmMWxoJSdtxi0aIm7yLO/Qqurtm3NvS4z+IG0Nda+8bcY+Rgfwmrg/pq3E39XgYogCrpdVUGaH8diW3XHkc5pZLX3NDeIoMnU03LlBr77TbpFYRn1unzpXN+WSHdZp7HpsjIluV1BJFZr4EzWx9tyhBdnVbdloDFhxvdshbBt9/RrlkJcWIicoljHe7a5gxgqVGQkoxh6ua1ZR7M0M9214hNqQnKnQkbHA+fyd3NqQtlXvmbMDptmwOlM/lcSXPqia3/iozR06PAnxmzTwHP7+aXX5y2pJny5H/hve7ctGrIaXJC9Lz1OPsQhJg7kLOE68yq2k/6Skcg24PuEdJVJ6rZMhT9tlVZQbhfi5oVv58l48ZUgbLpNsvQTPb3bB3mY2+f/v5l54XxrGXthmu7sukTP/O9m6yIfU1pKQd7rLQd6ZssTwGfa8Xdj9d3O76aXc68rIOO9CsH1P5uGx/K1dWdrYcg8/R/AI081wKMXRxX1p5uRmj3IpSJjrawLOBd5i7XQpyp8aszAI/ykHGj96e/fnt26++lL9//aP//PrVHy4D//ftn/4Hjz2wigAOmqwAAAAASUVORK5CYII\u003d","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios3_fp.json b/components/test/data/search_provider_logos/ddljson_ios3_fp.json index f64db50..293a5ea4 100644 --- a/components/test/data/search_provider_logos/ddljson_ios3_fp.json +++ b/components/test/data/search_provider_logos/ddljson_ios3_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"Hedy Lamarr\u0027s 101st birthday","cta_log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:26,type:1,cta:1","doodle_type":"VIDEO","fingerprint":"5a5c777a","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d24101651\u0026hl\u003den\u0026data_push_epoch\u003d2000000003","gallery_url":"http://www.google.com/doodles/hedy-lamarrs-101st-birthday?hl\u003den","header_layout":"LEGACY","id":24101651,"iframe_height_px":230,"iframe_width_px":409,"intent":"BUILTIN","large_cta_image":{"height":230,"image_id":5910974510923776,"image_name":"StaticCTA","is_animated_gif":false,"slot":26,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-scta.png","width":409},"large_image":{"alternate_url":"https://lh3.googleusercontent.com/N3wSsA1KchbJFobk3TmC0SOeSoGhwSyQPlISjqSUMpBN1frPmUCJJcZmPat7uZUguaNt_x5qbbdBgsHLMSQKy_oK5UbB5dn_i_6TtsiK","height":230,"image_id":5066549580791808,"image_name":"LargeAnimatedWhiteCTA","is_animated_gif":true,"slot":27,"url":"/logos/doodles/2015/hedy-lamarrs-101st-birthday-5679746450980864.2-hp.gif","width":409},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:24101651,slot:27,type:2,cta:0","search_url":"/search?q\u003dHedy+Lamarr\u0026oi\u003dddle\u0026ct\u003dhedy-lamarrs-101st-birthday-5679746450980864\u0026hl\u003den","share_text":"Actress and Inventor Hedy Lamarr\u0027s 101st birthday #GoogleDoodle\nhttps://g.co/doodle/pzx7av","short_link":"//g.co/doodle/pzx7av","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"//www.youtube.com/watch?v\u003dZ0gu2QhV1dc\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios4.json b/components/test/data/search_provider_logos/ddljson_ios4.json index a2adcfc..5f11702b 100644 --- a/components/test/data/search_provider_logos/ddljson_ios4.json +++ b/components/test/data/search_provider_logos/ddljson_ios4.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","data_uri":"data:image/jpeg;base64,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\u003d\u003d","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/test/data/search_provider_logos/ddljson_ios4_fp.json b/components/test/data/search_provider_logos/ddljson_ios4_fp.json index c3f45b2..af22359 100644 --- a/components/test/data/search_provider_logos/ddljson_ios4_fp.json +++ b/components/test/data/search_provider_logos/ddljson_ios4_fp.json
@@ -1,2 +1,2 @@ )]}' -{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":486998667000}} \ No newline at end of file +{"ddljson":{"alt_text":"155th Anniversary of the Pony Express (Test Interactive Doodle)","doodle_type":"INTERACTIVE","fingerprint":"de2ab303","fullpage_interactive_url":"https://www.google.com/?fpdoodle\u003d1\u0026doodle\u003d18511013\u0026hl\u003den\u0026data_push_epoch\u003d2000000004","gallery_url":"//www.google.com/doodles/155th-anniversary-of-the-pony-express","header_layout":"LEGACY","id":18511013,"intent":"JAR","large_image":{"alternate_url":"http://lh3.googleusercontent.com/YYmuJ3RPEk93WIRxZ8EmrJVA4vHDZX2jIREH_Sc5G6KT8pnkG7kQB24NR_6HsB5wl50VpCSIYzlcIqZjjFapdQwSldLfmip27tLja1dZ","height":225,"image_id":5066549580791808,"image_name":"Large","is_animated_gif":false,"slot":27,"url":"/logos/doodles/2015/155th-anniversary-of-the-pony-express-5959391580782592.2-hp.jpg","width":400},"launch_interactive_behavior":"INLINE","log_url":"/async/ddllog?async\u003ddoodle:18511013,slot:27,type:1,cta:0","mobile_native":{"jar_object_name":"particles"},"screen_orientation":"LANDSCAPE","search_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den","share_text":"Join the Pony Express to deliver 100 letters! #GoogleDoodle\nhttps://g.co/doodle/7j375g","short_link":"//g.co/doodle/7j375g","show_now_header_search_affordance":true,"show_now_header_share_button":true,"target_url":"/search?q\u003dwhen+was+the+first+mail+pouch+delivered+by+the+pony+express\u0026oi\u003dddle\u0026ct\u003d155th-anniversary-of-the-pony-express-5959391580782592\u0026hl\u003den\u0026source\u003ddoodle-ntp","time_to_live_ms":463124902000}} \ No newline at end of file
diff --git a/components/tracing/common/trace_startup_config.cc b/components/tracing/common/trace_startup_config.cc index 2e344fd3..84003835 100644 --- a/components/tracing/common/trace_startup_config.cc +++ b/components/tracing/common/trace_startup_config.cc
@@ -39,7 +39,8 @@ FILE_PATH_LITERAL("/data/local/chrome-trace-config.json"); const char kDefaultStartupCategories[] = - "startup,browser,toplevel,EarlyJava,cc,Java,navigation,loading,gpu,-*"; + "startup,browser,toplevel,EarlyJava,cc,Java,navigation,loading,gpu," + "disabled-by-default-cpu_profiler,-*"; #else const char kDefaultStartupCategories[] = "benchmark,toplevel,startup,disabled-by-default-file,disabled-by-default-"
diff --git a/components/ukm/debug/ukm_internals.html b/components/ukm/debug/ukm_internals.html index 34c5e43..e8ca44d0 100644 --- a/components/ukm/debug/ukm_internals.html +++ b/components/ukm/debug/ukm_internals.html
@@ -7,6 +7,10 @@ <script src="chrome://resources/js/cr.js"></script> <script src="chrome://resources/js/promise_resolver.js"></script> <script src="chrome://resources/js/util.js"></script> +<if expr="is_ios"> + <!-- TODO(crbug.com/487000): Remove this once injected by web. --> + <script src="chrome://resources/js/ios/web_ui.js"></script> +</if> <title>UKM Debug page</title> <h1>UKM Debug page</h1> <div>
diff --git a/components/ukm/debug/ukm_internals.js b/components/ukm/debug/ukm_internals.js index 85c1c7a..e259e2a 100644 --- a/components/ukm/debug/ukm_internals.js +++ b/components/ukm/debug/ukm_internals.js
@@ -75,4 +75,4 @@ }); } -updateUkmData(); +document.addEventListener('DOMContentLoaded', updateUkmData);
diff --git a/components/url_formatter/idn_spoof_checker.cc b/components/url_formatter/idn_spoof_checker.cc index 7b18d59..ad4ccfd 100644 --- a/components/url_formatter/idn_spoof_checker.cc +++ b/components/url_formatter/idn_spoof_checker.cc
@@ -217,7 +217,7 @@ // U+04C8 (ӈ), U+04CA (ӊ), U+050B (ԋ), U+0527 (ԧ), U+0529 (ԩ)} => h // - {U+0138 (ĸ), U+03BA (κ), U+043A (к), U+049B (қ), U+049D (ҝ), // U+049F (ҟ), U+04A1(ҡ), U+04C4 (ӄ), U+051F (ԟ)} => k - // - {U+014B (ŋ), U+043F (п), U+0525 (ԥ)} => n + // - {U+014B (ŋ), U+043F (п), U+0525 (ԥ), U+0E01 (ก)} => n // - U+0153 (œ) => "ce" // TODO: see https://crbug.com/843352 for further work on // U+0525 and U+0153. @@ -242,7 +242,7 @@ UNICODE_STRING_SIMPLE("ExtraConf"), icu::UnicodeString::fromUTF8( "[æӕ] > ae; [þϼҏ] > p; [ħнћңҥӈӊԋԧԩ] > h;" - "[ĸκкқҝҟҡӄԟ] > k; [ŋпԥ] > n; œ > ce;" + "[ĸκкқҝҟҡӄԟ] > k; [ŋпԥก] > n; œ > ce;" "[ŧтҭԏ] > t; [ƅьҍв] > b; [ωшщพฟພຟ] > w;" "[мӎ] > m; [єҽҿၔ] > e; ґ > r; [ғӻ] > f;" "[ҫင] > c; ұ > y; [χҳӽӿ] > x;"
diff --git a/components/url_formatter/top_domains/alexa_domains.skeletons b/components/url_formatter/top_domains/alexa_domains.skeletons index 94548d6c..dc896c6 100644 --- a/components/url_formatter/top_domains/alexa_domains.skeletons +++ b/components/url_formatter/top_domains/alexa_domains.skeletons
@@ -1,8 +1,9 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. +# 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. -# This file is generated by components/url_formatter/make_top_domain_skeletons.cc +# This file is generated by +# components/url_formatter/make_top_domain_skeletons.cc # DO NOT MANUALLY EDIT! # Each entry is the skeleton of a top domain for the confusability check
diff --git a/components/url_formatter/top_domains/test_domains.list b/components/url_formatter/top_domains/test_domains.list index 0a65446..466caf99 100644 --- a/components/url_formatter/top_domains/test_domains.list +++ b/components/url_formatter/top_domains/test_domains.list
@@ -22,3 +22,4 @@ 1234567890.com aece.com aen.com +n11.com
diff --git a/components/url_formatter/top_domains/test_domains.skeletons b/components/url_formatter/top_domains/test_domains.skeletons index 4f8de65e..218bdc6 100644 --- a/components/url_formatter/top_domains/test_domains.skeletons +++ b/components/url_formatter/top_domains/test_domains.skeletons
@@ -1,8 +1,9 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. +# 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. -# This file is generated by components/url_formatter/make_top_domain_skeletons.cc +# This file is generated by +# components/url_formatter/make_top_domain_skeletons.cc # DO NOT MANUALLY EDIT! # Each entry is the skeleton of a top domain for the confusability check @@ -32,3 +33,4 @@ l23456789O.corn, 1234567890.com aece.corn, aece.com aen.corn, aen.com +nll.corn, n11.com
diff --git a/components/url_formatter/url_formatter_unittest.cc b/components/url_formatter/url_formatter_unittest.cc index b0e58cb..32bb24f 100644 --- a/components/url_formatter/url_formatter_unittest.cc +++ b/components/url_formatter/url_formatter_unittest.cc
@@ -624,6 +624,13 @@ L"\x0ed0\x0e9a.com", false}, + // Lao character that looks like n. + // ก11.com + {"xn--11-lqi.com", + L"\x0e01" + L"11.com", + false}, + // At one point the skeleton of 'w' was 'vv', ensure that // that it's treated as 'w'. {"xn--wder-qqa.com",
diff --git a/components/url_pattern_index/ngram_extractor.h b/components/url_pattern_index/ngram_extractor.h index d91a046..4c13198e 100644 --- a/components/url_pattern_index/ngram_extractor.h +++ b/components/url_pattern_index/ngram_extractor.h
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/strings/string_piece.h" +#include "base/strings/string_util.h" namespace url_pattern_index { @@ -26,8 +27,13 @@ // Template parameters: // * N - the size of N-grams. // * NGramType - the integer type used to encode N-grams. +// * CasePolicy - whether or not to lower-case the N-grams. Assumes ASCII. // * IsSeparator - the type of a bool(char) functor. -template <size_t N, typename NGramType, typename IsSeparator> +enum class NGramCaseExtraction { kCaseSensitive, kLowerCase }; +template <size_t N, + typename NGramType, + NGramCaseExtraction CasePolicy, + typename IsSeparator> class NGramExtractor { public: // An STL compatible input iterator over N-grams contained in a string. @@ -64,6 +70,15 @@ } private: + char ExtractHeadByte() { + char head_byte = *head_; + switch (CasePolicy) { + case NGramCaseExtraction::kCaseSensitive: + return head_byte; + case NGramCaseExtraction::kLowerCase: + return base::ToLowerASCII(head_byte); + } + } // Consumes characters starting with the one pointed to by |head_|, as many // of them as needed to extend |ngram_| from its |current_length| to a // length of N. Leaves |head_| pointing to the last character consumed. @@ -73,7 +88,7 @@ current_length = 0; ngram_ = 0; } else { - ngram_ = ngram_ << 8 | static_cast<NGramType>(*head_); + ngram_ = ngram_ << 8 | static_cast<NGramType>(ExtractHeadByte()); if (++current_length == N) break; } @@ -116,16 +131,21 @@ // // Typical usage: // const char* str = "no*abacaba*abcd"; -// auto extractor = CreateNGramExtractor<5, uint64_t>( -// str, [](char c) { return c == '*'; }); +// auto extractor = +// CreateNGramExtractor<5, uint64_t, NGrameCaseExtraction::kLowercase>( +// str, [](char c) { return c == '*'; }); // for (uint64_t ngram : extractor) { // ... process the |ngram| ... // } -template <size_t N, typename NGramType, typename IsSeparator> -NGramExtractor<N, NGramType, IsSeparator> CreateNGramExtractor( +template <size_t N, + typename NGramType, + NGramCaseExtraction CasePolicy, + typename IsSeparator> +NGramExtractor<N, NGramType, CasePolicy, IsSeparator> CreateNGramExtractor( base::StringPiece string, IsSeparator is_separator) { - return NGramExtractor<N, NGramType, IsSeparator>(string, is_separator); + return NGramExtractor<N, NGramType, CasePolicy, IsSeparator>(string, + is_separator); } } // namespace url_pattern_index
diff --git a/components/url_pattern_index/ngram_extractor_unittest.cc b/components/url_pattern_index/ngram_extractor_unittest.cc index c758f2a..ec127025 100644 --- a/components/url_pattern_index/ngram_extractor_unittest.cc +++ b/components/url_pattern_index/ngram_extractor_unittest.cc
@@ -26,39 +26,57 @@ } template <typename IntType> -IntType EncodeStringToInteger(const char* data, size_t size) { - EXPECT_LE(size, sizeof(IntType)); +IntType EncodeStringToInteger(const std::string& data) { + EXPECT_LE(data.size(), sizeof(IntType)); IntType encoded_string = 0; - for (size_t i = 0; i < size; ++i) { + for (size_t i = 0; i < data.size(); ++i) { encoded_string = (encoded_string << 8) | static_cast<IntType>(data[i]); } return encoded_string; } +template <typename IntType> +std::vector<IntType> EncodeStringsToIntegers( + const std::vector<std::string>& ngrams) { + std::vector<IntType> int_grams; + for (const std::string& ngram : ngrams) { + int_grams.push_back(EncodeStringToInteger<IntType>(ngram)); + } + return int_grams; +} + } // namespace TEST(NGramExtractorTest, EmptyString) { const char* kString = ""; - auto extractor = CreateNGramExtractor<3, uint32_t>(kString, IsSpecialChar); + auto extractor = + CreateNGramExtractor<3, uint32_t, NGramCaseExtraction::kLowerCase>( + kString, IsSpecialChar); EXPECT_EQ(extractor.begin(), extractor.end()); } TEST(NGramExtractorTest, ShortString) { const char* kString = "abacab"; - auto extractor = CreateNGramExtractor<7, uint64_t>(kString, IsSeparatorFalse); + auto extractor = + CreateNGramExtractor<7, uint64_t, NGramCaseExtraction::kLowerCase>( + kString, IsSeparatorFalse); EXPECT_EQ(extractor.begin(), extractor.end()); } TEST(NGramExtractorTest, ShortPieces) { const char* kString = "1**abac*abc*abcd*00"; - auto extractor = CreateNGramExtractor<6, uint64_t>(kString, IsSpecialChar); + auto extractor = + CreateNGramExtractor<6, uint64_t, NGramCaseExtraction::kLowerCase>( + kString, IsSpecialChar); EXPECT_EQ(extractor.begin(), extractor.end()); } TEST(NGramExtractorTest, IsSeparatorAlwaysTrue) { const char* kString = "abacaba"; - auto extractor = CreateNGramExtractor<3, uint32_t>(kString, IsSeparatorTrue); + auto extractor = + CreateNGramExtractor<3, uint32_t, NGramCaseExtraction::kLowerCase>( + kString, IsSeparatorTrue); EXPECT_EQ(extractor.begin(), extractor.end()); } @@ -66,13 +84,37 @@ const std::string kString = "abacaba123"; constexpr size_t N = 3; - std::vector<uint32_t> expected_ngrams; - for (size_t begin = 0; begin + N <= kString.size(); ++begin) { - expected_ngrams.push_back( - EncodeStringToInteger<uint32_t>(kString.data() + begin, N)); - } + std::vector<uint32_t> expected_ngrams = EncodeStringsToIntegers<uint32_t>( + {"aba", "bac", "aca", "cab", "aba", "ba1", "a12", "123"}); + auto extractor = + CreateNGramExtractor<N, uint32_t, NGramCaseExtraction::kLowerCase>( + kString, IsSeparatorFalse); + std::vector<uint32_t> actual_ngrams(extractor.begin(), extractor.end()); + EXPECT_EQ(expected_ngrams, actual_ngrams); +} - auto extractor = CreateNGramExtractor<N, uint32_t>(kString, IsSeparatorFalse); +TEST(NGramExtractorTest, LowerCaseExtraction) { + const std::string kString = "aBcDEFG"; + constexpr size_t N = 3; + + std::vector<uint32_t> expected_ngrams = + EncodeStringsToIntegers<uint32_t>({"abc", "bcd", "cde", "def", "efg"}); + auto extractor = + CreateNGramExtractor<N, uint32_t, NGramCaseExtraction::kLowerCase>( + kString, IsSeparatorFalse); + std::vector<uint32_t> actual_ngrams(extractor.begin(), extractor.end()); + EXPECT_EQ(expected_ngrams, actual_ngrams); +} + +TEST(NGramExtractorTest, CaseSensitiveExtraction) { + const std::string kString = "aBcDEFG"; + constexpr size_t N = 3; + + std::vector<uint32_t> expected_ngrams = + EncodeStringsToIntegers<uint32_t>({"aBc", "BcD", "cDE", "DEF", "EFG"}); + auto extractor = + CreateNGramExtractor<N, uint32_t, NGramCaseExtraction::kCaseSensitive>( + kString, IsSeparatorFalse); std::vector<uint32_t> actual_ngrams(extractor.begin(), extractor.end()); EXPECT_EQ(expected_ngrams, actual_ngrams); } @@ -98,11 +140,13 @@ } if (is_valid_ngram) { expected_ngrams.push_back( - EncodeStringToInteger<uint64_t>(string.data() + begin, N)); + EncodeStringToInteger<uint64_t>(string.substr(begin, N))); } } - auto extractor = CreateNGramExtractor<N, uint64_t>(string, IsSpecialChar); + auto extractor = + CreateNGramExtractor<N, uint64_t, NGramCaseExtraction::kLowerCase>( + string, IsSpecialChar); std::vector<uint64_t> actual_ngrams(extractor.begin(), extractor.end()); EXPECT_EQ(expected_ngrams, actual_ngrams); }
diff --git a/components/url_pattern_index/url_pattern.cc b/components/url_pattern_index/url_pattern.cc index 8589f131..3aeed08 100644 --- a/components/url_pattern_index/url_pattern.cc +++ b/components/url_pattern_index/url_pattern.cc
@@ -238,13 +238,23 @@ UrlPattern::UrlInfo::UrlInfo(const GURL& url) : spec_(url.possibly_invalid_spec()), - lower_case_spec_(HasAnyUpperAscii(spec_) ? base::Optional<std::string>( - base::ToLowerASCII(spec_)) - : base::nullopt), host_(url.parsed_for_possibly_invalid_spec().host) { DCHECK(url.is_valid()); } +base::StringPiece UrlPattern::UrlInfo::GetLowerCaseSpec() const { + if (lower_case_spec_cached_) + return *lower_case_spec_cached_; + + if (!HasAnyUpperAscii(spec_)) { + lower_case_spec_cached_ = spec_; + } else { + lower_case_spec_owner_ = base::ToLowerASCII(spec_); + lower_case_spec_cached_ = lower_case_spec_owner_; + } + return *lower_case_spec_cached_; +} + UrlPattern::UrlInfo::~UrlInfo() = default; UrlPattern::UrlPattern() = default; @@ -278,7 +288,7 @@ type_ == proto::URL_PATTERN_TYPE_WILDCARDED); DCHECK(base::IsStringASCII(url_pattern_)); DCHECK(base::IsStringASCII(url.spec())); - DCHECK(base::IsStringASCII(url.lower_case_spec())); + DCHECK(base::IsStringASCII(url.GetLowerCaseSpec())); if (match_case()) { return IsCaseSensitiveMatch(url_pattern_, anchor_left_, anchor_right_, @@ -287,7 +297,8 @@ // For case-insensitive matching, convert both pattern and url to lower case. return IsCaseSensitiveMatch(base::ToLowerASCII(url_pattern_), anchor_left_, - anchor_right_, url.lower_case_spec(), url.host()); + anchor_right_, url.GetLowerCaseSpec(), + url.host()); } std::ostream& operator<<(std::ostream& out, const UrlPattern& pattern) {
diff --git a/components/url_pattern_index/url_pattern.h b/components/url_pattern_index/url_pattern.h index a5d46f6..97689d8 100644 --- a/components/url_pattern_index/url_pattern.h +++ b/components/url_pattern_index/url_pattern.h
@@ -38,17 +38,17 @@ ~UrlInfo(); base::StringPiece spec() const { return spec_; } - base::StringPiece lower_case_spec() const { - return lower_case_spec_ ? *lower_case_spec_ : spec_; - } + base::StringPiece GetLowerCaseSpec() const; url::Component host() const { return host_; } private: // The url spec. const base::StringPiece spec_; - // Lower-cased url spec. Only populated if |spec_| contains upper case - // characters. - const base::Optional<std::string> lower_case_spec_; + // String to hold the lazily computed lower cased spec. + mutable std::string lower_case_spec_owner_; + // Reference to the lower case spec. Computed lazily. + mutable base::Optional<base::StringPiece> lower_case_spec_cached_; + // The url host component. const url::Component host_;
diff --git a/components/url_pattern_index/url_pattern_index.cc b/components/url_pattern_index/url_pattern_index.cc index b5ff908..fea0a7a 100644 --- a/components/url_pattern_index/url_pattern_index.cc +++ b/components/url_pattern_index/url_pattern_index.cc
@@ -450,11 +450,12 @@ size_t min_list_size = std::numeric_limits<size_t>::max(); NGram best_ngram = 0; - // To support case-insensitive matching, lower case the n-grams for |pattern|. + // To support case-insensitive matching, make sure the n-grams for |pattern| + // are lower-cased. DCHECK(base::IsStringASCII(pattern)); - const std::string lower_case_pattern = base::ToLowerASCII(pattern); - auto ngrams = CreateNGramExtractor<kNGramSize, NGram>( - lower_case_pattern, [](char c) { return c == '*' || c == '^'; }); + auto ngrams = + CreateNGramExtractor<kNGramSize, NGram, NGramCaseExtraction::kLowerCase>( + pattern, [](char c) { return c == '*' || c == '^'; }); for (uint64_t ngram : ngrams) { const MutableUrlRuleList* rules = ngram_index_.Get(ngram); @@ -657,10 +658,11 @@ NGramHashTableProber prober; - // |hash_table| contains lower-cased n-grams. Use lower-cased url to find - // prospective matches. - auto ngrams = CreateNGramExtractor<kNGramSize, uint64_t>( - url.lower_case_spec(), [](char) { return false; }); + // |hash_table| contains lower-cased n-grams. Use lower-cased extraction to + // find prospective matches. + auto ngrams = CreateNGramExtractor<kNGramSize, uint64_t, + NGramCaseExtraction::kLowerCase>( + url.spec(), [](char) { return false; }); auto get_max_priority_rule = [](const flat::UrlRule* lhs, const flat::UrlRule* rhs) {
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn index 2a2f852..19592790 100644 --- a/components/viz/common/BUILD.gn +++ b/components/viz/common/BUILD.gn
@@ -217,6 +217,9 @@ "frame_sinks/copy_output_util_unittest.cc", "frame_sinks/delay_based_time_source_unittest.cc", "gl_helper_unittest.cc", + "gl_scaler_shader_pixeltest.cc", + "gl_scaler_test_util.cc", + "gl_scaler_test_util.h", "gl_scaler_unittest.cc", "gpu/context_cache_controller_unittest.cc", "quads/draw_quad_unittest.cc", @@ -243,6 +246,9 @@ "//media", "//testing/gmock", "//testing/gtest", + "//ui/gfx", + "//ui/gfx:color_space", + "//ui/gfx/geometry", ] }
diff --git a/components/viz/common/DEPS b/components/viz/common/DEPS index 538f895a..639f7cb 100644 --- a/components/viz/common/DEPS +++ b/components/viz/common/DEPS
@@ -22,7 +22,7 @@ "+gpu/ipc/common", "+third_party/skia", ], - ".*_unittest\.cc": [ + ".*(_unittest|_pixeltest)\.cc": [ "+cc/test", "+gpu/ipc/gl_in_process_context.h", "+media/base",
diff --git a/components/viz/common/gl_scaler.cc b/components/viz/common/gl_scaler.cc index cc90dd86..4c4ae20 100644 --- a/components/viz/common/gl_scaler.cc +++ b/components/viz/common/gl_scaler.cc
@@ -4,6 +4,8 @@ #include "components/viz/common/gl_scaler.h" +#include <sstream> +#include <string> #include <utility> #include "base/logging.h" @@ -11,6 +13,9 @@ #include "gpu/GLES2/gl2chromium.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/common/capabilities.h" +#include "ui/gfx/color_transform.h" +#include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/vector2d_f.h" namespace viz { @@ -63,6 +68,8 @@ } bool GLScaler::Configure(const Parameters& new_params) { + shader_programs_.clear(); + if (!context_provider_) { return false; } @@ -112,6 +119,14 @@ } } + // Color space transformation is meaningless when using the deinterleaver. + if (params_.export_format == + Parameters::ExportFormat::DEINTERLEAVE_PAIRWISE && + params_.source_color_space != params_.output_color_space) { + NOTIMPLEMENTED(); + return false; + } + // Check that one of the two implemented output swizzles has been specified. for (GLenum s : params_.swizzle) { if (s != GL_RGBA && s != GL_BGRA_EXT) { @@ -165,13 +180,630 @@ } void GLScaler::OnContextLost() { + // The destruction order here is important due to data dependencies. + shader_programs_.clear(); if (context_provider_) { context_provider_->RemoveObserver(this); context_provider_ = nullptr; } } +GLScaler::ShaderProgram* GLScaler::GetShaderProgram( + Shader shader, + GLint texture_format, + const gfx::ColorTransform* color_transform, + const GLenum swizzle[2]) { + const ShaderCacheKey key{ + shader, + texture_format, + color_transform ? color_transform->GetSrcColorSpace() : gfx::ColorSpace(), + color_transform ? color_transform->GetDstColorSpace() : gfx::ColorSpace(), + swizzle[0], + swizzle[1]}; + auto it = shader_programs_.find(key); + if (it == shader_programs_.end()) { + GLES2Interface* const gl = context_provider_->ContextGL(); + DCHECK(gl); + it = shader_programs_ + .emplace(std::piecewise_construct, std::forward_as_tuple(key), + std::forward_as_tuple(gl, shader, texture_format, + color_transform, swizzle)) + .first; + } + return &it->second; +} + GLScaler::Parameters::Parameters() = default; GLScaler::Parameters::~Parameters() = default; +// static +const GLfloat GLScaler::ShaderProgram::kVertexAttributes[16] = { + -1.0f, -1.0f, 0.0f, 0.0f, // vertex 0 + 1.0f, -1.0f, 1.0f, 0.0f, // vertex 1 + -1.0f, 1.0f, 0.0f, 1.0f, // vertex 2 + 1.0f, 1.0f, 1.0f, 1.0f, // vertex 3 +}; + +GLScaler::ShaderProgram::ShaderProgram( + gpu::gles2::GLES2Interface* gl, + GLScaler::Shader shader, + GLint texture_format, + const gfx::ColorTransform* color_transform, + const GLenum swizzle[2]) + : gl_(gl), + shader_(shader), + texture_format_(texture_format), + program_(gl_->CreateProgram()) { + DCHECK(program_); + + std::basic_ostringstream<GLchar> vertex_header; + std::basic_ostringstream<GLchar> fragment_directives; + std::basic_ostringstream<GLchar> fragment_header; + std::basic_ostringstream<GLchar> shared_variables; + std::basic_ostringstream<GLchar> vertex_main; + std::basic_ostringstream<GLchar> fragment_main; + + vertex_header + << ("precision highp float;\n" + "attribute vec2 a_position;\n" + "attribute vec2 a_texcoord;\n" + "uniform vec4 src_rect;\n"); + + fragment_header << "precision mediump float;\n"; + if (texture_format_ == GL_RGBA16F_EXT) { + fragment_header << "precision mediump sampler2D;\n"; + } else if (texture_format_ == GL_RGBA) { + fragment_header << "precision lowp sampler2D;\n"; + } else { + NOTIMPLEMENTED(); + } + fragment_header << "uniform sampler2D s_texture;\n"; + + if (color_transform && shader_ != Shader::PLANAR_CHANNEL_3) { + const std::string& source = color_transform->GetShaderSource(); + // Assumption: gfx::ColorTransform::GetShaderSource() should provide a + // function named DoColorConversion() that takes a vec3 argument and returns + // a vec3. + DCHECK_NE(source.find("DoColorConversion"), std::string::npos); + fragment_header << source; + } + + vertex_main + << (" gl_Position = vec4(a_position, 0.0, 1.0);\n" + " vec2 texcoord = src_rect.xy + a_texcoord * src_rect.zw;\n"); + + switch (shader_) { + case Shader::BILINEAR: + shared_variables << "varying highp vec2 v_texcoord;\n"; + vertex_main << " v_texcoord = texcoord;\n"; + fragment_main << " vec4 sample = texture2D(s_texture, v_texcoord);\n"; + if (color_transform) { + fragment_main << " sample.rgb = DoColorConversion(sample.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " sample.rb = sample.br;\n"; + } + fragment_main << " gl_FragColor = sample;\n"; + break; + + case Shader::BILINEAR2: + // This is equivialent to two passes of the BILINEAR shader above. It can + // be used to scale an image down 1.0x-2.0x in either dimension, or + // exactly 4x. + shared_variables << "varying highp vec4 v_texcoords;\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 4.0;\n" + " v_texcoords.xy = texcoord + step;\n" + " v_texcoords.zw = texcoord - step;\n"); + fragment_main + << (" vec4 blended = (texture2D(s_texture, v_texcoords.xy) +\n" + " texture2D(s_texture, v_texcoords.zw)) /\n" + " 2.0;\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::BILINEAR3: + // This is kind of like doing 1.5 passes of the BILINEAR shader. It can be + // used to scale an image down 1.5x-3.0x, or exactly 6x. + shared_variables + << ("varying highp vec4 v_texcoords0;\n" + "varying highp vec2 v_texcoords1;\n"); + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 3.0;\n" + " v_texcoords0.xy = texcoord + step;\n" + " v_texcoords0.zw = texcoord;\n" + " v_texcoords1 = texcoord - step;\n"); + fragment_main + << (" vec4 blended = (texture2D(s_texture, v_texcoords0.xy) +\n" + " texture2D(s_texture, v_texcoords0.zw) +\n" + " texture2D(s_texture, v_texcoords1)) / 3.0;\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::BILINEAR4: + // This is equivialent to three passes of the BILINEAR shader above. It + // can be used to scale an image down 2.0x-4.0x or exactly 8x. + shared_variables << "varying highp vec4 v_texcoords[2];\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 8.0;\n" + " v_texcoords[0].xy = texcoord - step * 3.0;\n" + " v_texcoords[0].zw = texcoord - step;\n" + " v_texcoords[1].xy = texcoord + step;\n" + " v_texcoords[1].zw = texcoord + step * 3.0;\n"); + fragment_main + << (" vec4 blended = (\n" + " texture2D(s_texture, v_texcoords[0].xy) +\n" + " texture2D(s_texture, v_texcoords[0].zw) +\n" + " texture2D(s_texture, v_texcoords[1].xy) +\n" + " texture2D(s_texture, v_texcoords[1].zw)) / 4.0;\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::BILINEAR2X2: + // This is equivialent to four passes of the BILINEAR shader above, two in + // each dimension. It can be used to scale an image down 1.0x-2.0x in both + // X and Y directions. Or, it could be used to scale an image down by + // exactly 4x in both dimensions. + shared_variables << "varying highp vec4 v_texcoords[2];\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 4.0;\n" + " v_texcoords[0].xy = texcoord + vec2(step.x, step.y);\n" + " v_texcoords[0].zw = texcoord + vec2(step.x, -step.y);\n" + " v_texcoords[1].xy = texcoord + vec2(-step.x, step.y);\n" + " v_texcoords[1].zw = texcoord + vec2(-step.x, -step.y);\n"); + fragment_main + << (" vec4 blended = (\n" + " texture2D(s_texture, v_texcoords[0].xy) +\n" + " texture2D(s_texture, v_texcoords[0].zw) +\n" + " texture2D(s_texture, v_texcoords[1].xy) +\n" + " texture2D(s_texture, v_texcoords[1].zw)) / 4.0;\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::BICUBIC_UPSCALE: + // When scaling up, 4 texture reads are necessary. However, some + // instructions can be saved because the parameter passed to the bicubic + // function will be in a known range. Also, when sampling the bicubic + // function like this, the sum is always exactly one, so normalization can + // be skipped as well. + shared_variables << "varying highp vec2 v_texcoord;\n"; + vertex_main << " v_texcoord = texcoord;\n"; + fragment_header + << ("uniform highp vec2 src_pixelsize;\n" + "uniform highp vec2 scaling_vector;\n" + "const float a = -0.5;\n" + // This function is equivialent to calling the bicubic + // function with x-1, x, 1-x and 2-x (assuming + // 0 <= x < 1) + "vec4 filt4(float x) {\n" + " return vec4(x * x * x, x * x, x, 1) *\n" + " mat4( a, -2.0 * a, a, 0.0,\n" + " a + 2.0, -a - 3.0, 0.0, 1.0,\n" + " -a - 2.0, 3.0 + 2.0 * a, -a, 0.0,\n" + " -a, a, 0.0, 0.0);\n" + "}\n" + "mat4 pixels_x(highp vec2 pos, highp vec2 step) {\n" + " return mat4(texture2D(s_texture, pos - step),\n" + " texture2D(s_texture, pos),\n" + " texture2D(s_texture, pos + step),\n" + " texture2D(s_texture, pos + step * 2.0));\n" + "}\n"); + fragment_main + << (" highp vec2 pixel_pos = v_texcoord * src_pixelsize - \n" + " scaling_vector / 2.0;\n" + " highp float frac = fract(dot(pixel_pos, scaling_vector));\n" + " highp vec2 base = \n" + " (floor(pixel_pos) + vec2(0.5)) / src_pixelsize;\n" + " highp vec2 step = scaling_vector / src_pixelsize;\n" + " vec4 blended = pixels_x(base, step) * filt4(frac);\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::BICUBIC_HALF_1D: + // This scales down an image by exactly half in one dimension. The + // bilinear lookup reduces the number of texture reads from 8 to 4. + shared_variables << "varying highp vec4 v_texcoords[2];\n"; + vertex_header + << ("uniform vec2 scaling_vector;\n" + "const float CenterDist = 99.0 / 140.0;\n" + "const float LobeDist = 11.0 / 4.0;\n"); + vertex_main + << (" vec2 step = scaling_vector / 2.0;\n" + " v_texcoords[0].xy = texcoord - LobeDist * step;\n" + " v_texcoords[0].zw = texcoord - CenterDist * step;\n" + " v_texcoords[1].xy = texcoord + CenterDist * step;\n" + " v_texcoords[1].zw = texcoord + LobeDist * step;\n"); + fragment_header + << ("const float CenterWeight = 35.0 / 64.0;\n" + "const float LobeWeight = -3.0 / 64.0;\n"); + fragment_main + << (" vec4 blended = \n" + // Lobe pixels + " (texture2D(s_texture, v_texcoords[0].xy) +\n" + " texture2D(s_texture, v_texcoords[1].zw)) *\n" + " LobeWeight +\n" + // Center pixels + " (texture2D(s_texture, v_texcoords[0].zw) +\n" + " texture2D(s_texture, v_texcoords[1].xy)) *\n" + " CenterWeight;\n"); + if (color_transform) { + fragment_main << " blended.rgb = DoColorConversion(blended.rgb);\n"; + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " blended.rb = blended.br;\n"; + } + fragment_main << " gl_FragColor = blended;\n"; + break; + + case Shader::PLANAR_CHANNEL_0: + case Shader::PLANAR_CHANNEL_1: + case Shader::PLANAR_CHANNEL_2: + case Shader::PLANAR_CHANNEL_3: { + // Select one color channel, and pack 4 pixels into one output quad. See + // header file for diagram. + shared_variables << "varying highp vec4 v_texcoords[2];\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 4.0;\n" + " v_texcoords[0].xy = texcoord - step * 1.5;\n" + " v_texcoords[0].zw = texcoord - step * 0.5;\n" + " v_texcoords[1].xy = texcoord + step * 0.5;\n" + " v_texcoords[1].zw = texcoord + step * 1.5;\n"); + std::basic_string<GLchar> convert_open; + std::basic_string<GLchar> convert_close; + if (color_transform && shader_ != Shader::PLANAR_CHANNEL_3) { + convert_open = "DoColorConversion("; + convert_close = ".rgb)"; + } + const char selector = "rgba"[static_cast<int>(shader_) - + static_cast<int>(Shader::PLANAR_CHANNEL_0)]; + fragment_main << " vec4 packed_quad = vec4(\n" + << " " << convert_open + << "texture2D(s_texture, v_texcoords[0].xy)" + << convert_close << '.' << selector << ",\n" + << " " << convert_open + << "texture2D(s_texture, v_texcoords[0].zw)" + << convert_close << '.' << selector << ",\n" + << " " << convert_open + << "texture2D(s_texture, v_texcoords[1].xy)" + << convert_close << '.' << selector << ",\n" + << " " << convert_open + << "texture2D(s_texture, v_texcoords[1].zw)" + << convert_close << '.' << selector << ");\n"; + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " packed_quad.rb = packed_quad.br;\n"; + } + fragment_main << " gl_FragColor = packed_quad;\n"; + break; + } + + case Shader::I422_NV61_MRT: + // I422 sampling, delivered via two output textures (NV61 format). See + // header file for diagram. + shared_variables << "varying highp vec4 v_texcoords[2];\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 4.0;\n" + " v_texcoords[0].xy = texcoord - step * 1.5;\n" + " v_texcoords[0].zw = texcoord - step * 0.5;\n" + " v_texcoords[1].xy = texcoord + step * 0.5;\n" + " v_texcoords[1].zw = texcoord + step * 1.5;\n"); + fragment_directives << "#extension GL_EXT_draw_buffers : enable\n"; + fragment_main + << (" vec3 pixel0 = texture2D(s_texture, v_texcoords[0].xy).rgb;\n" + " vec3 pixel1 = texture2D(s_texture, v_texcoords[0].zw).rgb;\n" + " vec3 pixel01 = (pixel0 + pixel1) / 2.0;\n" + " vec3 pixel2 = texture2D(s_texture, v_texcoords[1].xy).rgb;\n" + " vec3 pixel3 = texture2D(s_texture, v_texcoords[1].zw).rgb;\n" + " vec3 pixel23 = (pixel2 + pixel3) / 2.0;\n"); + if (color_transform) { + fragment_main + << (" pixel0 = DoColorConversion(pixel0);\n" + " pixel1 = DoColorConversion(pixel1);\n" + " pixel01 = DoColorConversion(pixel01);\n" + " pixel2 = DoColorConversion(pixel2);\n" + " pixel3 = DoColorConversion(pixel3);\n" + " pixel23 = DoColorConversion(pixel23);\n"); + } + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main + << (" gl_FragData[0] = \n" + " vec4(pixel2.r, pixel1.r, pixel0.r, pixel3.r);\n"); + } else { + fragment_main + << (" gl_FragData[0] = \n" + " vec4(pixel0.r, pixel1.r, pixel2.r, pixel3.r);\n"); + } + if (swizzle[1] == GL_BGRA_EXT) { + fragment_main + << (" gl_FragData[1] = \n" + " vec4(pixel23.g, pixel01.b, pixel01.g, pixel23.b);\n"); + } else { + fragment_main + << (" gl_FragData[1] = \n" + " vec4(pixel01.g, pixel01.b, pixel23.g, pixel23.b);\n"); + } + break; + + case Shader::DEINTERLEAVE_PAIRWISE_MRT: + // Sample two pixels and unswizzle them. There's no need to do vertical + // scaling with math, since the bilinear interpolation in the sampler + // takes care of that. + shared_variables << "varying highp vec4 v_texcoords;\n"; + vertex_header << "uniform vec2 scaling_vector;\n"; + vertex_main + << (" vec2 step = scaling_vector / 2.0;\n" + " v_texcoords.xy = texcoord - step * 0.5;\n" + " v_texcoords.zw = texcoord + step * 0.5;\n"); + fragment_directives << "#extension GL_EXT_draw_buffers : enable\n"; + DCHECK(!color_transform); + fragment_main + << (" vec4 lo_uvuv = texture2D(s_texture, v_texcoords.xy);\n" + " vec4 hi_uvuv = texture2D(s_texture, v_texcoords.zw);\n" + " vec4 uuuu = vec4(lo_uvuv.rb, hi_uvuv.rb);\n" + " vec4 vvvv = vec4(lo_uvuv.ga, hi_uvuv.ga);\n"); + if (swizzle[0] == GL_BGRA_EXT) { + fragment_main << " uuuu.rb = uuuu.br;\n"; + } + fragment_main << " gl_FragData[0] = uuuu;\n"; + if (swizzle[1] == GL_BGRA_EXT) { + fragment_main << " vvvv.rb = vvvv.br;\n"; + } + fragment_main << " gl_FragData[1] = vvvv;\n"; + break; + } + + // Helper function to compile the shader source and log the GLSL compiler's + // results. + const auto CompileShaderFromSource = + [](GLES2Interface* gl, const std::basic_string<GLchar>& source, + GLenum type) -> GLuint { + VLOG(2) << __func__ << ": Compiling shader " << type + << " with source:" << std::endl + << source; + const GLuint shader = gl->CreateShader(type); + const GLchar* source_data = source.data(); + const GLint length = base::checked_cast<GLint>(source.size()); + gl->ShaderSource(shader, 1, &source_data, &length); + gl->CompileShader(shader); + GLint compile_status = GL_FALSE; + gl->GetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); + + // Fetch logs and forward them to the system logger. If compilation failed, + // clean-up and return 0 for error. + if (compile_status != GL_TRUE || VLOG_IS_ON(2)) { + GLint log_length = 0; + gl->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length); + std::string log; + if (log_length > 0) { + std::unique_ptr<GLchar[]> tmp(new GLchar[log_length]); + GLsizei returned_log_length = 0; + gl->GetShaderInfoLog(shader, log_length, &returned_log_length, + tmp.get()); + log.assign(tmp.get(), returned_log_length); + } + if (log.empty()) { + log = "<<NO LOG>>"; + } + if (compile_status != GL_TRUE) { + LOG(ERROR) << __func__ << ": Compilation of shader " << type + << " failed:" << std::endl + << log; + gl->DeleteShader(shader); + return 0; + } + VLOG(2) << __func__ << ": Compilation of shader " << type + << " succeeded:" << std::endl + << log; + } + return shader; + }; + + // Compile the vertex shader and attach it to the program. + const std::string shared_variables_str = shared_variables.str(); + const GLuint vertex_shader = + CompileShaderFromSource(gl_, + vertex_header.str() + shared_variables_str + + "void main() {\n" + vertex_main.str() + "}\n", + GL_VERTEX_SHADER); + if (vertex_shader == 0) { + return; + } + gl_->AttachShader(program_, vertex_shader); + gl_->DeleteShader(vertex_shader); + + // Compile the fragment shader and attach to |program_|. + const GLuint fragment_shader = CompileShaderFromSource( + gl_, + fragment_directives.str() + fragment_header.str() + shared_variables_str + + "void main() {\n" + fragment_main.str() + "}\n", + GL_FRAGMENT_SHADER); + if (fragment_shader == 0) { + return; + } + gl_->AttachShader(program_, fragment_shader); + gl_->DeleteShader(fragment_shader); + + // Link the program. + gl_->LinkProgram(program_); + GLint link_status = GL_FALSE; + gl_->GetProgramiv(program_, GL_LINK_STATUS, &link_status); + if (link_status != GL_TRUE) { + LOG(ERROR) << "Failed to link shader program."; + return; + } + +#define DCHECK_RESOLVED_LOCATION(member) \ + DCHECK(member != -1 || gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) \ + << "Failed to get " #member " in program, or GPU process crashed." + + // Resolve the locations of the global variables. + position_location_ = gl_->GetAttribLocation(program_, "a_position"); + DCHECK_RESOLVED_LOCATION(position_location_); + texcoord_location_ = gl_->GetAttribLocation(program_, "a_texcoord"); + DCHECK_RESOLVED_LOCATION(texcoord_location_); + texture_location_ = gl_->GetUniformLocation(program_, "s_texture"); + DCHECK_RESOLVED_LOCATION(texture_location_); + src_rect_location_ = gl_->GetUniformLocation(program_, "src_rect"); + DCHECK_RESOLVED_LOCATION(src_rect_location_); + switch (shader_) { + case Shader::BILINEAR: + break; + + case Shader::BILINEAR2: + case Shader::BILINEAR3: + case Shader::BILINEAR4: + case Shader::BILINEAR2X2: + case Shader::BICUBIC_HALF_1D: + case Shader::PLANAR_CHANNEL_0: + case Shader::PLANAR_CHANNEL_1: + case Shader::PLANAR_CHANNEL_2: + case Shader::PLANAR_CHANNEL_3: + case Shader::I422_NV61_MRT: + case Shader::DEINTERLEAVE_PAIRWISE_MRT: + scaling_vector_location_ = + gl_->GetUniformLocation(program_, "scaling_vector"); + DCHECK_RESOLVED_LOCATION(scaling_vector_location_); + break; + + case Shader::BICUBIC_UPSCALE: + src_pixelsize_location_ = + gl_->GetUniformLocation(program_, "src_pixelsize"); + DCHECK_RESOLVED_LOCATION(src_pixelsize_location_); + scaling_vector_location_ = + gl_->GetUniformLocation(program_, "scaling_vector"); + DCHECK_RESOLVED_LOCATION(scaling_vector_location_); + break; + } + +#undef DCHECK_RESOLVED_LOCATION +} + +GLScaler::ShaderProgram::~ShaderProgram() { + gl_->DeleteProgram(program_); +} + +void GLScaler::ShaderProgram::UseProgram(const gfx::Size& src_texture_size, + const gfx::RectF& src_rect, + const gfx::Size& dst_size, + GLScaler::Axis primary_axis, + bool flip_y) { + gl_->UseProgram(program_); + + // OpenGL defines the last parameter to VertexAttribPointer as type + // "const GLvoid*" even though it is actually an offset into the buffer + // object's data store and not a pointer to the client's address space. + const void* offsets[2] = {nullptr, + reinterpret_cast<const void*>(2 * sizeof(GLfloat))}; + + gl_->VertexAttribPointer(position_location_, 2, GL_FLOAT, GL_FALSE, + 4 * sizeof(GLfloat), offsets[0]); + gl_->EnableVertexAttribArray(position_location_); + + gl_->VertexAttribPointer(texcoord_location_, 2, GL_FLOAT, GL_FALSE, + 4 * sizeof(GLfloat), offsets[1]); + gl_->EnableVertexAttribArray(texcoord_location_); + + // Always sample from the first texture unit. + gl_->Uniform1i(texture_location_, 0); + + // Convert |src_rect| from pixel coordinates to texture coordinates. The + // source texture coordinates are in the range [0.0,1.0] for each dimension, + // but the sampling rect may slightly "spill" outside that range (e.g., for + // scaler overscan). + GLfloat src_rect_texcoord[4] = { + src_rect.x() / src_texture_size.width(), + src_rect.y() / src_texture_size.height(), + src_rect.width() / src_texture_size.width(), + src_rect.height() / src_texture_size.height(), + }; + if (flip_y) { + src_rect_texcoord[1] += src_rect_texcoord[3]; + src_rect_texcoord[3] *= -1.0f; + } + gl_->Uniform4fv(src_rect_location_, 1, src_rect_texcoord); + + // Set shader-specific uniform inputs. The |scaling_vector| is the ratio of + // the number of source pixels sampled per dest pixels output. It is used by + // the shader programs to locate distinct texels from the source texture, and + // sample them at the appropriate offset to produce each output texel. + switch (shader_) { + case Shader::BILINEAR: + break; + + case Shader::BILINEAR2: + case Shader::BILINEAR3: + case Shader::BILINEAR4: + case Shader::BICUBIC_HALF_1D: + case Shader::PLANAR_CHANNEL_0: + case Shader::PLANAR_CHANNEL_1: + case Shader::PLANAR_CHANNEL_2: + case Shader::PLANAR_CHANNEL_3: + case Shader::I422_NV61_MRT: + case Shader::DEINTERLEAVE_PAIRWISE_MRT: + switch (primary_axis) { + case HORIZONTAL: + gl_->Uniform2f(scaling_vector_location_, + src_rect_texcoord[2] / dst_size.width(), 0.0); + break; + case VERTICAL: + gl_->Uniform2f(scaling_vector_location_, 0.0, + src_rect_texcoord[3] / dst_size.height()); + break; + } + break; + + case Shader::BILINEAR2X2: + gl_->Uniform2f(scaling_vector_location_, + src_rect_texcoord[2] / dst_size.width(), + src_rect_texcoord[3] / dst_size.height()); + break; + + case Shader::BICUBIC_UPSCALE: + gl_->Uniform2f(src_pixelsize_location_, src_texture_size.width(), + src_texture_size.height()); + // For this shader program, the |scaling_vector| has an alternate meaning: + // It is only being used to select whether bicubic sampling is stepped in + // the X or the Y direction. + gl_->Uniform2f(scaling_vector_location_, + primary_axis == HORIZONTAL ? 1.0 : 0.0, + primary_axis == VERTICAL ? 1.0 : 0.0); + break; + } +} + } // namespace viz
diff --git a/components/viz/common/gl_scaler.h b/components/viz/common/gl_scaler.h index 30529bf..67f3ad5 100644 --- a/components/viz/common/gl_scaler.h +++ b/components/viz/common/gl_scaler.h
@@ -7,6 +7,10 @@ #include <stdint.h> +#include <map> +#include <memory> +#include <tuple> + #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" @@ -17,8 +21,10 @@ #include "ui/gfx/geometry/vector2d.h" namespace gfx { +class ColorTransform; class Vector2dF; class Rect; +class RectF; class Size; } // namespace gfx @@ -266,11 +272,99 @@ const gfx::Vector2d& to); private: + friend class GLScalerShaderPixelTest; + using GLES2Interface = gpu::gles2::GLES2Interface; + enum Axis { HORIZONTAL, VERTICAL }; + + // The shaders used by each stage in the scaling pipeline. + enum class Shader : int8_t { + BILINEAR, + BILINEAR2, + BILINEAR3, + BILINEAR4, + BILINEAR2X2, + BICUBIC_UPSCALE, + BICUBIC_HALF_1D, + PLANAR_CHANNEL_0, + PLANAR_CHANNEL_1, + PLANAR_CHANNEL_2, + PLANAR_CHANNEL_3, + I422_NV61_MRT, + DEINTERLEAVE_PAIRWISE_MRT, + }; + + // A cached, re-usable shader program that performs one step in the scaling + // pipeline. + class VIZ_COMMON_EXPORT ShaderProgram { + public: + ShaderProgram(GLES2Interface* gl, + Shader shader, + GLint texture_format, + const gfx::ColorTransform* color_transform, + const GLenum swizzle[2]); + ~ShaderProgram(); + + Shader shader() const { return shader_; } + GLint texture_format() const { return texture_format_; } + + // UseProgram must be called with GL_ARRAY_BUFFER bound to a vertex + // attribute buffer. |src_texture_size| is the size of the entire source + // texture, regardless of which region is to be sampled. |src_rect| is the + // source region, not including overscan pixels past the edges. + // |primary_axis| configures certain programs which scale in only one + // particular direction. |flip_y| causes the |src_rect| to be scanned + // upside-down, to produce a vertically-flipped result. + void UseProgram(const gfx::Size& src_texture_size, + const gfx::RectF& src_rect, + const gfx::Size& dst_size, + Axis primary_axis, + bool flip_y); + + // GL_ARRAY_BUFFER data that must be bound when drawing with a + // ShaderProgram. These are the vertex attributes that will sweep the entire + // source area when executing the program. They represent triangle strip + // coordinates: The first two columns are (x,y) values interpolated to + // produce the vertex coordinates in object space, while the latter two + // columns are (s,t) values interpolated to produce the texture coordinates + // that correspond to the vertex coordinates. + static const GLfloat kVertexAttributes[16]; + + private: + GLES2Interface* const gl_; + const Shader shader_; + const GLint texture_format_; + + // A program for copying a source texture into a destination texture. + const GLuint program_; + + // The location of the position in the program. + GLint position_location_ = -1; + // The location of the texture coordinate in the program. + GLint texcoord_location_ = -1; + // The location of the source texture in the program. + GLint texture_location_ = -1; + // The location of the texture coordinate of the source rectangle in the + // program. + GLint src_rect_location_ = -1; + // Location of size of source image in pixels. + GLint src_pixelsize_location_ = -1; + // Location of vector for scaling ratio between source and dest textures. + GLint scaling_vector_location_ = -1; + + DISALLOW_COPY_AND_ASSIGN(ShaderProgram); + }; + // ContextLostObserver implementation. void OnContextLost() final; + // Returns a cached ShaderProgram, creating one on-demand if necessary. + ShaderProgram* GetShaderProgram(Shader shader, + GLint texture_format, + const gfx::ColorTransform* color_transform, + const GLenum swizzle[2]); + // The provider of the GL context. This is non-null while the GL context is // valid and GLScaler is observing for context loss. scoped_refptr<ContextProvider> context_provider_; @@ -282,6 +376,13 @@ // GetMaxDrawBuffersSupported(). -1 means "not yet known." mutable int max_draw_buffers_ = -1; + // Cache of ShaderPrograms. The cache key consists of fields that correspond + // to the arguments of GetShaderProgram(): the shader, the texture format, the + // source and output color spaces (color transform), and the two swizzles. + using ShaderCacheKey = std:: + tuple<Shader, GLint, gfx::ColorSpace, gfx::ColorSpace, GLenum, GLenum>; + std::map<ShaderCacheKey, ShaderProgram> shader_programs_; + DISALLOW_COPY_AND_ASSIGN(GLScaler); };
diff --git a/components/viz/common/gl_scaler_shader_pixeltest.cc b/components/viz/common/gl_scaler_shader_pixeltest.cc new file mode 100644 index 0000000..cb84b1c8 --- /dev/null +++ b/components/viz/common/gl_scaler_shader_pixeltest.cc
@@ -0,0 +1,687 @@ +// 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. + +#include "components/viz/common/gl_scaler.h" + +#include <sstream> +#include <tuple> +#include <vector> + +#include "build/build_config.h" +#include "cc/test/pixel_test.h" +#include "cc/test/pixel_test_utils.h" +#include "components/viz/common/gl_scaler_test_util.h" +#include "components/viz/common/gpu/context_provider.h" +#include "gpu/GLES2/gl2chromium.h" +#include "gpu/GLES2/gl2extchromium.h" +#include "gpu/command_buffer/client/gles2_implementation.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkRect.h" +#include "ui/gfx/color_transform.h" + +#if defined(OS_ANDROID) +#include "base/android/build_info.h" +#endif + +namespace viz { + +namespace { + +// Base size of test images to be operated upon. Both dimensions must be +// divisible by 2, 3, or 4. +constexpr gfx::Size kBaseSize = gfx::Size(16 * 4 * 3, 9 * 4 * 3); + +} // namespace + +class GLScalerShaderPixelTest + : public cc::PixelTest, + public testing::WithParamInterface<std::tuple<bool, bool>>, + public GLScalerTestUtil { + public: + using Axis = GLScaler::Axis; + using Shader = GLScaler::Shader; + using ShaderProgram = GLScaler::ShaderProgram; + + GLScalerShaderPixelTest() + : scoped_trace_( + __FILE__, + __LINE__, + (testing::Message() + << "is_converting_rgb_to_yuv=" << is_converting_rgb_to_yuv() + << ", is_swizzling_output=" << is_swizzling_output())) {} + + bool is_converting_rgb_to_yuv() const { return std::get<0>(GetParam()); } + bool is_swizzling_output() const { return std::get<1>(GetParam()); } + + bool AreMultipleRenderingTargetsSupported() const { + return scaler_->GetMaxDrawBuffersSupported() > 1; + } + + // Returns a cached ShaderProgram, maybe configured to convert RGB→YUV and/or + // swizzle the 1st and 3rd bytes in the output (depending on GetParams()). + ShaderProgram* GetShaderProgram(Shader shader) { + std::unique_ptr<gfx::ColorTransform> transform; + if (is_converting_rgb_to_yuv()) { + transform = gfx::ColorTransform::NewColorTransform( + DefaultRGBColorSpace(), DefaultYUVColorSpace(), + gfx::ColorTransform::Intent::INTENT_ABSOLUTE); + } + const GLenum swizzle[2] = { + is_swizzling_output() ? GL_BGRA_EXT : GL_RGBA, + is_swizzling_output() ? GL_BGRA_EXT : GL_RGBA, + }; + return scaler_->GetShaderProgram(shader, GL_RGBA, transform.get(), swizzle); + } + + GLuint CreateTexture(const gfx::Size& size) { + return texture_helper_->CreateTexture(size); + } + + GLuint UploadTexture(const SkBitmap& bitmap) { + return texture_helper_->UploadTexture(bitmap); + } + + SkBitmap DownloadTexture(GLuint texture, const gfx::Size& size) { + return texture_helper_->DownloadTexture(texture, size); + } + + GLuint RenderToNewTexture(GLuint src_texture, const gfx::Size& size) { + return RenderToNewTextures(src_texture, size, false).first; + } + + // Using the current shader program, creates new texture(s) of the given + // |size| and draws using |src_texture| as input. If |dual_outputs| is true, + // two new textures are created and drawn-to simultaneously; otherwise, only + // one is created and drawn-to. The caller does not take ownership of the new + // texture(s). + std::pair<GLuint, GLuint> RenderToNewTextures(GLuint src_texture, + const gfx::Size& size, + bool dual_outputs) { + auto dst_textures = std::make_pair<GLuint, GLuint>( + CreateTexture(size), dual_outputs ? CreateTexture(size) : 0u); + GLuint framebuffer = 0; + gl_->GenFramebuffers(1, &framebuffer); + gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer); + gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, dst_textures.first, 0); + if (dual_outputs) { + gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 1, + GL_TEXTURE_2D, dst_textures.second, 0); + } + + gl_->BindTexture(GL_TEXTURE_2D, src_texture); + + gl_->Viewport(0, 0, size.width(), size.height()); + const GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT0 + 1}; + gl_->DrawBuffersEXT(dual_outputs ? 2 : 1, buffers); + // Assumption: The |vertex_attributes_buffer_| created in SetUp() is + // currently bound to GL_ARRAY_BUFFER. + gl_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + gl_->DeleteFramebuffers(1, &framebuffer); + + return dst_textures; + } + + // Returns a texture that converts the input |texture| back to unswizzled RGB, + // if necessary, depending on GetParam(). The caller does not take ownership + // of the returned texture, which could be the same texture as the input + // argument in some cases. + GLuint ConvertBackToUnswizzledRGB(GLuint texture, const gfx::Size& size) { + GLuint result = texture; + if (is_swizzling_output()) { + const GLenum swizzle[2] = {GL_BGRA_EXT, GL_BGRA_EXT}; + scaler_->GetShaderProgram(Shader::BILINEAR, GL_RGBA, nullptr, swizzle) + ->UseProgram(size, gfx::RectF(gfx::Rect(size)), size, + Axis::HORIZONTAL, false); + result = RenderToNewTexture(result, size); + } + if (is_converting_rgb_to_yuv()) { + const auto transform = gfx::ColorTransform::NewColorTransform( + DefaultYUVColorSpace(), DefaultRGBColorSpace(), + gfx::ColorTransform::Intent::INTENT_ABSOLUTE); + const GLenum swizzle[2] = {GL_RGBA, GL_RGBA}; + scaler_ + ->GetShaderProgram(Shader::BILINEAR, GL_RGBA, transform.get(), + swizzle) + ->UseProgram(size, gfx::RectF(gfx::Rect(size)), size, + Axis::HORIZONTAL, false); + result = RenderToNewTexture(result, size); + } + return result; + } + + // A test case executed by RunSMPTEScalingTestCases(). + struct SMPTEScalingTestCase { + gfx::Rect src_rect; // Selects a subrect of the source. + int scale_from; // Scale ratio denominator. + int scale_to; // Scale ratio numerator. + int fuzzy_bar_border; // Ignored pixels between color bars, when comparing. + }; + + // Draws with the given shader for each of the provided |test_cases| and adds + // gtest failure(s) if the output does not look like a part of the SMPTE test + // image. + void RunSMPTEScalingTestCases( + Shader shader, + const std::vector<SMPTEScalingTestCase>& test_cases) { + const SkBitmap source = CreateSMPTETestImage(kBaseSize); + const GLuint src_texture = UploadTexture(source); + + for (const auto& tc : test_cases) { + for (int is_horizontal = 0; is_horizontal <= 1; ++is_horizontal) { + gfx::Size dst_size = tc.src_rect.size(); + Axis axis; + if (is_horizontal) { + CHECK_EQ((dst_size.width() * tc.scale_to) % tc.scale_from, 0); + dst_size.set_width(dst_size.width() * tc.scale_to / tc.scale_from); + axis = Axis::HORIZONTAL; + } else { + CHECK_EQ((dst_size.height() * tc.scale_to) % tc.scale_from, 0); + dst_size.set_height(dst_size.height() * tc.scale_to / tc.scale_from); + axis = Axis::VERTICAL; + } + + SCOPED_TRACE(testing::Message() + << "src_rect=" << tc.src_rect.ToString() + << ", scale from→to=" << tc.scale_from << "→" + << tc.scale_to << ", dst_size=" << dst_size.ToString()); + + GetShaderProgram(shader)->UseProgram(kBaseSize, gfx::RectF(tc.src_rect), + dst_size, axis, false); + const SkBitmap actual = DownloadTexture( + ConvertBackToUnswizzledRGB( + RenderToNewTexture(src_texture, dst_size), dst_size), + dst_size); + int max_color_diff = GetMaxAllowedColorDifference(); + if (!LooksLikeSMPTETestImage(actual, kBaseSize, tc.src_rect, + tc.fuzzy_bar_border, &max_color_diff)) { + ADD_FAILURE() << "Scaled image does not look like the correct scaled " + "subrect of the SMPTE test image (max diff measured=" + << max_color_diff + << "):\nActual: " << cc::GetPNGDataUrl(actual); + } + } + } + } + + // Adds test failures if an |actual| image does not match the |expected| + // image. When not doing color space conversion, the images must match + // exactly; otherwise, some minor differences are allowed. + void ExpectAreTheSameImage(const SkBitmap& expected, + const SkBitmap& actual) const { + const int max_color_diff = GetMaxAllowedColorDifference(); + if (!cc::FuzzyPixelComparator(false, 100.0f, 0.0f, max_color_diff, + max_color_diff, 0) + .Compare(expected, actual)) { + ADD_FAILURE() << "Images are not similar enough (max_color_diff=" + << max_color_diff + << "):\nExpected: " << cc::GetPNGDataUrl(expected) + << "\nActual: " << cc::GetPNGDataUrl(actual); + } + } + + // Draws with the given shader to downscale a "striped pattern" image by + // |downscale_factor| in one dimension only, and adds gtest failure(s) if the + // resulting image is not of the |expected_solid_color|. |cycle| specifies the + // colors of the stripes, which should average to |expected_solid_color|. + // + // If the shader program is correct, it should be sampling the texture halfway + // between each pair of stripes and then averaging the result. This means that + // every N pixels in the source will be averaged to one pixel in the output, + // creating a solid color fill as output. If the shader is sampling the + // texture at the wrong points, the result will be tinted and/or contain + // striping. + void RunMultiplePassBilinearTest(Shader shader, + int downscale_factor, + const std::vector<SkColor>& cycle) { + // Compute the expected solid fill color from the colors in |cycle|. + uint32_t sum_red = 0; + uint32_t sum_green = 0; + uint32_t sum_blue = 0; + uint32_t sum_alpha = 0; + for (SkColor c : cycle) { + sum_red += SkColorGetR(c); + sum_green += SkColorGetG(c); + sum_blue += SkColorGetB(c); + sum_alpha += SkColorGetA(c); + } + const float count = cycle.size(); + // Note: Taking the rounded average for each color channel. + const SkColor expected_solid_color = + SkColorSetARGB(sum_alpha / count + 0.5f, sum_red / count + 0.5f, + sum_green / count + 0.5f, sum_blue / count + 0.5f); + + // Run the test for the vertical direction, and again for the horizontal + // direction. + const gfx::Rect src_rect = + gfx::Rect(0, 0, 10 * downscale_factor, 10 * downscale_factor); + for (int is_horizontal = 0; is_horizontal <= 1; ++is_horizontal) { + gfx::Size dst_size = src_rect.size(); + Axis axis; + CyclicalPattern pattern; + if (is_horizontal) { + dst_size.set_width(dst_size.width() / downscale_factor); + axis = Axis::HORIZONTAL; + pattern = VERTICAL_STRIPES; + } else { + dst_size.set_height(dst_size.height() / downscale_factor); + axis = Axis::VERTICAL; + pattern = HORIZONTAL_STRIPES; + } + + // Create the expected output image consisting of a solid fill color. + SkBitmap expected = AllocateRGBABitmap(dst_size); + expected.eraseColor(expected_solid_color); + + // Run the test for each of N possible rotations of the |cycle| of + // stripes. + for (size_t rotation = 0; rotation < cycle.size(); ++rotation) { + SCOPED_TRACE(testing::Message() << "is_horizontal=" << !!is_horizontal + << ", rotation=" << rotation + << ", expected_solid_color=" << std::hex + << expected_solid_color); + + const SkBitmap source = + CreateCyclicalTestImage(src_rect.size(), pattern, cycle, rotation); + const GLuint src_texture = UploadTexture(source); + + // Execute the program, and convert the shader program's drawn result + // back to an unswizzled RGB form, and compare that with the expected + // image. + GetShaderProgram(shader)->UseProgram( + src_rect.size(), gfx::RectF(src_rect), dst_size, axis, false); + const SkBitmap actual = DownloadTexture( + ConvertBackToUnswizzledRGB( + RenderToNewTexture(src_texture, dst_size), dst_size), + dst_size); + ExpectAreTheSameImage(expected, actual); + } + } + } + + protected: + void SetUp() final { + cc::PixelTest::SetUpGLWithoutRenderer(false); + + scaler_ = std::make_unique<GLScaler>(context_provider()); + gl_ = context_provider()->ContextGL(); + CHECK(gl_); + + // Set up vertex attributes buffer and its data. + gl_->GenBuffers(1, &vertex_attributes_buffer_); + gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_attributes_buffer_); + gl_->BufferData(GL_ARRAY_BUFFER, sizeof(ShaderProgram::kVertexAttributes), + ShaderProgram::kVertexAttributes, GL_STATIC_DRAW); + + texture_helper_ = std::make_unique<GLScalerTestTextureHelper>(gl_); + } + + void TearDown() final { + texture_helper_.reset(); + + if (vertex_attributes_buffer_) { + gl_->DeleteBuffers(1, &vertex_attributes_buffer_); + vertex_attributes_buffer_ = 0; + } + + gl_ = nullptr; + scaler_.reset(); + + cc::PixelTest::TearDown(); + } + + // Returns the maximum allowed absolute difference between any two color + // values in the expected vs actual image comparisons, given the current test + // parameters and known platform-specific inaccuracy. + int GetMaxAllowedColorDifference() const { +#if defined(OS_ANDROID) + // Android seems to have texture sampling and/or readback accuracy issues + // with these programs that are not at all seen on any of the desktop + // platforms. Also, versions before Marshmallow seem to have a much larger + // accuracy issue with a few of the programs. Thus, use higher thresholds, + // assuming that the programs are correct if they can pass a much lower + // threshold on other platforms. + if (base::android::BuildInfo::GetInstance()->sdk_int() < + base::android::SDK_VERSION_MARSHMALLOW) { + return (is_converting_rgb_to_yuv() || is_swizzling_output()) ? 24 : 12; + } + return (is_converting_rgb_to_yuv() || is_swizzling_output()) ? 4 : 2; +#else + return (is_converting_rgb_to_yuv() || is_swizzling_output()) ? 2 : 0; +#endif + } + + testing::ScopedTrace scoped_trace_; + std::unique_ptr<GLScaler> scaler_; + gpu::gles2::GLES2Interface* gl_ = nullptr; + GLuint vertex_attributes_buffer_ = 0; + std::unique_ptr<GLScalerTestTextureHelper> texture_helper_; +}; + +// As the BILINEAR shader is used by some of the test helpers, this test is +// necessary to ensure the correctness of the tools used by all the other tests. +TEST_P(GLScalerShaderPixelTest, ValidateTestHelpers) { + // Create/validate a SMPTE color bar test image. + const SkBitmap original = CreateSMPTETestImage(kBaseSize); + int max_color_diff = GetMaxAllowedColorDifference(); + ASSERT_TRUE(LooksLikeSMPTETestImage(original, kBaseSize, gfx::Rect(kBaseSize), + 0, &max_color_diff)) + << "max diff measured=" << max_color_diff; + + // Create and upload a test image that has had RGB→YUV conversion performed + // and/or had its color channels swizzled, depending on the testing params. + SkBitmap image = CreateSMPTETestImage(kBaseSize); + if (is_converting_rgb_to_yuv()) { + ConvertBitmapToYUV(&image); + } + if (is_swizzling_output()) { + SwizzleBitmap(&image); + } + const GLuint uploaded_texture = UploadTexture(image); + + // Use the convert-back helper, which uses the BILINEAR shader to convert the + // |uploaded_texture| back to an unswizzled RGB form. Then, download the + // result and check whether it matches the original. + const gfx::Size size(image.width(), image.height()); + const GLuint converted_back_texture = + ConvertBackToUnswizzledRGB(uploaded_texture, size); + const SkBitmap actual = DownloadTexture(converted_back_texture, size); + ExpectAreTheSameImage(original, actual); +} + +// Tests the default, one-pass bilinear shader which can upscale or downscale by +// up to 2X. +TEST_P(GLScalerShaderPixelTest, Bilinear) { + constexpr gfx::Rect whole = gfx::Rect(kBaseSize); + constexpr gfx::Rect quadrant = + gfx::Rect(kBaseSize.width() / 2, kBaseSize.height() / 2, + kBaseSize.width() / 2, kBaseSize.height() / 2); + const std::vector<SMPTEScalingTestCase> kTestCases = { + // No scaling. + {whole, 1, 1, 0}, + // Downscale by half. + {whole, 2, 1, 1}, + // Upscale by 1.5. + {whole, 2, 3, 1}, + // No scaling; lower-right quadrant only. + {quadrant, 1, 1, 0}, + // Downscale by half; lower-right quadrant only. + {quadrant, 2, 1, 1}, + // Upscale by 1.5; lower-right quadrant only. + {quadrant, 2, 3, 1}, + }; + + RunSMPTEScalingTestCases(Shader::BILINEAR, kTestCases); +} + +// Test the 2-tap bilinear shader, which downscales by 4X in one dimension. +TEST_P(GLScalerShaderPixelTest, TwoTapBilinear) { + RunMultiplePassBilinearTest(Shader::BILINEAR2, 4, + {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff)}); +} + +// Test the 3-tap bilinear shader, which downscales by 6X in one dimension. +TEST_P(GLScalerShaderPixelTest, ThreeTapBilinear) { + RunMultiplePassBilinearTest(Shader::BILINEAR3, 6, + {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0xbf, 0x00, 0x80, 0xff), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0xbf, 0xff, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff)}); +} + +// Test the 4-tap bilinear shader, which downscales by 8X in one dimension. +TEST_P(GLScalerShaderPixelTest, FourTapBilinear) { + RunMultiplePassBilinearTest(Shader::BILINEAR4, 8, + {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff), + SkColorSetARGB(0xff, 0xff, 0xff, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x80), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x80), + SkColorSetARGB(0xff, 0xff, 0x00, 0xff)}); +} + +// Test the 2-by-2-tap bilinear shader, which downscales by 4X in both +// dimensions at the same time. +TEST_P(GLScalerShaderPixelTest, TwoByTwoTapBilinear) { + RunMultiplePassBilinearTest(Shader::BILINEAR2X2, 4, + {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0x7f, 0x00, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff)}); +} + +// Tests the bicubic upscaler for a variety of scaling factors between 1X and +// 2X, and over the entire source texture versus just its lower-right quadrant. +TEST_P(GLScalerShaderPixelTest, BicubicUpscale) { + constexpr gfx::Rect whole = gfx::Rect(kBaseSize); + constexpr gfx::Rect quadrant = + gfx::Rect(kBaseSize.width() / 2, kBaseSize.height() / 2, + kBaseSize.width() / 2, kBaseSize.height() / 2); + const std::vector<SMPTEScalingTestCase> kTestCases = { + // No scaling. + {whole, 1, 1, 0}, + // Upscale by 4/3. + {whole, 3, 4, 3}, + // Upscale by 3/2. + {whole, 2, 3, 3}, + // Upscale by 2X. + {whole, 1, 2, 3}, + // No scaling; lower-right quadrant only. + {quadrant, 1, 1, 0}, + // Upscale by 4/3. + {quadrant, 3, 4, 3}, + // Upscale by 3/2. + {quadrant, 2, 3, 3}, + // Upscale by 2X. + {quadrant, 1, 2, 3}, + }; + + RunSMPTEScalingTestCases(Shader::BICUBIC_UPSCALE, kTestCases); +} + +// Tests the bicubic half-downscaler, both over an entire source texture and +// over just its lower-right quadrant. +TEST_P(GLScalerShaderPixelTest, BicubicDownscaleByHalf) { + constexpr gfx::Rect whole = gfx::Rect(kBaseSize); + constexpr gfx::Rect quadrant = + gfx::Rect(kBaseSize.width() / 2, kBaseSize.height() / 2, + kBaseSize.width() / 2, kBaseSize.height() / 2); + const std::vector<SMPTEScalingTestCase> kTestCases = { + // Downscale by half. + {whole, 2, 1, 2}, + // Downscale by half; lower-right quadrant only. + {quadrant, 2, 1, 2}, + }; + + RunSMPTEScalingTestCases(Shader::BICUBIC_HALF_1D, kTestCases); +} + +// Tests the shaders that read a normal 4-channel interleaved texture and +// produce a planar texture consisting of just one color channel, packed into +// RGBA quads. +TEST_P(GLScalerShaderPixelTest, Export_Planar) { + const std::vector<SkColor> kCycle = {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0x80, 0x00, 0x80, 0x00), + SkColorSetARGB(0x80, 0x00, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff)}; + SkBitmap source = CreateCyclicalTestImage(kBaseSize, STAGGERED, kCycle, 0); + const GLuint src_texture = UploadTexture(source); + + // For each channel, create an expected bitmap and compare it to the result + // from drawing with the shader program. + if (is_converting_rgb_to_yuv()) { + ConvertBitmapToYUV(&source); + } + for (int channel = 0; channel <= 3; ++channel) { + SkBitmap expected = CreatePackedPlanarBitmap(source, channel); + if (is_swizzling_output()) { + SwizzleBitmap(&expected); + } + + const Shader shader = static_cast<Shader>( + static_cast<int>(Shader::PLANAR_CHANNEL_0) + channel); + const gfx::Size dst_size(kBaseSize.width() / 4, kBaseSize.height()); + GetShaderProgram(shader)->UseProgram(kBaseSize, + gfx::RectF(gfx::Rect(kBaseSize)), + dst_size, Axis::HORIZONTAL, false); + const SkBitmap actual = + DownloadTexture(RenderToNewTexture(src_texture, dst_size), dst_size); + ExpectAreTheSameImage(expected, actual); + } +} + +// Tests that the I422/NV61 formatter shader program produces a planar texture +// and an interleaved half-width texture from a normal 4-channel interleaved +// texture. See gl_shader.h for more specifics. +TEST_P(GLScalerShaderPixelTest, Export_I422_NV61) { + if (!AreMultipleRenderingTargetsSupported()) { + LOG(WARNING) << "Skipping test due to lack of MRT support on this machine."; + return; + } + + // Use a vertical stripes source image/texture to test that the shader is + // sampling the texture at the correct points and performing + // downscale-blending in the second texture. + const std::vector<SkColor> kCycle = {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0x80, 0x00, 0x80, 0x00), + SkColorSetARGB(0x80, 0x00, 0x80, 0x00), + SkColorSetARGB(0xff, 0x00, 0x00, 0xff)}; + SkBitmap source = + CreateCyclicalTestImage(kBaseSize, VERTICAL_STRIPES, kCycle, 0); + const GLuint src_texture = UploadTexture(source); + + // Create the expected output images: The first (A) is simply the first color + // channel of the source packed into a planar format. The second (BC) consists + // of the second and third color channels downscaled by half and interleaved. + // The following can be considered a reference implementation for what the + // shader program is supposed to do. + if (is_converting_rgb_to_yuv()) { + ConvertBitmapToYUV(&source); + } + SkBitmap expected_a = CreatePackedPlanarBitmap(source, 0); + if (is_swizzling_output()) { + SwizzleBitmap(&expected_a); + } + const gfx::Size dst_size(expected_a.width(), expected_a.height()); + SkBitmap expected_bc = AllocateRGBABitmap(dst_size); + for (int y = 0; y < dst_size.height(); ++y) { + const uint32_t* const src = source.getAddr32(0, y); + uint32_t* const dst_bc = expected_bc.getAddr32(0, y); + for (int x = 0; x < dst_size.width(); ++x) { + // (src[0..3]) (dst_bc) + // RGBA RGBA rgba rgba --> GBgb (e.g, two G's blended into one G) + const uint32_t g01 = ((((src[x * 4 + 0] >> kGreenShift) & 0xff) + + ((src[x * 4 + 1] >> kGreenShift) & 0xff)) / + 2.f + + 0.5f); + const uint32_t b01 = ((((src[x * 4 + 0] >> kBlueShift) & 0xff) + + ((src[x * 4 + 1] >> kBlueShift) & 0xff)) / + 2.f + + 0.5f); + const uint32_t g23 = ((((src[x * 4 + 2] >> kGreenShift) & 0xff) + + ((src[x * 4 + 3] >> kGreenShift) & 0xff)) / + 2.f + + 0.5f); + const uint32_t b23 = ((((src[x * 4 + 2] >> kBlueShift) & 0xff) + + ((src[x * 4 + 3] >> kBlueShift) & 0xff)) / + 2.f + + 0.5f); + dst_bc[x] = ((g01 << kRedShift) | (b01 << kGreenShift) | + (g23 << kBlueShift) | (b23 << kAlphaShift)); + } + } + if (is_swizzling_output()) { + SwizzleBitmap(&expected_bc); + } + + // Execute the program, and compare the shader program's drawn result with the + // expected images. + GetShaderProgram(Shader::I422_NV61_MRT) + ->UseProgram(kBaseSize, gfx::RectF(gfx::Rect(kBaseSize)), dst_size, + Axis::HORIZONTAL, false); + const auto textures = RenderToNewTextures(src_texture, dst_size, true); + const SkBitmap actual_a = DownloadTexture(textures.first, dst_size); + ExpectAreTheSameImage(expected_a, actual_a); + const SkBitmap actual_bc = DownloadTexture(textures.second, dst_size); + ExpectAreTheSameImage(expected_bc, actual_bc); +} + +// Tests the pairwise-deinterleave shader program that produces two planar +// textures from a single interleaved one. +TEST_P(GLScalerShaderPixelTest, Export_PairwiseDeinterleave) { + if (!AreMultipleRenderingTargetsSupported()) { + LOG(WARNING) << "Skipping test due to lack of MRT support on this machine."; + return; + } + + // This shader does not provide color space conversion. It is just a + // demultiplexer/repackager. + if (is_converting_rgb_to_yuv()) { + return; + } + + // Create a source image/texture with a pattern suitable for ensuring the + // shader is sampling the texture at the correct points. + const std::vector<SkColor> kCycle = {SkColorSetARGB(0xff, 0xff, 0x00, 0x00), + SkColorSetARGB(0xc0, 0x00, 0xc0, 0x00), + SkColorSetARGB(0x80, 0x00, 0x00, 0x80), + SkColorSetARGB(0xff, 0xff, 0xff, 0xff)}; + const SkBitmap source = + CreateCyclicalTestImage(kBaseSize, STAGGERED, kCycle, 0); + const GLuint src_texture = UploadTexture(source); + + // Create the expected pair of planar images. + const gfx::Size dst_size(kBaseSize.width() / 2, kBaseSize.height()); + SkBitmap expected_a = AllocateRGBABitmap(dst_size); + SkBitmap expected_b = AllocateRGBABitmap(dst_size); + for (int y = 0; y < dst_size.height(); ++y) { + const uint32_t* const src = source.getAddr32(0, y); + uint32_t* const dst_a = expected_a.getAddr32(0, y); + uint32_t* const dst_b = expected_b.getAddr32(0, y); + for (int x = 0; x < dst_size.width(); ++x) { + // (src) (dst_a) (dst_b) + // ABAB abab --> { AAaa + BBbb } + dst_a[x] = ((((src[x * 2 + 0] >> kRedShift) & 0xff) << kRedShift) | + (((src[x * 2 + 0] >> kBlueShift) & 0xff) << kGreenShift) | + (((src[x * 2 + 1] >> kRedShift) & 0xff) << kBlueShift) | + (((src[x * 2 + 1] >> kBlueShift) & 0xff) << kAlphaShift)); + dst_b[x] = ((((src[x * 2 + 0] >> kGreenShift) & 0xff) << kRedShift) | + (((src[x * 2 + 0] >> kAlphaShift) & 0xff) << kGreenShift) | + (((src[x * 2 + 1] >> kGreenShift) & 0xff) << kBlueShift) | + (((src[x * 2 + 1] >> kAlphaShift) & 0xff) << kAlphaShift)); + } + } + if (is_swizzling_output()) { + SwizzleBitmap(&expected_a); + SwizzleBitmap(&expected_b); + } + + // Execute the program, and compare the shader program's drawn result with the + // expected images. + GetShaderProgram(Shader::DEINTERLEAVE_PAIRWISE_MRT) + ->UseProgram(kBaseSize, gfx::RectF(gfx::Rect(kBaseSize)), dst_size, + Axis::HORIZONTAL, false); + const auto textures = RenderToNewTextures(src_texture, dst_size, true); + const SkBitmap actual_a = DownloadTexture(textures.first, dst_size); + ExpectAreTheSameImage(expected_a, actual_a); + const SkBitmap actual_b = DownloadTexture(textures.second, dst_size); + ExpectAreTheSameImage(expected_b, actual_b); +} + +INSTANTIATE_TEST_CASE_P(, + GLScalerShaderPixelTest, + testing::Combine(testing::Bool(), testing::Bool())); + +} // namespace viz
diff --git a/components/viz/common/gl_scaler_test_util.cc b/components/viz/common/gl_scaler_test_util.cc new file mode 100644 index 0000000..a706e82 --- /dev/null +++ b/components/viz/common/gl_scaler_test_util.cc
@@ -0,0 +1,362 @@ +// 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. + +#include "components/viz/common/gl_scaler_test_util.h" + +#include <algorithm> +#include <cmath> + +#include "base/logging.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "ui/gfx/geometry/rect.h" + +namespace viz { + +using ColorBar = GLScalerTestUtil::ColorBar; + +// static +SkBitmap GLScalerTestUtil::AllocateRGBABitmap(const gfx::Size& size) { + SkBitmap bitmap; + bitmap.allocPixels(SkImageInfo::Make(size.width(), size.height(), + kRGBA_8888_SkColorType, + kUnpremul_SkAlphaType)); + return bitmap; +} + +// static +uint8_t GLScalerTestUtil::ToClamped255(float value) { + value = std::fma(value, 255.0f, 0.5f /* rounding */); + return base::saturated_cast<uint8_t>(value); +} + +// static +std::vector<ColorBar> GLScalerTestUtil::GetScaledSMPTEColorBars( + const gfx::Size& size) { + std::vector<ColorBar> rects; + const SkScalar scale_x = + static_cast<SkScalar>(size.width()) / kSMPTEFullSize.width(); + const SkScalar scale_y = + static_cast<SkScalar>(size.height()) / kSMPTEFullSize.height(); + for (const auto& cr : kSMPTEColorBars) { + const SkRect rect = + SkRect{cr.rect.fLeft * scale_x, cr.rect.fTop * scale_y, + cr.rect.fRight * scale_x, cr.rect.fBottom * scale_y}; + rects.push_back(ColorBar{rect.round(), cr.color}); + } + return rects; +} + +// static +SkBitmap GLScalerTestUtil::CreateSMPTETestImage(const gfx::Size& size) { + SkBitmap result = AllocateRGBABitmap(size); + + // Set all pixels to a color that should not exist in the result. Later, a + // sanity-check will ensure all pixels have been overwritten. + constexpr SkColor kDeadColor = SkColorSetARGB(0xde, 0xad, 0xbe, 0xef); + result.eraseColor(kDeadColor); + + // Set the pixels corresponding to each color bar. + for (const auto& cr : GetScaledSMPTEColorBars(size)) { + result.erase(cr.color, cr.rect); + } + + // Validate that every pixel in the result bitmap has been touched by one of + // the color bars. + for (int y = 0; y < result.height(); ++y) { + for (int x = 0; x < result.width(); ++x) { + if (result.getColor(x, y) == kDeadColor) { + NOTREACHED() << "TEST BUG: Error creating SMPTE test image. Bad size (" + << size.ToString() << ")?"; + return result; + } + } + } + + return result; +} + +// static +bool GLScalerTestUtil::LooksLikeSMPTETestImage(const SkBitmap& image, + const gfx::Size& src_size, + const gfx::Rect& src_rect, + int fuzzy_pixels, + int* max_color_diff) { + if (image.width() <= 0 || image.height() <= 0) { + return false; + } + + const SkScalar offset_x = static_cast<SkScalar>(src_rect.x()); + const SkScalar offset_y = static_cast<SkScalar>(src_rect.y()); + const SkScalar scale_x = + static_cast<SkScalar>(image.width()) / src_rect.width(); + const SkScalar scale_y = + static_cast<SkScalar>(image.height()) / src_rect.height(); + int measured_max_diff = 0; + for (const auto& cr : GetScaledSMPTEColorBars(src_size)) { + const SkIRect offset_rect = cr.rect.makeOffset(-offset_x, -offset_y); + const SkIRect rect = + SkRect{offset_rect.fLeft * scale_x, offset_rect.fTop * scale_y, + offset_rect.fRight * scale_x, offset_rect.fBottom * scale_y} + .round() + .makeInset(fuzzy_pixels, fuzzy_pixels); + for (int y = std::max(0, rect.fTop), + y_end = std::min(image.height(), rect.fBottom); + y < y_end; ++y) { + for (int x = std::max(0, rect.fLeft), + x_end = std::min(image.width(), rect.fRight); + x < x_end; ++x) { + const SkColor actual = image.getColor(x, y); + measured_max_diff = + std::max({measured_max_diff, + std::abs(static_cast<int>(SkColorGetR(cr.color)) - + static_cast<int>(SkColorGetR(actual))), + std::abs(static_cast<int>(SkColorGetG(cr.color)) - + static_cast<int>(SkColorGetG(actual))), + std::abs(static_cast<int>(SkColorGetB(cr.color)) - + static_cast<int>(SkColorGetB(actual))), + std::abs(static_cast<int>(SkColorGetA(cr.color)) - + static_cast<int>(SkColorGetA(actual)))}); + } + } + } + + if (max_color_diff) { + const int threshold = *max_color_diff; + *max_color_diff = measured_max_diff; + return measured_max_diff <= threshold; + } + return measured_max_diff == 0; +} + +// static +SkBitmap GLScalerTestUtil::CreateCyclicalTestImage( + const gfx::Size& size, + CyclicalPattern pattern, + const std::vector<SkColor>& cycle, + size_t rotation) { + CHECK(!cycle.empty()); + + // Map SkColors to RGBA data. Also, applies the cycle |rotation| to simplify + // the rest of the code below. + std::vector<uint32_t> cycle_as_rgba(cycle.size()); + for (size_t i = 0; i < cycle.size(); ++i) { + const SkColor color = cycle[(i + rotation) % cycle.size()]; + cycle_as_rgba[i] = ((SkColorGetR(color) << kRedShift) | + (SkColorGetG(color) << kGreenShift) | + (SkColorGetB(color) << kBlueShift) | + (SkColorGetA(color) << kAlphaShift)); + } + + SkBitmap result = AllocateRGBABitmap(size); + switch (pattern) { + case HORIZONTAL_STRIPES: + for (int y = 0; y < size.height(); ++y) { + uint32_t* const pixels = result.getAddr32(0, y); + const uint32_t stripe_rgba = cycle_as_rgba[y % cycle_as_rgba.size()]; + for (int x = 0; x < size.width(); ++x) { + pixels[x] = stripe_rgba; + } + } + break; + + case VERTICAL_STRIPES: + for (int y = 0; y < size.height(); ++y) { + uint32_t* const pixels = result.getAddr32(0, y); + for (int x = 0; x < size.width(); ++x) { + pixels[x] = cycle_as_rgba[x % cycle_as_rgba.size()]; + } + } + break; + + case STAGGERED: + for (int y = 0; y < size.height(); ++y) { + uint32_t* const pixels = result.getAddr32(0, y); + for (int x = 0; x < size.width(); ++x) { + pixels[x] = cycle_as_rgba[(x + y) % cycle_as_rgba.size()]; + } + } + break; + } + + return result; +} + +// static +gfx::ColorSpace GLScalerTestUtil::DefaultRGBColorSpace() { + return gfx::ColorSpace::CreateSRGB(); +} + +// static +gfx::ColorSpace GLScalerTestUtil::DefaultYUVColorSpace() { + return gfx::ColorSpace::CreateREC709(); +} + +// static +void GLScalerTestUtil::ConvertBitmapToYUV(SkBitmap* image) { + const auto transform = gfx::ColorTransform::NewColorTransform( + DefaultRGBColorSpace(), DefaultYUVColorSpace(), + gfx::ColorTransform::Intent::INTENT_ABSOLUTE); + + // Loop, transforming one row of pixels at a time. + std::vector<gfx::ColorTransform::TriStim> stims(image->width()); + for (int y = 0; y < image->height(); ++y) { + uint32_t* const pixels = image->getAddr32(0, y); + for (int x = 0; x < image->width(); ++x) { + stims[x].set_x(((pixels[x] >> kRedShift) & 0xff) / 255.0f); + stims[x].set_y(((pixels[x] >> kGreenShift) & 0xff) / 255.0f); + stims[x].set_z(((pixels[x] >> kBlueShift) & 0xff) / 255.0f); + } + transform->Transform(stims.data(), stims.size()); + for (int x = 0; x < image->width(); ++x) { + pixels[x] = ((ToClamped255(stims[x].x()) << kRedShift) | + (ToClamped255(stims[x].y()) << kGreenShift) | + (ToClamped255(stims[x].z()) << kBlueShift) | + (((pixels[x] >> kAlphaShift) & 0xff) << kAlphaShift)); + } + } +} + +// static +void GLScalerTestUtil::SwizzleBitmap(SkBitmap* image) { + for (int y = 0; y < image->height(); ++y) { + uint32_t* const pixels = image->getAddr32(0, y); + for (int x = 0; x < image->width(); ++x) { + pixels[x] = ((((pixels[x] >> kBlueShift) & 0xff) << kRedShift) | + (((pixels[x] >> kGreenShift) & 0xff) << kGreenShift) | + (((pixels[x] >> kRedShift) & 0xff) << kBlueShift) | + (((pixels[x] >> kAlphaShift) & 0xff) << kAlphaShift)); + } + } +} + +// static +SkBitmap GLScalerTestUtil::CreatePackedPlanarBitmap(const SkBitmap& source, + int channel) { + CHECK_EQ(source.width() % 4, 0); + SkBitmap result = + AllocateRGBABitmap(gfx::Size(source.width() / 4, source.height())); + + constexpr int kShiftForChannel[4] = {kRedShift, kGreenShift, kBlueShift, + kAlphaShift}; + const int shift = kShiftForChannel[channel]; + for (int y = 0; y < result.height(); ++y) { + const uint32_t* const src = source.getAddr32(0, y); + uint32_t* const dst = result.getAddr32(0, y); + for (int x = 0; x < result.width(); ++x) { + // (src[0..3]) (dst) + // RGBA RGBA RGBA RGBA --> RRRR (if channel is 0) + dst[x] = ((((src[x * 4 + 0] >> shift) & 0xff) << kRedShift) | + (((src[x * 4 + 1] >> shift) & 0xff) << kGreenShift) | + (((src[x * 4 + 2] >> shift) & 0xff) << kBlueShift) | + (((src[x * 4 + 3] >> shift) & 0xff) << kAlphaShift)); + } + } + return result; +} + +// The area and color of the bars in a 1920x1080 HD SMPTE color bars test image +// (https://commons.wikimedia.org/wiki/File:SMPTE_Color_Bars_16x9.svg). The gray +// linear gradient bar is defined as half solid 0-level black and half solid +// full-intensity white). +const ColorBar GLScalerTestUtil::kSMPTEColorBars[30] = { + {{0, 0, 240, 630}, SkColorSetRGB(0x66, 0x66, 0x66)}, + {{240, 0, 445, 630}, SkColorSetRGB(0xbf, 0xbf, 0xbf)}, + {{445, 0, 651, 630}, SkColorSetRGB(0xbf, 0xbf, 0x00)}, + {{651, 0, 857, 630}, SkColorSetRGB(0x00, 0xbf, 0xbf)}, + {{857, 0, 1063, 630}, SkColorSetRGB(0x00, 0xbf, 0x00)}, + {{1063, 0, 1269, 630}, SkColorSetRGB(0xbf, 0x00, 0xbf)}, + {{1269, 0, 1475, 630}, SkColorSetRGB(0xbf, 0x00, 0x00)}, + {{1475, 0, 1680, 630}, SkColorSetRGB(0x00, 0x00, 0xbf)}, + {{1680, 0, 1920, 630}, SkColorSetRGB(0x66, 0x66, 0x66)}, + {{0, 630, 240, 720}, SkColorSetRGB(0x00, 0xff, 0xff)}, + {{240, 630, 445, 720}, SkColorSetRGB(0x00, 0x21, 0x4c)}, + {{445, 630, 1680, 720}, SkColorSetRGB(0xbf, 0xbf, 0xbf)}, + {{1680, 630, 1920, 720}, SkColorSetRGB(0x00, 0x00, 0xff)}, + {{0, 720, 240, 810}, SkColorSetRGB(0xff, 0xff, 0x00)}, + {{240, 720, 445, 810}, SkColorSetRGB(0x32, 0x00, 0x6a)}, + {{445, 720, 1063, 810}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1063, 720, 1680, 810}, SkColorSetRGB(0xff, 0xff, 0xff)}, + {{1680, 720, 1920, 810}, SkColorSetRGB(0xff, 0x00, 0x00)}, + {{0, 810, 240, 1080}, SkColorSetRGB(0x26, 0x26, 0x26)}, + {{240, 810, 549, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{549, 810, 960, 1080}, SkColorSetRGB(0xff, 0xff, 0xff)}, + {{960, 810, 1131, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1131, 810, 1200, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1200, 810, 1268, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1268, 810, 1337, 1080}, SkColorSetRGB(0x05, 0x05, 0x05)}, + {{1337, 810, 1405, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1405, 810, 1474, 1080}, SkColorSetRGB(0x0a, 0x0a, 0x0a)}, + {{1474, 810, 1680, 1080}, SkColorSetRGB(0x00, 0x00, 0x00)}, + {{1680, 810, 1920, 1080}, SkColorSetRGB(0x26, 0x26, 0x26)}, +}; + +constexpr gfx::Size GLScalerTestUtil::kSMPTEFullSize; + +GLScalerTestTextureHelper::GLScalerTestTextureHelper( + gpu::gles2::GLES2Interface* gl) + : gl_(gl) { + CHECK(gl_); +} + +GLScalerTestTextureHelper::~GLScalerTestTextureHelper() { + gl_->DeleteTextures(textures_to_delete_.size(), textures_to_delete_.data()); + textures_to_delete_.clear(); +} + +GLuint GLScalerTestTextureHelper::CreateTexture(const gfx::Size& size) { + GLuint texture = 0; + gl_->GenTextures(1, &texture); + gl_->BindTexture(GL_TEXTURE_2D, texture); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + gl_->BindTexture(GL_TEXTURE_2D, 0); + + if (texture) { + textures_to_delete_.push_back(texture); + } + + return texture; +} + +GLuint GLScalerTestTextureHelper::UploadTexture(const SkBitmap& bitmap) { + CHECK_EQ(bitmap.colorType(), kRGBA_8888_SkColorType); + + GLuint texture = 0; + gl_->GenTextures(1, &texture); + gl_->BindTexture(GL_TEXTURE_2D, texture); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap.width(), bitmap.height(), 0, + GL_RGBA, GL_UNSIGNED_BYTE, bitmap.getAddr32(0, 0)); + gl_->BindTexture(GL_TEXTURE_2D, 0); + + if (texture) { + textures_to_delete_.push_back(texture); + } + + return texture; +} + +SkBitmap GLScalerTestTextureHelper::DownloadTexture(GLuint texture, + const gfx::Size& size) { + GLuint framebuffer = 0; + gl_->GenFramebuffers(1, &framebuffer); + gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer); + gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + texture, 0); + SkBitmap result = GLScalerTestUtil::AllocateRGBABitmap(size); + gl_->ReadPixels(0, 0, size.width(), size.height(), GL_RGBA, GL_UNSIGNED_BYTE, + result.getAddr32(0, 0)); + gl_->DeleteFramebuffers(1, &framebuffer); + return result; +} + +} // namespace viz
diff --git a/components/viz/common/gl_scaler_test_util.h b/components/viz/common/gl_scaler_test_util.h new file mode 100644 index 0000000..3c4e47e --- /dev/null +++ b/components/viz/common/gl_scaler_test_util.h
@@ -0,0 +1,154 @@ +// 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 COMPONENTS_VIZ_COMMON_GL_SCALER_TEST_UTIL_H_ +#define COMPONENTS_VIZ_COMMON_GL_SCALER_TEST_UTIL_H_ + +#include <stdint.h> + +#include <vector> + +#include "base/macros.h" +#include "gpu/command_buffer/client/gles2_interface.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" +#include "third_party/skia/include/core/SkRect.h" +#include "ui/gfx/color_space.h" +#include "ui/gfx/color_transform.h" +#include "ui/gfx/geometry/size.h" + +namespace gfx { +class Rect; +} + +namespace viz { + +// A collection of utility functions used in the GLScaler-related pixel tests. +class GLScalerTestUtil { + public: + struct ColorBar { + SkIRect rect; + SkColor color; + }; + + // The patterns that can be created by CreateCyclicalTestImage(). + enum CyclicalPattern { + HORIZONTAL_STRIPES, + VERTICAL_STRIPES, + STAGGERED, + }; + + // Returns an SkBitmap with pixels allocated, having a RGBA format with + // unpremultiplied alpha. + static SkBitmap AllocateRGBABitmap(const gfx::Size& size); + + // Returns a |value| in the range [0.0,1.0] as an unsigned integer in the + // range [0,255]. + static uint8_t ToClamped255(float value); + + // Return the SMPTE color bars that make up a test image, scaled to an image + // of the given |size|. + static std::vector<ColorBar> GetScaledSMPTEColorBars(const gfx::Size& size); + + // Create a SMPTE color bar test image, scaled to the given |size|. + static SkBitmap CreateSMPTETestImage(const gfx::Size& size); + + // Returns true if the given |image| looks similar-enough to a scaled version + // of a SMPTE color bar test image that was originally of |src_size| and + // cropped to |src_rect|. |fuzzy_pixels| is used to ignore a border of pixels + // surrounding each color bar, since the scaling algorithms may blend + // in-between colors where the bars touch. |max_color_diff| controls what + // "similar-enough" means: 0 for "exact," or otherwise some positive value + // specifying the maximum color value difference; and is updated with the + // the actual maximum. + static bool LooksLikeSMPTETestImage(const SkBitmap& image, + const gfx::Size& src_size, + const gfx::Rect& src_rect, + int fuzzy_pixels, + int* max_color_diff); + + // Returns an image of the given |size| with the colors in |cycle| used to + // generate a striped or staggered |pattern|. |rotation| specifies which index + // in the |cycle| to start with. + static SkBitmap CreateCyclicalTestImage(const gfx::Size& size, + CyclicalPattern pattern, + const std::vector<SkColor>& cycle, + size_t rotation); + + // Returns the RGB/YUV color spaces used by default when color space + // conversion is requested. + static gfx::ColorSpace DefaultRGBColorSpace(); + static gfx::ColorSpace DefaultYUVColorSpace(); + + // Performs an in-place transform of the given |image| from + // DefaultRGBColorSpace() to DefaultYUVColorSpace(). The color channels (plus + // one alpha) remain interleaved (i.e., no pixel blending or format transform + // is being done). + static void ConvertBitmapToYUV(SkBitmap* image); + + // Performs an in-place swizzling of the red and blue color channels in the + // given |image|. + static void SwizzleBitmap(SkBitmap* image); + + // Returns a bitmap consisting of one color channel from every 4 pixels in a + // |source| bitmap packed into a single quad. Thus, the resulting bitmap will + // have 1/4 the width of the source bitmap. This is used to create the + // expected output of the single-channel export shaders, and thus can be + // considered a reference implementation of that. + static SkBitmap CreatePackedPlanarBitmap(const SkBitmap& source, int channel); + + // The area and color of the bars in a 1920x1080 HD SMPTE color bars test + // image (https://commons.wikimedia.org/wiki/File:SMPTE_Color_Bars_16x9.svg). + // The gray linear gradient bar is defined as half solid 0-level black and + // half solid full-intensity white). + static const ColorBar kSMPTEColorBars[30]; + static constexpr gfx::Size kSMPTEFullSize = gfx::Size(1920, 1080); + +#ifdef SK_CPU_BENDIAN + // Bit shift offsets (within a uint32_t RGBA quad) to access each color + // channel's byte. + static constexpr int kRedShift = 24; + static constexpr int kGreenShift = 16; + static constexpr int kBlueShift = 8; + static constexpr int kAlphaShift = 0; +#else + static constexpr int kRedShift = 0; + static constexpr int kGreenShift = 8; + static constexpr int kBlueShift = 16; + static constexpr int kAlphaShift = 24; +#endif +}; + +// A helper for tests to create textures, and download/upload RGBA textures +// to/from SkBitmaps. All textures created by this helper will be deleted when +// its destructor is invoked. +class GLScalerTestTextureHelper { + public: + // |gl| context must outlive this instance. + explicit GLScalerTestTextureHelper(gpu::gles2::GLES2Interface* gl); + + ~GLScalerTestTextureHelper(); + + // Creates a fully-defined RGBA texture of the given |size|, returning its GL + // name. + GLuint CreateTexture(const gfx::Size& size); + + // Uploads the given RGBA |bitmap| to the GPU into a new texture, returning + // its GL name. + GLuint UploadTexture(const SkBitmap& bitmap); + + // Reads-back the |texture| which is of the given |size|, returning the result + // as a RGBA SkBitmap. + SkBitmap DownloadTexture(GLuint texture, const gfx::Size& size); + + private: + gpu::gles2::GLES2Interface* const gl_; + std::vector<GLuint> textures_to_delete_; + + DISALLOW_COPY_AND_ASSIGN(GLScalerTestTextureHelper); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_COMMON_GL_SCALER_TEST_UTIL_H_
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index 28a8345..455170c 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -449,9 +449,9 @@ } } - ++last_acked_trace_id_; - TRACE_EVENT_ASYNC_END0("viz,benchmark", "Graphics.Pipeline.DrawAndSwap", - last_acked_trace_id_); + TRACE_EVENT_ASYNC_END1("viz,benchmark", "Graphics.Pipeline.DrawAndSwap", + swapped_trace_id_, "status", "canceled"); + --swapped_trace_id_; if (scheduler_) { scheduler_->DidSwapBuffers(); scheduler_->DidReceiveSwapBuffersAck();
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index 4563595c..b01ecbe5 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc
@@ -1109,7 +1109,7 @@ CompositorFrame SurfaceAggregator::Aggregate( const SurfaceId& surface_id, base::TimeTicks expected_display_time, - int32_t display_trace_id) { + int64_t display_trace_id) { DCHECK(!expected_display_time.is_null()); uma_stats_.Reset(); @@ -1126,7 +1126,7 @@ if (!surface->HasActiveFrame()) return {}; - base::AutoReset<int32_t> reset_display_trace_id(&display_trace_id_, + base::AutoReset<int64_t> reset_display_trace_id(&display_trace_id_, display_trace_id); const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); TRACE_EVENT_WITH_FLOW2(
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h index 7647ddb..325b7e1a 100644 --- a/components/viz/service/display/surface_aggregator.h +++ b/components/viz/service/display/surface_aggregator.h
@@ -40,7 +40,7 @@ CompositorFrame Aggregate(const SurfaceId& surface_id, base::TimeTicks expected_display_time, - int32_t display_trace_id = -1); + int64_t display_trace_id = -1); void ReleaseResources(const SurfaceId& surface_id); const SurfaceIndexMap& previous_contained_surfaces() const { return previous_contained_surfaces_; @@ -281,7 +281,7 @@ // the display if they're damaged. base::flat_map<FrameSinkId, std::vector<SurfaceRange>> damage_ranges_; - int32_t display_trace_id_ = -1; + int64_t display_trace_id_ = -1; base::WeakPtrFactory<SurfaceAggregator> weak_factory_;
diff --git a/content/browser/browsing_data/storage_partition_http_cache_data_remover.cc b/content/browser/browsing_data/storage_partition_http_cache_data_remover.cc index a6551a0..721ba05 100644 --- a/content/browser/browsing_data/storage_partition_http_cache_data_remover.cc +++ b/content/browser/browsing_data/storage_partition_http_cache_data_remover.cc
@@ -172,8 +172,8 @@ } case CacheState::DELETE_CODE: { next_cache_state_ = CacheState::DONE; - if (base::FeatureList::IsEnabled(features::kIsolatedCodeCache)) { - DCHECK(generated_code_cache_context_); + // Embedders can disable code caches. + if (generated_code_cache_context_) { GeneratedCodeCache* code_cache = generated_code_cache_context_->generated_code_cache(); if (code_cache) {
diff --git a/content/browser/cache_storage/cache_storage_blob_to_disk_cache.cc b/content/browser/cache_storage/cache_storage_blob_to_disk_cache.cc index ad208e12..a641644 100644 --- a/content/browser/cache_storage/cache_storage_blob_to_disk_cache.cc +++ b/content/browser/cache_storage/cache_storage_blob_to_disk_cache.cc
@@ -13,6 +13,7 @@ #include "storage/browser/blob/blob_data_handle.h" #include "storage/browser/blob/blob_url_request_job_factory.h" #include "storage/common/storage_histograms.h" +#include "third_party/blink/public/common/blob/blob_utils.h" namespace content { @@ -38,13 +39,14 @@ DCHECK(!consumer_handle_.is_valid()); DCHECK(!pending_read_); - mojo::ScopedDataPipeProducerHandle producer_handle; - MojoResult result = - CreateDataPipe(nullptr, &producer_handle, &consumer_handle_); - if (result != MOJO_RESULT_OK) { + mojo::DataPipe pipe(blink::BlobUtils::GetDataPipeCapacity()); + if (!pipe.consumer_handle.is_valid()) { std::move(callback).Run(std::move(entry), false /* success */); return; } + DCHECK(pipe.producer_handle.is_valid()); + + consumer_handle_ = std::move(pipe.consumer_handle); disk_cache_body_index_ = disk_cache_body_index; entry_ = std::move(entry); @@ -52,7 +54,7 @@ blink::mojom::BlobReaderClientPtr client; client_binding_.Bind(MakeRequest(&client)); - blob->ReadAll(std::move(producer_handle), std::move(client)); + blob->ReadAll(std::move(pipe.producer_handle), std::move(client)); handle_watcher_.Watch( consumer_handle_.get(), MOJO_HANDLE_SIGNAL_READABLE,
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc index ec173c16..2a6897d5 100644 --- a/content/browser/frame_host/cross_process_frame_connector.cc +++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -484,7 +484,7 @@ void CrossProcessFrameConnector::SetScreenSpaceRect( const gfx::Rect& screen_space_rect) { - gfx::Rect old_rect = screen_space_rect; + gfx::Rect old_rect = screen_space_rect_in_pixels_; FrameConnectorDelegate::SetScreenSpaceRect(screen_space_rect); if (view_) {
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index ebff6f1..5ffbd8e 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -2738,7 +2738,7 @@ params.transition = ui::PAGE_TRANSITION_LINK; params.redirects.push_back(url); params.should_update_history = true; - params.gesture = NavigationGestureUnknown; + params.gesture = NavigationGestureAuto; params.method = "GET"; params.page_state = PageState::CreateFromURL(url); @@ -2763,7 +2763,7 @@ params.redirects.push_back(GURL("http://foo2/#a")); params.redirects.push_back(url); params.should_update_history = true; - params.gesture = NavigationGestureUnknown; + params.gesture = NavigationGestureAuto; params.method = "GET"; params.page_state = PageState::CreateFromURL(url);
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc index 4b8b594e..37f66c01 100644 --- a/content/browser/frame_host/navigation_handle_impl.cc +++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" +#include "base/optional.h" #include "base/time/time.h" #include "content/browser/appcache/appcache_navigation_handle.h" #include "content/browser/appcache/appcache_service_impl.h" @@ -34,6 +35,7 @@ #include "content/common/frame_messages.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/navigation_ui_data.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/site_instance.h" #include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/content_client.h" @@ -73,8 +75,8 @@ } // LOG_NAVIGATION_TIMING_HISTOGRAM logs |value| for "Navigation.<histogram>" UMA -// and (depending on |transition|) also for -// "Navigation.<histogram>.BackForward/Reload/NewNavigation" UMA. +// as well as supplementary UMAs (depending on |transition| and |is_background|) +// for BackForward/Reload/NewNavigation variants. // // kMaxTime and kBuckets constants are consistent with // UMA_HISTOGRAM_MEDIUM_TIMES, but a custom kMinTime is used for high fidelity @@ -83,26 +85,38 @@ // TODO(csharrison,nasko): This macro is incorrect for subframe navigations, // which will only have subframe-specific transition types. This means that all // subframes currently are tagged as NewNavigations. -#define LOG_NAVIGATION_TIMING_HISTOGRAM(histogram, transition, value) \ - do { \ - const base::TimeDelta kMinTime = base::TimeDelta::FromMilliseconds(1); \ - const base::TimeDelta kMaxTime = base::TimeDelta::FromMinutes(3); \ - const int kBuckets = 50; \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram, value, kMinTime, \ - kMaxTime, kBuckets); \ - if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".BackForward", \ - value, kMinTime, kMaxTime, kBuckets); \ - } else if (ui::PageTransitionCoreTypeIs(transition, \ - ui::PAGE_TRANSITION_RELOAD)) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".Reload", value, \ - kMinTime, kMaxTime, kBuckets); \ - } else if (ui::PageTransitionIsNewNavigation(transition)) { \ - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".NewNavigation", \ - value, kMinTime, kMaxTime, kBuckets); \ - } else { \ - NOTREACHED() << "Invalid page transition: " << transition; \ - } \ +#define LOG_NAVIGATION_TIMING_HISTOGRAM(histogram, transition, is_background, \ + duration) \ + do { \ + const base::TimeDelta kMinTime = base::TimeDelta::FromMilliseconds(1); \ + const base::TimeDelta kMaxTime = base::TimeDelta::FromMinutes(3); \ + const int kBuckets = 50; \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram, duration, kMinTime, \ + kMaxTime, kBuckets); \ + if (transition & ui::PAGE_TRANSITION_FORWARD_BACK) { \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".BackForward", \ + duration, kMinTime, kMaxTime, kBuckets); \ + } else if (ui::PageTransitionCoreTypeIs(transition, \ + ui::PAGE_TRANSITION_RELOAD)) { \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".Reload", duration, \ + kMinTime, kMaxTime, kBuckets); \ + } else if (ui::PageTransitionIsNewNavigation(transition)) { \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram ".NewNavigation", \ + duration, kMinTime, kMaxTime, kBuckets); \ + } else { \ + NOTREACHED() << "Invalid page transition: " << transition; \ + } \ + if (is_background.has_value()) { \ + if (is_background.value()) { \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram \ + ".BackgroundProcessPriority", \ + duration, kMinTime, kMaxTime, kBuckets); \ + } else { \ + UMA_HISTOGRAM_CUSTOM_TIMES("Navigation." histogram \ + ".ForegroundProcessPriority", \ + duration, kMinTime, kMaxTime, kBuckets); \ + } \ + } \ } while (0) void LogIsSameProcess(ui::PageTransition transition, bool is_same_process) { @@ -566,8 +580,6 @@ params.transition = ui::PAGE_TRANSITION_TYPED; params.redirects = std::vector<GURL>(); params.should_update_history = false; - params.searchable_form_url = GURL(); - params.searchable_form_encoding = std::string(); params.did_create_new_entry = false; params.gesture = NavigationGestureUser; params.method = "GET"; @@ -870,23 +882,28 @@ frame_tree_node_->current_frame_host()->GetProcess()->GetID(); LogIsSameProcess(transition_, is_same_process_); + // Don't log process-priority-specific UMAs for TimeToReadyToCommit metric + // (which shouldn't be influenced by renderer priority). + constexpr base::Optional<bool> kIsBackground = base::nullopt; + base::TimeDelta delta = ready_to_commit_time_ - navigation_start_; - LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit", transition_, delta); + LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit", transition_, + kIsBackground, delta); if (IsInMainFrame()) { LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit.MainFrame", - transition_, delta); + transition_, kIsBackground, delta); } else { LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit.Subframe", - transition_, delta); + transition_, kIsBackground, delta); } if (is_same_process_) { LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit.SameProcess", - transition_, delta); + transition_, kIsBackground, delta); } else { LOG_NAVIGATION_TIMING_HISTOGRAM("TimeToReadyToCommit.CrossProcess", - transition_, delta); + transition_, kIsBackground, delta); } } @@ -938,38 +955,42 @@ base::TimeTicks now = base::TimeTicks::Now(); base::TimeDelta delta = now - navigation_start_; ui::PageTransition transition = GetPageTransition(); - LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit", transition, delta); + base::Optional<bool> is_background = + render_frame_host->GetProcess()->IsProcessBackgrounded(); + LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit", transition, is_background, + delta); if (IsInMainFrame()) { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.MainFrame", transition, - delta); + is_background, delta); } else { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.Subframe", transition, - delta); + is_background, delta); } if (is_same_process_) { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.SameProcess", transition, - delta); + is_background, delta); if (IsInMainFrame()) { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.SameProcess.MainFrame", - transition, delta); + transition, is_background, delta); } else { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.SameProcess.Subframe", - transition, delta); + transition, is_background, delta); } } else { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.CrossProcess", transition, - delta); + is_background, delta); if (IsInMainFrame()) { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.CrossProcess.MainFrame", - transition, delta); + transition, is_background, delta); } else { LOG_NAVIGATION_TIMING_HISTOGRAM("StartToCommit.CrossProcess.Subframe", - transition, delta); + transition, is_background, delta); } } if (!ready_to_commit_time_.is_null()) { LOG_NAVIGATION_TIMING_HISTOGRAM("ReadyToCommitUntilCommit", transition_, + is_background, now - ready_to_commit_time_); } }
diff --git a/content/browser/frame_host/navigation_handle_impl_browsertest.cc b/content/browser/frame_host/navigation_handle_impl_browsertest.cc index c199bfb..89839bb 100644 --- a/content/browser/frame_host/navigation_handle_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
@@ -2076,15 +2076,17 @@ // Add the suffix to all existing histogram names, and append the results to // |names|. std::vector<std::string> names{"Navigation.StartToCommit"}; - auto add_suffix = [&names](std::string suffix) { + auto add_suffix = [&names](std::vector<std::string> suffixes) { size_t original_size = names.size(); for (size_t i = 0; i < original_size; i++) { - names.push_back(names[i] + suffix); + for (const std::string& suffix : suffixes) + names.push_back(names[i] + suffix); } }; - add_suffix(kProcessSuffixes.at(process_type)); - add_suffix(kFrameSuffixes.at(frame_type)); - add_suffix(kTransitionSuffixes.at(transition_type)); + add_suffix({kProcessSuffixes.at(process_type)}); + add_suffix({kFrameSuffixes.at(frame_type)}); + add_suffix({kTransitionSuffixes.at(transition_type), + ".ForegroundProcessPriority"}); // Check that all generated histogram names are logged exactly once. for (const auto& name : names) {
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 0e0cbcd..11c0d98 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -5515,7 +5515,6 @@ it != validated_params->redirects.end(); ++it) { process->FilterURL(false, &(*it)); } - process->FilterURL(true, &validated_params->searchable_form_url); // Without this check, the renderer can trick the browser into using // filenames it can't access in a future session restore.
diff --git a/content/browser/media/media_color_browsertest.cc b/content/browser/media/media_color_browsertest.cc index 6cc930bb..5f38d74 100644 --- a/content/browser/media/media_color_browsertest.cc +++ b/content/browser/media/media_color_browsertest.cc
@@ -53,9 +53,8 @@ RunColorTest("yuv420p.mp4"); } -// This test fails on Android: http://crbug.com/647818 and OSX: -// http://crbug.com/647838 -#if defined(OS_MACOSX) || defined(OS_ANDROID) +// This test fails on Android: http://crbug.com/647818 +#if defined(OS_ANDROID) #define MAYBE_Yuvj420pH264 DISABLED_Yuvj420pH264 #else #define MAYBE_Yuvj420pH264 Yuvj420pH264
diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc index 5d7dd2a..ddd9404 100644 --- a/content/browser/renderer_host/input/input_router_impl.cc +++ b/content/browser/renderer_host/input/input_router_impl.cc
@@ -343,7 +343,8 @@ // Touchstart events sent to the renderer indicate a new touch sequence, but // in some cases we may filter out sending the touchstart - catch those // here. - if (ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) { + if (ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS || + ack_result == INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING) { // Touch action must be auto when there is no consumer touch_action_filter_.OnSetTouchAction(cc::kTouchActionAuto); UpdateTouchAckTimeoutEnabled();
diff --git a/content/browser/renderer_host/input/input_router_impl.h b/content/browser/renderer_host/input/input_router_impl.h index 6fe5543..60a7e28 100644 --- a/content/browser/renderer_host/input/input_router_impl.h +++ b/content/browser/renderer_host/input/input_router_impl.h
@@ -118,6 +118,7 @@ friend class InputRouterImplTest; friend class MockRenderWidgetHost; friend class RenderWidgetHostSitePerProcessTest; + friend class SitePerProcessBrowserTouchActionTest; // Keeps track of last position of touch points and sets MovementXY for them. void SetMovementXYForTouchPoints(blink::WebTouchEvent* event);
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc index 709d42b..e5077420 100644 --- a/content/browser/renderer_host/input/input_router_impl_unittest.cc +++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc
@@ -440,6 +440,18 @@ EXPECT_EQ(input_router_->num_of_active_touches_for_test(), 0); } + void OnTouchEventAckWithResultNonBlocking() { + input_router_->OnHasTouchEventHandlers(true); + EXPECT_FALSE(input_router_->AllowedTouchAction().has_value()); + PressTouchPoint(1, 1); + input_router_->SendTouchEvent(TouchEventWithLatencyInfo(touch_event_)); + input_router_->OnTouchEventAck(TouchEventWithLatencyInfo(touch_event_), + InputEventAckSource::BROWSER, + INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING); + EXPECT_EQ(input_router_->AllowedTouchAction().value(), + cc::kTouchActionAuto); + } + InputRouter::Config config_; std::unique_ptr<MockInputRouterImplClient> client_; std::unique_ptr<InputRouterImpl> input_router_; @@ -637,6 +649,10 @@ INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); } +TEST_F(InputRouterImplTest, TouchActionAutoWithAckResultNonBlocking) { + OnTouchEventAckWithResultNonBlocking(); +} + // Tests that touch-events are sent properly. TEST_F(InputRouterImplTest, TouchEventQueue) { OnHasTouchEventHandlers(true);
diff --git a/content/browser/renderer_host/input/touch_action_filter.cc b/content/browser/renderer_host/input/touch_action_filter.cc index a0cf770..30c7bb6 100644 --- a/content/browser/renderer_host/input/touch_action_filter.cc +++ b/content/browser/renderer_host/input/touch_action_filter.cc
@@ -179,7 +179,10 @@ gesture_sequence_in_progress_ = true; // If the gesture is hitting a region that has a non-blocking (such as a // passive) event listener. - if (gesture_event->is_source_touch_event_set_non_blocking) + // In theory, the num_of_active_touches_ should be > 0 at this point. But + // crash reports suggest otherwise. + if (gesture_event->is_source_touch_event_set_non_blocking || + num_of_active_touches_ <= 0) SetTouchAction(cc::kTouchActionAuto); scrolling_touch_action_ = allowed_touch_action_; if (scrolling_touch_action_.has_value())
diff --git a/content/browser/renderer_host/input/touch_action_filter.h b/content/browser/renderer_host/input/touch_action_filter.h index 7a7593e..7060f06 100644 --- a/content/browser/renderer_host/input/touch_action_filter.h +++ b/content/browser/renderer_host/input/touch_action_filter.h
@@ -77,6 +77,7 @@ private: friend class MockRenderWidgetHost; friend class TouchActionFilterTest; + friend class SitePerProcessBrowserTouchActionTest; bool ShouldSuppressManipulation(const blink::WebGestureEvent&); bool FilterManipulationEventAndResetState();
diff --git a/content/browser/renderer_host/input/touch_action_filter_unittest.cc b/content/browser/renderer_host/input/touch_action_filter_unittest.cc index 7712cdc..e010cf4f 100644 --- a/content/browser/renderer_host/input/touch_action_filter_unittest.cc +++ b/content/browser/renderer_host/input/touch_action_filter_unittest.cc
@@ -45,6 +45,7 @@ // Scrolls with no direction hint are permitted in the |action| direction. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(0, 0, @@ -64,12 +65,14 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } { // Scrolls biased towards the touch-action axis are permitted. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(scroll_x, scroll_y, kSourceDevice); @@ -100,6 +103,7 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } { @@ -107,6 +111,7 @@ // suppressed entirely. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(scroll_y, scroll_x, kSourceDevice); @@ -125,6 +130,7 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } } @@ -140,6 +146,7 @@ // Scrolls towards the touch-action direction are permitted. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(scroll_x, scroll_y, kSourceDevice); @@ -155,6 +162,7 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } { @@ -162,6 +170,7 @@ // suppressed entirely. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin( -scroll_x, -scroll_y, kSourceDevice); @@ -177,6 +186,7 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } { @@ -184,6 +194,7 @@ // suppressed entirely. filter_.ResetTouchAction(); filter_.OnSetTouchAction(action); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin( -scroll_x - scroll_y, -scroll_x - scroll_y, kSourceDevice); @@ -199,6 +210,7 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } } TouchActionFilter filter_; @@ -220,6 +232,7 @@ // cc::kTouchActionAuto doesn't cause any filtering. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -230,10 +243,12 @@ EXPECT_EQ(kDeltaY, scroll_update.data.scroll_update.delta_y); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // cc::kTouchActionNone filters out all scroll events, but no other events. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -246,10 +261,12 @@ EXPECT_EQ(kDeltaY, scroll_update.data.scroll_update.delta_y); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); // When a new touch sequence begins, the state is reset. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -258,10 +275,12 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Setting touch action doesn't impact any in-progress gestures. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -271,20 +290,24 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // And the state is still cleared for the next gesture. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Changing the touch action during a gesture has no effect. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -298,6 +321,7 @@ EXPECT_EQ(kDeltaY, scroll_update.data.scroll_update.delta_y); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } TEST_F(TouchActionFilterTest, PanLeft) { @@ -370,6 +394,7 @@ // Scrolls hinted in the X axis are permitted and unmodified. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPan); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(-7, 6, kSourceDevice); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), @@ -387,12 +412,14 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } { // Scrolls hinted in the Y axis are permitted and unmodified. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPan); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(-6, 7, kSourceDevice); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), @@ -410,12 +437,14 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } { // A two-finger gesture is not allowed. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPan); + filter_.IncreaseActiveTouches(); WebGestureEvent scroll_begin = SyntheticWebGestureEventBuilder::BuildScrollBegin(-6, 7, kSourceDevice, 2); @@ -432,6 +461,7 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } } @@ -466,6 +496,7 @@ filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -478,12 +509,14 @@ EXPECT_EQ(kDeltaY, scroll_update.data.scroll_update.delta_y); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); // Intersection of PAN_X and PAN_Y is NONE. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPanX); filter_.OnSetTouchAction(cc::kTouchActionPanY); filter_.OnSetTouchAction(cc::kTouchActionPan); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -492,6 +525,7 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } class TouchActionFilterPinchTest : public testing::Test { @@ -518,6 +552,7 @@ // Pinch is allowed with touch-action: auto. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -530,10 +565,12 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Pinch is not allowed with touch-action: none. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -552,11 +589,13 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); // Pinch is not allowed with touch-action: pan-x pan-y except for force // enable zoom. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPan); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_NE(filter_.FilterGestureEvent(&scroll_begin), @@ -579,10 +618,12 @@ force_enable_zoom ? FilterGestureEventResult::kFilterGestureEventFiltered : FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Pinch is allowed with touch-action: manipulation. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionManipulation); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -595,10 +636,12 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Pinch state is automatically reset at the end of a scroll. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -611,10 +654,12 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Pinching is only computed at GestureScrollBegin time. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -641,11 +686,13 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Once a pinch has started, any change in state won't affect the pinch // gestures since it is computed in GestureScrollBegin. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -665,10 +712,12 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // Scrolling is allowed when two fingers are down. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPinchZoom); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -681,12 +730,14 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); // A pinch event sequence with only one pointer is equivalent to a scroll // gesture, so disallowed as a pinch gesture. scroll_begin.data.scroll_begin.pointer_count = 1; filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionPinchZoom); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -699,6 +750,7 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } private: @@ -759,6 +811,7 @@ // Double tap is disabled with any touch action other than auto. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionManipulation); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&unconfirmed_tap), @@ -775,6 +828,7 @@ EXPECT_EQ(filter_.FilterGestureEvent(&double_tap), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(WebInputEvent::kGestureTap, double_tap.GetType()); + filter_.DecreaseActiveTouches(); } TEST_F(TouchActionFilterTest, SingleTapWithTouchActionAuto) { @@ -808,6 +862,7 @@ // With touch action other than auto, tap unconfirmed is turned into tap. filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&unconfirmed_tap1), @@ -815,6 +870,7 @@ EXPECT_EQ(WebInputEvent::kGestureTap, unconfirmed_tap1.GetType()); EXPECT_EQ(filter_.FilterGestureEvent(&tap), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); } TEST_F(TouchActionFilterTest, TouchActionResetsOnResetTouchAction) { @@ -829,26 +885,32 @@ filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&tap), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); filter_.ResetTouchAction(); filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } TEST_F(TouchActionFilterTest, TouchActionResetMidSequence) { @@ -868,6 +930,7 @@ WebInputEvent::kGestureScrollEnd, kSourceDevice); filter_.OnSetTouchAction(cc::kTouchActionNone); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), @@ -887,9 +950,11 @@ FilterGestureEventResult::kFilterGestureEventFiltered); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventFiltered); + filter_.DecreaseActiveTouches(); // A new scroll and pinch sequence should be allowed. filter_.OnSetTouchAction(cc::kTouchActionAuto); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_begin), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&pinch_begin), @@ -906,6 +971,7 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&scroll_end), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } // This test makes sure that we do not reset scrolling touch action in the @@ -925,6 +991,7 @@ WebGestureEvent scroll_end = SyntheticWebGestureEventBuilder::Build( WebInputEvent::kGestureScrollEnd, kSourceDevice); + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(cc::kTouchActionPanY, ScrollingTouchAction().value()); @@ -934,6 +1001,7 @@ EXPECT_EQ(filter_.FilterGestureEvent(&scroll_update), FilterGestureEventResult::kFilterGestureEventAllowed); // Simulate a touch sequence end by calling ReportAndResetTouchAction. + filter_.DecreaseActiveTouches(); filter_.ReportAndResetTouchAction(); EXPECT_FALSE(filter_.allowed_touch_action().has_value()); EXPECT_EQ(cc::kTouchActionPanY, ScrollingTouchAction().value()); @@ -985,6 +1053,7 @@ WebInputEvent::kGestureDoubleTap, kSourceDevice); // Simulate a double tap gesture: GTD-->GTC-->GTD-->GTC-->GDT. + filter_.IncreaseActiveTouches(); EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionAuto); @@ -1000,6 +1069,7 @@ FilterGestureEventResult::kFilterGestureEventAllowed); EXPECT_EQ(filter_.FilterGestureEvent(&double_tap), FilterGestureEventResult::kFilterGestureEventAllowed); + filter_.DecreaseActiveTouches(); } TEST_F(TouchActionFilterTest, OnHasTouchEventHandlersReceivedDuringScroll) { @@ -1149,6 +1219,20 @@ EXPECT_EQ(filter_.allowed_touch_action().value(), cc::kTouchActionAuto); } +// This tests a gesture tap down with |num_of_active_touches_| == 0 +TEST_F(TouchActionFilterTest, TapDownWithZeroNumOfActiveTouches) { + filter_.OnHasTouchEventHandlers(true); + EXPECT_FALSE(ScrollingTouchAction().has_value()); + EXPECT_FALSE(filter_.allowed_touch_action().has_value()); + + WebGestureEvent tap_down = SyntheticWebGestureEventBuilder::Build( + WebInputEvent::kGestureTapDown, kSourceDevice); + EXPECT_EQ(filter_.FilterGestureEvent(&tap_down), + FilterGestureEventResult::kFilterGestureEventAllowed); + EXPECT_TRUE(ScrollingTouchAction().has_value()); + EXPECT_EQ(ScrollingTouchAction().value(), cc::kTouchActionAuto); +} + TEST_F(TouchActionFilterTest, ScrollBeginWithoutTapDownWithKnownTouchAction) { filter_.OnHasTouchEventHandlers(true); EXPECT_FALSE(ScrollingTouchAction().has_value());
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 1b67b81..d573fe09 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -780,7 +780,6 @@ OnShowFullscreenWidget) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateTargetURL, OnUpdateTargetURL) IPC_MESSAGE_HANDLER(ViewHostMsg_Close, OnClose) - IPC_MESSAGE_HANDLER(ViewHostMsg_RequestSetBounds, OnRequestSetBounds) IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentAvailableInMainFrame, OnDocumentAvailableInMainFrame) IPC_MESSAGE_HANDLER(ViewHostMsg_DidContentsPreferredSizeChange, @@ -851,12 +850,6 @@ ClosePageIgnoringUnloadEvents(); } -void RenderViewHostImpl::OnRequestSetBounds(const gfx::Rect& bounds) { - if (is_active_) - delegate_->RequestSetBounds(bounds); - Send(new ViewMsg_SetBounds_ACK(GetRoutingID())); -} - void RenderViewHostImpl::OnDocumentAvailableInMainFrame( bool uses_temporary_zoom_level) { delegate_->DocumentAvailableInMainFrame(this); @@ -921,6 +914,11 @@ return is_active_; } +void RenderViewHostImpl::RequestSetBounds(const gfx::Rect& bounds) { + if (is_active_) + delegate_->RequestSetBounds(bounds); +} + WebPreferences RenderViewHostImpl::GetWebkitPreferences() { if (!web_preferences_.get()) { OnWebkitPreferencesChanged();
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 36f57cc9..1df97a6 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -239,6 +239,7 @@ bool MayRenderWidgetForwardKeyboardEvent( const NativeWebKeyboardEvent& key_event) override; bool ShouldContributePriorityToProcess() override; + void RequestSetBounds(const gfx::Rect& bounds) override; // IPC message handlers. void OnShowView(int route_id, @@ -249,7 +250,6 @@ void OnShowFullscreenWidget(int route_id); void OnUpdateTargetURL(const GURL& url); void OnClose(); - void OnRequestSetBounds(const gfx::Rect& bounds); void OnDocumentAvailableInMainFrame(bool uses_temporary_zoom_level); void OnDidContentsPreferredSizeChange(const gfx::Size& new_size); void OnPasteFromSelectionClipboard();
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index a57fc144..a3d7e1f 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -2160,10 +2160,12 @@ } void RenderWidgetHostImpl::OnRequestSetBounds(const gfx::Rect& bounds) { - if (view_) { + if (owner_delegate_) { + owner_delegate_->RequestSetBounds(bounds); + } else if (view_) { view_->SetBounds(bounds); - Send(new ViewMsg_SetBounds_ACK(routing_id_)); } + Send(new ViewMsg_SetBounds_ACK(routing_id_)); } void RenderWidgetHostImpl::DidNotProduceFrame(const viz::BeginFrameAck& ack) {
diff --git a/content/browser/renderer_host/render_widget_host_owner_delegate.h b/content/browser/renderer_host/render_widget_host_owner_delegate.h index 409e8ef..0ba7bbc 100644 --- a/content/browser/renderer_host/render_widget_host_owner_delegate.h +++ b/content/browser/renderer_host/render_widget_host_owner_delegate.h
@@ -57,6 +57,10 @@ // priority to the RenderProcessHost. virtual bool ShouldContributePriorityToProcess() = 0; + // Notify the OwnerDelegate that the renderer has requested a change in + // the bounds of the content area. + virtual void RequestSetBounds(const gfx::Rect& bounds) = 0; + protected: virtual ~RenderWidgetHostOwnerDelegate() {} };
diff --git a/content/browser/service_worker/service_worker_installed_script_reader.cc b/content/browser/service_worker/service_worker_installed_script_reader.cc index 8c42abb..6f0c7a1 100644 --- a/content/browser/service_worker/service_worker_installed_script_reader.cc +++ b/content/browser/service_worker/service_worker_installed_script_reader.cc
@@ -11,6 +11,7 @@ #include "content/browser/service_worker/service_worker_metrics.h" #include "net/http/http_response_headers.h" #include "services/network/public/cpp/net_adapters.h" +#include "third_party/blink/public/common/blob/blob_utils.h" namespace content { @@ -114,25 +115,25 @@ DCHECK_GE(result, 0); mojo::ScopedDataPipeConsumerHandle meta_data_consumer; - mojo::ScopedDataPipeConsumerHandle body_consumer; DCHECK_GE(http_info->response_data_size, 0); uint64_t body_size = http_info->response_data_size; uint64_t meta_data_size = 0; - if (mojo::CreateDataPipe(nullptr, &body_handle_, &body_consumer) != - MOJO_RESULT_OK) { + mojo::DataPipe body_pipe(blink::BlobUtils::GetDataPipeCapacity()); + if (!body_pipe.producer_handle.is_valid()) { CompleteSendIfNeeded(FinishedReason::kCreateDataPipeError); return; } + body_handle_ = std::move(body_pipe.producer_handle); // Start sending meta data (V8 code cache data). if (http_info->http_info->metadata) { - mojo::ScopedDataPipeProducerHandle meta_data_producer; - if (mojo::CreateDataPipe(nullptr, &meta_data_producer, - &meta_data_consumer) != MOJO_RESULT_OK) { + mojo::DataPipe meta_pipe(blink::BlobUtils::GetDataPipeCapacity()); + if (!meta_pipe.producer_handle.is_valid()) { CompleteSendIfNeeded(FinishedReason::kCreateDataPipeError); return; } + meta_data_consumer = std::move(meta_pipe.consumer_handle); meta_data_sender_ = std::make_unique<MetaDataSender>( - http_info->http_info->metadata, std::move(meta_data_producer)); + http_info->http_info->metadata, std::move(meta_pipe.producer_handle)); meta_data_sender_->Start(base::BindOnce( &ServiceWorkerInstalledScriptReader::OnMetaDataSent, AsWeakPtr())); DCHECK_GE(http_info->http_info->metadata->size(), 0); @@ -168,7 +169,7 @@ } client_->OnStarted(charset, std::move(header_strings), - std::move(body_consumer), body_size, + std::move(body_pipe.consumer_handle), body_size, std::move(meta_data_consumer), meta_data_size); client_->OnHttpInfoRead(http_info); } @@ -181,6 +182,9 @@ uint32_t num_bytes = 0; MojoResult rv = network::NetToMojoPendingBuffer::BeginWrite( &body_handle_, &body_pending_write_, &num_bytes); + + num_bytes = std::min(num_bytes, blink::BlobUtils::GetDataPipeChunkSize()); + switch (rv) { case MOJO_RESULT_INVALID_ARGUMENT: case MOJO_RESULT_BUSY:
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 31e6685..f6709ab 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -12243,7 +12243,8 @@ RenderWidgetHostInputEventRouter* router, RenderWidgetHostViewBase* rwhv_root, RenderWidgetHostViewBase* rwhv_child, - const gfx::Point& event_position) { + const gfx::Point& event_position, + base::Optional<cc::TouchAction>& whitelisted_touch_action) { InputEventAckWaiter ack_observer( rwhv_child->GetRenderWidgetHost(), base::BindRepeating([](content::InputEventAckSource source, @@ -12266,6 +12267,14 @@ static_cast<RenderWidgetHostImpl*>(rwhv_child->GetRenderWidgetHost()) ->input_router() ->AllowedTouchAction(); + // Whitelisted touch action is sent from a separate IPC channel, so it is + // not guaranteed to have value when the ACK for the touch start arrived + // because the ACK is from the main thread. + whitelisted_touch_action = + static_cast<InputRouterImpl*>(static_cast<RenderWidgetHostImpl*>( + rwhv_child->GetRenderWidgetHost()) + ->input_router()) + ->touch_action_filter_.white_listed_touch_action_; // Send a touch move and touch end to complete the sequence, this also // avoids triggering DCHECKs when sending followup events. @@ -12344,22 +12353,31 @@ WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); + base::Optional<cc::TouchAction> whitelisted_touch_action; + cc::TouchAction expected_touch_action = cc::kTouchActionPan; // Gestures are filtered by the intersection of touch-action values of the // touched element and all its ancestors up to the one that implements the // gesture. Since iframe allows scrolling, touch action pan restrictions will // not affect iframe's descendants, so we expect kTouchActionPan instead of // kTouchActionAuto in iframe's child. - EXPECT_EQ(cc::TouchAction::kTouchActionPan, + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); EXPECT_TRUE( ExecuteScript(shell(), "document.body.style.touchAction = 'auto'")); WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionAuto, + expected_touch_action = cc::kTouchActionAuto; + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); } IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTouchActionTest, @@ -12414,9 +12432,14 @@ // Child should inherit effective touch action none from root. WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionPan, + base::Optional<cc::TouchAction> whitelisted_touch_action; + cc::TouchAction expected_touch_action = cc::kTouchActionPan; + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); // Child should inherit effective touch action none from parent. EXPECT_TRUE( @@ -12426,9 +12449,12 @@ "document.getElementById('parent-div').style.touchAction = 'none';")); WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionPan, + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); // Child should inherit effective touch action auto from root and parent. EXPECT_TRUE(ExecuteScript( @@ -12436,9 +12462,13 @@ "document.getElementById('parent-div').style.touchAction = 'auto'")); WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionAuto, + expected_touch_action = cc::kTouchActionAuto; + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); } IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTouchActionTest, @@ -12487,9 +12517,14 @@ // Child should inherit effective touch action none from root. WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionPan, + base::Optional<cc::TouchAction> whitelisted_touch_action; + cc::TouchAction expected_touch_action = cc::kTouchActionPan; + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); // After navigation, child should still inherit effective touch action none // from parent. @@ -12509,9 +12544,12 @@ WaitForTouchActionUpdated(root_thread_observer.get(), child_thread_observer.get()); - EXPECT_EQ(cc::TouchAction::kTouchActionPan, + EXPECT_EQ(expected_touch_action, GetEffectiveTouchActionForChild(router, rwhv_root, rwhv_child, - point_inside_child)); + point_inside_child, + whitelisted_touch_action)); + if (whitelisted_touch_action.has_value()) + EXPECT_EQ(expected_touch_action, whitelisted_touch_action.value()); } IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index d64bf38..d734d10a 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -1506,33 +1506,12 @@ RunTest(TouchActionBubbling); } -#if defined(OS_ANDROID) -namespace { -// This function is used in TouchActionAckTimeout and -// SubframeGestureEventRouting, which is defined either under Android or Aura. -void OnSyntheticGestureCompleted(scoped_refptr<MessageLoopRunner> runner, - SyntheticGesture::Result result) { - EXPECT_EQ(SyntheticGesture::GESTURE_FINISHED, result); - runner->Quit(); -} - -void GiveItSomeTime(int t) { - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), base::TimeDelta::FromMilliseconds(t)); - run_loop.Run(); -} - -} // namespace -#endif // defined(OS_ANDROID) - // Regression test for https://crbug.com/851644. The test passes as long as it // doesn't crash. // Touch action ack timeout is enabled on Android only. -// Flaky, see https://crbug.com/871062. #if defined(OS_ANDROID) IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, - DISABLED_TouchActionAckTimeout) { + TouchActionAckTimeout) { GURL main_url( embedded_test_server()->GetURL("/frame_tree/page_with_janky_frame.html")); ASSERT_TRUE(NavigateToURL(shell(), main_url)); @@ -1566,41 +1545,29 @@ params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; params.anchor = gfx::PointF(point_in_child.x(), point_in_child.y()); params.distances.push_back(gfx::Vector2dF(0, -10)); - // Make this scroll slow so that the second scroll will be queued even before - // this one ends. - params.speed_in_pixels_s = 1000; + // The JS jank from the "page_with_touch_start_janking_main_thread.html" + // causes the touch ack timeout. Set the speed high so that the gesture can be + // completed quickly and so does this test. + params.speed_in_pixels_s = 100000; std::unique_ptr<SyntheticSmoothScrollGesture> gesture( new SyntheticSmoothScrollGesture(params)); - scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner(); + InputEventAckWaiter ack_observer( + child_frame_host->GetRenderWidgetHost(), + base::BindRepeating([](content::InputEventAckSource source, + content::InputEventAckState state, + const blink::WebInputEvent& event) { + return event.GetType() == blink::WebGestureEvent::kGestureScrollEnd; + })); + ack_observer.Reset(); + RenderWidgetHostImpl* render_widget_host = root->current_frame_host()->GetRenderWidgetHost(); render_widget_host->QueueSyntheticGesture( - std::move(gesture), base::BindOnce(OnSyntheticGestureCompleted, runner)); - // The first gesture takes 100ms, so wait for 120ms to ensure that it has - // finished. - runner->Run(); - GiveItSomeTime(120); - - SyntheticSmoothScrollGestureParams params2; - params2.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT; - params2.anchor = gfx::PointF(point_in_child.x(), point_in_child.y()); - params2.distances.push_back(gfx::Vector2dF(0, -10)); - params2.speed_in_pixels_s = 100000; - std::unique_ptr<SyntheticSmoothScrollGesture> gesture2( - new SyntheticSmoothScrollGesture(params2)); - render_widget_host->QueueSyntheticGesture( - std::move(gesture2), base::BindOnce(OnSyntheticGestureCompleted, runner)); - - runner->Run(); - runner = nullptr; - - // Give enough time to make sure all gesture are flushed and handled. - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), - base::TimeDelta::FromMilliseconds(2500)); - run_loop.Run(); + std::move(gesture), base::BindOnce([](SyntheticGesture::Result result) { + EXPECT_EQ(SyntheticGesture::GESTURE_FINISHED, result); + })); + ack_observer.Wait(); } #endif // defined(OS_ANDROID) @@ -4431,6 +4398,108 @@ #endif } +// Verify that scrolling the main frame correctly updates the position to +// a nested child frame. See issue https://crbug.com/878703 for more +// information. +// On Mac and Android, the reported menu coordinates are relative to the +// OOPIF, and its screen position is computed later, so this test isn't +// relevant on those platforms. +#if !defined(OS_ANDROID) && !defined(OS_MACOSX) +IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, + ScrolledNestedPopupMenuTest) { + GURL main_url(embedded_test_server()->GetURL( + "a.com", "/frame_tree/page_with_tall_positioned_frame.html")); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + FrameTreeNode* child_node = root->child_at(0); + + GURL child_url(embedded_test_server()->GetURL( + "b.com", "/frame_tree/page_with_positioned_frame.html")); + NavigateFrameToURL(child_node, child_url); + + FrameTreeNode* grandchild_node = child_node->child_at(0); + + GURL grandchild_url(embedded_test_server()->GetURL( + "c.com", "/site_isolation/page-with-select.html")); + NavigateFrameToURL(grandchild_node, grandchild_url); + + WaitForHitTestDataOrChildSurfaceReady(grandchild_node->current_frame_host()); + + EXPECT_EQ( + " Site A ------------ proxies for B C\n" + " +--Site B ------- proxies for A C\n" + " +--Site C -- proxies for A B\n" + "Where A = http://a.com/\n" + " B = http://b.com/\n" + " C = http://c.com/", + DepictFrameTree(root)); + + RenderWidgetHostViewBase* rwhv_root = static_cast<RenderWidgetHostViewBase*>( + root->current_frame_host()->GetRenderWidgetHost()->GetView()); + RenderWidgetHostViewBase* rwhv_grandchild = + static_cast<RenderWidgetHostViewBase*>( + grandchild_node->current_frame_host() + ->GetRenderWidgetHost() + ->GetView()); + + scoped_refptr<ShowWidgetMessageFilter> filter = new ShowWidgetMessageFilter(); + grandchild_node->current_frame_host()->GetProcess()->AddFilter(filter.get()); + + // Target left-click event to the select element in the innermost frame. + DispatchMouseEventAndWaitUntilDispatch(web_contents(), rwhv_grandchild, + gfx::PointF(15, 15), rwhv_grandchild, + gfx::PointF(15, 15)); + + // Prompt the WebContents to dismiss the popup by clicking elsewhere. + DispatchMouseEventAndWaitUntilDispatch(web_contents(), rwhv_grandchild, + gfx::PointF(2, 2), rwhv_grandchild, + gfx::PointF(2, 2)); + filter->Wait(); + + // This test isn't verifying correctness of these coordinates, this is just + // to ensure that they change after scroll. + gfx::Rect unscrolled_popup_rect = filter->last_initial_rect(); + gfx::Rect initial_grandchild_view_bounds = rwhv_grandchild->GetViewBounds(); + + // Scroll the main frame. + EXPECT_TRUE(ExecuteScript(root, "window.scrollTo(0, 20);")); + + // Wait until the OOPIF positions have been updated in the browser process. + while (true) { + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout()); + run_loop.Run(); + if (initial_grandchild_view_bounds.y() == + rwhv_grandchild->GetViewBounds().y() + 20) + break; + } + + filter->Reset(); + // This sends the message directly to the rwhv_grandchild, avoiding using + // the helper methods, to avert a race condition with the surfaces or + // HitTestRegions needing to update post-scroll. The event won't hit test + // correctly if it gets sent before a fresh compositor frame is received. + blink::WebMouseEvent down_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); + down_event.button = blink::WebPointerProperties::Button::kLeft; + down_event.click_count = 1; + down_event.SetPositionInWidget(15, 15); + rwhv_grandchild->ProcessMouseEvent(down_event, ui::LatencyInfo()); + + // Dismiss the popup again. This time there is no need to worry about + // compositor frame updates because it is sufficient to send the click to + // the root frame. + DispatchMouseEventAndWaitUntilDispatch(web_contents(), rwhv_root, + gfx::PointF(1, 1), rwhv_root, + gfx::PointF(1, 1)); + filter->Wait(); + EXPECT_EQ(unscrolled_popup_rect.y(), filter->last_initial_rect().y() + 20); +} +#endif // !defined(OS_ANDROID) + #if defined(USE_AURA) class SitePerProcessGestureHitTestBrowserTest : public SitePerProcessHitTestBrowserTest {
diff --git a/content/browser/storage_partition_impl_unittest.cc b/content/browser/storage_partition_impl_unittest.cc index d58a94c..84e08ad 100644 --- a/content/browser/storage_partition_impl_unittest.cc +++ b/content/browser/storage_partition_impl_unittest.cc
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "components/services/leveldb/public/cpp/util.h" @@ -1338,6 +1339,45 @@ EXPECT_FALSE(tester.ContainsEntry(kResourceURL, origin)); } +TEST_F(StoragePartitionImplTest, ClearCodeCacheNoIsolatedCodeCache) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(features::kIsolatedCodeCache); + ASSERT_FALSE(base::FeatureList::IsEnabled(features::kIsolatedCodeCache)); + + StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>( + BrowserContext::GetDefaultStoragePartition(browser_context())); + base::RunLoop().RunUntilIdle(); + // We should not create GeneratedCodeCacheContext when IsolatedCodeCache + // is disabled. + EXPECT_EQ(nullptr, partition->GetGeneratedCodeCacheContext()); + + base::RunLoop run_loop; + // This shouldn't crash. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&ClearCodeCache, partition, &run_loop)); + run_loop.Run(); +} + +TEST_F(StoragePartitionImplTest, ClearCodeCacheIncognito) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(features::kIsolatedCodeCache); + ASSERT_TRUE(base::FeatureList::IsEnabled(features::kIsolatedCodeCache)); + + browser_context()->set_is_off_the_record(true); + + StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>( + BrowserContext::GetDefaultStoragePartition(browser_context())); + base::RunLoop().RunUntilIdle(); + // We should not create GeneratedCodeCacheContext for off the record mode. + EXPECT_EQ(nullptr, partition->GetGeneratedCodeCacheContext()); + + base::RunLoop run_loop; + // This shouldn't crash. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&ClearCodeCache, partition, &run_loop)); + run_loop.Run(); +} + #if BUILDFLAG(ENABLE_PLUGINS) TEST_F(StoragePartitionImplTest, RemovePluginPrivateDataForever) { StoragePartitionImpl* partition = static_cast<StoragePartitionImpl*>(
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 0986f4e3..9d14f9c 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -426,12 +426,6 @@ // considered potentially trustworthy. IPC_STRUCT_MEMBER(bool, has_potentially_trustworthy_unique_origin) - // See WebSearchableFormData for a description of these. - // Not used by PlzNavigate: in that case these fields are sent to the browser - // in mojom::BeginNavigationParams. - IPC_STRUCT_MEMBER(GURL, searchable_form_url) - IPC_STRUCT_MEMBER(std::string, searchable_form_encoding) - // This is a non-decreasing value that the browser process can use to // identify and discard compositor frames that correspond to now-unloaded // web content.
diff --git a/content/common/navigation_gesture.h b/content/common/navigation_gesture.h index 380cd51..f38031b 100644 --- a/content/common/navigation_gesture.h +++ b/content/common/navigation_gesture.h
@@ -14,9 +14,7 @@ // setTimeout-triggered document.location changes and form.submits. See // http://b/1046841 for some cases that should be treated this way but aren't. NavigationGestureAuto, - // Initial state. - NavigationGestureUnknown, - NavigationGestureLast = NavigationGestureUnknown + NavigationGestureLast = NavigationGestureAuto }; } // namespace content
diff --git a/content/common/sandbox_policy_fuchsia.cc b/content/common/sandbox_policy_fuchsia.cc index 723586c..67d758d6 100644 --- a/content/common/sandbox_policy_fuchsia.cc +++ b/content/common/sandbox_policy_fuchsia.cc
@@ -29,7 +29,7 @@ namespace { constexpr const char* const kRendererServices[] = { - fuchsia::fonts::FontProvider::Name_}; + fuchsia::fonts::Provider::Name_}; constexpr const char* const kGpuServices[] = { fuchsia::ui::scenic::Scenic::Name_};
diff --git a/content/common/service_worker/service_worker_loader_helpers.cc b/content/common/service_worker/service_worker_loader_helpers.cc index 7b394959..31fa049 100644 --- a/content/common/service_worker/service_worker_loader_helpers.cc +++ b/content/common/service_worker/service_worker_loader_helpers.cc
@@ -18,6 +18,7 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/resource_request_body.h" #include "services/network/public/cpp/resource_response.h" +#include "third_party/blink/public/common/blob/blob_utils.h" #include "ui/base/page_transition_types.h" namespace content { @@ -193,7 +194,7 @@ return net::ERR_REQUEST_RANGE_NOT_SATISFIABLE; } - mojo::DataPipe data_pipe; + mojo::DataPipe data_pipe(blink::BlobUtils::GetDataPipeCapacity()); blink::mojom::BlobReaderClientPtr blob_reader_client; mojo::MakeStrongBinding( std::make_unique<BlobCompleteCaller>(std::move(on_blob_read_complete)),
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java index fe82fc9a..bb3f1f11 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
@@ -427,7 +427,7 @@ // access it afterwards. if (connection == null) return; - int bindingCounts[] = connection.bindingStateCountsCurrentOrWhenDied(); + int bindingCounts[] = connection.remainingBindingStateCountsCurrentOrWhenDied(); nativeSetTerminationInfo(terminationInfoPtr, connection.bindingStateCurrentOrWhenDied(), connection.isKilledByUs(), bindingCounts[ChildBindingState.STRONG], bindingCounts[ChildBindingState.MODERATE], bindingCounts[ChildBindingState.WAIVED]);
diff --git a/content/renderer/internal_document_state_data.h b/content/renderer/internal_document_state_data.h index 1705e537..5f995cf 100644 --- a/content/renderer/internal_document_state_data.h +++ b/content/renderer/internal_document_state_data.h
@@ -36,15 +36,6 @@ http_status_code_ = http_status_code; } - const GURL& searchable_form_url() const { return searchable_form_url_; } - void set_searchable_form_url(const GURL& url) { searchable_form_url_ = url; } - const std::string& searchable_form_encoding() const { - return searchable_form_encoding_; - } - void set_searchable_form_encoding(const std::string& encoding) { - searchable_form_encoding_ = encoding; - } - // True if the user agent was overridden for this page. bool is_overriding_user_agent() const { return is_overriding_user_agent_; } void set_is_overriding_user_agent(bool state) { @@ -80,8 +71,6 @@ private: int http_status_code_; - GURL searchable_form_url_; - std::string searchable_form_encoding_; bool is_overriding_user_agent_; bool must_reset_scroll_and_scale_state_; bool cache_policy_override_set_;
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc index 4d3d8c0b..98d69f60 100644 --- a/content/renderer/media/media_factory.cc +++ b/content/renderer/media/media_factory.cc
@@ -13,6 +13,7 @@ #include "base/task_runner_util.h" #include "base/threading/thread_task_runner_handle.h" #include "build/buildflag.h" +#include "cc/trees/layer_tree_settings.h" #include "content/public/common/content_client.h" #include "content/public/renderer/content_renderer_client.h" #include "content/renderer/media/audio/audio_device_factory.h" @@ -216,8 +217,8 @@ blink::WebMediaStream web_stream = GetWebMediaStreamFromWebMediaPlayerSource(source); if (!web_stream.IsNull()) - return CreateWebMediaPlayerForMediaStream(client, sink_id, security_origin, - web_frame, layer_tree_view); + return CreateWebMediaPlayerForMediaStream( + client, sink_id, security_origin, web_frame, layer_tree_view, settings); // If |source| was not a MediaStream, it must be a URL. // TODO(guidou): Fix this when support for other srcObject types is added. @@ -500,7 +501,8 @@ const blink::WebString& sink_id, const blink::WebSecurityOrigin& security_origin, blink::WebLocalFrame* frame, - blink::WebLayerTreeView* layer_tree_view) { + blink::WebLayerTreeView* layer_tree_view, + const cc::LayerTreeSettings& settings) { RenderThreadImpl* const render_thread = RenderThreadImpl::current(); scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner = @@ -509,6 +511,12 @@ compositor_task_runner = render_frame_->GetTaskRunner(blink::TaskType::kInternalMediaRealTime); + scoped_refptr<base::SingleThreadTaskRunner> + media_stream_compositor_task_runner = + VideoSurfaceLayerEnabledForMS() + ? render_thread->CreateVideoFrameCompositorTaskRunner() + : compositor_task_runner; + DCHECK(layer_tree_view); return new WebMediaPlayerMS( frame, client, GetWebMediaPlayerDelegate(), @@ -516,10 +524,17 @@ url::Origin(security_origin).GetURL(), render_frame_->GetTaskRunner(blink::TaskType::kInternalMedia)), CreateMediaStreamRendererFactory(), render_thread->GetIOTaskRunner(), - compositor_task_runner, render_thread->GetMediaThreadTaskRunner(), + media_stream_compositor_task_runner, + render_thread->GetMediaThreadTaskRunner(), render_thread->GetWorkerTaskRunner(), render_thread->GetGpuFactories(), sink_id, base::BindOnce(&blink::WebSurfaceLayerBridge::Create, layer_tree_view), + base::BindRepeating( + &blink::WebVideoFrameSubmitter::Create, + base::BindRepeating( + &PostContextProviderToCallback, + RenderThreadImpl::current()->GetCompositorMainThreadTaskRunner()), + settings), VideoSurfaceLayerEnabledForMS()); }
diff --git a/content/renderer/media/media_factory.h b/content/renderer/media/media_factory.h index bbb8837e..51d94e37 100644 --- a/content/renderer/media/media_factory.h +++ b/content/renderer/media/media_factory.h
@@ -127,7 +127,8 @@ const blink::WebString& sink_id, const blink::WebSecurityOrigin& security_origin, blink::WebLocalFrame* frame, - blink::WebLayerTreeView* layer_tree_view); + blink::WebLayerTreeView* layer_tree_view, + const cc::LayerTreeSettings& settings); // Returns the media delegate for WebMediaPlayer usage. If // |media_player_delegate_| is NULL, one is created.
diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc index 6db020d7..82429d9 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.cc +++ b/content/renderer/media/stream/webmediaplayer_ms.cc
@@ -269,6 +269,8 @@ media::GpuVideoAcceleratorFactories* gpu_factories, const blink::WebString& sink_id, CreateSurfaceLayerBridgeCB create_bridge_callback, + base::RepeatingCallback<std::unique_ptr<blink::WebVideoFrameSubmitter>()> + create_submitter_callback, bool surface_layer_for_video_enabled) : frame_(frame), network_state_(WebMediaPlayer::kNetworkStateEmpty), @@ -291,6 +293,7 @@ volume_multiplier_(1.0), should_play_upon_shown_(false), create_bridge_callback_(std::move(create_bridge_callback)), + create_submitter_callback_(create_submitter_callback), surface_layer_for_video_enabled_(surface_layer_for_video_enabled) { DVLOG(1) << __func__; DCHECK(client); @@ -349,7 +352,9 @@ web_stream_.AddObserver(this); compositor_ = new WebMediaPlayerMSCompositor( - compositor_task_runner_, io_task_runner_, web_stream_, AsWeakPtr()); + compositor_task_runner_, io_task_runner_, web_stream_, + create_submitter_callback_, surface_layer_for_video_enabled_, + AsWeakPtr()); SetNetworkState(WebMediaPlayer::kNetworkStateLoading); SetReadyState(WebMediaPlayer::kReadyStateHaveNothing); @@ -1079,6 +1084,10 @@ return false; } +void WebMediaPlayerMS::OnFrameSinkDestroyed() { + bridge_->ClearSurfaceId(); +} + void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation, bool is_opaque) { DVLOG(1) << __func__; @@ -1090,6 +1099,16 @@ bridge_ = std::move(create_bridge_callback_) .Run(this, compositor_->GetUpdateSubmissionStateCallback()); bridge_->CreateSurfaceLayer(); + bridge_->SetContentsOpaque(opaque_); + + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &WebMediaPlayerMSCompositor::EnableSubmission, compositor_, + bridge_->GetSurfaceId(), video_rotation, IsInPictureInPicture(), + opaque_, + media::BindToCurrentLoop(base::BindRepeating( + &WebMediaPlayerMS::OnFrameSinkDestroyed, AsWeakPtr())))); } SetReadyState(WebMediaPlayer::kReadyStateHaveMetadata); @@ -1112,6 +1131,9 @@ DCHECK(bridge_); bridge_->SetContentsOpaque(opaque_); + compositor_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&WebMediaPlayerMSCompositor::UpdateIsOpaque, + compositor_, opaque_)); } } @@ -1132,12 +1154,18 @@ get_client()->SetCcLayer(new_video_layer.get()); video_layer_ = std::move(new_video_layer); - } else if (bridge_->GetCcLayer()) { - // TODO(lethalantidote): Handle rotation. - bridge_->SetContentsOpaque(opaque_); + } else { + compositor_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&WebMediaPlayerMSCompositor::UpdateRotation, + compositor_, video_rotation)); } } +bool WebMediaPlayerMS::IsInPictureInPicture() const { + // TODO(apacible): Add implementation. See http://crbug/746182. + return false; +} + void WebMediaPlayerMS::RepaintInternal() { DVLOG(1) << __func__; DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/content/renderer/media/stream/webmediaplayer_ms.h b/content/renderer/media/stream/webmediaplayer_ms.h index 8408a5d4..1f3ec20 100644 --- a/content/renderer/media/stream/webmediaplayer_ms.h +++ b/content/renderer/media/stream/webmediaplayer_ms.h
@@ -27,6 +27,7 @@ class WebLocalFrame; class WebMediaPlayerClient; class WebString; +class WebVideoFrameSubmitter; } namespace media { @@ -91,6 +92,8 @@ media::GpuVideoAcceleratorFactories* gpu_factories, const blink::WebString& sink_id, CreateSurfaceLayerBridgeCB create_bridge_callback, + base::RepeatingCallback<std::unique_ptr<blink::WebVideoFrameSubmitter>()> + create_submitter_callback, bool surface_layer_for_video_enabled_); ~WebMediaPlayerMS() override; @@ -237,11 +240,18 @@ static const gfx::Size kUseGpuMemoryBufferVideoFramesMinResolution; #endif // defined(OS_WIN) + // When we lose the context_provider, we destroy the CompositorFrameSink to + // prevent frames from being submitted. The current surface_ids become + // invalid. + void OnFrameSinkDestroyed(); + void OnFirstFrameReceived(media::VideoRotation video_rotation, bool is_opaque); void OnOpacityChanged(bool is_opaque); void OnRotationChanged(media::VideoRotation video_rotation, bool is_opaque); + bool IsInPictureInPicture() const; + // Need repaint due to state change. void RepaintInternal(); @@ -309,6 +319,7 @@ const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; + const scoped_refptr<base::TaskRunner> worker_task_runner_; media::GpuVideoAcceleratorFactories* gpu_factories_; @@ -336,6 +347,9 @@ CreateSurfaceLayerBridgeCB create_bridge_callback_; + base::RepeatingCallback<std::unique_ptr<blink::WebVideoFrameSubmitter>()> + create_submitter_callback_; + // Whether the use of a surface layer instead of a video layer is enabled. bool surface_layer_for_video_enabled_ = false;
diff --git a/content/renderer/media/stream/webmediaplayer_ms_compositor.cc b/content/renderer/media/stream/webmediaplayer_ms_compositor.cc index ee24b71..c53c0be2 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_compositor.cc +++ b/content/renderer/media/stream/webmediaplayer_ms_compositor.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/public/platform/web_media_stream.h" #include "third_party/blink/public/platform/web_media_stream_source.h" #include "third_party/blink/public/platform/web_media_stream_track.h" +#include "third_party/blink/public/platform/web_video_frame_submitter.h" #include "third_party/libyuv/include/libyuv/convert.h" #include "third_party/libyuv/include/libyuv/planar_functions.h" #include "third_party/libyuv/include/libyuv/video_common.h" @@ -128,11 +129,17 @@ } // anonymous namespace WebMediaPlayerMSCompositor::WebMediaPlayerMSCompositor( - scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> + video_frame_compositor_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, const blink::WebMediaStream& web_stream, + base::RepeatingCallback<std::unique_ptr<blink::WebVideoFrameSubmitter>()> + create_submitter_callback, + bool surface_layer_for_video_enabled, const base::WeakPtr<WebMediaPlayerMS>& player) - : compositor_task_runner_(compositor_task_runner), + : RefCountedDeleteOnSequence<WebMediaPlayerMSCompositor>( + video_frame_compositor_task_runner), + video_frame_compositor_task_runner_(video_frame_compositor_task_runner), io_task_runner_(io_task_runner), player_(player), video_frame_provider_client_(nullptr), @@ -141,9 +148,23 @@ total_frame_count_(0), dropped_frame_count_(0), stopped_(true), - render_started_(!stopped_) { + render_started_(!stopped_), + weak_ptr_factory_(this) { main_message_loop_ = base::MessageLoopCurrent::Get(); + if (surface_layer_for_video_enabled) { + submitter_ = create_submitter_callback.Run(); + + video_frame_compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&WebMediaPlayerMSCompositor::InitializeSubmitter, + weak_ptr_factory_.GetWeakPtr())); + update_submission_state_callback_ = media::BindToLoop( + video_frame_compositor_task_runner_, + base::BindRepeating(&WebMediaPlayerMSCompositor::UpdateSubmissionState, + weak_ptr_factory_.GetWeakPtr())); + } + blink::WebVector<blink::WebMediaStreamTrack> video_tracks; if (!web_stream.IsNull()) video_tracks = web_stream.VideoTracks(); @@ -168,8 +189,54 @@ } WebMediaPlayerMSCompositor::~WebMediaPlayerMSCompositor() { - DCHECK(!video_frame_provider_client_) - << "Must call StopUsingProvider() before dtor!"; + if (submitter_) { + video_frame_compositor_task_runner_->DeleteSoon(FROM_HERE, + std::move(submitter_)); + } else { + DCHECK(!video_frame_provider_client_) + << "Must call StopUsingProvider() before dtor!"; + } +} + +void WebMediaPlayerMSCompositor::InitializeSubmitter() { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->Initialize(this); +} + +void WebMediaPlayerMSCompositor::UpdateSubmissionState(bool state) { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->UpdateSubmissionState(state); +} + +// TODO(https://crbug/879424): Rename, since it really doesn't enable +// submission. Do this along with the VideoFrameSubmitter refactor. +void WebMediaPlayerMSCompositor::EnableSubmission( + const viz::SurfaceId& id, + media::VideoRotation rotation, + bool force_submit, + bool is_opaque, + blink::WebFrameSinkDestroyedCallback frame_sink_destroyed_callback) { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->SetRotation(rotation); + submitter_->SetForceSubmit(force_submit); + submitter_->SetIsOpaque(is_opaque); + submitter_->EnableSubmission(id, std::move(frame_sink_destroyed_callback)); + video_frame_provider_client_ = submitter_.get(); +} + +void WebMediaPlayerMSCompositor::UpdateRotation(media::VideoRotation rotation) { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->SetRotation(rotation); +} + +void WebMediaPlayerMSCompositor::SetForceSubmit(bool force_submit) { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->SetForceSubmit(force_submit); +} + +void WebMediaPlayerMSCompositor::UpdateIsOpaque(bool is_opaque) { + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); + submitter_->SetIsOpaque(is_opaque); } gfx::Size WebMediaPlayerMSCompositor::GetCurrentSize() { @@ -200,7 +267,7 @@ void WebMediaPlayerMSCompositor::SetVideoFrameProviderClient( cc::VideoFrameProvider::Client* client) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); if (video_frame_provider_client_) video_frame_provider_client_->StopUsingProvider(); @@ -272,7 +339,7 @@ bool WebMediaPlayerMSCompositor::UpdateCurrentFrame( base::TimeTicks deadline_min, base::TimeTicks deadline_max) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); TRACE_EVENT_BEGIN2("media", "UpdateCurrentFrame", "Actual Render Begin", deadline_min.ToInternalValue(), "Actual Render End", @@ -311,7 +378,7 @@ scoped_refptr<media::VideoFrame> WebMediaPlayerMSCompositor::GetCurrentFrame() { DVLOG(3) << __func__; - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); base::AutoLock auto_lock(current_frame_lock_); TRACE_EVENT_INSTANT1("media", "WebMediaPlayerMSCompositor::GetCurrentFrame", TRACE_EVENT_SCOPE_THREAD, "Timestamp", @@ -324,7 +391,7 @@ void WebMediaPlayerMSCompositor::PutCurrentFrame() { DVLOG(3) << __func__; - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); current_frame_rendered_ = true; } @@ -344,7 +411,7 @@ base::AutoLock auto_lock(current_frame_lock_); render_started_ = true; } - compositor_task_runner_->PostTask( + video_frame_compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce(&WebMediaPlayerMSCompositor::StartRenderingInternal, this)); @@ -352,7 +419,7 @@ void WebMediaPlayerMSCompositor::StopRendering() { DCHECK(thread_checker_.CalledOnValidThread()); - compositor_task_runner_->PostTask( + video_frame_compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce(&WebMediaPlayerMSCompositor::StopRenderingInternal, this)); } @@ -370,7 +437,7 @@ void WebMediaPlayerMSCompositor::StopUsingProvider() { DCHECK(thread_checker_.CalledOnValidThread()); - compositor_task_runner_->PostTask( + video_frame_compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce(&WebMediaPlayerMSCompositor::StopUsingProviderInternal, this)); @@ -379,7 +446,7 @@ bool WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks( const std::vector<base::TimeDelta>& timestamps, std::vector<base::TimeTicks>* wall_clock_times) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread() || + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread() || thread_checker_.CalledOnValidThread() || io_task_runner_->BelongsToCurrentThread()); for (const base::TimeDelta& timestamp : timestamps) { @@ -392,7 +459,7 @@ void WebMediaPlayerMSCompositor::RenderUsingAlgorithm( base::TimeTicks deadline_min, base::TimeTicks deadline_max) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); current_frame_lock_.AssertAcquired(); last_deadline_max_ = deadline_max; last_render_length_ = deadline_max - deadline_min; @@ -422,7 +489,7 @@ void WebMediaPlayerMSCompositor::RenderWithoutAlgorithm( const scoped_refptr<media::VideoFrame>& frame) { DCHECK(io_task_runner_->BelongsToCurrentThread()); - compositor_task_runner_->PostTask( + video_frame_compositor_task_runner_->PostTask( FROM_HERE, base::BindOnce( &WebMediaPlayerMSCompositor::RenderWithoutAlgorithmOnCompositor, this, @@ -431,7 +498,7 @@ void WebMediaPlayerMSCompositor::RenderWithoutAlgorithmOnCompositor( const scoped_refptr<media::VideoFrame>& frame) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); { base::AutoLock auto_lock(current_frame_lock_); SetCurrentFrame(frame); @@ -442,7 +509,7 @@ void WebMediaPlayerMSCompositor::SetCurrentFrame( const scoped_refptr<media::VideoFrame>& frame) { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); current_frame_lock_.AssertAcquired(); TRACE_EVENT_INSTANT1("media", "WebMediaPlayerMSCompositor::SetCurrentFrame", TRACE_EVENT_SCOPE_THREAD, "Timestamp", @@ -464,7 +531,7 @@ } void WebMediaPlayerMSCompositor::StartRenderingInternal() { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); stopped_ = false; if (video_frame_provider_client_) @@ -472,7 +539,7 @@ } void WebMediaPlayerMSCompositor::StopRenderingInternal() { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); stopped_ = true; // It is possible that the video gets paused and then resumed. We need to @@ -490,7 +557,7 @@ } void WebMediaPlayerMSCompositor::StopUsingProviderInternal() { - DCHECK(compositor_task_runner_->BelongsToCurrentThread()); + DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); if (video_frame_provider_client_) video_frame_provider_client_->StopUsingProvider(); video_frame_provider_client_ = nullptr;
diff --git a/content/renderer/media/stream/webmediaplayer_ms_compositor.h b/content/renderer/media/stream/webmediaplayer_ms_compositor.h index 921b0bb..63caa79 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_compositor.h +++ b/content/renderer/media/stream/webmediaplayer_ms_compositor.h
@@ -11,7 +11,7 @@ #include <memory> #include <vector> -#include "base/memory/ref_counted.h" +#include "base/memory/ref_counted_delete_on_sequence.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/synchronization/lock.h" @@ -20,6 +20,7 @@ #include "cc/layers/video_frame_provider.h" #include "content/common/content_export.h" #include "media/base/media_log.h" +#include "third_party/blink/public/platform/web_video_frame_submitter.h" namespace base { class SingleThreadTaskRunner; @@ -37,6 +38,10 @@ class VideoRendererAlgorithm; } +namespace viz { +class SurfaceId; +} + namespace content { class WebMediaPlayerMS; @@ -51,16 +56,19 @@ // frame, and submit it whenever asked by the compositor. class CONTENT_EXPORT WebMediaPlayerMSCompositor : public cc::VideoFrameProvider, - public base::RefCountedThreadSafe<WebMediaPlayerMSCompositor> { + public base::RefCountedDeleteOnSequence<WebMediaPlayerMSCompositor> { public: // This |url| represents the media stream we are rendering. |url| is used to // find out what web stream this WebMediaPlayerMSCompositor is playing, and // together with flag "--disable-rtc-smoothness-algorithm" determine whether // we enable algorithm or not. WebMediaPlayerMSCompositor( - scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, const blink::WebMediaStream& web_stream, + base::RepeatingCallback<std::unique_ptr<blink::WebVideoFrameSubmitter>()> + create_submitter_callback, + bool surface_layer_for_video_enabled, const base::WeakPtr<WebMediaPlayerMS>& player); // Can be called from any thread. @@ -76,6 +84,24 @@ size_t total_frame_count(); size_t dropped_frame_count(); + // Signals the VideoFrameSubmitter to prepare to receive BeginFrames and + // submit video frames given by WebMediaPlayerMSCompositor. + virtual void EnableSubmission( + const viz::SurfaceId& id, + media::VideoRotation rotation, + bool force_submit, + bool is_opaque, + blink::WebFrameSinkDestroyedCallback frame_sink_destroyed_callback); + + // Updates the rotation information for frames given to |submitter_|. + void UpdateRotation(media::VideoRotation rotation); + + // Notifies the |submitter_| that the frames must be submitted. + void SetForceSubmit(bool); + + // Updates the opacity information for frames given to |submitter_|. + void UpdateIsOpaque(bool); + // VideoFrameProvider implementation. void SetVideoFrameProviderClient( cc::VideoFrameProvider::Client* client) override; @@ -101,11 +127,19 @@ void StopUsingProvider(); private: - friend class base::RefCountedThreadSafe<WebMediaPlayerMSCompositor>; + friend class base::RefCountedDeleteOnSequence<WebMediaPlayerMSCompositor>; + friend class base::DeleteHelper<WebMediaPlayerMSCompositor>; friend class WebMediaPlayerMSTest; ~WebMediaPlayerMSCompositor() override; + // Ran on the |video_frame_compositor_task_runner_| to initialize + // |submitter_| + void InitializeSubmitter(); + + // Signals the VideoFrameSubmitter to stop submitting frames. + void UpdateSubmissionState(bool); + bool MapTimestampsToRenderTimeTicks( const std::vector<base::TimeDelta>& timestamps, std::vector<base::TimeTicks>* wall_clock_times); @@ -138,7 +172,8 @@ // which is renderer main thread in this class. base::ThreadChecker thread_checker_; - const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; + const scoped_refptr<base::SingleThreadTaskRunner> + video_frame_compositor_task_runner_; const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; base::MessageLoop* main_message_loop_; @@ -186,6 +221,8 @@ bool stopped_; bool render_started_; + std::unique_ptr<blink::WebVideoFrameSubmitter> submitter_; + std::map<base::TimeDelta, base::TimeTicks> timestamps_to_clock_times_; cc::UpdateSubmissionStateCB update_submission_state_callback_; @@ -194,6 +231,8 @@ // |dropped_frame_count_|, and |render_started_|. base::Lock current_frame_lock_; + base::WeakPtrFactory<WebMediaPlayerMSCompositor> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerMSCompositor); }; } // namespace content
diff --git a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc index 065fc62..232c446 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc +++ b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
@@ -26,8 +26,9 @@ #include "third_party/blink/public/platform/web_media_player_client.h" #include "third_party/blink/public/platform/web_media_player_source.h" +using ::testing::NiceMock; using ::testing::Return; -using ::testing::StrictMock; +using ::testing::ReturnRef; namespace content { @@ -40,12 +41,22 @@ class MockSurfaceLayerBridge : public blink::WebSurfaceLayerBridge { public: + MockSurfaceLayerBridge() { + ON_CALL(*this, GetSurfaceId).WillByDefault(ReturnRef(surface_id_)); + } + MOCK_CONST_METHOD0(GetCcLayer, cc::Layer*()); MOCK_CONST_METHOD0(GetFrameSinkId, const viz::FrameSinkId&()); MOCK_CONST_METHOD0(GetSurfaceId, const viz::SurfaceId&()); MOCK_METHOD1(SetContentsOpaque, void(bool)); MOCK_METHOD0(CreateSurfaceLayer, void()); MOCK_METHOD0(ClearSurfaceId, void()); + + viz::FrameSinkId frame_sink_id_ = viz::FrameSinkId(1, 1); + viz::LocalSurfaceId local_surface_id_ = + viz::LocalSurfaceId(11, base::UnguessableToken::Deserialize(0x111111, 0)); + viz::SurfaceId surface_id_ = + viz::SurfaceId(frame_sink_id_, local_surface_id_); }; using TestFrame = std::pair<FrameType, scoped_refptr<media::VideoFrame>>; @@ -414,6 +425,23 @@ message_loop_controller_->GetClosure().Run(); } +class MockWebVideoFrameSubmitter : public blink::WebVideoFrameSubmitter { + public: + // blink::WebVideoFrameSubmitter implementation. + MOCK_METHOD0(StopUsingProvider, void()); + MOCK_METHOD0(DidReceiveFrame, void()); + MOCK_METHOD2(EnableSubmission, + void(viz::SurfaceId, blink::WebFrameSinkDestroyedCallback)); + MOCK_METHOD0(StartRendering, void()); + MOCK_METHOD0(StopRendering, void()); + MOCK_METHOD1(Initialize, void(cc::VideoFrameProvider*)); + MOCK_METHOD1(SetRotation, void(media::VideoRotation)); + MOCK_METHOD1(SetIsOpaque, void(bool)); + MOCK_METHOD1(UpdateSubmissionState, void(bool)); + MOCK_METHOD1(SetForceSubmit, void(bool)); + MOCK_CONST_METHOD0(IsDrivingFrameUpdates, bool()); +}; + // The class is used to generate a MockVideoProvider in // WebMediaPlayerMS::load(). class MockRenderFactory : public MediaStreamRendererFactory { @@ -498,7 +526,10 @@ // 7. When WebMediaPlayerMS::play gets called, evething paused in step 6 should // be resumed. class WebMediaPlayerMSTest - : public testing::TestWithParam<testing::tuple<bool, bool>> , + : public testing::TestWithParam< + testing::tuple<bool /* enable_surface_layer_for_video */, + bool /* opaque_frame */, + bool /* odd_size_frame */>>, public blink::WebMediaPlayerClient, public cc::VideoFrameProvider::Client { public: @@ -507,18 +538,20 @@ &message_loop_controller_)), gpu_factories_(new media::MockGpuVideoAcceleratorFactories(nullptr)), surface_layer_bridge_( - std::make_unique<StrictMock<MockSurfaceLayerBridge>>()), + std::make_unique<NiceMock<MockSurfaceLayerBridge>>()), + submitter_(std::make_unique<NiceMock<MockWebVideoFrameSubmitter>>()), layer_set_(false), rendering_(false), background_rendering_(false) { surface_layer_bridge_ptr_ = surface_layer_bridge_.get(); + submitter_ptr_ = submitter_.get(); } ~WebMediaPlayerMSTest() override { player_.reset(); base::RunLoop().RunUntilIdle(); } - void InitializeWebMediaPlayerMS(bool enable_surface_layer_for_video); + void InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* LoadAndGetFrameProvider(bool algorithm_enabled); @@ -621,6 +654,11 @@ return std::move(surface_layer_bridge_); } + std::unique_ptr<blink::WebVideoFrameSubmitter> + CreateWebMockVideoFrameSubmitter() { + return std::move(submitter_); + } + base::MessageLoop message_loop_; MockRenderFactory* render_factory_; std::unique_ptr<media::MockGpuVideoAcceleratorFactories> gpu_factories_; @@ -631,8 +669,11 @@ cc::Layer* layer_; bool is_audio_element_ = false; std::vector<base::OnceClosure> frame_ready_cbs_; - std::unique_ptr<StrictMock<MockSurfaceLayerBridge>> surface_layer_bridge_; - StrictMock<MockSurfaceLayerBridge>* surface_layer_bridge_ptr_ = nullptr; + std::unique_ptr<NiceMock<MockSurfaceLayerBridge>> surface_layer_bridge_; + std::unique_ptr<NiceMock<MockWebVideoFrameSubmitter>> submitter_; + NiceMock<MockSurfaceLayerBridge>* surface_layer_bridge_ptr_ = nullptr; + NiceMock<MockWebVideoFrameSubmitter>* submitter_ptr_ = nullptr; + bool enable_surface_layer_for_video_ = false; private: // Main function trying to ask WebMediaPlayerMS to submit a frame for @@ -644,17 +685,20 @@ bool background_rendering_; }; -void WebMediaPlayerMSTest::InitializeWebMediaPlayerMS( - bool enable_surface_layer_for_video) { +void WebMediaPlayerMSTest::InitializeWebMediaPlayerMS() { + enable_surface_layer_for_video_ = testing::get<0>(GetParam()); player_ = std::make_unique<WebMediaPlayerMS>( nullptr, this, &delegate_, std::make_unique<media::MediaLog>(), std::unique_ptr<MediaStreamRendererFactory>(render_factory_), message_loop_.task_runner(), message_loop_.task_runner(), message_loop_.task_runner(), message_loop_.task_runner(), gpu_factories_.get(), blink::WebString(), - base::BindRepeating(&WebMediaPlayerMSTest::CreateMockSurfaceLayerBridge, - base::Unretained(this)), - enable_surface_layer_for_video); + base::BindOnce(&WebMediaPlayerMSTest::CreateMockSurfaceLayerBridge, + base::Unretained(this)), + base::BindRepeating( + &WebMediaPlayerMSTest::CreateWebMockVideoFrameSubmitter, + base::Unretained(this)), + enable_surface_layer_for_video_); } MockMediaStreamVideoRenderer* WebMediaPlayerMSTest::LoadAndGetFrameProvider( @@ -709,8 +753,12 @@ layer_set_ = layer ? true : false; layer_ = layer; - if (layer) - compositor_->SetVideoFrameProviderClient(this); + if (layer) { + if (enable_surface_layer_for_video_) + compositor_->SetVideoFrameProviderClient(submitter_ptr_); + else + compositor_->SetVideoFrameProviderClient(this); + } DoSetCcLayer(!!layer); } @@ -769,8 +817,8 @@ CheckSizeChanged(frame_size); } -TEST_F(WebMediaPlayerMSTest, NoDataDuringLoadForVideo) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, NoDataDuringLoadForVideo) { + InitializeWebMediaPlayerMS(); EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)) .Times(0); @@ -787,8 +835,8 @@ EXPECT_CALL(*this, DoSetCcLayer(false)); } -TEST_F(WebMediaPlayerMSTest, NoWaitForFrameForAudio) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, NoWaitForFrameForAudio) { + InitializeWebMediaPlayerMS(); is_audio_element_ = true; scoped_refptr<MediaStreamAudioRenderer> audio_renderer( new MockMediaStreamAudioRenderer()); @@ -814,8 +862,8 @@ EXPECT_CALL(*this, DoSetCcLayer(false)); } -TEST_F(WebMediaPlayerMSTest, NoWaitForFrameForAudioOnly) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, NoWaitForFrameForAudioOnly) { + InitializeWebMediaPlayerMS(); render_factory_->set_support_video_renderer(false); scoped_refptr<MediaStreamAudioRenderer> audio_renderer( new MockMediaStreamAudioRenderer()); @@ -828,12 +876,12 @@ EXPECT_CALL(*this, DoSetCcLayer(false)); } -TEST_F(WebMediaPlayerMSTest, Playing_Normal) { +TEST_P(WebMediaPlayerMSTest, Playing_Normal) { // This test sends a bunch of normal frames with increasing timestamps // and verifies that they are produced by WebMediaPlayerMS in appropriate // order. - InitializeWebMediaPlayerMS(false); + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(true); @@ -842,8 +890,12 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -858,14 +910,17 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } -TEST_F(WebMediaPlayerMSTest, Playing_ErrorFrame) { +TEST_P(WebMediaPlayerMSTest, Playing_ErrorFrame) { // This tests sends a broken frame to WebMediaPlayerMS, and verifies // OnSourceError function works as expected. - InitializeWebMediaPlayerMS(false); + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(false); @@ -875,8 +930,12 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -890,13 +949,16 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } TEST_P(WebMediaPlayerMSTest, PlayThenPause) { - InitializeWebMediaPlayerMS(false); - const bool opaque_frame = testing::get<0>(GetParam()); - const bool odd_size_frame = testing::get<1>(GetParam()); + InitializeWebMediaPlayerMS(); + const bool opaque_frame = testing::get<1>(GetParam()); + const bool odd_size_frame = testing::get<2>(GetParam()); // In the middle of this test, WebMediaPlayerMS::pause will be called, and we // are going to verify that during the pause stage, a frame gets freezed, and // cc::VideoFrameProviderClient should also be paused. @@ -908,8 +970,13 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps, opaque_frame, odd_size_frame); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -923,7 +990,11 @@ testing::Mock::VerifyAndClearExpectations(this); // Here we call pause, and expect a freezing frame. - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopRendering()); + else + EXPECT_CALL(*this, DoStopRendering()); + player_->Pause(); auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); message_loop_controller_.RunAndWaitForStatus( @@ -936,9 +1007,9 @@ } TEST_P(WebMediaPlayerMSTest, PlayThenPauseThenPlay) { - InitializeWebMediaPlayerMS(false); - const bool opaque_frame = testing::get<0>(GetParam()); - const bool odd_size_frame = testing::get<1>(GetParam()); + InitializeWebMediaPlayerMS(); + const bool opaque_frame = testing::get<1>(GetParam()); + const bool odd_size_frame = testing::get<2>(GetParam()); // Similary to PlayAndPause test above, this one focuses on testing that // WebMediaPlayerMS can be resumed after a period of paused status. MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(false); @@ -950,8 +1021,13 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps, opaque_frame, odd_size_frame); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -965,7 +1041,11 @@ testing::Mock::VerifyAndClearExpectations(this); // Here we call pause, and expect a freezing frame. - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopRendering()); + else + EXPECT_CALL(*this, DoStopRendering()); + player_->Pause(); auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); message_loop_controller_.RunAndWaitForStatus( @@ -975,7 +1055,11 @@ testing::Mock::VerifyAndClearExpectations(this); // We resume the player, and expect rendering can continue. - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StartRendering()); + else + EXPECT_CALL(*this, DoStartRendering()); + player_->Play(); prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); message_loop_controller_.RunAndWaitForStatus( @@ -985,26 +1069,30 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + } else { + EXPECT_CALL(*this, DoStopRendering()); + } } -INSTANTIATE_TEST_CASE_P(, - WebMediaPlayerMSTest, - ::testing::Combine(::testing::Bool(), - ::testing::Bool())); - // During this test, we check that when we send rotated video frames, it applies // to player's natural size. -TEST_F(WebMediaPlayerMSTest, RotationChange) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, RotationChange) { + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(true); const int kTestBrake = static_cast<int>(FrameType::TEST_BRAKE); static int tokens[] = {0, 33, kTestBrake}; std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps, false, false, 17, media::VIDEO_ROTATION_90); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -1020,9 +1108,13 @@ // Change rotation. provider->QueueFrames(timestamps, false, false, 17, media::VIDEO_ROTATION_0); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStopRendering()); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*submitter_ptr_, SetRotation(media::VIDEO_ROTATION_0)); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStopRendering()); + EXPECT_CALL(*this, DoStartRendering()); + } message_loop_controller_.RunAndWaitForStatus( media::PipelineStatus::PIPELINE_OK); natural_size = player_->NaturalSize(); @@ -1031,13 +1123,17 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } // During this test, we check that web layer changes opacity according to the // given frames. -TEST_F(WebMediaPlayerMSTest, OpacityChange) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, OpacityChange) { + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(true); // Push one opaque frame. @@ -1045,8 +1141,13 @@ static int tokens[] = {0, kTestBrake}; std::vector<int> timestamps(tokens, tokens + arraysize(tokens)); provider->QueueFrames(timestamps, true); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -1055,34 +1156,50 @@ CheckSizeChanged(gfx::Size(kStandardWidth, kStandardHeight))); message_loop_controller_.RunAndWaitForStatus( media::PipelineStatus::PIPELINE_OK); - ASSERT_TRUE(layer_ != nullptr); - EXPECT_TRUE(layer_->contents_opaque()); + + if (!enable_surface_layer_for_video_) { + ASSERT_TRUE(layer_ != nullptr); + EXPECT_TRUE(layer_->contents_opaque()); + } // Push one transparent frame. + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, SetContentsOpaque(false)); + EXPECT_CALL(*submitter_ptr_, SetIsOpaque(false)); + } provider->QueueFrames(timestamps, false); message_loop_controller_.RunAndWaitForStatus( media::PipelineStatus::PIPELINE_OK); - EXPECT_FALSE(layer_->contents_opaque()); + if (!enable_surface_layer_for_video_) + EXPECT_FALSE(layer_->contents_opaque()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, SetContentsOpaque(true)); + EXPECT_CALL(*submitter_ptr_, SetIsOpaque(true)); + } // Push another opaque frame. provider->QueueFrames(timestamps, true); message_loop_controller_.RunAndWaitForStatus( media::PipelineStatus::PIPELINE_OK); - EXPECT_TRUE(layer_->contents_opaque()); + if (!enable_surface_layer_for_video_) + EXPECT_TRUE(layer_->contents_opaque()); testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } -TEST_F(WebMediaPlayerMSTest, BackgroundRendering) { +TEST_P(WebMediaPlayerMSTest, BackgroundRendering) { // During this test, we will switch to background rendering mode, in which // WebMediaPlayerMS::pause does not get called, but // cc::VideoFrameProviderClient simply stops asking frames from // WebMediaPlayerMS without an explicit notification. We should expect that // WebMediaPlayerMS can digest old frames, rather than piling frames up and // explode. - InitializeWebMediaPlayerMS(false); + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(true); const int kTestBrake = static_cast<int>(FrameType::TEST_BRAKE); @@ -1092,8 +1209,13 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -1106,7 +1228,11 @@ // Switch to background rendering, expect rendering to continue for all the // frames between kTestBrake frames. - EXPECT_CALL(*this, DoDidReceiveFrame()).Times(testing::AtLeast(1)); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, DidReceiveFrame()).Times(testing::AtLeast(1)); + else + EXPECT_CALL(*this, DoDidReceiveFrame()).Times(testing::AtLeast(1)); + SetBackgroundRendering(true); auto prev_frame = compositor_->GetCurrentFrameWithoutUpdatingStatistics(); message_loop_controller_.RunAndWaitForStatus( @@ -1124,14 +1250,17 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } -TEST_F(WebMediaPlayerMSTest, FrameSizeChange) { +TEST_P(WebMediaPlayerMSTest, FrameSizeChange) { // During this test, the frame size of the input changes. // We need to make sure, when sizeChanged() gets called, new size should be // returned by GetCurrentSize(). - InitializeWebMediaPlayerMS(false); + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(true); int tokens[] = {0, 33, 66, 100, 133, 166, 200, 233, 266, 300, @@ -1139,8 +1268,13 @@ std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int)); provider->QueueFrames(timestamps, false, false, 7); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -1154,12 +1288,15 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } // Tests that GpuMemoryBufferVideoFramePool is called in the expected sequence. -TEST_F(WebMediaPlayerMSTest, CreateHardwareFrames) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, CreateHardwareFrames) { + InitializeWebMediaPlayerMS(); MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(false); SetGpuMemoryBufferVideoForTesting(); @@ -1171,8 +1308,13 @@ media::PipelineStatus::PIPELINE_OK); ASSERT_EQ(1u, frame_ready_cbs_.size()); - EXPECT_CALL(*this, DoSetCcLayer(true)); - EXPECT_CALL(*this, DoStartRendering()); + if (enable_surface_layer_for_video_) { + EXPECT_CALL(*surface_layer_bridge_ptr_, CreateSurfaceLayer()); + EXPECT_CALL(*submitter_ptr_, StartRendering()); + } else { + EXPECT_CALL(*this, DoSetCcLayer(true)); + EXPECT_CALL(*this, DoStartRendering()); + } EXPECT_CALL(*this, DoReadyStateChanged( blink::WebMediaPlayer::kReadyStateHaveMetadata)); EXPECT_CALL(*this, DoReadyStateChanged( @@ -1189,12 +1331,14 @@ testing::Mock::VerifyAndClearExpectations(this); EXPECT_CALL(*this, DoSetCcLayer(false)); - EXPECT_CALL(*this, DoStopRendering()); + if (enable_surface_layer_for_video_) + EXPECT_CALL(*submitter_ptr_, StopUsingProvider()); + else + EXPECT_CALL(*this, DoStopRendering()); } - #if defined(OS_ANDROID) -TEST_F(WebMediaPlayerMSTest, HiddenPlayerTests) { - InitializeWebMediaPlayerMS(false); +TEST_P(WebMediaPlayerMSTest, HiddenPlayerTests) { + InitializeWebMediaPlayerMS(); LoadAndGetFrameProvider(true); // Hidden status should not affect playback. @@ -1244,4 +1388,9 @@ } #endif +INSTANTIATE_TEST_CASE_P(, + WebMediaPlayerMSTest, + ::testing::Combine(::testing::Bool(), + ::testing::Bool(), + ::testing::Bool())); } // namespace content
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index cdc05bd4..1b66caf 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -56,6 +56,7 @@ #include "content/common/frame_owner_properties.h" #include "content/common/frame_replication_state.h" #include "content/common/input_messages.h" +#include "content/common/navigation_gesture.h" #include "content/common/navigation_params.h" #include "content/common/page_messages.h" #include "content/common/possibly_associated_wrapper_shared_url_loader_factory.h" @@ -4026,20 +4027,12 @@ DocumentState::FromDocumentLoader(frame_->GetProvisionalDocumentLoader()); NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>(document_state->navigation_state()); - InternalDocumentStateData* internal_data = - InternalDocumentStateData::FromDocumentState(document_state); if (ui::PageTransitionCoreTypeIs(navigation_state->GetTransitionType(), ui::PAGE_TRANSITION_LINK)) { navigation_state->set_transition_type(ui::PAGE_TRANSITION_FORM_SUBMIT); } - // Save these to be processed when the ensuing navigation is committed. - WebSearchableFormData web_searchable_form_data(form); - internal_data->set_searchable_form_url(web_searchable_form_data.Url()); - internal_data->set_searchable_form_encoding( - web_searchable_form_data.Encoding().Utf8()); - for (auto& observer : observers_) observer.WillSubmitForm(form); } @@ -4098,14 +4091,7 @@ DocumentState::FromDocumentLoader(document_loader); NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( document_state->navigation_state()); - bool is_top_most = !frame_->Parent(); - if (is_top_most) { - auto navigation_gesture = - WebUserGestureIndicator::IsProcessingUserGesture(frame_) - ? NavigationGestureUser - : NavigationGestureAuto; - render_view_->set_navigation_gesture(navigation_gesture); - } else if (document_loader->ReplacesCurrentHistoryItem()) { + if (frame_->Parent() && document_loader->ReplacesCurrentHistoryItem()) { // Subframe navigations that don't add session history items must be // marked with AUTO_SUBFRAME. See also didFailProvisionalLoad for how we // handle loading of error pages. @@ -5464,11 +5450,8 @@ params->should_update_history = !document_loader->HasUnreachableURL() && response.HttpStatusCode() != 404; - params->searchable_form_url = internal_data->searchable_form_url(); - params->searchable_form_encoding = internal_data->searchable_form_encoding(); - - params->gesture = render_view_->navigation_gesture_; - render_view_->navigation_gesture_ = NavigationGestureUnknown; + params->gesture = document_loader->HadUserGesture() ? NavigationGestureUser + : NavigationGestureAuto; // Make navigation state a part of the DidCommitProvisionalLoad message so // that committed entry has it at all times. Send a single HistoryItem for
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index e89e01a8..566f097b 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -27,7 +27,6 @@ #include "cc/input/browser_controls_state.h" #include "content/common/content_export.h" #include "content/common/frame_message_enums.h" -#include "content/common/navigation_gesture.h" #include "content/public/common/browser_controls_state.h" #include "content/public/common/drop_data.h" #include "content/public/common/page_zoom.h" @@ -515,13 +514,6 @@ return observers_; } - NavigationGesture navigation_gesture() { - return navigation_gesture_; - } - void set_navigation_gesture(NavigationGesture gesture) { - navigation_gesture_ = gesture; - } - // Platform specific theme preferences if any are updated here. #if defined(OS_WIN) void UpdateThemePrefs(); @@ -577,10 +569,6 @@ // Loading state ------------------------------------------------------------- - // The gesture that initiated the current navigation. - // TODO(nasko): Move to RenderFrame, as this is per-frame state. - NavigationGesture navigation_gesture_ = NavigationGestureUnknown; - // Timer used to delay the updating of nav state (see // StartNavStateSyncTimerIfNecessary). base::OneShotTimer nav_state_sync_timer_;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index ef073fc..38e21ad 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -1071,6 +1071,8 @@ // Notify subclasses that we initiated the paint operation. DidInitiatePaint(); + + Send(new ViewHostMsg_DidCommitAndDrawCompositorFrame(routing_id_)); } void RenderWidget::DidCommitCompositorFrame() {
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index 91fbdfd..d60d7465 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -70,7 +70,7 @@ #include "third_party/blink/public/platform/modules/notifications/web_notification_data.h" #include "third_party/blink/public/platform/modules/payments/web_payment_handler_response.h" #include "third_party/blink/public/platform/modules/payments/web_payment_request_event_data.h" -#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_client_query_options.h" +#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_info.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_error.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_request.h" @@ -336,108 +336,6 @@ map, std::forward<Args>(args)..., base::Time::Now()); } -void DidGetClients( - std::unique_ptr<blink::WebServiceWorkerClientsCallbacks> callbacks, - std::vector<blink::mojom::ServiceWorkerClientInfoPtr> clients) { - blink::WebServiceWorkerClientsInfo info; - blink::WebVector<blink::WebServiceWorkerClientInfo> web_clients( - clients.size()); - for (size_t i = 0; i < clients.size(); ++i) - web_clients[i] = ToWebServiceWorkerClientInfo(std::move(clients[i])); - info.clients.Swap(web_clients); - callbacks->OnSuccess(info); -} - -void DidClaimClients( - std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> callbacks, - blink::mojom::ServiceWorkerErrorType error, - const base::Optional<std::string>& error_msg) { - if (error != blink::mojom::ServiceWorkerErrorType::kNone) { - callbacks->OnError(blink::WebServiceWorkerError( - error, blink::WebString::FromUTF8(*error_msg))); - return; - } - DCHECK(!error_msg); - callbacks->OnSuccess(); -} - -void DidGetClient( - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, - blink::mojom::ServiceWorkerClientInfoPtr client) { - std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; - if (client) { - web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( - ToWebServiceWorkerClientInfo(std::move(client))); - } - callbacks->OnSuccess(std::move(web_client)); -} - -void DidSkipWaiting( - std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks> callbacks, - bool success) { - // OnError() should not be called here since per spec the promise returned by - // skipWaiting() can never reject. - if (!success) - return; - callbacks->OnSuccess(); -} - -void DidOpenWindow( - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, - bool success, - blink::mojom::ServiceWorkerClientInfoPtr client, - const base::Optional<std::string>& error_msg) { - if (!success) { - DCHECK(!client); - callbacks->OnError(blink::WebServiceWorkerError( - blink::mojom::ServiceWorkerErrorType::kNavigation, - blink::WebString::FromUTF8(*error_msg))); - return; - } - - std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; - if (client) { - web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( - ToWebServiceWorkerClientInfo(std::move(client))); - } - callbacks->OnSuccess(std::move(web_client)); -} - -void DidFocusClient( - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, - blink::mojom::ServiceWorkerClientInfoPtr client) { - if (!client) { - callbacks->OnError(blink::WebServiceWorkerError( - blink::mojom::ServiceWorkerErrorType::kNotFound, - "The client was not found.")); - return; - } - auto web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( - ToWebServiceWorkerClientInfo(std::move(client))); - callbacks->OnSuccess(std::move(web_client)); -} - -void DidNavigateClient( - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, - bool success, - blink::mojom::ServiceWorkerClientInfoPtr client, - const base::Optional<std::string>& error_msg) { - if (!success) { - DCHECK(!client); - callbacks->OnError(blink::WebServiceWorkerError( - blink::mojom::ServiceWorkerErrorType::kNavigation, - blink::WebString::FromUTF8(*error_msg))); - return; - } - - std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; - if (client) { - web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( - ToWebServiceWorkerClientInfo(std::move(client))); - } - callbacks->OnSuccess(std::move(web_client)); -} - } // namespace // Holding data that needs to be bound to the worker context on the @@ -457,10 +355,6 @@ mojo::Binding<mojom::ServiceWorker> service_worker_binding; - // Bound by the first Mojo call received on the service worker thread - // ServiceWorker::InitializeGlobalScope(). - blink::mojom::ServiceWorkerHostAssociatedPtr service_worker_host; - // Maps for inflight event callbacks. // These are mapped from an event id issued from ServiceWorkerTimeoutTimer to // the Mojo callback to notify the end of the event. @@ -748,51 +642,6 @@ std::move(info)); } -void ServiceWorkerContextClient::GetClient( - const blink::WebString& id, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->GetClient( - id.Utf8(), base::BindOnce(&DidGetClient, std::move(callbacks))); -} - -void ServiceWorkerContextClient::GetClients( - const blink::WebServiceWorkerClientQueryOptions& weboptions, - std::unique_ptr<blink::WebServiceWorkerClientsCallbacks> callbacks) { - DCHECK(callbacks); - auto options = blink::mojom::ServiceWorkerClientQueryOptions::New( - weboptions.include_uncontrolled, weboptions.client_type); - context_->service_worker_host->GetClients( - std::move(options), base::BindOnce(&DidGetClients, std::move(callbacks))); -} - -void ServiceWorkerContextClient::OpenNewTab( - const blink::WebURL& url, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->OpenNewTab( - url, base::BindOnce(&DidOpenWindow, std::move(callbacks))); -} - -void ServiceWorkerContextClient::OpenPaymentHandlerWindow( - const blink::WebURL& url, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->OpenPaymentHandlerWindow( - url, base::BindOnce(&DidOpenWindow, std::move(callbacks))); -} - -void ServiceWorkerContextClient::SetCachedMetadata(const blink::WebURL& url, - const char* data, - size_t size) { - context_->service_worker_host->SetCachedMetadata( - url, std::vector<uint8_t>(data, data + size)); -} - -void ServiceWorkerContextClient::ClearCachedMetadata(const blink::WebURL& url) { - context_->service_worker_host->ClearCachedMetadata(url); -} - void ServiceWorkerContextClient::WorkerReadyForInspection() { DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence()); (*instance_host_)->OnReadyForInspection(); @@ -1417,45 +1266,6 @@ provider_context_.get()); } -void ServiceWorkerContextClient::PostMessageToClient( - const blink::WebString& uuid, - blink::TransferableMessage message) { - context_->service_worker_host->PostMessageToClient(uuid.Utf8(), - std::move(message)); -} - -void ServiceWorkerContextClient::Focus( - const blink::WebString& uuid, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->FocusClient( - uuid.Utf8(), base::BindOnce(&DidFocusClient, std::move(callbacks))); -} - -void ServiceWorkerContextClient::Navigate( - const blink::WebString& uuid, - const blink::WebURL& url, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->NavigateClient( - uuid.Utf8(), url, - base::BindOnce(&DidNavigateClient, std::move(callbacks))); -} - -void ServiceWorkerContextClient::SkipWaiting( - std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->SkipWaiting( - base::BindOnce(&DidSkipWaiting, std::move(callbacks))); -} - -void ServiceWorkerContextClient::Claim( - std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> callbacks) { - DCHECK(callbacks); - context_->service_worker_host->ClaimClients( - base::BindOnce(&DidClaimClients, std::move(callbacks))); -} - void ServiceWorkerContextClient::DispatchOrQueueFetchEvent( blink::mojom::DispatchFetchEventParamsPtr params, blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback, @@ -1666,8 +1476,7 @@ blink::mojom::ServiceWorkerRegistrationObjectInfoPtr registration_info) { DCHECK(worker_task_runner_->RunsTasksInCurrentSequence()); // Connect to the blink::mojom::ServiceWorkerHost. - DCHECK(!context_->service_worker_host); - context_->service_worker_host.Bind(std::move(service_worker_host)); + proxy_->BindServiceWorkerHost(service_worker_host.PassHandle()); // Set ServiceWorkerGlobalScope#registration. DCHECK_NE(registration_info->registration_id, blink::mojom::kInvalidServiceWorkerRegistrationId);
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h index 1c8de87..4ca23363 100644 --- a/content/renderer/service_worker/service_worker_context_client.h +++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -46,7 +46,6 @@ namespace blink { struct PlatformNotificationData; -struct WebServiceWorkerClientQueryOptions; class WebDataConsumerHandle; class WebServiceWorkerContextProxy; class WebServiceWorkerProvider; @@ -111,22 +110,6 @@ blink::mojom::ServiceWorkerObjectInfoPtr info); // WebServiceWorkerContextClient overrides. - void GetClient( - const blink::WebString& client_id, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override; - void GetClients( - const blink::WebServiceWorkerClientQueryOptions&, - std::unique_ptr<blink::WebServiceWorkerClientsCallbacks>) override; - void OpenNewTab( - const blink::WebURL&, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override; - void OpenPaymentHandlerWindow( - const blink::WebURL&, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override; - void SetCachedMetadata(const blink::WebURL&, - const char* data, - size_t size) override; - void ClearCachedMetadata(const blink::WebURL&) override; void WorkerReadyForInspection() override; void WorkerContextFailedToStart() override; void FailedToLoadInstalledScript() override; @@ -231,18 +214,6 @@ blink::WebServiceWorkerNetworkProvider*) override; std::unique_ptr<blink::WebServiceWorkerProvider> CreateServiceWorkerProvider() override; - void PostMessageToClient(const blink::WebString& uuid, - blink::TransferableMessage message) override; - void Focus(const blink::WebString& uuid, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override; - void Navigate( - const blink::WebString& uuid, - const blink::WebURL&, - std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override; - void SkipWaiting(std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks> - callbacks) override; - void Claim(std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> - callbacks) override; // Dispatches the fetch event if the worker is running normally, and queues it // instead if the worker has already requested to be terminated by the
diff --git a/content/renderer/service_worker/service_worker_context_client_unittest.cc b/content/renderer/service_worker/service_worker_context_client_unittest.cc index 2a34a8e..f2ceba8 100644 --- a/content/renderer/service_worker/service_worker_context_client_unittest.cc +++ b/content/renderer/service_worker/service_worker_context_client_unittest.cc
@@ -66,12 +66,14 @@ public: ~MockWebServiceWorkerContextProxy() override = default; - void ReadyToEvaluateScript() override {} + void BindServiceWorkerHost( + mojo::ScopedInterfaceEndpointHandle service_worker_host) override {} void SetRegistration( std::unique_ptr<blink::WebServiceWorkerRegistration::Handle> handle) override { registration_handle_ = std::move(handle); } + void ReadyToEvaluateScript() override {} bool HasFetchEventHandler() override { return false; } void DispatchFetchEvent(int fetch_event_id, const blink::WebServiceWorkerRequest& web_request,
diff --git a/content/test/content_browser_test_utils_internal.cc b/content/test/content_browser_test_utils_internal.cc index b02e0a5..7e66736 100644 --- a/content/test/content_browser_test_utils_internal.cc +++ b/content/test/content_browser_test_utils_internal.cc
@@ -420,8 +420,6 @@ } void ShowWidgetMessageFilter::Wait() { - initial_rect_ = gfx::Rect(); - routing_id_ = MSG_ROUTING_NONE; message_loop_runner_->Run(); }
diff --git a/content/test/content_browser_test_utils_internal.h b/content/test/content_browser_test_utils_internal.h index e6fe4c0..dbf3cf9 100644 --- a/content/test/content_browser_test_utils_internal.h +++ b/content/test/content_browser_test_utils_internal.h
@@ -247,7 +247,7 @@ scoped_refptr<content::MessageLoopRunner> message_loop_runner_; gfx::Rect initial_rect_; - int routing_id_; + int routing_id_ = MSG_ROUTING_NONE; DISALLOW_COPY_AND_ASSIGN(ShowWidgetMessageFilter); };
diff --git a/content/test/gpu/gpu_tests/context_lost_expectations.py b/content/test/gpu/gpu_tests/context_lost_expectations.py index 01b3223..6089366 100644 --- a/content/test/gpu/gpu_tests/context_lost_expectations.py +++ b/content/test/gpu/gpu_tests/context_lost_expectations.py
@@ -55,8 +55,6 @@ ['android'], bug=609629) # Flaking on Nexus 5X - self.Flaky('ContextLost_WebGLBlockedAfterJSNavigation', - ['android'], bug=882103) self.Flaky('ContextLost_WebGLUnblockedAfterUserInitiatedReload', ['android'], bug=879423) self.Fail('ContextLost_WorkerRAFAfterGPUCrash',
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index f913cfd..7e35f1e6 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc
@@ -52,8 +52,6 @@ params->transition = transition; params->redirects = std::vector<GURL>(); params->should_update_history = false; - params->searchable_form_url = GURL(); - params->searchable_form_encoding = std::string(); params->did_create_new_entry = did_create_new_entry; params->gesture = NavigationGestureUser; params->method = "GET";
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 6511a0a..0657c86 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -183,8 +183,6 @@ params.origin = url::Origin(); params.insecure_request_policy = blink::kLeaveInsecureRequestsAlone; params.has_potentially_trustworthy_unique_origin = false; - params.searchable_form_url = GURL(); - params.searchable_form_encoding = std::string(); rfh->SendNavigateWithParams(¶ms, was_within_same_document); }
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index 561b48d4..d561d94d 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -38,6 +38,7 @@ #include "content/public/common/child_process_host.h" #include "content/public/common/resource_type.h" #include "extensions/browser/api/activity_log/web_request_constants.h" +#include "extensions/browser/api/declarative/rules_registry_service.h" #include "extensions/browser/api/declarative_net_request/ruleset_manager.h" #include "extensions/browser/api/declarative_webrequest/request_stage.h" #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" @@ -405,6 +406,25 @@ request_id, std::move(callback)); } +// Checks whether the extension has any permissions that would use the web +// request API. +bool HasAnyWebRequestPermissions(const Extension* extension) { + static const APIPermission::ID kWebRequestPermissions[] = { + APIPermission::ID::kWebRequest, + APIPermission::ID::kWebRequestBlocking, + APIPermission::ID::kDeclarativeWebRequest, + APIPermission::ID::kDeclarativeNetRequest, + APIPermission::ID::kWebView, + }; + + const PermissionsData* permissions = extension->permissions_data(); + for (auto permission : kWebRequestPermissions) { + if (permissions->HasAPIPermission(permission)) + return true; + } + return false; +} + } // namespace void WebRequestAPI::Proxy::HandleAuthRequest( @@ -511,9 +531,7 @@ : browser_context_(context), info_map_(ExtensionSystem::Get(browser_context_)->info_map()), request_id_generator_(base::MakeRefCounted<RequestIDGenerator>()), - may_have_proxies_(MayHaveProxies()), - rules_monitor_observer_(this), - rules_registry_observer_(this) { + may_have_proxies_(MayHaveProxies()) { EventRouter* event_router = EventRouter::Get(browser_context_); for (size_t i = 0; i < arraysize(kWebRequestEvents); ++i) { // Observe the webRequest event. @@ -525,13 +543,7 @@ 0, sizeof(kWebRequestEventPrefix) - 1, webview::kWebViewEventPrefix); event_router->RegisterObserver(this, event_name); } - - rules_monitor_observer_.Add( - BrowserContextKeyedAPIFactory< - declarative_net_request::RulesMonitorService>::Get(browser_context_)); - rules_registry_observer_.Add( - BrowserContextKeyedAPIFactory<RulesRegistryService>::Get( - browser_context_)); + extensions::ExtensionRegistry::Get(browser_context_)->AddObserver(this); } WebRequestAPI::~WebRequestAPI() { @@ -539,8 +551,7 @@ void WebRequestAPI::Shutdown() { EventRouter::Get(browser_context_)->UnregisterObserver(this); - rules_monitor_observer_.RemoveAll(); - rules_registry_observer_.RemoveAll(); + extensions::ExtensionRegistry::Get(browser_context_)->RemoveObserver(this); } static base::LazyInstance< @@ -553,18 +564,8 @@ return g_factory.Pointer(); } -void WebRequestAPI::OnListenerAdded(const EventListenerInfo& details) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - ++listener_count_; - UpdateMayHaveProxies(); -} - void WebRequestAPI::OnListenerRemoved(const EventListenerInfo& details) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - --listener_count_; - DCHECK_GE(listener_count_, 0); - UpdateMayHaveProxies(); - // Note that details.event_name includes the sub-event details (e.g. "/123"). // TODO(fsamuel): <webview> events will not be removed through this code path. // <webview> events will be removed in RemoveWebViewEventListeners. Ideally, @@ -679,21 +680,17 @@ std::move(proxied_request), std::move(authentication_request))); } +void WebRequestAPI::ForceProxyForTesting() { + ++web_request_extension_count_; + UpdateMayHaveProxies(); +} + bool WebRequestAPI::MayHaveProxies() const { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) return false; - // If any other conditions are added here, make sure to call - // |UpdateMayHaveProxies()| when those conditions may change. - const auto* rules_registry_service = - BrowserContextKeyedAPIFactory<RulesRegistryService>::Get( - browser_context_); - const auto* rules_monitor_service = BrowserContextKeyedAPIFactory< - declarative_net_request::RulesMonitorService>::Get(browser_context_); - return listener_count_ > 0 || - rules_registry_service->HasAnyRegisteredRules() || - rules_monitor_service->HasAnyRegisteredRulesets(); + return web_request_extension_count_ > 0; } void WebRequestAPI::UpdateMayHaveProxies() { @@ -708,12 +705,22 @@ may_have_proxies_ = may_have_proxies; } -void WebRequestAPI::OnRulesetLoaded() { - UpdateMayHaveProxies(); +void WebRequestAPI::OnExtensionLoaded(content::BrowserContext* browser_context, + const Extension* extension) { + if (HasAnyWebRequestPermissions(extension)) { + ++web_request_extension_count_; + UpdateMayHaveProxies(); + } } -void WebRequestAPI::OnUpdateRules() { - UpdateMayHaveProxies(); +void WebRequestAPI::OnExtensionUnloaded( + content::BrowserContext* browser_context, + const Extension* extension, + UnloadedExtensionReason reason) { + if (HasAnyWebRequestPermissions(extension)) { + --web_request_extension_count_; + UpdateMayHaveProxies(); + } } // Represents a single unique listener to an event, along with whatever filter
diff --git a/extensions/browser/api/web_request/web_request_api.h b/extensions/browser/api/web_request/web_request_api.h index 8c96d95..03d6ad3a 100644 --- a/extensions/browser/api/web_request/web_request_api.h +++ b/extensions/browser/api/web_request/web_request_api.h
@@ -24,8 +24,6 @@ #include "content/public/browser/content_browser_client.h" #include "content/public/browser/global_request_id.h" #include "extensions/browser/api/declarative/rules_registry.h" -#include "extensions/browser/api/declarative/rules_registry_service.h" -#include "extensions/browser/api/declarative_net_request/rules_monitor_service.h" #include "extensions/browser/api/declarative_webrequest/request_stage.h" #include "extensions/browser/api/web_request/web_request_api_helpers.h" #include "extensions/browser/api/web_request/web_request_permissions.h" @@ -74,11 +72,9 @@ // work is done by ExtensionWebRequestEventRouter below. This class observes // extensions::EventRouter to deal with event listeners. There is one instance // per BrowserContext which is shared with incognito. -class WebRequestAPI - : public BrowserContextKeyedAPI, - public EventRouter::Observer, - public declarative_net_request::RulesMonitorService::Observer, - public RulesRegistryService::Observer { +class WebRequestAPI : public BrowserContextKeyedAPI, + public EventRouter::Observer, + public ExtensionRegistryObserver { public: // A callback used to asynchronously respond to an intercepted authentication // request when the Network Service is enabled. If |should_cancel| is true @@ -184,7 +180,6 @@ void Shutdown() override; // EventRouter::Observer overrides: - void OnListenerAdded(const EventListenerInfo& details) override; void OnListenerRemoved(const EventListenerInfo& details) override; // If any WebRequest event listeners are currently active for this @@ -222,6 +217,8 @@ network::mojom::WebSocketRequest* request, network::mojom::AuthenticationHandlerPtr* auth_handler); + void ForceProxyForTesting(); + private: friend class BrowserContextKeyedAPIFactory<WebRequestAPI>; @@ -238,15 +235,16 @@ // URLLoaderFactories if so. void UpdateMayHaveProxies(); - // RulesMonitorService::Observer implementation. - void OnRulesetLoaded() override; + // ExtensionRegistryObserver implementation. + void OnExtensionLoaded(content::BrowserContext* browser_context, + const Extension* extension) override; + void OnExtensionUnloaded(content::BrowserContext* browser_context, + const Extension* extension, + UnloadedExtensionReason reason) override; - // RulesRegistryService::Observer implementation. - void OnUpdateRules() override; - - // A count of active event listeners registered in this BrowserContext. This - // is eventually consistent with the state of - int listener_count_ = 0; + // A count of active extensions for this BrowserContext that use web request + // permissions. + int web_request_extension_count_ = 0; content::BrowserContext* const browser_context_; InfoMap* const info_map_; @@ -257,12 +255,6 @@ // |UpdateMayHaveProxies()|. bool may_have_proxies_; - ScopedObserver<declarative_net_request::RulesMonitorService, - declarative_net_request::RulesMonitorService::Observer> - rules_monitor_observer_; - ScopedObserver<RulesRegistryService, RulesRegistryService::Observer> - rules_registry_observer_; - DISALLOW_COPY_AND_ASSIGN(WebRequestAPI); };
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc index dd42cc6..cbb241b 100644 --- a/extensions/browser/updater/extension_downloader.cc +++ b/extensions/browser/updater/extension_downloader.cc
@@ -52,8 +52,6 @@ namespace extensions { -const char ExtensionDownloader::kBlacklistAppID[] = "com.google.crx.blacklist"; - namespace { const net::BackoffEntry::Policy kDefaultBackoffPolicy = { @@ -89,7 +87,6 @@ const char kNotFromWebstoreInstallSource[] = "notfromwebstore"; const char kDefaultInstallSource[] = ""; -const char kDefaultInstallLocation[] = ""; const char kReinstallInstallSource[] = "reinstall"; const char kGoogleDotCom[] = "google.com"; @@ -304,24 +301,6 @@ fetches_preparing_.clear(); } -void ExtensionDownloader::StartBlacklistUpdate( - const std::string& version, - const ManifestFetchData::PingData& ping_data, - int request_id) { - // Note: it is very important that we use the https version of the update - // url here to avoid DNS hijacking of the blacklist, which is not validated - // by a public key signature like .crx files are. - std::unique_ptr<ManifestFetchData> blacklist_fetch( - CreateManifestFetchData(extension_urls::GetWebstoreUpdateUrl(), - request_id, ManifestFetchData::BACKGROUND)); - DCHECK(blacklist_fetch->base_url().SchemeIsCryptographic()); - blacklist_fetch->AddExtension(kBlacklistAppID, version, &ping_data, - std::string(), kDefaultInstallSource, - kDefaultInstallLocation, - ManifestFetchData::FetchPriority::BACKGROUND); - StartUpdateCheck(std::move(blacklist_fetch)); -} - void ExtensionDownloader::SetWebstoreAuthenticationCapabilities( const GetWebstoreAccountCallback& webstore_account_callback, OAuth2TokenService* token_service) { @@ -670,23 +649,7 @@ const std::string& extension_id = update->extension_id; GURL crx_url = update->crx_url; - if (extension_id != kBlacklistAppID) { - NotifyUpdateFound(extension_id, update->version); - } else { - // The URL of the blacklist file is returned by the server and we need to - // be sure that we continue to be able to reliably detect whether a URL - // references a blacklist file. - DCHECK(extension_urls::IsBlacklistUpdateUrl(crx_url)) << crx_url; - - // Force https (crbug.com/129587). - if (!crx_url.SchemeIsCryptographic()) { - url::Replacements<char> replacements; - std::string scheme("https"); - replacements.SetScheme(scheme.c_str(), - url::Component(0, scheme.size())); - crx_url = crx_url.ReplaceComponents(replacements); - } - } + NotifyUpdateFound(extension_id, update->version); FetchUpdatedExtension(std::make_unique<ExtensionFetch>( update->extension_id, crx_url, update->package_hash, update->version, fetch_data->request_ids()));
diff --git a/extensions/browser/updater/extension_downloader.h b/extensions/browser/updater/extension_downloader.h index 010c115..6b1adea 100644 --- a/extensions/browser/updater/extension_downloader.h +++ b/extensions/browser/updater/extension_downloader.h
@@ -114,11 +114,6 @@ // AddExtension() and AddPendingExtension(). void StartAllPending(ExtensionCache* cache); - // Schedules an update check of the blacklist. - void StartBlacklistUpdate(const std::string& version, - const ManifestFetchData::PingData& ping_data, - int request_id); - // Sets GetWebstoreAccountCallback and TokenService instances to be used for // OAuth2 authentication on protected Webstore downloads. Both objects must be // valid to use for the lifetime of this object. @@ -147,9 +142,6 @@ static const int kManifestFetcherId = 1; static const int kExtensionFetcherId = 2; - // Update AppID for extension blacklist. - static const char kBlacklistAppID[]; - static const int kMaxRetries = 10; // Names of the header fields used for traffic management for extension
diff --git a/google_apis/drive/drive_common_callbacks.h b/google_apis/drive/drive_common_callbacks.h index e8821685..de503003 100644 --- a/google_apis/drive/drive_common_callbacks.h +++ b/google_apis/drive/drive_common_callbacks.h
@@ -20,10 +20,6 @@ std::unique_ptr<AboutResource> about_resource)> AboutResourceCallback; -// Callback used for getting ShareUrl. -typedef base::Callback<void(DriveApiErrorCode error, - const GURL& share_url)> GetShareUrlCallback; - // Callback used for getting AppList. typedef base::Callback<void(DriveApiErrorCode error, std::unique_ptr<AppList> app_list)>
diff --git a/infra/config/branch/cq.cfg b/infra/config/branch/cq.cfg index edcf96ef..80de542 100644 --- a/infra/config/branch/cq.cfg +++ b/infra/config/branch/cq.cfg
@@ -79,7 +79,7 @@ # TODO(crbug.com/646404): Scale this up to 100% mandatory. builders { name: "linux-libfuzzer-asan-rel" - experiment_percentage: 50 + experiment_percentage: 100 } builders { name: "linux-ozone-rel" } builders { name: "linux_chromium_compile_dbg_ng" }
diff --git a/media/capture/video/linux/fake_v4l2_impl.cc b/media/capture/video/linux/fake_v4l2_impl.cc index 5221c49..ef2c38c6 100644 --- a/media/capture/video/linux/fake_v4l2_impl.cc +++ b/media/capture/video/linux/fake_v4l2_impl.cc
@@ -234,12 +234,17 @@ return EINVAL; if (buf->memory != V4L2_MEMORY_MMAP) return EINVAL; - base::AutoLock lock(outgoing_queue_lock_); - if (outgoing_queue_.empty()) { + bool outgoing_queue_is_empty = true; + { + base::AutoLock lock(outgoing_queue_lock_); + outgoing_queue_is_empty = outgoing_queue_.empty(); + } + if (outgoing_queue_is_empty) { if (open_flags_ & O_NONBLOCK) return EAGAIN; wait_for_outgoing_queue_event_.Wait(); } + base::AutoLock lock(outgoing_queue_lock_); auto* buffer = outgoing_queue_.front(); outgoing_queue_.pop(); buffer->flags = V4L2_BUF_FLAG_MAPPED & V4L2_BUF_FLAG_DONE;
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index 13c701a..656217612 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -564,7 +564,7 @@ "//media/test/data/peach_pi-41x23.jpg", ] if (use_vaapi) { - sources += [ "vaapi/vaapi_jpeg_decode_accelerator_unittest.cc" ] + deps += [ "//media/gpu/vaapi:jpeg_decode_accelerator_unit_test" ] data += [ "//media/test/data/pixel-1280x720.jpg" ] } if (use_x11) {
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn index 5f6bc1a..df1051eb 100644 --- a/media/gpu/vaapi/BUILD.gn +++ b/media/gpu/vaapi/BUILD.gn
@@ -73,6 +73,8 @@ "vaapi_picture.h", "vaapi_picture_factory.cc", "vaapi_picture_factory.h", + "vaapi_utils.cc", + "vaapi_utils.h", "vaapi_video_decode_accelerator.cc", "vaapi_video_decode_accelerator.h", "vaapi_video_encode_accelerator.cc", @@ -145,3 +147,20 @@ "//ui/gfx/geometry", ] } + +source_set("jpeg_decode_accelerator_unit_test") { + testonly = true + sources = [ + "vaapi_jpeg_decode_accelerator_unittest.cc", + ] + deps = [ + ":vaapi", + "//base/test:test_support", + "//gpu:test_support", + "//media:test_support", + "//media/gpu:common", + "//testing/gmock", + "//testing/gtest", + "//ui/gfx:test_support", + ] +}
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc index e6685f8..068ba1f 100644 --- a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc
@@ -22,6 +22,7 @@ #include "media/base/video_frame.h" #include "media/filters/jpeg_parser.h" #include "media/gpu/vaapi/vaapi_picture.h" +#include "media/gpu/vaapi/vaapi_utils.h" #include "media/gpu/vaapi/vaapi_wrapper.h" #include "third_party/libyuv/include/libyuv.h" @@ -336,28 +337,28 @@ << " into video_frame associated with input buffer id " << input_buffer_id; - VAImage image = {}; - uint8_t* mem = nullptr; - gfx::Size coded_size = video_frame->coded_size(); + const gfx::Size coded_size = video_frame->coded_size(); DCHECK(va_image_format_); - if (!vaapi_wrapper_->GetVaImage(va_surface_id, va_image_format_.get(), - coded_size, &image, - reinterpret_cast<void**>(&mem))) { + auto scoped_image = vaapi_wrapper_->CreateVaImage( + va_surface_id, va_image_format_.get(), coded_size); + if (!scoped_image) { VLOGF(1) << "Cannot get VAImage"; return false; } + const VAImage* image = scoped_image->image(); + auto* mem = static_cast<uint8_t*>(scoped_image->va_buffer()->data()); // Copy image content from VAImage to VideoFrame. // The component order of VAImage I420 are Y, U, and V. - DCHECK_EQ(image.num_planes, 3u); - DCHECK_GE(image.width, coded_size.width()); - DCHECK_GE(image.height, coded_size.height()); - const uint8_t* src_y = mem + image.offsets[0]; - const uint8_t* src_u = mem + image.offsets[1]; - const uint8_t* src_v = mem + image.offsets[2]; - size_t src_y_stride = image.pitches[0]; - size_t src_u_stride = image.pitches[1]; - size_t src_v_stride = image.pitches[2]; + DCHECK_EQ(image->num_planes, 3u); + DCHECK_GE(image->width, coded_size.width()); + DCHECK_GE(image->height, coded_size.height()); + const uint8_t* src_y = mem + image->offsets[0]; + const uint8_t* src_u = mem + image->offsets[1]; + const uint8_t* src_v = mem + image->offsets[2]; + size_t src_y_stride = image->pitches[0]; + size_t src_u_stride = image->pitches[1]; + size_t src_v_stride = image->pitches[2]; uint8_t* dst_y = video_frame->data(VideoFrame::kYPlane); uint8_t* dst_u = video_frame->data(VideoFrame::kUPlane); uint8_t* dst_v = video_frame->data(VideoFrame::kVPlane); @@ -376,8 +377,6 @@ return false; } - vaapi_wrapper_->ReturnVaImage(&image); - task_runner_->PostTask( FROM_HERE, base::BindOnce(&VaapiJpegDecodeAccelerator::VideoFrameReady,
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_unittest.cc index 0dc4ffb..999b3dc 100644 --- a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator_unittest.cc
@@ -18,12 +18,13 @@ #include "base/md5.h" #include "base/path_service.h" #include "base/strings/string_piece.h" +#include "base/test/gtest_util.h" #include "media/base/test_data_util.h" #include "media/base/video_frame.h" #include "media/filters/jpeg_parser.h" #include "media/gpu/vaapi/vaapi_jpeg_decode_accelerator.h" +#include "media/gpu/vaapi/vaapi_utils.h" #include "media/gpu/vaapi/vaapi_wrapper.h" -#include "mojo/core/embedder/embedder.h" namespace media { namespace { @@ -69,6 +70,9 @@ const JpegParseResult& parse_result, VASurfaceID va_surface); + base::Lock* GetVaapiWrapperLock() const { return wrapper_->va_lock_; } + VADisplay GetVaapiWrapperVaDisplay() const { return wrapper_->va_display_; } + protected: scoped_refptr<VaapiWrapper> wrapper_; std::string jpeg_data_; @@ -89,28 +93,24 @@ return false; } - VAImage image; - VAImageFormat format; - const uint32_t kI420Fourcc = VA_FOURCC('I', '4', '2', '0'); - memset(&image, 0, sizeof(image)); - memset(&format, 0, sizeof(format)); - format.fourcc = kI420Fourcc; + VAImageFormat format{}; + format.fourcc = VA_FOURCC_I420; format.byte_order = VA_LSB_FIRST; format.bits_per_pixel = 12; // 12 for I420 - void* mem; - if (!wrapper_->GetVaImage(va_surfaces[0], &format, size, &image, &mem)) { + auto scoped_image = wrapper_->CreateVaImage(va_surfaces[0], &format, size); + if (!scoped_image) { LOG(ERROR) << "Cannot get VAImage"; return false; } - EXPECT_EQ(kI420Fourcc, image.format.fourcc); - base::StringPiece result(reinterpret_cast<const char*>(mem), + EXPECT_TRUE(VA_FOURCC_I420 == scoped_image->image()->format.fourcc); + const auto* mem = static_cast<char*>(scoped_image->va_buffer()->data()); + + base::StringPiece result(mem, VideoFrame::AllocationSize(PIXEL_FORMAT_I420, size)); EXPECT_EQ(expected_md5sum, base::MD5String(result)); - wrapper_->ReturnVaImage(&image); - return true; } @@ -150,4 +150,73 @@ EXPECT_FALSE(Decode(wrapper_.get(), parse_result, va_surfaces[0])); } +// This test exercises the usual ScopedVAImage lifetime. +TEST_F(VaapiJpegDecodeAcceleratorTest, ScopedVAImage) { + std::vector<VASurfaceID> va_surfaces; + const gfx::Size coded_size(64, 64); + ASSERT_TRUE(wrapper_->CreateSurfaces(VA_RT_FORMAT_YUV420, coded_size, 1, + &va_surfaces)); + ASSERT_EQ(va_surfaces.size(), 1u); + + VAImageFormat va_image_format{.fourcc = VA_FOURCC_I420, + .byte_order = VA_LSB_FIRST, + .bits_per_pixel = 12}; + ASSERT_TRUE(VaapiWrapper::IsImageFormatSupported(va_image_format)); + + std::unique_ptr<ScopedVAImage> scoped_image; + { + base::AutoLock auto_lock(*GetVaapiWrapperLock()); + scoped_image = std::make_unique<ScopedVAImage>( + GetVaapiWrapperLock(), GetVaapiWrapperVaDisplay(), va_surfaces[0], + &va_image_format, coded_size); + + EXPECT_TRUE(scoped_image->image()); + ASSERT_TRUE(scoped_image->IsValid()); + EXPECT_TRUE(scoped_image->va_buffer()->IsValid()); + EXPECT_TRUE(scoped_image->va_buffer()->data()); + } +} + +// This test exercises creation of a ScopedVAImage with a bad VASurfaceID. +TEST_F(VaapiJpegDecodeAcceleratorTest, BadScopedVAImage) { + const std::vector<VASurfaceID> va_surfaces = {VA_INVALID_ID}; + const gfx::Size coded_size(64, 64); + + VAImageFormat va_image_format{.fourcc = VA_FOURCC_I420, + .byte_order = VA_LSB_FIRST, + .bits_per_pixel = 12}; + ASSERT_TRUE(VaapiWrapper::IsImageFormatSupported(va_image_format)); + + std::unique_ptr<ScopedVAImage> scoped_image; + { + base::AutoLock auto_lock(*GetVaapiWrapperLock()); + scoped_image = std::make_unique<ScopedVAImage>( + GetVaapiWrapperLock(), GetVaapiWrapperVaDisplay(), va_surfaces[0], + &va_image_format, coded_size); + + EXPECT_TRUE(scoped_image->image()); + EXPECT_FALSE(scoped_image->IsValid()); +#if DCHECK_IS_ON() + EXPECT_DCHECK_DEATH(scoped_image->va_buffer()); +#else + EXPECT_FALSE(scoped_image->va_buffer()); +#endif + } +} + +// This test exercises creation of a ScopedVABufferMapping with bad VABufferIDs. +TEST_F(VaapiJpegDecodeAcceleratorTest, BadScopedVABufferMapping) { + base::AutoLock auto_lock(*GetVaapiWrapperLock()); + + // A ScopedVABufferMapping with a VA_INVALID_ID VABufferID is DCHECK()ed. + EXPECT_DCHECK_DEATH(std::make_unique<ScopedVABufferMapping>( + GetVaapiWrapperLock(), GetVaapiWrapperVaDisplay(), VA_INVALID_ID)); + + // This should not hit any DCHECK() but will create an invalid + // ScopedVABufferMapping. + auto scoped_buffer = std::make_unique<ScopedVABufferMapping>( + GetVaapiWrapperLock(), GetVaapiWrapperVaDisplay(), VA_INVALID_ID - 1); + EXPECT_FALSE(scoped_buffer->IsValid()); +} + } // namespace media
diff --git a/media/gpu/vaapi/vaapi_utils.cc b/media/gpu/vaapi/vaapi_utils.cc new file mode 100644 index 0000000..f48b81fa --- /dev/null +++ b/media/gpu/vaapi/vaapi_utils.cc
@@ -0,0 +1,86 @@ +// 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. + +#include "media/gpu/vaapi/vaapi_utils.h" + +#include <va/va.h> + +#include "base/logging.h" +#include "ui/gfx/geometry/size.h" + +namespace media { + +ScopedVABufferMapping::ScopedVABufferMapping( + const base::Lock* lock, + VADisplay va_display, + VABufferID buffer_id, + base::OnceCallback<void(VABufferID)> release_callback) + : lock_(lock), va_display_(va_display), buffer_id_(buffer_id) { + DCHECK(lock_); + lock_->AssertAcquired(); + DCHECK_NE(buffer_id, VA_INVALID_ID); + + const VAStatus result = + vaMapBuffer(va_display_, buffer_id_, &va_buffer_data_); + const bool success = result == VA_STATUS_SUCCESS; + LOG_IF(ERROR, !success) << "vaMapBuffer failed: " << vaErrorStr(result); + DCHECK(success == (va_buffer_data_ != nullptr)) + << "|va_buffer_data| should be null if vaMapBuffer() fails"; + + if (!success && release_callback) + std::move(release_callback).Run(buffer_id_); +} + +ScopedVABufferMapping::~ScopedVABufferMapping() { + lock_->AssertAcquired(); + if (va_buffer_data_) + Unmap(); +} + +VAStatus ScopedVABufferMapping::Unmap() { + lock_->AssertAcquired(); + const VAStatus result = vaUnmapBuffer(va_display_, buffer_id_); + if (result == VA_STATUS_SUCCESS) + va_buffer_data_ = nullptr; + else + LOG(ERROR) << "vaUnmapBuffer failed: " << vaErrorStr(result); + return result; +} + +ScopedVAImage::ScopedVAImage(base::Lock* lock, + VADisplay va_display, + VASurfaceID va_surface_id, + VAImageFormat* format, + const gfx::Size& size) + : lock_(lock), va_display_(va_display), image_(new VAImage{}) { + DCHECK(lock_); + lock_->AssertAcquired(); + VAStatus result = vaCreateImage(va_display_, format, size.width(), + size.height(), image_.get()); + if (result != VA_STATUS_SUCCESS) { + DCHECK_EQ(image_->image_id, VA_INVALID_ID); + LOG(ERROR) << "vaCreateImage failed: " << vaErrorStr(result); + return; + } + + result = vaGetImage(va_display_, va_surface_id, 0, 0, size.width(), + size.height(), image_->image_id); + if (result != VA_STATUS_SUCCESS) { + LOG(ERROR) << "vaGetImage failed: " << vaErrorStr(result); + return; + } + + va_buffer_ = + std::make_unique<ScopedVABufferMapping>(lock_, va_display, image_->buf); +} + +ScopedVAImage::~ScopedVAImage() { + base::AutoLock auto_lock(*lock_); + + // |va_buffer_| has to be deleted before vaDestroyImage(). + va_buffer_.release(); + vaDestroyImage(va_display_, image_->image_id); +} + +} // namespace media
diff --git a/media/gpu/vaapi/vaapi_utils.h b/media/gpu/vaapi/vaapi_utils.h new file mode 100644 index 0000000..db13c76 --- /dev/null +++ b/media/gpu/vaapi/vaapi_utils.h
@@ -0,0 +1,93 @@ +// 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 MEDIA_GPU_VAAPI_VAAPI_UTILS_H_ +#define MEDIA_GPU_VAAPI_VAAPI_UTILS_H_ + +#include "base/bind_helpers.h" +#include "base/callback_forward.h" +#include "base/macros.h" + +// Forward declarations taken verbatim from <va/va.h> +typedef unsigned int VABufferID; +typedef void* VADisplay; +typedef struct _VAImage VAImage; +typedef struct _VAImageFormat VAImageFormat; +typedef int VAStatus; +typedef unsigned int VASurfaceID; + +namespace base { +class Lock; +} + +namespace gfx { +class Size; +} + +namespace media { + +// Class to map a given VABuffer, identified by |buffer_id|, for its lifetime. +// This class must operate under |lock_| acquired. +class ScopedVABufferMapping { + public: + // |release_callback| will be called if the mapping of the buffer failed. + ScopedVABufferMapping(const base::Lock* lock, + VADisplay va_display, + VABufferID buffer_id, + base::OnceCallback<void(VABufferID)> release_callback = + base::NullCallback()); + ~ScopedVABufferMapping(); + bool IsValid() const { return !!va_buffer_data_; } + void* data() const { + DCHECK(IsValid()); + return va_buffer_data_; + } + // Explicit destruction method, to retrieve the success/error result. It is + // safe to call this method several times. + VAStatus Unmap(); + + private: + const base::Lock* lock_; // Only for AssertAcquired() calls. + const VADisplay va_display_; + const VABufferID buffer_id_; + + void* va_buffer_data_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(ScopedVABufferMapping); +}; + +// This class tracks the VAImage life cycle from vaCreateImage() - vaGetImage() +// to vaDestroyImage(). In between creation and destruction, image()->buf will +// try to be be mapped on user space using a ScopedVABufferMapping. All +// resources will be cleaned up appropriately. |lock| is acquired for +// destruction purposes. +class ScopedVAImage { + public: + ScopedVAImage(base::Lock* lock, + VADisplay va_display, + VASurfaceID va_surface_id, + VAImageFormat* format /* Needs to be a pointer for libva */, + const gfx::Size& size); + ~ScopedVAImage(); + + bool IsValid() const { return va_buffer_ && va_buffer_->IsValid(); } + + const VAImage* image() const { return image_.get(); } + const ScopedVABufferMapping* va_buffer() const { + DCHECK(IsValid()); + return va_buffer_.get(); + } + + private: + base::Lock* lock_; + const VADisplay va_display_; + std::unique_ptr<VAImage> image_; + std::unique_ptr<ScopedVABufferMapping> va_buffer_; + + DISALLOW_COPY_AND_ASSIGN(ScopedVAImage); +}; + +} // namespace media + +#endif // MEDIA_GPU_VAAPI_VAAPI_UTILS_H_
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index 9aab6d0d..34a733c4 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -32,6 +32,7 @@ #include "media/gpu/vaapi/va_stubs.h" #include "media/gpu/vaapi/vaapi_picture.h" +#include "media/gpu/vaapi/vaapi_utils.h" #include "third_party/libyuv/include/libyuv.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/native_pixmap.h" @@ -1026,21 +1027,15 @@ size, 1, nullptr, &buffer_id); VA_SUCCESS_OR_RETURN(va_res, "Failed to create a VA buffer", false); - void* va_buffer_data = nullptr; - va_res = vaMapBuffer(va_display_, buffer_id, &va_buffer_data); - VA_LOG_ON_ERROR(va_res, "vaMapBuffer failed"); - if (va_res != VA_STATUS_SUCCESS) { - vaDestroyBuffer(va_display_, buffer_id); + ScopedVABufferMapping mapping( + va_lock_, va_display_, buffer_id, + base::BindOnce(base::IgnoreResult(&vaDestroyBuffer), va_display_)); + if (!mapping.IsValid()) return false; - } - DCHECK(va_buffer_data); // TODO(selcott): Investigate potentially faster alternatives to memcpy here // such as libyuv::CopyX and family. - memcpy(va_buffer_data, buffer, size); - - va_res = vaUnmapBuffer(va_display_, buffer_id); - VA_LOG_ON_ERROR(va_res, "vaUnmapBuffer failed"); + memcpy(mapping.data(), buffer, size); switch (va_buffer_type) { case VASliceParameterBufferType: @@ -1069,22 +1064,15 @@ sizeof(VAEncMiscParameterBuffer) + size, 1, NULL, &buffer_id); VA_SUCCESS_OR_RETURN(va_res, "Failed to create a VA buffer", false); - void* data_ptr = NULL; - va_res = vaMapBuffer(va_display_, buffer_id, &data_ptr); - VA_LOG_ON_ERROR(va_res, "vaMapBuffer failed"); - if (va_res != VA_STATUS_SUCCESS) { - vaDestroyBuffer(va_display_, buffer_id); + ScopedVABufferMapping mapping( + va_lock_, va_display_, buffer_id, + base::BindOnce(base::IgnoreResult(&vaDestroyBuffer), va_display_)); + if (!mapping.IsValid()) return false; - } - DCHECK(data_ptr); - - VAEncMiscParameterBuffer* misc_param = - reinterpret_cast<VAEncMiscParameterBuffer*>(data_ptr); - misc_param->type = misc_param_type; - memcpy(misc_param->data, buffer, size); - va_res = vaUnmapBuffer(va_display_, buffer_id); - VA_LOG_ON_ERROR(va_res, "vaUnmapBuffer failed"); + auto* params = reinterpret_cast<VAEncMiscParameterBuffer*>(mapping.data()); + params->type = misc_param_type; + memcpy(params->data, buffer, size); pending_va_bufs_.push_back(buffer_id); return true; @@ -1134,48 +1122,18 @@ } #endif // USE_X11 -bool VaapiWrapper::GetVaImage(VASurfaceID va_surface_id, - VAImageFormat* format, - const gfx::Size& size, - VAImage* image, - void** mem) { - TRACE_EVENT0("media,gpu", "VaapiWrapper::GetVaImage"); +std::unique_ptr<ScopedVAImage> VaapiWrapper::CreateVaImage( + VASurfaceID va_surface_id, + VAImageFormat* format, + const gfx::Size& size) { base::AutoLock auto_lock(*va_lock_); VAStatus va_res = vaSyncSurface(va_display_, va_surface_id); - VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", false); + VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", nullptr); - va_res = - vaCreateImage(va_display_, format, size.width(), size.height(), image); - VA_SUCCESS_OR_RETURN(va_res, "vaCreateImage failed", false); - - va_res = vaGetImage(va_display_, va_surface_id, 0, 0, size.width(), - size.height(), image->image_id); - VA_LOG_ON_ERROR(va_res, "vaGetImage failed"); - - if (va_res == VA_STATUS_SUCCESS) { - // Map the VAImage into memory - va_res = vaMapBuffer(va_display_, image->buf, mem); - VA_LOG_ON_ERROR(va_res, "vaMapBuffer failed"); - } - - if (va_res != VA_STATUS_SUCCESS) { - va_res = vaDestroyImage(va_display_, image->image_id); - VA_LOG_ON_ERROR(va_res, "vaDestroyImage failed"); - return false; - } - - return true; -} - -void VaapiWrapper::ReturnVaImage(VAImage* image) { - base::AutoLock auto_lock(*va_lock_); - - VAStatus va_res = vaUnmapBuffer(va_display_, image->buf); - VA_LOG_ON_ERROR(va_res, "vaUnmapBuffer failed"); - - va_res = vaDestroyImage(va_display_, image->image_id); - VA_LOG_ON_ERROR(va_res, "vaDestroyImage failed"); + auto scoped_image = std::make_unique<ScopedVAImage>( + va_lock_, va_display_, va_surface_id, format, size); + return scoped_image->IsValid() ? std::move(scoped_image) : nullptr; } bool VaapiWrapper::UploadVideoFrameToSurface( @@ -1199,10 +1157,10 @@ return false; } - void* image_ptr = NULL; - va_res = vaMapBuffer(va_display_, image.buf, &image_ptr); - VA_SUCCESS_OR_RETURN(va_res, "vaMapBuffer failed", false); - DCHECK(image_ptr); + ScopedVABufferMapping mapping(va_lock_, va_display_, image.buf); + if (!mapping.IsValid()) + return false; + uint8_t* image_ptr = static_cast<uint8_t*>(mapping.data()); int ret = 0; { @@ -1211,14 +1169,10 @@ frame->data(VideoFrame::kYPlane), frame->stride(VideoFrame::kYPlane), frame->data(VideoFrame::kUPlane), frame->stride(VideoFrame::kUPlane), frame->data(VideoFrame::kVPlane), frame->stride(VideoFrame::kVPlane), - static_cast<uint8_t*>(image_ptr) + image.offsets[0], image.pitches[0], - static_cast<uint8_t*>(image_ptr) + image.offsets[1], image.pitches[1], - image.width, image.height); + image_ptr + image.offsets[0], image.pitches[0], + image_ptr + image.offsets[1], image.pitches[1], image.width, + image.height); } - - va_res = vaUnmapBuffer(va_display_, image.buf); - VA_LOG_ON_ERROR(va_res, "vaUnmapBuffer failed"); - return ret == 0; } @@ -1239,16 +1193,17 @@ uint8_t* target_ptr, size_t target_size, size_t* coded_data_size) { + DCHECK(target_ptr); base::AutoLock auto_lock(*va_lock_); VAStatus va_res = vaSyncSurface(va_display_, sync_surface_id); VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", false); - VACodedBufferSegment* buffer_segment = NULL; - va_res = vaMapBuffer(va_display_, buffer_id, - reinterpret_cast<void**>(&buffer_segment)); - VA_SUCCESS_OR_RETURN(va_res, "vaMapBuffer failed", false); - DCHECK(target_ptr); + ScopedVABufferMapping mapping(va_lock_, va_display_, buffer_id); + if (!mapping.IsValid()) + return false; + auto* buffer_segment = + reinterpret_cast<VACodedBufferSegment*>(mapping.data()); { base::AutoUnlock auto_unlock(*va_lock_); @@ -1274,9 +1229,7 @@ } } - va_res = vaUnmapBuffer(va_display_, buffer_id); - VA_LOG_ON_ERROR(va_res, "vaUnmapBuffer failed"); - return buffer_segment == NULL; + return buffer_segment == nullptr; } bool VaapiWrapper::DownloadAndDestroyCodedBuffer(VABufferID buffer_id, @@ -1318,34 +1271,36 @@ return false; } - VAProcPipelineParameterBuffer* pipeline_param; - VA_SUCCESS_OR_RETURN(vaMapBuffer(va_display_, va_vpp_buffer_id_, - reinterpret_cast<void**>(&pipeline_param)), - "Couldn't map vpp buffer", false); + { + ScopedVABufferMapping mapping(va_lock_, va_display_, va_vpp_buffer_id_); + if (!mapping.IsValid()) + return false; + auto* pipeline_param = + reinterpret_cast<VAProcPipelineParameterBuffer*>(mapping.data()); - memset(pipeline_param, 0, sizeof *pipeline_param); - const gfx::Size src_size = va_surface_src->size(); - const gfx::Size dest_size = va_surface_dest->size(); + memset(pipeline_param, 0, sizeof *pipeline_param); + const gfx::Size& src_size = va_surface_src->size(); + const gfx::Size& dest_size = va_surface_dest->size(); - VARectangle input_region; - input_region.x = input_region.y = 0; - input_region.width = src_size.width(); - input_region.height = src_size.height(); - pipeline_param->surface_region = &input_region; - pipeline_param->surface = va_surface_src->id(); - pipeline_param->surface_color_standard = VAProcColorStandardNone; + VARectangle input_region; + input_region.x = input_region.y = 0; + input_region.width = src_size.width(); + input_region.height = src_size.height(); + pipeline_param->surface_region = &input_region; + pipeline_param->surface = va_surface_src->id(); + pipeline_param->surface_color_standard = VAProcColorStandardNone; - VARectangle output_region; - output_region.x = output_region.y = 0; - output_region.width = dest_size.width(); - output_region.height = dest_size.height(); - pipeline_param->output_region = &output_region; - pipeline_param->output_background_color = 0xff000000; - pipeline_param->output_color_standard = VAProcColorStandardNone; - pipeline_param->filter_flags = VA_FILTER_SCALING_DEFAULT; + VARectangle output_region; + output_region.x = output_region.y = 0; + output_region.width = dest_size.width(); + output_region.height = dest_size.height(); + pipeline_param->output_region = &output_region; + pipeline_param->output_background_color = 0xff000000; + pipeline_param->output_color_standard = VAProcColorStandardNone; + pipeline_param->filter_flags = VA_FILTER_SCALING_DEFAULT; - VA_SUCCESS_OR_RETURN(vaUnmapBuffer(va_display_, va_vpp_buffer_id_), - "Couldn't unmap vpp buffer", false); + VA_SUCCESS_OR_RETURN(mapping.Unmap(), "Couldn't unmap vpp buffer", false); + } VA_SUCCESS_OR_RETURN( vaBeginPicture(va_display_, va_vpp_context_id_, va_surface_dest->id()),
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h index a3c7b19..f7ce487 100644 --- a/media/gpu/vaapi/vaapi_wrapper.h +++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -41,6 +41,8 @@ namespace media { +class ScopedVAImage; + // This class handles VA-API calls and ensures proper locking of VA-API calls // to libva, the userspace shim to the HW codec driver. libva is not // thread-safe, so we have to perform locking ourselves. This class is fully @@ -162,22 +164,14 @@ gfx::Size dest_size); #endif // USE_X11 - // Get a VAImage from a VASurface |va_surface_id| and map it into memory with - // given |format| and |size|. The output is |image| and the mapped memory is - // |mem|. If |format| doesn't equal to the internal format, the underlying - // implementation will do format conversion if supported. |size| should be - // smaller than or equal to the surface. If |size| is smaller, the image will - // be cropped. The VAImage should be released using the ReturnVaImage - // function. Returns true when successful. - bool GetVaImage(VASurfaceID va_surface_id, - VAImageFormat* format, - const gfx::Size& size, - VAImage* image, - void** mem); - - // Release the VAImage (and the associated memory mapping) obtained from - // GetVaImage(). - void ReturnVaImage(VAImage* image); + // Creates a ScopedVAImage from a VASurface |va_surface_id| and map it into + // memory with the given |format| and |size|. If |format| is not equal to the + // internal format, the underlying implementation will do format conversion if + // supported. |size| should be smaller than or equal to the surface. If |size| + // is smaller, the image will be cropped. + std::unique_ptr<ScopedVAImage> CreateVaImage(VASurfaceID va_surface_id, + VAImageFormat* format, + const gfx::Size& size); // Upload contents of |frame| into |va_surface_id| for encode. bool UploadVideoFrameToSurface(const scoped_refptr<VideoFrame>& frame, @@ -227,6 +221,7 @@ private: friend class base::RefCountedThreadSafe<VaapiWrapper>; + friend class VaapiJpegDecodeAcceleratorTest; bool Initialize(CodecMode mode, VAProfile va_profile); void Deinitialize();
diff --git a/media/media_options.gni b/media/media_options.gni index d8e20f6..709fab3b 100644 --- a/media/media_options.gni +++ b/media/media_options.gni
@@ -128,8 +128,8 @@ # |mojo_media_services|). When enabled, selected mojo paths will be enabled in # the media pipeline and corresponding services will hosted in the selected # remote process (e.g. "utility" process, see |mojo_media_host|). - enable_mojo_media = - is_android || is_chromecast || is_mac || enable_library_cdms || is_win + enable_mojo_media = is_android || is_chromecast || is_chromeos || is_mac || + is_win || enable_library_cdms # Enable the TestMojoMediaClient to be used in mojo MediaService. This is for # testing only and will override the default platform MojoMediaClient, if any. @@ -191,7 +191,7 @@ "video_decoder", ] _default_mojo_media_host = "gpu" - } else if (is_mac || is_win) { + } else if (is_chromeos || is_mac || is_win) { _default_mojo_media_services = [ "video_decoder" ] _default_mojo_media_host = "gpu" }
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc index 6b2bcd2..997995d 100644 --- a/media/mojo/services/gpu_mojo_media_client.cc +++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -33,7 +33,6 @@ #include "services/service_manager/public/cpp/connect.h" #endif // defined(OS_ANDROID) -// OS_WIN guards are needed for cross-compiling on linux. #if defined(OS_WIN) #include "media/gpu/windows/d3d11_video_decoder.h" #endif // defined(OS_WIN) @@ -48,7 +47,8 @@ namespace { -#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_MACOSX) || \ + defined(OS_WIN) gpu::CommandBufferStub* GetCommandBufferStub( base::WeakPtr<MediaGpuChannelManager> media_gpu_channel_manager, base::UnguessableToken channel_token, @@ -63,7 +63,7 @@ return channel->LookupCommandBuffer(route_id); } -#endif // OS_ANDROID || OS_WIN +#endif } // namespace @@ -100,7 +100,7 @@ mojom::CommandBufferIdPtr command_buffer_id, RequestOverlayInfoCB request_overlay_info_cb, const gfx::ColorSpace& target_color_space) { - // Both MCVD and D3D11 VideoDecoders need a command buffer. + // All implemetnations require a command buffer. if (!command_buffer_id) return nullptr; @@ -116,7 +116,7 @@ android_overlay_factory_cb_, std::move(request_overlay_info_cb), std::make_unique<VideoFrameFactoryImpl>(gpu_task_runner_, std::move(get_stub_cb))); -#elif defined(OS_MACOSX) || defined(OS_WIN) +#elif defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) #if defined(OS_WIN) if (base::FeatureList::IsEnabled(kD3D11VideoDecoder)) { return D3D11VideoDecoder::Create(
diff --git a/media/mojo/services/mojo_cdm_proxy_unittest.cc b/media/mojo/services/mojo_cdm_proxy_unittest.cc index c621c0d..1c609dc 100644 --- a/media/mojo/services/mojo_cdm_proxy_unittest.cc +++ b/media/mojo/services/mojo_cdm_proxy_unittest.cc
@@ -48,42 +48,23 @@ ~MockCdmProxy() override = default; // media::CdmProxy implementation. - // Note: As move-only parameters (e.g. OnceCallback) aren't supported by mock - // methods, add On... methods to pass a non-const reference to OnceCallback. base::WeakPtr<CdmContext> GetCdmContext() override { return weak_factory_.GetWeakPtr(); } - void Initialize(Client* client, InitializeCB init_cb) override { - OnInitialize(client, init_cb); - } - MOCK_METHOD2(OnInitialize, void(Client* client, InitializeCB& init_cb)); + MOCK_METHOD2(Initialize, void(Client* client, InitializeCB init_cb)); - void Process(Function function, - uint32_t crypto_session_id, - const std::vector<uint8_t>& input_data, - uint32_t expected_output_data_size, - ProcessCB process_cb) override { - OnProcess(function, crypto_session_id, input_data, - expected_output_data_size, process_cb); - } - MOCK_METHOD5(OnProcess, + MOCK_METHOD5(Process, void(Function function, uint32_t crypto_session_id, const std::vector<uint8_t>& input_data, uint32_t expected_output_data_size, - ProcessCB& process_cb)); + ProcessCB process_cb)); - void CreateMediaCryptoSession( - const std::vector<uint8_t>& input_data, - CreateMediaCryptoSessionCB create_media_crypto_session_cb) override { - OnCreateMediaCryptoSession(input_data, create_media_crypto_session_cb); - } - MOCK_METHOD2( - OnCreateMediaCryptoSession, - void(const std::vector<uint8_t>& input_data, - CreateMediaCryptoSessionCB& create_media_crypto_session_cb)); + MOCK_METHOD2(CreateMediaCryptoSession, + void(const std::vector<uint8_t>& input_data, + CreateMediaCryptoSessionCB create_media_crypto_session_cb)); MOCK_METHOD3(SetKey, void(uint32_t crypto_session_id, @@ -154,9 +135,11 @@ void Initialize(Status expected_status = Status::kOk, bool has_connection = true) { if (has_connection) { - EXPECT_CALL(*mock_cdm_proxy_, OnInitialize(NotNull(), _)) - .WillOnce(RunOnceCallback<1>( - expected_status, CdmProxy::Protocol::kNone, kCryptoSessionId)); + EXPECT_CALL(*mock_cdm_proxy_, Initialize(NotNull(), _)) + .WillOnce([&](auto, auto init_cb) { + std::move(init_cb).Run(expected_status, CdmProxy::Protocol::kNone, + kCryptoSessionId); + }); EXPECT_CALL(client_, OnInitialized(StatusEq(expected_status), cdm::CdmProxyClient::kNone, kCryptoSessionId)) @@ -180,9 +163,11 @@ if (has_connection) { EXPECT_CALL( *mock_cdm_proxy_, - OnProcess(CdmProxy::Function::kIntelNegotiateCryptoSessionKeyExchange, - crypto_session_id_, kInputData, kExpectedOutputDataSize, _)) - .WillOnce(RunOnceCallback<4>(expected_status, kOutputData)); + Process(CdmProxy::Function::kIntelNegotiateCryptoSessionKeyExchange, + crypto_session_id_, kInputData, kExpectedOutputDataSize, _)) + .WillOnce([&](auto, auto, auto, auto, auto process_cb) { + std::move(process_cb).Run(expected_status, kOutputData); + }); EXPECT_CALL(client_, OnProcessed(StatusEq(expected_status), NotNull(), kOutputData.size())); } else { @@ -205,9 +190,11 @@ const uint64_t kOutputData = 333; if (has_connection) { - EXPECT_CALL(*mock_cdm_proxy_, OnCreateMediaCryptoSession(kInputData, _)) - .WillOnce(RunOnceCallback<1>(expected_status, kMediaCryptoSessionId, - kOutputData)); + EXPECT_CALL(*mock_cdm_proxy_, CreateMediaCryptoSession(kInputData, _)) + .WillOnce([&](auto, auto create_media_crypto_session_cb) { + std::move(create_media_crypto_session_cb) + .Run(expected_status, kMediaCryptoSessionId, kOutputData); + }); EXPECT_CALL(client_, OnMediaCryptoSessionCreated( StatusEq(expected_status), kMediaCryptoSessionId, kOutputData));
diff --git a/media/test/data/bear-av1-480x360.webm b/media/test/data/bear-av1-480x360.webm new file mode 100644 index 0000000..abb0cf1 --- /dev/null +++ b/media/test/data/bear-av1-480x360.webm Binary files differ
diff --git a/media/test/data/bear-av1-640x480.webm b/media/test/data/bear-av1-640x480.webm new file mode 100644 index 0000000..12dacd3 --- /dev/null +++ b/media/test/data/bear-av1-640x480.webm Binary files differ
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc index 3fe81035..e6222f7c 100644 --- a/media/test/pipeline_integration_test.cc +++ b/media/test/pipeline_integration_test.cc
@@ -116,6 +116,7 @@ #if BUILDFLAG(ENABLE_AV1_DECODER) const char kMP4AV1[] = "video/mp4; codecs=\"av01.0.04M.08\""; const char kWebMAV1[] = "video/webm; codecs=\"av01.0.04M.08\""; +const int kAV1640WebMFileDurationMs = 2736; #endif // BUILDFLAG(ENABLE_AV1_DECODER) #if BUILDFLAG(USE_PROPRIETARY_CODECS) const char kADTS[] = "audio/aac"; @@ -1586,6 +1587,36 @@ Stop(); } +#if BUILDFLAG(ENABLE_AV1_DECODER) +TEST_P(MSEPipelineIntegrationTest, ConfigChange_AV1_WebM) { + MockMediaSource source("bear-av1-480x360.webm", kWebMAV1, + kAppendWholeFile); + EXPECT_EQ(PIPELINE_OK, StartPipelineWithMediaSource(&source)); + + const gfx::Size kNewSize(640, 480); + EXPECT_CALL(*this, OnVideoConfigChange(::testing::Property( + &VideoDecoderConfig::natural_size, kNewSize))) + .Times(1); + EXPECT_CALL(*this, OnVideoNaturalSizeChange(kNewSize)).Times(1); + scoped_refptr<DecoderBuffer> second_file = + ReadTestDataFile("bear-av1-640x480.webm"); + source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), + second_file->data(), second_file->data_size()); + source.EndOfStream(); + + Play(); + EXPECT_TRUE(WaitUntilOnEnded()); + + EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); + EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); + EXPECT_EQ(kAppendTimeMs + kAV1640WebMFileDurationMs, + pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); + + source.Shutdown(); + Stop(); +} +#endif // BUILDFLAG(ENABLE_AV1_DECODER) + TEST_P(MSEPipelineIntegrationTest, ConfigChange_WebM) { MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, kAppendWholeFile);
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc index 4abce4d..0f379b2 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -638,6 +638,17 @@ #endif bool passthrough = false; +#if defined(OS_MACOSX) + // GPU memory buffers do not support full-range YUV video on mac. + // Fortunately, the hardware decoders never produce full-range video. + // https://crbug/882627 + gfx::ColorSpace color_space = video_frame->ColorSpace(); + gfx::ColorSpace as_rgb = color_space.GetAsRGB(); + gfx::ColorSpace as_full_range_rgb = color_space.GetAsFullRangeRGB(); + + if (color_space != as_rgb && as_rgb == as_full_range_rgb) + passthrough = true; +#endif if (output_format_ == GpuVideoAcceleratorFactories::OutputFormat::UNDEFINED) passthrough = true; switch (pixel_format) {
diff --git a/mojo/core/message_unittest.cc b/mojo/core/message_unittest.cc index fe801f65..8f047ac 100644 --- a/mojo/core/message_unittest.cc +++ b/mojo/core/message_unittest.cc
@@ -227,6 +227,7 @@ const char kTestMessageWithContext2[] = "my old friend"; const char kTestMessageWithContext3[] = "something something"; const char kTestMessageWithContext4[] = "do moar ipc"; +const char kTestQuitMessage[] = "quit"; DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveMessageNoHandles, MessageTest, h) { MojoTestBase::WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE); @@ -272,6 +273,7 @@ auto m = MojoTestBase::ReadMessageWithHandles(h, &h1, 1); EXPECT_EQ(kTestMessageWithContext1, m); MojoTestBase::WriteMessage(h1, kTestMessageWithContext2); + EXPECT_EQ(kTestQuitMessage, MojoTestBase::ReadMessage(h)); } TEST_F(MessageTest, SerializeSimpleMessageOneHandleWithContext) { @@ -283,6 +285,7 @@ nullptr); EXPECT_EQ(kTestMessageWithContext2, MojoTestBase::ReadMessage(pipe.handle1.get().value())); + MojoTestBase::WriteMessage(h, kTestQuitMessage); }); } @@ -295,18 +298,11 @@ MojoTestBase::WriteMessage(handles[1], kTestMessageWithContext2); MojoTestBase::WriteMessage(handles[2], kTestMessageWithContext3); MojoTestBase::WriteMessage(handles[3], kTestMessageWithContext4); + + EXPECT_EQ(kTestQuitMessage, MojoTestBase::ReadMessage(h)); } -// Flaky on Fuchsia only. http://crbug.com/883624 -#if defined(OS_FUCHSIA) -#define MAYBE_SerializeSimpleMessageWithHandlesWithContext \ - DISABLED_SerializeSimpleMessageWithHandlesWithContext -#else -#define MAYBE_SerializeSimpleMessageWithHandlesWithContext \ - SerializeSimpleMessageWithHandlesWithContext -#endif - -TEST_F(MessageTest, MAYBE_SerializeSimpleMessageWithHandlesWithContext) { +TEST_F(MessageTest, SerializeSimpleMessageWithHandlesWithContext) { RunTestClient("ReceiveMessageWithHandles", [&](MojoHandle h) { auto message = std::make_unique<SimpleMessage>(kTestMessageWithContext1); mojo::MessagePipe pipes[4]; @@ -324,6 +320,8 @@ MojoTestBase::ReadMessage(pipes[2].handle1.get().value())); EXPECT_EQ(kTestMessageWithContext4, MojoTestBase::ReadMessage(pipes[3].handle1.get().value())); + + MojoTestBase::WriteMessage(h, kTestQuitMessage); }); }
diff --git a/pdf/pdf.cc b/pdf/pdf.cc index bfa6a4b..c45791a 100644 --- a/pdf/pdf.cc +++ b/pdf/pdf.cc
@@ -139,27 +139,29 @@ std::vector<uint8_t> ConvertPdfPagesToNupPdf( std::vector<base::span<const uint8_t>> input_buffers, size_t pages_per_sheet, - const gfx::Size& page_size) { + const gfx::Size& page_size, + const gfx::Rect& printable_area) { ScopedSdkInitializer scoped_sdk_initializer; if (!scoped_sdk_initializer.Init()) return std::vector<uint8_t>(); PDFEngineExports* engine_exports = PDFEngineExports::Get(); - return engine_exports->ConvertPdfPagesToNupPdf(std::move(input_buffers), - pages_per_sheet, page_size); + return engine_exports->ConvertPdfPagesToNupPdf( + std::move(input_buffers), pages_per_sheet, page_size, printable_area); } std::vector<uint8_t> ConvertPdfDocumentToNupPdf( base::span<const uint8_t> input_buffer, size_t pages_per_sheet, - const gfx::Size& page_size) { + const gfx::Size& page_size, + const gfx::Rect& printable_area) { ScopedSdkInitializer scoped_sdk_initializer; if (!scoped_sdk_initializer.Init()) return std::vector<uint8_t>(); PDFEngineExports* engine_exports = PDFEngineExports::Get(); - return engine_exports->ConvertPdfDocumentToNupPdf(input_buffer, - pages_per_sheet, page_size); + return engine_exports->ConvertPdfDocumentToNupPdf( + input_buffer, pages_per_sheet, page_size, printable_area); } } // namespace chrome_pdf
diff --git a/pdf/pdf.h b/pdf/pdf.h index 4617943..f17b7ea 100644 --- a/pdf/pdf.h +++ b/pdf/pdf.h
@@ -21,6 +21,7 @@ #endif namespace gfx { +class Rect; class Size; } @@ -132,6 +133,8 @@ // document is used. // |pages_per_sheet| is the number of pages to put on one sheet. // |page_size| is the output page size, measured in PDF "user space" units. +// |printable_area| is the output page printable area, measured in PDF +// "user space" units. Should be smaller than |page_size|. // // |page_size| is the print media size. The page size of the output N-up PDF is // determined by the |pages_per_sheet|, the orientation of the PDF pages @@ -145,13 +148,16 @@ std::vector<uint8_t> ConvertPdfPagesToNupPdf( std::vector<base::span<const uint8_t>> input_buffers, size_t pages_per_sheet, - const gfx::Size& page_size); + const gfx::Size& page_size, + const gfx::Rect& printable_area); // Convert a PDF document to a N-up PDF document. // |input_buffer| is the buffer that contains the entire PDF document to be // converted to a N-up PDF document. // |pages_per_sheet| is the number of pages to put on one sheet. // |page_size| is the output page size, measured in PDF "user space" units. +// |printable_area| is the output page printable area, measured in PDF +// "user space" units. Should be smaller than |page_size|. // // Refer to the description of ConvertPdfPagesToNupPdf to understand how the // output page size will be calculated. @@ -159,7 +165,8 @@ std::vector<uint8_t> ConvertPdfDocumentToNupPdf( base::span<const uint8_t> input_buffer, size_t pages_per_sheet, - const gfx::Size& page_size); + const gfx::Size& page_size, + const gfx::Rect& printable_area); } // namespace chrome_pdf
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h index 3d179018..511118e 100644 --- a/pdf/pdf_engine.h +++ b/pdf/pdf_engine.h
@@ -42,6 +42,7 @@ struct PP_PdfPrintSettings_Dev; namespace gfx { +class Rect; class Size; } @@ -474,13 +475,15 @@ virtual std::vector<uint8_t> ConvertPdfPagesToNupPdf( std::vector<base::span<const uint8_t>> input_buffers, size_t pages_per_sheet, - const gfx::Size& page_size) = 0; + const gfx::Size& page_size, + const gfx::Rect& printable_area) = 0; // See the definition of ConvertPdfDocumentToNupPdf in pdf.cc for details. virtual std::vector<uint8_t> ConvertPdfDocumentToNupPdf( base::span<const uint8_t> input_buffer, size_t pages_per_sheet, - const gfx::Size& page_size) = 0; + const gfx::Size& page_size, + const gfx::Rect& printable_area) = 0; virtual bool GetPDFDocInfo(base::span<const uint8_t> pdf_buffer, int* page_count,
diff --git a/pdf/pdfium/pdfium_engine_exports.cc b/pdf/pdfium/pdfium_engine_exports.cc index 8b5f69b..f0fdc6d 100644 --- a/pdf/pdfium/pdfium_engine_exports.cc +++ b/pdf/pdfium/pdfium_engine_exports.cc
@@ -16,6 +16,7 @@ #include "third_party/pdfium/public/cpp/fpdf_scopers.h" #include "third_party/pdfium/public/fpdf_ppo.h" #include "third_party/pdfium/public/fpdfview.h" +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" using printing::ConvertUnitDouble; @@ -121,7 +122,8 @@ std::vector<uint8_t> CreateNupPdfDocument(FPDF_DOCUMENT doc, size_t pages_per_sheet, - const gfx::Size& page_size) { + const gfx::Size& page_size, + const gfx::Rect& printable_area) { int page_size_width = page_size.width(); int page_size_height = page_size.height(); @@ -139,6 +141,9 @@ if (!output_doc_nup) return std::vector<uint8_t>(); + PDFiumPrint::FitContentsToPrintableArea(output_doc_nup.get(), page_size, + printable_area); + PDFiumMemBufferFileWrite output_file_write; if (!FPDF_SaveAsCopy(output_doc_nup.get(), &output_file_write, 0)) return std::vector<uint8_t>(); @@ -146,6 +151,14 @@ return output_file_write.TakeBuffer(); } +bool IsValidPrintableArea(const gfx::Size& page_size, + const gfx::Rect& printable_area) { + return !printable_area.IsEmpty() && printable_area.x() >= 0 && + printable_area.y() >= 0 && + printable_area.right() <= page_size.width() && + printable_area.bottom() <= page_size.height(); +} + } // namespace PDFEngineExports::RenderingSettings::RenderingSettings(int dpi_x, @@ -302,23 +315,33 @@ std::vector<uint8_t> PDFiumEngineExports::ConvertPdfPagesToNupPdf( std::vector<base::span<const uint8_t>> input_buffers, size_t pages_per_sheet, - const gfx::Size& page_size) { + const gfx::Size& page_size, + const gfx::Rect& printable_area) { + if (!IsValidPrintableArea(page_size, printable_area)) + return std::vector<uint8_t>(); + ScopedFPDFDocument doc = CreatePdfDoc(std::move(input_buffers)); if (!doc) return std::vector<uint8_t>(); - return CreateNupPdfDocument(doc.get(), pages_per_sheet, page_size); + return CreateNupPdfDocument(doc.get(), pages_per_sheet, page_size, + printable_area); } std::vector<uint8_t> PDFiumEngineExports::ConvertPdfDocumentToNupPdf( base::span<const uint8_t> input_buffer, size_t pages_per_sheet, - const gfx::Size& page_size) { + const gfx::Size& page_size, + const gfx::Rect& printable_area) { + if (!IsValidPrintableArea(page_size, printable_area)) + return std::vector<uint8_t>(); + ScopedFPDFDocument doc = LoadPdfData(input_buffer); if (!doc) return std::vector<uint8_t>(); - return CreateNupPdfDocument(doc.get(), pages_per_sheet, page_size); + return CreateNupPdfDocument(doc.get(), pages_per_sheet, page_size, + printable_area); } bool PDFiumEngineExports::GetPDFDocInfo(base::span<const uint8_t> pdf_buffer,
diff --git a/pdf/pdfium/pdfium_engine_exports.h b/pdf/pdfium/pdfium_engine_exports.h index 04de13d..53af133 100644 --- a/pdf/pdfium/pdfium_engine_exports.h +++ b/pdf/pdfium/pdfium_engine_exports.h
@@ -38,11 +38,13 @@ std::vector<uint8_t> ConvertPdfPagesToNupPdf( std::vector<base::span<const uint8_t>> input_buffers, size_t pages_per_sheet, - const gfx::Size& page_size) override; + const gfx::Size& page_size, + const gfx::Rect& printable_area) override; std::vector<uint8_t> ConvertPdfDocumentToNupPdf( base::span<const uint8_t> input_buffer, size_t pages_per_sheet, - const gfx::Size& page_size) override; + const gfx::Size& page_size, + const gfx::Rect& printable_area) override; bool GetPDFDocInfo(base::span<const uint8_t> pdf_buffer, int* page_count, double* max_page_width) override;
diff --git a/pdf/pdfium/pdfium_engine_exports_unittest.cc b/pdf/pdfium/pdfium_engine_exports_unittest.cc index ab01ba1..ed3e31c3 100644 --- a/pdf/pdfium/pdfium_engine_exports_unittest.cc +++ b/pdf/pdfium/pdfium_engine_exports_unittest.cc
@@ -10,6 +10,7 @@ #include "pdf/pdf.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" namespace chrome_pdf { @@ -102,14 +103,26 @@ ASSERT_TRUE(base::ReadFileToString(pdf_path, &pdf_data)); std::vector<base::span<const uint8_t>> pdf_buffers; - std::vector<uint8_t> output_pdf_buffer = - ConvertPdfPagesToNupPdf(pdf_buffers, 1, gfx::Size(512, 792)); + std::vector<uint8_t> output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 1, gfx::Size(612, 792), gfx::Rect(22, 20, 570, 750)); EXPECT_TRUE(output_pdf_buffer.empty()); pdf_buffers.push_back(base::as_bytes(base::make_span(pdf_data))); pdf_buffers.push_back(base::as_bytes(base::make_span(pdf_data))); - output_pdf_buffer = - ConvertPdfPagesToNupPdf(pdf_buffers, 2, gfx::Size(512, 792)); + output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 2, gfx::Size(612, 792), gfx::Rect(22, 20, 0, 750)); + EXPECT_TRUE(output_pdf_buffer.empty()); + output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 2, gfx::Size(612, 792), gfx::Rect(22, 20, 570, 0)); + EXPECT_TRUE(output_pdf_buffer.empty()); + output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 2, gfx::Size(612, 792), gfx::Rect(300, 20, 570, 750)); + EXPECT_TRUE(output_pdf_buffer.empty()); + output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 2, gfx::Size(612, 792), gfx::Rect(22, 400, 570, 750)); + EXPECT_TRUE(output_pdf_buffer.empty()); + output_pdf_buffer = ConvertPdfPagesToNupPdf( + pdf_buffers, 2, gfx::Size(612, 792), gfx::Rect(22, 20, 570, 750)); ASSERT_GT(output_pdf_buffer.size(), 0U); base::span<const uint8_t> output_pdf_span = @@ -122,7 +135,7 @@ double height; ASSERT_TRUE(GetPDFPageSizeByIndex(output_pdf_span, 0, &width, &height)); EXPECT_DOUBLE_EQ(792.0, width); - EXPECT_DOUBLE_EQ(512.0, height); + EXPECT_DOUBLE_EQ(612.0, height); } TEST_F(PDFiumEngineExportsTest, ConvertPdfDocumentToNupPdf) { @@ -132,13 +145,13 @@ ASSERT_TRUE(base::ReadFileToString(pdf_path, &pdf_data)); base::span<const uint8_t> pdf_buffer; - std::vector<uint8_t> output_pdf_buffer = - ConvertPdfDocumentToNupPdf(pdf_buffer, 1, gfx::Size(512, 792)); + std::vector<uint8_t> output_pdf_buffer = ConvertPdfDocumentToNupPdf( + pdf_buffer, 1, gfx::Size(612, 792), gfx::Rect(32, 20, 570, 750)); EXPECT_TRUE(output_pdf_buffer.empty()); pdf_buffer = base::as_bytes(base::make_span(pdf_data)); - output_pdf_buffer = - ConvertPdfDocumentToNupPdf(pdf_buffer, 4, gfx::Size(512, 792)); + output_pdf_buffer = ConvertPdfDocumentToNupPdf( + pdf_buffer, 4, gfx::Size(612, 792), gfx::Rect(22, 20, 570, 750)); ASSERT_GT(output_pdf_buffer.size(), 0U); base::span<const uint8_t> output_pdf_span = @@ -151,7 +164,7 @@ double height; ASSERT_TRUE( GetPDFPageSizeByIndex(output_pdf_span, page_number, &width, &height)); - EXPECT_DOUBLE_EQ(512.0, width); + EXPECT_DOUBLE_EQ(612.0, width); EXPECT_DOUBLE_EQ(792.0, height); } }
diff --git a/pdf/pdfium/pdfium_print.cc b/pdf/pdfium/pdfium_print.cc index 1437a43..a12d5ef1 100644 --- a/pdf/pdfium/pdfium_print.cc +++ b/pdf/pdfium/pdfium_print.cc
@@ -22,6 +22,7 @@ #include "third_party/pdfium/public/fpdf_transformpage.h" #include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" using printing::ConvertUnit; using printing::ConvertUnitDouble; @@ -228,6 +229,19 @@ return is_source_landscape; } +void PDFiumPrint::FitContentsToPrintableArea(FPDF_DOCUMENT doc, + const gfx::Size& page_size, + const gfx::Rect& printable_area) { + PP_PrintSettings_Dev print_settings; + print_settings.paper_size = pp::Size(page_size.width(), page_size.height()); + print_settings.printable_area = + pp::Rect(printable_area.x(), printable_area.y(), printable_area.width(), + printable_area.height()); + print_settings.print_scaling_option = + PP_PRINTSCALINGOPTION_FIT_TO_PRINTABLE_AREA; + FitContentsToPrintableAreaIfRequired(doc, 1.0, print_settings); +} + pp::Buffer_Dev PDFiumPrint::PrintPagesAsRasterPDF( const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count,
diff --git a/pdf/pdfium/pdfium_print.h b/pdf/pdfium/pdfium_print.h index 5405a1f..a899e6e 100644 --- a/pdf/pdfium/pdfium_print.h +++ b/pdf/pdfium/pdfium_print.h
@@ -15,6 +15,11 @@ struct PP_PrintSettings_Dev; struct PP_PrintPageNumberRange_Dev; +namespace gfx { +class Rect; +class Size; +} // namespace gfx + namespace chrome_pdf { class PDFiumEngine; @@ -49,6 +54,10 @@ // will not be rotated. static bool IsSourcePdfLandscape(FPDF_DOCUMENT doc); + static void FitContentsToPrintableArea(FPDF_DOCUMENT doc, + const gfx::Size& page_size, + const gfx::Rect& printable_area); + private: FPDF_DOCUMENT CreateSinglePageRasterPdf( double source_page_width,
diff --git a/services/network/public/mojom/tcp_socket.mojom b/services/network/public/mojom/tcp_socket.mojom index 8128bc2..1aaa798 100644 --- a/services/network/public/mojom/tcp_socket.mojom +++ b/services/network/public/mojom/tcp_socket.mojom
@@ -51,7 +51,8 @@ // On success, |net_error| is net::OK. Caller is to use |send_stream| to send // data and |receive_stream| to receive data over the connection. On failure, // |result| is a network error code. - // |ssl_info| is only returned if |options::skip_cert_verification| is true. + // |ssl_info| is only returned if |options::unsafely_skip_cert_verification| + // is true. UpgradeToTLS(HostPortPair host_port_pair, TLSClientSocketOptions? options, MutableNetworkTrafficAnnotationTag traffic_annotation,
diff --git a/services/network/public/mojom/tls_socket.mojom b/services/network/public/mojom/tls_socket.mojom index 92d3019..a885dc7 100644 --- a/services/network/public/mojom/tls_socket.mojom +++ b/services/network/public/mojom/tls_socket.mojom
@@ -21,5 +21,5 @@ SSLVersion version_min = kTLS1; SSLVersion version_max = kTLS12; // If |true|, the SSLInfo will be returned in the UpgradeToTLS callback. - bool skip_cert_verification = false; + bool unsafely_skip_cert_verification = false; };
diff --git a/services/network/tls_socket_factory.cc b/services/network/tls_socket_factory.cc index a5010ad..040b65b 100644 --- a/services/network/tls_socket_factory.cc +++ b/services/network/tls_socket_factory.cc
@@ -121,7 +121,7 @@ ssl_config.version_max = mojo::MojoSSLVersionToNetSSLVersion(socket_options->version_max); - if (socket_options->skip_cert_verification) { + if (socket_options->unsafely_skip_cert_verification) { if (!no_verification_cert_verifier_) { no_verification_cert_verifier_ = base::WrapUnique(new FakeCertVerifier); no_verification_transport_security_state_.reset(
diff --git a/services/network/tls_socket_factory.h b/services/network/tls_socket_factory.h index 437c8df..76509df 100644 --- a/services/network/tls_socket_factory.h +++ b/services/network/tls_socket_factory.h
@@ -74,8 +74,8 @@ const net::NetworkTrafficAnnotationTag& traffic_annotation, mojom::TCPConnectedSocket::UpgradeToTLSCallback callback); - // The following are used when |skip_cert_verification| is specified in - // upgrade options. + // The following are used when |unsafely_skip_cert_verification| is specified + // in upgrade options. net::SSLClientSocketContext no_verification_ssl_client_socket_context_; std::unique_ptr<net::CertVerifier> no_verification_cert_verifier_; std::unique_ptr<net::TransportSecurityState>
diff --git a/skia/ext/fontmgr_default_fuchsia.cc b/skia/ext/fontmgr_default_fuchsia.cc index fc0f4d8..379a00c 100644 --- a/skia/ext/fontmgr_default_fuchsia.cc +++ b/skia/ext/fontmgr_default_fuchsia.cc
@@ -25,5 +25,5 @@ } return sk_make_sp<skia::FuchsiaFontManager>( base::fuchsia::ComponentContext::GetDefault() - ->ConnectToServiceSync<fuchsia::fonts::FontProvider>()); + ->ConnectToServiceSync<fuchsia::fonts::Provider>()); }
diff --git a/skia/ext/fontmgr_fuchsia.cc b/skia/ext/fontmgr_fuchsia.cc index c1f94600..3469305f 100644 --- a/skia/ext/fontmgr_fuchsia.cc +++ b/skia/ext/fontmgr_fuchsia.cc
@@ -27,9 +27,9 @@ constexpr char kDefaultFont[] = "Roboto"; -// Currently FontProvider doesn't support font aliases. The map below is used to -// map common web fonts to font families that are expected to be present in -// FontProvider. +// Currently fonts::Provider doesn't support font aliases. The map below is +// used to map common web fonts to font families that are expected to be present +// in fonts::Provider. constexpr struct { const char* font_name_in; const char* font_name_out; @@ -50,10 +50,9 @@ {"courier new", "RobotoMono"}, {"monospace", "RobotoMono"}}; -fuchsia::fonts::FontSlant ToFontSlant(SkFontStyle::Slant slant) { - return (slant == SkFontStyle::kItalic_Slant) - ? fuchsia::fonts::FontSlant::ITALIC - : fuchsia::fonts::FontSlant::UPRIGHT; +fuchsia::fonts::Slant ToFontSlant(SkFontStyle::Slant slant) { + return (slant == SkFontStyle::kItalic_Slant) ? fuchsia::fonts::Slant::ITALIC + : fuchsia::fonts::Slant::UPRIGHT; } void UnmapMemory(const void* buffer, void* context) { @@ -127,14 +126,14 @@ name, std::move(on_deleted)); } -sk_sp<SkTypeface> CreateTypefaceFromFontData(fuchsia::fonts::FontData font_data, - base::OnceClosure on_deleted) { - sk_sp<SkData> data = BufferToSkData(std::move(font_data.buffer)); +sk_sp<SkTypeface> CreateTypefaceFromBuffer(fuchsia::mem::Buffer buffer, + base::OnceClosure on_deleted) { + sk_sp<SkData> data = BufferToSkData(std::move(buffer)); if (!data) return nullptr; // TODO(https://crbug.com/800156): Initialize font arguments with font index - // when font collection support is implemented in FontProvider. + // when font collection support is implemented in Provider. SkFontArguments args; return CreateTypefaceFromSkStream( @@ -149,7 +148,7 @@ FontCache(); ~FontCache(); - sk_sp<SkTypeface> GetTypefaceFromFontData(fuchsia::fonts::FontData font_data); + sk_sp<SkTypeface> GetTypefaceFromBuffer(fuchsia::mem::Buffer buffer); private: void OnTypefaceDeleted(zx_koid_t vmo_koid); @@ -157,7 +156,7 @@ THREAD_CHECKER(thread_checker_); // SkTypeface cache. They key is koid of the VMO that contains the typeface. - // This allows to reuse previously-created SkTypeface when FontProvider + // This allows to reuse previously-created SkTypeface when fonts::Provider // returns FontData with the same VMO. base::small_map<std::unordered_map<zx_koid_t, SkTypeface*>> typefaces_; @@ -170,13 +169,13 @@ FuchsiaFontManager::FontCache::~FontCache() = default; -sk_sp<SkTypeface> FuchsiaFontManager::FontCache::GetTypefaceFromFontData( - fuchsia::fonts::FontData font_data) { +sk_sp<SkTypeface> FuchsiaFontManager::FontCache::GetTypefaceFromBuffer( + fuchsia::mem::Buffer buffer) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); zx_info_handle_basic_t vmo_info; - zx_status_t status = font_data.buffer.vmo.get_info( - ZX_INFO_HANDLE_BASIC, &vmo_info, sizeof(vmo_info), nullptr, nullptr); + zx_status_t status = buffer.vmo.get_info(ZX_INFO_HANDLE_BASIC, &vmo_info, + sizeof(vmo_info), nullptr, nullptr); if (status != ZX_OK) { ZX_DLOG(ERROR, status) << "zx_object_get_info"; return nullptr; @@ -187,8 +186,8 @@ if (*cached_typeface) { result = sk_ref_sp(*cached_typeface); } else { - result = CreateTypefaceFromFontData( - std::move(font_data), + result = CreateTypefaceFromBuffer( + std::move(buffer), base::BindOnce(&FontCache::OnTypefaceDeleted, weak_factory_.GetWeakPtr(), vmo_info.koid)); *cached_typeface = result.get(); @@ -204,7 +203,7 @@ } FuchsiaFontManager::FuchsiaFontManager( - fuchsia::fonts::FontProviderSyncPtr font_provider) + fuchsia::fonts::ProviderSyncPtr font_provider) : font_provider_(std::move(font_provider)), font_cache_(new FontCache()) { for (auto& m : kFontMap) { font_map_[m.font_name_in] = m.font_name_out; @@ -214,7 +213,7 @@ default_typeface_.reset(onMatchFamilyStyle(kDefaultFont, SkFontStyle())); if (!default_typeface_) { default_typeface_ = sk_make_sp<SkTypeface_Empty>(); - LOG(ERROR) << "Failed to get default font from the FontProvider."; + LOG(ERROR) << "Failed to get default font from fonts::Provider."; } } @@ -246,30 +245,31 @@ const SkFontStyle& style) const { std::string family_name_lowercase = base::ToLowerASCII(family_name); - fuchsia::fonts::FontRequest request; + fuchsia::fonts::Request request; auto it = font_map_.find(family_name_lowercase); request.family = (it != font_map_.end()) ? it->second.c_str() : family_name; request.weight = style.weight(); request.width = style.width(); request.slant = ToFontSlant(style.slant()); - fuchsia::fonts::FontResponsePtr response; + fuchsia::fonts::ResponsePtr response; zx_status_t status = font_provider_->GetFont(std::move(request), &response); if (status != ZX_OK) { ZX_DLOG(ERROR, status) << "Failed to query font provider."; } else if (response) { sk_sp<SkTypeface> result = - font_cache_->GetTypefaceFromFontData(std::move(response->data)); + font_cache_->GetTypefaceFromBuffer(std::move(response->buffer)); if (result) return result.release(); - LOG(ERROR) << "FontProvider returned invalid FontData for " << family_name; + LOG(ERROR) << "fonts::Provider returned invalid FontData for " + << family_name; } // If Sans was requested and we failed to get a valid response from - // FontProvider then return |default_typeface_|. blink::FontCache queries Sans - // as a last-resort font. Returning |default_typeface_| here ensures that the - // renderer doesn't crash when FontProvider stops working. + // fonts::Provider then return |default_typeface_|. blink::FontCache queries + // Sans as a last-resort font. Returning |default_typeface_| here ensures that + // the renderer doesn't crash when fonts::Provider stops working. if (family_name_lowercase == "sans") { // Copy |default_typeface_| to increment ref-count before returning it. sk_sp<SkTypeface> result = default_typeface_;
diff --git a/skia/ext/fontmgr_fuchsia.h b/skia/ext/fontmgr_fuchsia.h index bd3ab155..cb12997 100644 --- a/skia/ext/fontmgr_fuchsia.h +++ b/skia/ext/fontmgr_fuchsia.h
@@ -19,8 +19,7 @@ class SK_API FuchsiaFontManager : public SkFontMgr { public: - explicit FuchsiaFontManager( - fuchsia::fonts::FontProviderSyncPtr font_provider); + explicit FuchsiaFontManager(fuchsia::fonts::ProviderSyncPtr font_provider); ~FuchsiaFontManager() override; @@ -52,7 +51,7 @@ private: class FontCache; - fuchsia::fonts::FontProviderSyncPtr font_provider_; + fuchsia::fonts::ProviderSyncPtr font_provider_; // Map applied to font family name before sending requests to the FontService. base::flat_map<std::string, std::string> font_map_;
diff --git a/skia/ext/fontmgr_fuchsia_unittest.cc b/skia/ext/fontmgr_fuchsia_unittest.cc index e3d3748b..5a32dc7 100644 --- a/skia/ext/fontmgr_fuchsia_unittest.cc +++ b/skia/ext/fontmgr_fuchsia_unittest.cc
@@ -25,20 +25,19 @@ constexpr zx_rights_t kFontDataRights = ZX_RIGHTS_BASIC | ZX_RIGHT_READ | ZX_RIGHT_MAP; -fuchsia::fonts::FontData LoadFont(const base::FilePath& file_path) { +fuchsia::mem::Buffer LoadFont(const base::FilePath& file_path) { std::string file_content; CHECK(ReadFileToString(file_path, &file_content)); - fuchsia::fonts::FontData data; - zx_status_t status = - zx::vmo::create(file_content.size(), 0, &data.buffer.vmo); + fuchsia::mem::Buffer buffer; + zx_status_t status = zx::vmo::create(file_content.size(), 0, &buffer.vmo); ZX_CHECK(status == ZX_OK, status); - status = data.buffer.vmo.write(file_content.data(), 0, file_content.size()); + status = buffer.vmo.write(file_content.data(), 0, file_content.size()); ZX_CHECK(status == ZX_OK, status); - data.buffer.size = file_content.size(); - return data; + buffer.size = file_content.size(); + return buffer; } -class MockFontProvider : public fuchsia::fonts::FontProvider { +class MockFontProvider : public fuchsia::fonts::Provider { public: MockFontProvider() { base::FilePath assets_dir; @@ -50,32 +49,32 @@ roboto_slab_ = LoadFont(assets_dir.Append("test_fonts/Tinos-Regular.ttf")); } - // fuchsia::fonts::FontProvider implementation. - void GetFont(fuchsia::fonts::FontRequest request, + // fuchsia::fonts::Provider implementation. + void GetFont(fuchsia::fonts::Request request, GetFontCallback callback) override { - fuchsia::fonts::FontData* font_data = nullptr; + fuchsia::mem::Buffer* font_buffer = nullptr; if (*request.family == "Roboto") { - font_data = &roboto_; + font_buffer = &roboto_; } else if (*request.family == "RobotoSlab") { - font_data = &roboto_slab_; + font_buffer = &roboto_slab_; } - if (!font_data) { + if (!font_buffer) { callback(nullptr); return; } - auto response = fuchsia::fonts::FontResponse::New(); - EXPECT_EQ(font_data->buffer.vmo.duplicate(kFontDataRights, - &(response->data.buffer.vmo)), - ZX_OK); - response->data.buffer.size = font_data->buffer.size; + auto response = fuchsia::fonts::Response::New(); + EXPECT_EQ( + font_buffer->vmo.duplicate(kFontDataRights, &(response->buffer.vmo)), + ZX_OK); + response->buffer.size = font_buffer->size; callback(std::move(response)); } private: - fuchsia::fonts::FontData roboto_; - fuchsia::fonts::FontData roboto_slab_; + fuchsia::mem::Buffer roboto_; + fuchsia::mem::Buffer roboto_slab_; }; class MockFontProviderService { @@ -90,24 +89,23 @@ std::move(provider_binding_)); } - void Bind(fidl::InterfaceRequest<fuchsia::fonts::FontProvider> request) { + void Bind(fidl::InterfaceRequest<fuchsia::fonts::Provider> request) { provider_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&MockFontProviderService::DoBind, base::Unretained(this), std::move(request))); } private: - void DoBind(fidl::InterfaceRequest<fuchsia::fonts::FontProvider> request) { + void DoBind(fidl::InterfaceRequest<fuchsia::fonts::Provider> request) { provider_binding_ = - std::make_unique<fidl::Binding<fuchsia::fonts::FontProvider>>( + std::make_unique<fidl::Binding<fuchsia::fonts::Provider>>( &provider_, std::move(request)); } base::Thread provider_thread_; MockFontProvider provider_; - std::unique_ptr<fidl::Binding<fuchsia::fonts::FontProvider>> - provider_binding_; + std::unique_ptr<fidl::Binding<fuchsia::fonts::Provider>> provider_binding_; }; } // namespace @@ -115,7 +113,7 @@ class FuchsiaFontManagerTest : public testing::Test { public: FuchsiaFontManagerTest() { - fuchsia::fonts::FontProviderSyncPtr font_provider; + fuchsia::fonts::ProviderSyncPtr font_provider; font_provider_service_.Bind(font_provider.NewRequest()); font_manager_ = sk_make_sp<FuchsiaFontManager>(std::move(font_provider)); }
diff --git a/storage/DEPS b/storage/DEPS index 5da38bf0..83e7442 100644 --- a/storage/DEPS +++ b/storage/DEPS
@@ -6,6 +6,7 @@ "+services/network/public/mojom", "+services/network/session_cleanup_cookie_store.h", "+sql", + "+third_party/blink/public/common", "+third_party/blink/public/mojom", "+third_party/blink/public/platform", "+third_party/leveldatabase",
diff --git a/storage/OWNERS b/storage/OWNERS index ca4682d..499dd91 100644 --- a/storage/OWNERS +++ b/storage/OWNERS
@@ -1,6 +1,7 @@ dmurph@chromium.org jsbell@chromium.org pwnall@chromium.org +mek@chromium.org kinuko@chromium.org # TEAM: storage-dev@chromium.org
diff --git a/storage/browser/blob/mojo_blob_reader.cc b/storage/browser/blob/mojo_blob_reader.cc index 0c4e8f06..870638e 100644 --- a/storage/browser/blob/mojo_blob_reader.cc +++ b/storage/browser/blob/mojo_blob_reader.cc
@@ -8,6 +8,7 @@ #include "net/base/io_buffer.h" #include "services/network/public/cpp/net_adapters.h" #include "storage/browser/blob/blob_data_handle.h" +#include "third_party/blink/public/common/blob/blob_utils.h" namespace storage { @@ -184,6 +185,8 @@ return; } + num_bytes = std::min(num_bytes, blink::BlobUtils::GetDataPipeChunkSize()); + TRACE_EVENT_ASYNC_BEGIN0("Blob", "BlobReader::ReadMore", this); CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes); DCHECK(pending_write_);
diff --git a/storage/browser/fileapi/OWNERS b/storage/browser/fileapi/OWNERS index 3cf9e69..e3635f0 100644 --- a/storage/browser/fileapi/OWNERS +++ b/storage/browser/fileapi/OWNERS
@@ -1,3 +1,4 @@ +mek@chromium.org tzik@chromium.org nhiroki@chromium.org
diff --git a/storage/common/fileapi/OWNERS b/storage/common/fileapi/OWNERS index aaa27af5..9bf87a3 100644 --- a/storage/common/fileapi/OWNERS +++ b/storage/common/fileapi/OWNERS
@@ -1,3 +1,4 @@ +mek@chromium.org tzik@chromium.org nhiroki@chromium.org
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 52f938e..d259157 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -105,19 +105,6 @@ } ] }, - "test": "cros_vm_sanity_test" - }, - { - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-14.04", - "pool": "Chrome-CrOS-VM" - } - ] - }, "test": "crypto_unittests" }, {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 75f2e9ef..1b865d63 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -947,13 +947,25 @@ "gtest_tests": [ { "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm7l-32", + "os": "Ubuntu-14.04" + } + ] }, "test": "nacl_helper_nonsfi_unittests" }, { "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm7l-32", + "os": "Ubuntu-14.04" + } + ] }, "test": "nacl_loader_unittests" }, @@ -962,7 +974,13 @@ "--test-launcher-print-test-stdio=always" ], "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm7l-32", + "os": "Ubuntu-14.04" + } + ] }, "test": "sandbox_linux_unittests" } @@ -3071,21 +3089,6 @@ "test": "chromeos_unittests" }, { - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-14.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "cros_vm_sanity_test" - }, - { "args": [ "--vpython-dir=../../vpython_dir_linux_amd64", "--ozone-platform=headless",
diff --git a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter index dfea6024..a2cb8e4 100644 --- a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter +++ b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter
@@ -38,6 +38,7 @@ -BrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/* # Touch gestures don't work in webcontents. https://crbug.com/866991. +-TopControlsSlideControllerTest.TestScrollingMaximizedPageBeforeGoingToTabletMode -TopControlsSlideControllerTest.TestScrollingPage -TopControlsSlideControllerTest.TestScrollingPageAndSwitchingToNTP -TopControlsSlideControllerTest.TestClosingATab @@ -262,10 +263,10 @@ -PresentationReceiverWindowViewBrowserTest.ChromeOSHardwareFullscreenButton # RenderFrameMetadata observation not supported: https://crbug.com/820974 --ChromeMimeHandlerViewBrowserPluginScrollTest.OverscrollControllerSeesConsumedScrollsInGuest -WebViewFocusBrowserPluginSpecificTest.* -WebViewScrollBubbling/WebViewGuestScrollTest.ScrollLatchingPreservedInGuests/* -WebViewScrollBubbling/WebViewGuestScrollTouchTest.* +-WebViewScrollGuestContentBrowserPluginSpecificTest.OverscrollControllerSeesConsumedScrollsInGuest -WebViewScrollBubbling/WebViewGuestScrollTest.TestGuestWheelScrollsBubble/* # https://crbug.com/843760: webm in <object> triggers RegisterFrameSinkId crash
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter index c85134d..d403ec5 100644 --- a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter +++ b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
@@ -97,10 +97,10 @@ -RoundedOmniboxPopupContentsViewTest.ClickOmnibox* # RenderFrameMetadata observation not supported: https://crbug.com/820974 --ChromeMimeHandlerViewBrowserPluginScrollTest.OverscrollControllerSeesConsumedScrollsInGuest -WebViewFocusBrowserPluginSpecificTest.* -WebViewScrollBubbling/WebViewGuestScrollTest.ScrollLatchingPreservedInGuests/* -WebViewScrollBubbling/WebViewGuestScrollTouchTest.* +-WebViewScrollGuestContentBrowserPluginSpecificTest.OverscrollControllerSeesConsumedScrollsInGuest -WebViewScrollBubbling/WebViewGuestScrollTest.TestGuestWheelScrollsBubble/* # FATAL:hit_test_region_observer.cc(164)] Check failed: frame_sink_id.is_valid(). @@ -200,6 +200,9 @@ -ManagedWithoutPermission/ManagedWithoutPermissionPlatformKeysTest.* -ManagedWithPermission/ManagedWithPermissionPlatformKeysTest.* +# Timeout. https://crbug.com/883884 +-MediaEngagementBrowserTest.SessionNewTabNavigateSameURL + # Full screen button tests. -PresentationReceiverWindowViewBrowserTest.ChromeOSHardwareFullscreenButton
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 03f708f..d814465 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -497,13 +497,13 @@ "label": "//components/cronet/android:cronet_test_instrumentation_apk", "type": "console_test_launcher", }, - "cros_vm_sanity_test": { - "label": "//chromeos:cros_vm_sanity_test", - "type": "raw", - "args": [ - "--vm-logs-dir=${ISOLATED_OUTDIR}", - ] - }, + #"cros_vm_sanity_test": { + # "label": "//chromeos:cros_vm_sanity_test", + # "type": "raw", + # "args": [ + # "--vm-logs-dir=${ISOLATED_OUTDIR}", + # ] + #}, "crypto_unittests": { "label": "//crypto:crypto_unittests", "type": "console_test_launcher",
diff --git a/testing/buildbot/swarming_mixins.pyl b/testing/buildbot/swarming_mixins.pyl index 7ef2361..c4e37c1 100644 --- a/testing/buildbot/swarming_mixins.pyl +++ b/testing/buildbot/swarming_mixins.pyl
@@ -15,4 +15,14 @@ # already exists. { + 'linux-trusty': { + 'dimensions': { + 'os': 'Ubuntu-14.04', + } + }, + 'arm_tester': { + 'dimensions': { + 'cpu': 'arm7l-32', + } + } }
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 36a76bf..aaf46f28 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -383,7 +383,9 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.chromeos_unittests.filter', ], }, - 'cros_vm_sanity_test': {}, + # TODO(bpastene): Re-enable this once the fixes in crbug.com/881638 roll + # into CHROMEOS_LKGM. + #'cros_vm_sanity_test': {}, 'crypto_unittests': {}, 'display_unittests': {}, 'google_apis_unittests': {}, @@ -437,7 +439,9 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.chromeos_unittests.filter', ], }, - 'cros_vm_sanity_test': {}, + # TODO(bpastene): Re-enable this once the fixes in crbug.com/881638 roll + # into CHROMEOS_LKGM. + #'cros_vm_sanity_test': {}, 'services_unittests': { 'args': [ '--vpython-dir=../../vpython_dir_linux_amd64',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index acdc804..21f16ff 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2432,6 +2432,10 @@ ], }, 'Linux ARM': { + 'swarming_mixins': [ + 'linux-trusty', + 'arm_tester', + ], 'test_suites': { 'gtest_tests': 'linux_arm_gtests', },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 0830d3a..babf960 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -461,31 +461,13 @@ "AudioService": [ { "platforms": [ + "linux", "mac", "windows" ], "experiments": [ { - "name": "AudioProcess_LaunchOnStartup_Sandboxed_v7", - "params": { - "teardown_timeout_s": "0" - }, - "enable_features": [ - "AudioServiceAudioStreams", - "AudioServiceLaunchOnStartup", - "AudioServiceOutOfProcess", - "AudioServiceSandbox" - ] - } - ] - }, - { - "platforms": [ - "linux" - ], - "experiments": [ - { - "name": "AudioProcess_LaunchOnStartup_v7", + "name": "AudioProcess_LaunchOnStartup_v6", "params": { "teardown_timeout_s": "0" }, @@ -873,6 +855,29 @@ ] } ], + "BlobDataPipeTuning": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Capacity_512kb_Chunk_64kb", + "params": { + "capacity_bytes": "524288", + "chunk_bytes": "65536" + }, + "enable_features": [ + "BlobDataPipeTuning" + ] + } + ] + } + ], "BlockTabUnders": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 4144d25..6aa96ff 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -76,6 +76,7 @@ crbug.com/591099 external/wpt/css/CSS2/text/white-space-mixed-003.xht [ Pass ] crbug.com/591099 external/wpt/css/css-contain/contain-layout-cell-001.html [ Pass ] crbug.com/591099 external/wpt/css/css-contain/contain-layout-cell-002.html [ Pass ] +crbug.com/591099 external/wpt/css/css-contain/contain-size-025.html [ Pass ] crbug.com/591099 external/wpt/css/css-contain/contain-size-scrollbars-001.html [ Failure ] crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-1.html [ Pass ] crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-3.html [ Pass ] @@ -244,7 +245,7 @@ crbug.com/591099 external/wpt/fetch/api/redirect/redirect-count.any.worker.html [ Pass ] crbug.com/591099 external/wpt/fetch/api/request/request-keepalive-quota.html?include=slow-2 [ Pass ] crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Timeout ] -crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] +crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ] crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ] @@ -252,6 +253,7 @@ crbug.com/591099 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_parent [ Timeout ] crbug.com/591099 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_self [ Timeout ] crbug.com/591099 external/wpt/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-positive.html [ Timeout ] +crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-2j.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ] @@ -284,6 +286,7 @@ crbug.com/591099 external/wpt/requestidlecallback/callback-timeout-when-busy.html [ Timeout ] crbug.com/591099 external/wpt/requestidlecallback/callback-timeout.html [ Timeout ] crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/broken-chunked-encoding.https.html [ Failure ] +crbug.com/591099 external/wpt/shadow-dom/untriaged/styles/test-003.html [ Pass ] crbug.com/591099 external/wpt/speech-api/SpeechSynthesis-speak-twice.html [ Timeout ] crbug.com/591099 external/wpt/svg/painting/reftests/paint-context-001.svg [ Failure ] crbug.com/591099 external/wpt/svg/painting/reftests/paint-context-002.svg [ Failure ] @@ -380,14 +383,14 @@ crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ] crbug.com/591099 fast/overflow/recompute-overflow-of-layout-root-container.html [ Failure ] crbug.com/591099 fast/replaced/table-replaced-element.html [ Failure ] -crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Failure Pass ] +crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Failure ] crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/composited-cell-collapsed-border.html [ Failure ] crbug.com/591099 fast/table/dynamic-descendant-percentage-height.html [ Failure ] crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] -crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ] +crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ] crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ] crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ] crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ] @@ -429,7 +432,7 @@ crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ] crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ] crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] -crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Crash Pass ] +crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Pass ] crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ] crbug.com/591099 images/rendering-broken-block-flow-images.html [ Failure ] crbug.com/591099 images/rendering-broken-images.html [ Failure ] @@ -474,7 +477,7 @@ crbug.com/714962 paint/invalidation/position/relative-positioned-movement-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/position/relayout-fixed-position-after-scale.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/repaint-composited-child-in-scrolled-container.html [ Failure ] -crbug.com/591099 paint/invalidation/selection/selection-partial-invalidation-between-blocks.html [ Failure ] +crbug.com/591099 paint/invalidation/selection/selection-partial-invalidation-between-blocks.html [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/animated-path-inside-transformed-html.xhtml [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Failure ] crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ] @@ -560,4 +563,4 @@ crbug.com/591099 virtual/user-activation-v2/fast/events/mouse-cursor.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/video-surface-layer/media/video-aspect-ratio.html [ Failure ] -crbug.com/591099 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure Pass ] +crbug.com/591099 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index f1edf5b6..9be0437 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2779,6 +2779,7 @@ crbug.com/875249 external/wpt/infrastructure/testdriver/bless.html [ Timeout Pass ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-contain/contain-layout-008.html [ Failure ] crbug.com/626703 external/wpt/presentation-api/controlling-ua/reconnectToPresentation_notfound_error-manual.https.html [ Skip ] crbug.com/626703 external/wpt/presentation-api/controlling-ua/reconnectToMultiplePresentations_success-manual.https.html [ Skip ] crbug.com/626703 external/wpt/presentation-api/controlling-ua/startMultiplePresentations_success-manual.https.html [ Skip ] @@ -2811,7 +2812,7 @@ crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-list-item.html [ Failure ] crbug.com/626703 [ Retina ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ] crbug.com/626703 [ Mac10.10 Mac10.12 ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ] -crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ] crbug.com/626703 external/wpt/css/selectors/old-tests/css3-modsel-16.xml [ Skip ] crbug.com/626703 external/wpt/css/selectors/old-tests/css3-modsel-83.xml [ Failure ] crbug.com/626703 external/wpt/css/selectors/old-tests/css3-modsel-64.xml [ Skip ] @@ -5128,3 +5129,4 @@ # Sheriff 2018-09-13 crbug.com/883591 [ Android ] fullscreen/full-screen-inline-split-crash.html [ Pass Crash ] crbug.com/883860 [ Mac ] external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Failure ] +crbug.com/883837 [ Win7 ] http/tests/performance-timing/resource_timing_buffer_full_250.html [ Timeout Pass ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json index b34f6c2..bba7d15 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
@@ -36377,18 +36377,6 @@ {} ] ], - "css/css-contain/contain-paint-013.html": [ - [ - "/css/css-contain/contain-paint-013.html", - [ - [ - "/css/css-contain/reference/contain-paint-013-ref.html", - "==" - ] - ], - {} - ] - ], "css/css-contain/contain-paint-014.html": [ [ "/css/css-contain/contain-paint-014.html", @@ -36701,6 +36689,42 @@ {} ] ], + "css/css-contain/contain-paint-independent-formatting-context-001.html": [ + [ + "/css/css-contain/contain-paint-independent-formatting-context-001.html", + [ + [ + "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-contain/contain-paint-independent-formatting-context-002.html": [ + [ + "/css/css-contain/contain-paint-independent-formatting-context-002.html", + [ + [ + "/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-contain/contain-paint-independent-formatting-context-003.html": [ + [ + "/css/css-contain/contain-paint-independent-formatting-context-003.html", + [ + [ + "/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-paint-size-001.html": [ [ "/css/css-contain/contain-paint-size-001.html", @@ -118418,6 +118442,11 @@ {} ] ], + "css/css-contain/OWNERS": [ + [ + {} + ] + ], "css/css-contain/contain-style-counters-ref.html": [ [ {} @@ -118483,11 +118512,6 @@ {} ] ], - "css/css-contain/reference/contain-paint-013-ref.html": [ - [ - {} - ] - ], "css/css-contain/reference/contain-paint-022-ref.html": [ [ {} @@ -118508,6 +118532,16 @@ {} ] ], + "css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html": [ + [ + {} + ] + ], + "css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html": [ + [ + {} + ] + ], "css/css-contain/reference/contain-paint-size-001-ref.html": [ [ {} @@ -262720,6 +262754,12 @@ {} ] ], + "trusted-types/Element-setAttributeNS.tentative.html": [ + [ + "/trusted-types/Element-setAttributeNS.tentative.html", + {} + ] + ], "trusted-types/HTMLElement-generic.tentative.html": [ [ "/trusted-types/HTMLElement-generic.tentative.html", @@ -262822,6 +262862,12 @@ {} ] ], + "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [ + [ + "/trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html", + {} + ] + ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ [ "/trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html", @@ -314415,6 +314461,10 @@ "259c00b2a587c9aa2d07de97fb547b32f9772b92", "support" ], + "css/css-contain/OWNERS": [ + "5f43f9116bc8073cfadd3bf840519a3ad96c296f", + "support" + ], "css/css-contain/contain-animation-001.html": [ "449221428c3d76d31ff84a5792c7578c36cbebed", "reftest" @@ -314591,10 +314641,6 @@ "471726a99c659ab0d6a7870ee2519994051b425f", "reftest" ], - "css/css-contain/contain-paint-013.html": [ - "3b6b3a76dc63028e1ae22b81c4ba06112c5aceb7", - "reftest" - ], "css/css-contain/contain-paint-014.html": [ "ee6bc7876f6f0a1f3653c62819fd16553b1610b7", "reftest" @@ -314699,6 +314745,18 @@ "b8a03936cbcc3ddcc88dc1237fab0af56f4bd72b", "reftest" ], + "css/css-contain/contain-paint-independent-formatting-context-001.html": [ + "e4c06a992b351974d5506070db3dd8dadd53173e", + "reftest" + ], + "css/css-contain/contain-paint-independent-formatting-context-002.html": [ + "353196970c99e9b5ed556b850d4eda034d16df77", + "reftest" + ], + "css/css-contain/contain-paint-independent-formatting-context-003.html": [ + "fe1f7f2775db9cd82292c181560c2f9997de197d", + "reftest" + ], "css/css-contain/contain-paint-size-001.html": [ "930429b7ecc5af860fa6782cff30a8803393d3cd", "reftest" @@ -314979,10 +315037,6 @@ "b94055eb1b7830696b36be17f7bde1474ea605c4", "support" ], - "css/css-contain/reference/contain-paint-013-ref.html": [ - "af758703a3b75b45223491a4fe97eb1da20d5320", - "support" - ], "css/css-contain/reference/contain-paint-022-ref.html": [ "b3bb7576f2944f6ef51c16024767b93e8f30c329", "support" @@ -314999,6 +315053,14 @@ "229c8c2d74ba3f2b5cede6824091575835807092", "support" ], + "css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html": [ + "08900b201b12099e3b0c00f1e21b4b7890d2bcb9", + "support" + ], + "css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html": [ + "0cef592ba5cc6cc56a0fc3a7439cec330d1856b0", + "support" + ], "css/css-contain/reference/contain-paint-size-001-ref.html": [ "9aad8a490b4b740991c968a17f1c74571e758d36", "support" @@ -358296,7 +358358,7 @@ "testharness" ], "css/cssom/shorthand-serialization.html": [ - "44af6737e3ef3b3c71ccd259b1d75104c4a92061", + "97e11da8b8a266c7efa3826272e3fdb7ce55ed86", "testharness" ], "css/cssom/shorthand-values-expected.txt": [ @@ -419188,7 +419250,7 @@ "testharness" ], "service-workers/service-worker/interfaces-sw.https-expected.txt": [ - "16b331f34e80faea599a2de7a56d91b95a7296a2", + "a738aaca91917711f83150a77a611083f3905d52", "support" ], "service-workers/service-worker/interfaces-sw.https.html": [ @@ -424139,6 +424201,10 @@ "a284b2f83550b1b0e4cf7c79e7a200791ae8c70a", "testharness" ], + "trusted-types/Element-setAttributeNS.tentative.html": [ + "80128cfbf0ebce7d878dd349fc8838b2a6469a16", + "testharness" + ], "trusted-types/HTMLElement-generic.tentative.html": [ "2d38104511879943a4d538c9dc5b0031d7596b23", "testharness" @@ -424215,6 +424281,10 @@ "52e317083316435ec4b1dcc7331f1216c2a32d9a", "testharness" ], + "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [ + "5a72992100ced1ae73766f147e29fa0afa6c8334", + "testharness" + ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ "f31fce629bccd342ff5e8dfacd43e13faac6fced", "testharness" @@ -424244,7 +424314,7 @@ "testharness" ], "trusted-types/support/helper.sub.js": [ - "1ad5b4ef0c68a1ffde111db62c5e2aa4957732b6", + "75874e5b3c2ed90f0ebfbfca2da701d027d2d832", "support" ], "uievents/META.yml": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/OWNERS b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/OWNERS new file mode 100644 index 0000000..5f43f911 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: layout-dev@chromium.org +# COMPONENT: Blink>Layout +# WPT-NOTIFY: true +rego@igalia.com
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-013.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-013.html deleted file mode 100644 index 3b6b3a76..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-013.html +++ /dev/null
@@ -1,29 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>CSS Containment Test: Paint containment independent formatting context</title> -<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> -<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-paint"> -<link rel="match" href="reference/contain-paint-013-ref.html"> -<meta name=assert content="Paint containment elements establish an independent formatting context. The test checks that this feature of paint containment applies to blocks and inline blocks, but it doesn't apply to inline elements."> -<style> -.wrapper { - border: solid thick; - margin: 1em; -} -</style> -<p>Test passes if on the first two boxes the top and bottom margins of the text line are double size than on the last box.</p> -<div class="wrapper"> - <div style="margin: 1em 0; contain: paint;"> - <div style="margin: 1em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> - </div> -</div> -<div class="wrapper"> - <span style="display: inline-block; margin: 1em 0; contain: paint;"> - <div style="margin: 1em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> - </span> -</div> -<div class="wrapper"> - <span style="margin: 1em 0; contain: paint;"> - <div style="margin: 1em 0;">This text should have 1em top and bottom margins.</div> - </span> -</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-001.html new file mode 100644 index 0000000..e4c06a9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-001.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Paint containment independent formatting context</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-paint"> +<link rel="match" href="reference/contain-paint-independent-formatting-context-001-ref.html"> +<meta name=assert content="Paint containment elements establish an independent formatting context. The test checks that this feature of paint containment applies to blocks."> +<style> +.wrapper { + border: solid thick; + margin: 1em; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<div class="wrapper"> + <div style="margin: 1em 0; contain: paint;"> + <div style="margin: 1em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> + </div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-002.html new file mode 100644 index 0000000..3531969 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-002.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Paint containment independent formatting context</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-paint"> +<link rel="match" href="reference/contain-paint-independent-formatting-context-001-ref.html"> +<meta name=assert content="Paint containment elements establish an independent formatting context. The test checks that this feature of paint containment applies to inline blocks."> +<style> +.wrapper { + border: solid thick; + margin: 1em; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<div class="wrapper"> + <span style="display: inline-block; margin: 1em 0; contain: paint;"> + <div style="margin: 1em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> + </span> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-003.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-003.html new file mode 100644 index 0000000..fe1f7f2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-paint-independent-formatting-context-003.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Paint containment independent formatting context</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-paint"> +<link rel="match" href="reference/contain-paint-independent-formatting-context-003-ref.html"> +<meta name=assert content="Paint containment elements establish an independent formatting context. The test checks that this feature of paint containment does not appliy to inline elements."> +<style> +.wrapper { + border: solid thick; + margin: 1em; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<div class="wrapper"> + <span style="margin: 1em 0; contain: paint;"> + <div style="margin: 1em 0;">This text should have 1em top and bottom margins.</div> + </span> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-013-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-013-ref.html deleted file mode 100644 index af75870..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-013-ref.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>CSS Containment Test: Reference file</title> -<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> -<style> -.wrapper { - border: solid thick; - margin: 1em; -} -</style> -<p>Test passes if on the first two boxes the top and bottom margins of the text line are double size than on the last box.</p> -<div class="wrapper"> - <div style="margin: 2em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> -</div> -<div class="wrapper"> - <div style="margin: 2em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> -</div> -<div class="wrapper"> - <div style="margin: 1em 0;">This text should have 1em top and bottom margins.</div> -</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html new file mode 100644 index 0000000..08900b2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-001-ref.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +.wrapper { + border: solid thick; + margin: 1em; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<div class="wrapper"> + <div style="margin: 2em 0;">This text should have 2em top and bottom margins (margins do not collapse).</div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html new file mode 100644 index 0000000..0cef592b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-independent-formatting-context-003-ref.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Reference file</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<style> +.wrapper { + border: solid thick; + margin: 1em; +} +</style> +<p>Test passes if it has the same output than the reference.</p> +<div class="wrapper"> + <div style="margin: 1em 0;">This text should have 1em top and bottom margins.</div> +</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/shorthand-serialization.html b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/shorthand-serialization.html index 44af6737..97e11da8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/cssom/shorthand-serialization.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/cssom/shorthand-serialization.html
@@ -70,8 +70,17 @@ const testElem = document.getElementById("test"); testElem.style.setProperty("margin-top", "initial", "important"); assert_equals(testElem.style.margin, ""); - assert_equals(testElem.style.cssText, "margin-top: initial !important; margin-right: initial; margin-bottom: initial; margin-left: initial;"); }, "Shorthand serialization with 'initial' value, one longhand with important flag."); + + test(function() { + const testElem = document.getElementById("test"); + testElem.style.cssText = ""; + testElem.style.setProperty("margin-top", "initial"); + testElem.style.setProperty("margin-right", "initial"); + testElem.style.setProperty("margin-bottom", "initial"); + testElem.style.setProperty("margin-left", "initial", "important"); + assert_equals(testElem.style.margin, ""); + }, "Shorthand serialization with 'initial' value, longhands set individually, one with important flag."); </script> </body> </html>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-complex-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-complex-expected.png index 43b59021..1e9b005 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-complex-expected.png +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-complex-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png index 163e247..75f1482 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js index 67167b3..abb22c2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/nodejs-set-breakpoint.js
@@ -12,22 +12,11 @@ SourcesTestRunner.startDebuggerTest(); var debuggerModel = SDK.targetManager.mainTarget().model(SDK.DebuggerModel); - var originalParsedScriptSource = TestRunner.override(debuggerModel, '_parsedScriptSource', overrideSourceURL, true); - - function overrideSourceURL(scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash, - executionContextAuxData, isLiveEdit, sourceMapURL, hasSourceURL, hasSyntaxError, length) { - // Overwrite hasSourceURL to pretend we're Node.js - hasSourceURL = false; - originalParsedScriptSource.call(this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash, - executionContextAuxData, isLiveEdit, sourceMapURL, hasSourceURL, hasSyntaxError, length); - } - var functionText = 'function foobar() { \nconsole.log(\'foobar execute!\');\n}'; var sourceURL = Host.isWin() ? '\n//# sourceURL=c:\\prog\\foobar.js' : '\n//# sourceURL=/usr/local/home/prog/foobar.js'; await TestRunner.evaluateInPageAnonymously(functionText + sourceURL); SourcesTestRunner.showScriptSource('foobar.js', didShowScriptSource); - function didShowScriptSource(sourceFrame) { TestRunner.addResult('Setting breakpoint:'); TestRunner.addSniffer(
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url-expected.txt new file mode 100644 index 0000000..3193def --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url-expected.txt
@@ -0,0 +1,5 @@ +Checks url patching for Node.js +..result.value.url patched: false +..exceptionDetails.url patched: true +..stackTrace.callFrames[0].url patched: true +
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url.js b/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url.js new file mode 100644 index 0000000..683de12 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/unit/node-url.js
@@ -0,0 +1,41 @@ +// 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. + +(async function() { + TestRunner.addResult('Checks url patching for Node.js'); + const url = Host.isWin() + ? 'c:\\prog\\foobar.js' + : '/usr/local/home/prog/foobar.js' + const nodejsTarget = {isNodeJS: () => true}; + let obj = { + id: 0, + result: { + result: { + value: { + url: url + } + }, + exceptionDetails: { + url: url, + stackTrace: { + callFrames: [{ + columnNumber: 0, + functionName: '', + lineNumber: 0, + scriptId: "0", + url: url + }] + } + } + } + }; + Protocol.NodeURL.patch(nodejsTarget, obj); + TestRunner.addResult(`..result.value.url patched: ${ + obj.result.result.value.url !== url}`); + TestRunner.addResult(`..exceptionDetails.url patched: ${ + obj.result.exceptionDetails.url !== url}`); + TestRunner.addResult(`..stackTrace.callFrames[0].url patched: ${ + obj.result.exceptionDetails.stackTrace.callFrames[0].url !== url}`); + TestRunner.completeTest(); +})()
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png index 6a6cd15..1e9b005 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png index 301fd4ee..ff6806c9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-expected.png index 301fd4ee..ff6806c9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/video-no-audio-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/video-no-audio-expected.png index 51590a8..1fff8178 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/video-no-audio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/media/video-no-audio-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png index 301fd4ee..ff6806c9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-expected.png index 301fd4ee..ff6806c9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/new-remote-playback-pipeline/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png index a7701e14..b2406a0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-custom-bg-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-expected.png index a7701e14..b2406a0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/controls/paint-controls-webkit-appearance-none-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/controls/video-overlay-cast-light-rendering-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/controls/video-overlay-cast-light-rendering-expected.png index b11c7729..6702108f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/controls/video-overlay-cast-light-rendering-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/controls/video-overlay-cast-light-rendering-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/video-colorspace-yuv420-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/video-colorspace-yuv420-expected.png index e50cf21..74870070 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/video-colorspace-yuv420-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/video-colorspace-yuv420-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/media/video-no-audio-expected.png b/third_party/WebKit/LayoutTests/platform/mac/media/video-no-audio-expected.png index ee140c8e..de23f173 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/media/video-no-audio-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/media/video-no-audio-expected.png Binary files differ
diff --git a/third_party/blink/common/blob/blob_utils.cc b/third_party/blink/common/blob/blob_utils.cc index 82536ed7..6ec9ab7 100644 --- a/third_party/blink/common/blob/blob_utils.cc +++ b/third_party/blink/common/blob/blob_utils.cc
@@ -4,7 +4,10 @@ #include "third_party/blink/public/common/blob/blob_utils.h" +#include <algorithm> + #include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" #include "services/network/public/cpp/features.h" #include "third_party/blink/public/common/features.h" @@ -16,4 +19,39 @@ base::FeatureList::IsEnabled(blink::features::kMojoBlobURLs); } +namespace { + +const base::Feature kBlobDataPipeTuningFeature{ + "BlobDataPipeTuning", base::FEATURE_DISABLED_BY_DEFAULT}; + +constexpr int kBlobMinDataPipeCapacity = 1024; +constexpr int kBlobDefaultDataPipeCapacity = 512 * 1024; + +constexpr base::FeatureParam<int> kBlobDataPipeCapacity{ + &kBlobDataPipeTuningFeature, "capacity_bytes", + kBlobDefaultDataPipeCapacity}; + +constexpr int kBlobMinDataPipeChunkSize = 1024; +constexpr int kBlobDefaultDataPipeChunkSize = 64 * 1024; + +constexpr base::FeatureParam<int> kBlobDataPipeChunkSize{ + &kBlobDataPipeTuningFeature, "chunk_bytes", kBlobDefaultDataPipeChunkSize}; + +} // namespace + +// static +uint32_t BlobUtils::GetDataPipeCapacity() { + return std::max(kBlobDataPipeCapacity.Get(), kBlobMinDataPipeCapacity); +} + +// static +uint32_t BlobUtils::GetDataPipeChunkSize() { + // The mojo::DataPipe will allow up to 64KB to be written into it in + // a single chunk, but there may be some advantage to writing smaller + // chunks. For example, the network stack uses 32KB chunks. This could + // result in the faster delivery of the first byte of data when reading + // from a slow disk. + return std::max(kBlobDataPipeChunkSize.Get(), kBlobMinDataPipeChunkSize); +} + } // namespace blink
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index 63b5dac..f8b84c3 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -167,7 +167,6 @@ "platform/modules/screen_orientation/web_screen_orientation_enum_traits.h", "platform/modules/service_worker/web_navigation_preload_state.h", "platform/modules/service_worker/web_service_worker.h", - "platform/modules/service_worker/web_service_worker_client_query_options.h", "platform/modules/service_worker/web_service_worker_clients_claim_callbacks.h", "platform/modules/service_worker/web_service_worker_clients_info.h", "platform/modules/service_worker/web_service_worker_error.h",
diff --git a/third_party/blink/public/common/blob/blob_utils.h b/third_party/blink/public/common/blob/blob_utils.h index ab19712b..c08744ef 100644 --- a/third_party/blink/public/common/blob/blob_utils.h +++ b/third_party/blink/public/common/blob/blob_utils.h
@@ -6,6 +6,8 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_BLOB_BLOB_UTILS_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_BLOB_BLOB_UTILS_H_ +#include <stdint.h> + #include "third_party/blink/common/common_export.h" namespace blink { @@ -15,6 +17,13 @@ // Whether the new Blob URL glue for NetworkService is enabled (i.e., // the NetworkService or MojoBlobURLs feature is enabled). static bool BLINK_COMMON_EXPORT MojoBlobURLsEnabled(); + + // Get the preferred capacity a mojo::DataPipe being used to read a blob. + static uint32_t BLINK_COMMON_EXPORT GetDataPipeCapacity(); + + // Get the preferred chunk size to use when reading a blob to copy + // into a mojo::DataPipe. + static uint32_t BLINK_COMMON_EXPORT GetDataPipeChunkSize(); }; } // namespace blink
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_client_query_options.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_client_query_options.h deleted file mode 100644 index 41672a742..0000000 --- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_client_query_options.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_CLIENT_QUERY_OPTIONS_H_ -#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_CLIENT_QUERY_OPTIONS_H_ - -#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom-shared.h" - -namespace blink { - -struct WebServiceWorkerClientQueryOptions { - WebServiceWorkerClientQueryOptions() - : client_type(mojom::ServiceWorkerClientType::kWindow), - include_uncontrolled(false) {} - - mojom::ServiceWorkerClientType client_type; - bool include_uncontrolled; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_CLIENT_QUERY_OPTIONS_H_
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h index 397cfe85..2d21dc1 100644 --- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h +++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
@@ -33,11 +33,7 @@ #include <memory> -#include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-shared.h" -#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_claim_callbacks.h" -#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_info.h" -#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_skip_waiting_callbacks.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_stream_handle.h" #include "third_party/blink/public/platform/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/web_url.h" @@ -47,7 +43,6 @@ namespace blink { struct WebPaymentHandlerResponse; -struct WebServiceWorkerClientQueryOptions; class WebServiceWorkerContextProxy; class WebServiceWorkerNetworkProvider; class WebServiceWorkerProvider; @@ -66,33 +61,6 @@ public: virtual ~WebServiceWorkerContextClient() = default; - // For Clients#get(id). Requests the embedder to return the specified Client. - virtual void GetClient(const WebString& client_id, - std::unique_ptr<WebServiceWorkerClientCallbacks>) = 0; - - // For Clients#matchAll(options). Requests the embedder to return all matching - // Clients. - virtual void GetClients( - const WebServiceWorkerClientQueryOptions&, - std::unique_ptr<WebServiceWorkerClientsCallbacks>) = 0; - - // For Clients#openWindow(url). Requests the embedder to open a tab. - virtual void OpenNewTab(const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) = 0; - - // Similar to OpenNewTab above. For PaymentRequestEvent#openWindow(). - virtual void OpenPaymentHandlerWindow( - const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) = 0; - - // A suggestion to cache this metadata in association with this URL. - virtual void SetCachedMetadata(const WebURL& url, - const char* data, - size_t size) {} - - // A suggestion to clear the cached metadata in association with this URL. - virtual void ClearCachedMetadata(const WebURL& url) {} - // ServiceWorker has prepared everything for script loading and is now ready // for DevTools inspection. virtual void WorkerReadyForInspection() {} @@ -315,28 +283,6 @@ // Called on the main thread. virtual std::unique_ptr<WebServiceWorkerProvider> CreateServiceWorkerProvider() = 0; - - // The message is only valid during this method call, unless callee calls - // EnsureDataIsOwned on the message. - virtual void PostMessageToClient(const WebString& uuid, - TransferableMessage) = 0; - - // For WindowClient#focus(). Requests the embedder to focus a window. - virtual void Focus(const WebString& uuid, - std::unique_ptr<WebServiceWorkerClientCallbacks>) = 0; - - // For WindowClient#navigate(). Requests the embedder to navigate to a URL. - virtual void Navigate(const WebString& uuid, - const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) = 0; - - // For ServiceWorkerGlobalScope#skipWaiting(). - virtual void SkipWaiting( - std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>) = 0; - - // For Clients#claim(). - virtual void Claim( - std::unique_ptr<WebServiceWorkerClientsClaimCallbacks>) = 0; }; } // namespace blink
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h index 200a0b07..db8b141 100644 --- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h +++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h
@@ -32,6 +32,7 @@ #define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_CONTEXT_PROXY_H_ #include "base/time/time.h" +#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h" #include "third_party/blink/public/common/messaging/transferable_message.h" #include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom-shared.h" #include "third_party/blink/public/platform/modules/background_fetch/web_background_fetch_registration.h" @@ -60,6 +61,9 @@ public: virtual ~WebServiceWorkerContextProxy() = default; + virtual void BindServiceWorkerHost( + mojo::ScopedInterfaceEndpointHandle service_worker_host) = 0; + virtual void SetRegistration( std::unique_ptr<WebServiceWorkerRegistration::Handle>) = 0;
diff --git a/third_party/blink/public/web/web_document_loader.h b/third_party/blink/public/web/web_document_loader.h index 632bf50..b11eb4d4 100644 --- a/third_party/blink/public/web/web_document_loader.h +++ b/third_party/blink/public/web/web_document_loader.h
@@ -133,6 +133,9 @@ // IsArchive returns false. virtual WebArchiveInfo GetArchiveInfo() const = 0; + // Whether this load was started with a user gesture. + virtual bool HadUserGesture() const = 0; + protected: ~WebDocumentLoader() = default; };
diff --git a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc index b14ee0e3f0..45e783b 100644 --- a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc +++ b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc
@@ -206,8 +206,10 @@ function, worker, script_state_->GetContext()->Global(), info.size(), info.data(), script_state_->GetIsolate()); } else { - worker->ScriptController()->Evaluate(ScriptSourceCode( - code_, ScriptSourceLocationType::kEvalForScheduledAction)); + worker->ScriptController()->Evaluate( + ScriptSourceCode(code_, + ScriptSourceLocationType::kEvalForScheduledAction), + kNotSharableCrossOrigin); } }
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc index 0f8f840..2c538fed 100644 --- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc +++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
@@ -261,6 +261,7 @@ ScriptValue WorkerOrWorkletScriptController::EvaluateInternal( const ScriptSourceCode& source_code, + AccessControlStatus access_control_status, V8CacheOptions v8_cache_options) { DCHECK(IsContextInitialized()); @@ -284,7 +285,7 @@ std::tie(compile_options, produce_cache_options, no_cache_reason) = V8CodeCache::GetCompileOptions(v8_cache_options, source_code); if (V8ScriptRunner::CompileScript(script_state_, source_code, - kSharableCrossOrigin, compile_options, + access_control_status, compile_options, no_cache_reason, referrer_info) .ToLocal(&compiled_script)) { maybe_result = V8ScriptRunner::RunCompiledScript(isolate_, compiled_script, @@ -319,13 +320,14 @@ bool WorkerOrWorkletScriptController::Evaluate( const ScriptSourceCode& source_code, + AccessControlStatus access_control_status, ErrorEvent** error_event, V8CacheOptions v8_cache_options) { if (IsExecutionForbidden()) return false; ExecutionState state(this); - EvaluateInternal(source_code, v8_cache_options); + EvaluateInternal(source_code, access_control_status, v8_cache_options); if (IsExecutionForbidden()) return false; @@ -338,19 +340,19 @@ return false; } if (global_scope_->ShouldSanitizeScriptError(state.location_->Url(), - kNotSharableCrossOrigin)) { + access_control_status)) { *error_event = ErrorEvent::CreateSanitizedError(world_.get()); } else { *error_event = ErrorEvent::Create(state.error_message, state.location_->Clone(), state.exception, world_.get()); + StoreExceptionForInspector(script_state_, *error_event, + state.exception.V8Value(), + script_state_->GetContext()->Global()); } - StoreExceptionForInspector(script_state_, *error_event, - state.exception.V8Value(), - script_state_->GetContext()->Global()); } else { - DCHECK(!global_scope_->ShouldSanitizeScriptError( - state.location_->Url(), kNotSharableCrossOrigin)); + DCHECK(!global_scope_->ShouldSanitizeScriptError(state.location_->Url(), + access_control_status)); ErrorEvent* event = nullptr; if (state.error_event_from_imported_script_) { event = state.error_event_from_imported_script_.Release(); @@ -359,7 +361,7 @@ ErrorEvent::Create(state.error_message, state.location_->Clone(), state.exception, world_.get()); } - global_scope_->DispatchErrorEvent(event, kNotSharableCrossOrigin); + global_scope_->DispatchErrorEvent(event, access_control_status); } return false; } @@ -369,7 +371,7 @@ ScriptValue WorkerOrWorkletScriptController::EvaluateAndReturnValueForTest( const ScriptSourceCode& source_code) { ExecutionState state(this); - return EvaluateInternal(source_code, kV8CacheOptionsDefault); + return EvaluateInternal(source_code, kOpaqueResource, kV8CacheOptionsDefault); } void WorkerOrWorkletScriptController::ForbidExecution() {
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h index 9d40582..4d7a66f 100644 --- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h +++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
@@ -36,6 +36,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/loader/fetch/access_control_status.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/text_position.h" #include "v8/include/v8.h" @@ -61,6 +62,7 @@ // Returns true if the evaluation completed with no uncaught exception. bool Evaluate(const ScriptSourceCode&, + AccessControlStatus access_control_status, ErrorEvent** = nullptr, V8CacheOptions = kV8CacheOptionsDefault); @@ -107,6 +109,7 @@ // Evaluate a script file in the current execution environment. ScriptValue EvaluateInternal(const ScriptSourceCode&, + AccessControlStatus, V8CacheOptions); void DisposeContextIfNeeded();
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 3eef932..99447c5 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1973,6 +1973,8 @@ const ComputedStyle* document_element_style = documentElement()->EnsureComputedStyle(); + TouchAction effective_touch_action = + document_element_style->GetEffectiveTouchAction(); WritingMode root_writing_mode = document_element_style->GetWritingMode(); TextDirection root_direction = document_element_style->Direction(); if (body_style) { @@ -2084,7 +2086,8 @@ viewport_style.ScrollPaddingTop() != scroll_padding_top || viewport_style.ScrollPaddingRight() != scroll_padding_right || viewport_style.ScrollPaddingBottom() != scroll_padding_bottom || - viewport_style.ScrollPaddingLeft() != scroll_padding_left) { + viewport_style.ScrollPaddingLeft() != scroll_padding_left || + viewport_style.GetEffectiveTouchAction() != effective_touch_action) { scoped_refptr<ComputedStyle> new_style = ComputedStyle::Clone(viewport_style); new_style->SetWritingMode(root_writing_mode); @@ -2104,6 +2107,7 @@ new_style->SetScrollPaddingRight(scroll_padding_right); new_style->SetScrollPaddingBottom(scroll_padding_bottom); new_style->SetScrollPaddingLeft(scroll_padding_left); + new_style->SetEffectiveTouchAction(effective_touch_action); GetLayoutView()->SetStyle(new_style); SetupFontBuilder(*new_style);
diff --git a/third_party/blink/renderer/core/exported/web_document_loader_impl.cc b/third_party/blink/renderer/core/exported/web_document_loader_impl.cc index 933451c0..ffb8a3e7 100644 --- a/third_party/blink/renderer/core/exported/web_document_loader_impl.cc +++ b/third_party/blink/renderer/core/exported/web_document_loader_impl.cc
@@ -171,6 +171,10 @@ return {archive->MainResource()->Url(), archive->Date()}; } +bool WebDocumentLoaderImpl::HadUserGesture() const { + return DocumentLoader::had_transient_activation(); +} + void WebDocumentLoaderImpl::Trace(blink::Visitor* visitor) { DocumentLoader::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/exported/web_document_loader_impl.h b/third_party/blink/renderer/core/exported/web_document_loader_impl.h index d04c59c8..229788d 100644 --- a/third_party/blink/renderer/core/exported/web_document_loader_impl.h +++ b/third_party/blink/renderer/core/exported/web_document_loader_impl.h
@@ -82,6 +82,7 @@ void ResumeParser() override; bool IsArchive() const override; WebArchiveInfo GetArchiveInfo() const override; + bool HadUserGesture() const override; void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc index bcbd71cb..ba6eecb8 100644 --- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc +++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -367,9 +367,10 @@ worker_inspector_proxy_->WorkerThreadCreated(document, GetWorkerThread(), script_response_url); // TODO(nhiroki): Support module workers (https://crbug.com/680046). - GetWorkerThread()->EvaluateClassicScript(script_response_url, source_code, - nullptr /* cached_meta_data */, - v8_inspector::V8StackTraceId()); + // Shared worker is origin-bound, so use kSharableCrossOrigin. + GetWorkerThread()->EvaluateClassicScript( + script_response_url, kSharableCrossOrigin, source_code, + nullptr /* cached_meta_data */, v8_inspector::V8StackTraceId()); client_->WorkerScriptLoaded(); }
diff --git a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc index 80737ae..dd0ea0f6 100644 --- a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc +++ b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/fetch/form_data_bytes_consumer.h" +#include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fetch/blob_bytes_consumer.h" @@ -185,7 +186,7 @@ if (!data_pipe_consumer_) { network::mojom::blink::DataPipeGetterPtr* data_pipe_getter = iter_->data_pipe_getter_->GetPtr(); - mojo::DataPipe data_pipe; + mojo::DataPipe data_pipe(BlobUtils::GetDataPipeCapacity()); (*data_pipe_getter) ->Read( std::move(data_pipe.producer_handle),
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc index 6bf6e8d..f33fe35 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -36,6 +36,7 @@ #include "base/memory/scoped_refptr.h" #include "mojo/public/cpp/system/wait.h" +#include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" @@ -89,17 +90,16 @@ started_loading_ = true; #endif // DCHECK_IS_ON() - mojo::ScopedDataPipeProducerHandle producer_handle; - MojoResult result = - CreateDataPipe(nullptr, &producer_handle, &consumer_handle_); - if (result != MOJO_RESULT_OK) { + mojo::DataPipe pipe(blink::BlobUtils::GetDataPipeCapacity()); + if (!pipe.producer_handle.is_valid()) { Failed(FileError::kNotReadableErr, FailureType::kMojoPipeCreation); return; } + consumer_handle_ = std::move(pipe.consumer_handle); mojom::blink::BlobReaderClientPtr client_ptr; binding_.Bind(MakeRequest(&client_ptr)); - blob_data->ReadAll(std::move(producer_handle), std::move(client_ptr)); + blob_data->ReadAll(std::move(pipe.producer_handle), std::move(client_ptr)); if (IsSyncLoad()) { // Wait for OnCalculatedSize, which will also synchronously drain the data
diff --git a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc index 2758c8ef..292f513 100644 --- a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc +++ b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc
@@ -99,7 +99,7 @@ // // If the shelf is at -Infinity or +Infinity at either end, the given area // always intersects. -bool Intersects(const NGExclusionSpace::NGShelf& shelf, +bool Intersects(const NGExclusionSpaceInternal::NGShelf& shelf, const NGBfcOffset& offset, const LayoutUnit inline_size) { if (shelf.line_right >= offset.line_offset && @@ -138,7 +138,7 @@ // Creates a new layout opportunity. The given shelf *must* intersect with the // given area (defined by offset and inline_size). NGLayoutOpportunity CreateLayoutOpportunity( - const NGExclusionSpace::NGShelf& shelf, + const NGExclusionSpaceInternal::NGShelf& shelf, const NGBfcOffset& offset, const LayoutUnit inline_size) { DCHECK(Intersects(shelf, offset, inline_size)); @@ -162,13 +162,14 @@ } // namespace -NGExclusionSpace::NGExclusionSpace() +NGExclusionSpaceInternal::NGExclusionSpaceInternal() : exclusions_(RefVector<scoped_refptr<const NGExclusion>>::Create()), num_exclusions_(0), both_clear_offset_(LayoutUnit::Min()), derived_geometry_(nullptr) {} -NGExclusionSpace::NGExclusionSpace(const NGExclusionSpace& other) +NGExclusionSpaceInternal::NGExclusionSpaceInternal( + const NGExclusionSpaceInternal& other) : exclusions_(other.exclusions_), num_exclusions_(other.num_exclusions_), both_clear_offset_(other.both_clear_offset_), @@ -178,13 +179,15 @@ other.derived_geometry_ = nullptr; } -NGExclusionSpace::NGExclusionSpace(NGExclusionSpace&& other) +NGExclusionSpaceInternal::NGExclusionSpaceInternal( + NGExclusionSpaceInternal&& other) : exclusions_(std::move(other.exclusions_)), num_exclusions_(other.num_exclusions_), both_clear_offset_(other.both_clear_offset_), derived_geometry_(std::move(other.derived_geometry_)) {} -NGExclusionSpace& NGExclusionSpace::operator=(const NGExclusionSpace& other) { +NGExclusionSpaceInternal& NGExclusionSpaceInternal::operator=( + const NGExclusionSpaceInternal& other) { exclusions_ = other.exclusions_; num_exclusions_ = other.num_exclusions_; both_clear_offset_ = other.both_clear_offset_; @@ -193,7 +196,7 @@ return *this; } -NGExclusionSpace::DerivedGeometry::DerivedGeometry() +NGExclusionSpaceInternal::DerivedGeometry::DerivedGeometry() : last_float_block_start_(LayoutUnit::Min()), left_float_clear_offset_(LayoutUnit::Min()), right_float_clear_offset_(LayoutUnit::Min()) { @@ -201,7 +204,7 @@ shelves_.emplace_back(/* block_offset */ LayoutUnit::Min()); } -void NGExclusionSpace::Add(scoped_refptr<const NGExclusion> exclusion) { +void NGExclusionSpaceInternal::Add(scoped_refptr<const NGExclusion> exclusion) { DCHECK_LE(num_exclusions_, exclusions_->size()); // Perform a copy-on-write if the number of exclusions has gone out of sync. @@ -227,7 +230,8 @@ num_exclusions_++; } -void NGExclusionSpace::DerivedGeometry::Add(const NGExclusion& exclusion) { +void NGExclusionSpaceInternal::DerivedGeometry::Add( + const NGExclusion& exclusion) { last_float_block_start_ = std::max(last_float_block_start_, exclusion.rect.BlockStartOffset()); @@ -484,7 +488,8 @@ #endif } -NGLayoutOpportunity NGExclusionSpace::DerivedGeometry::FindLayoutOpportunity( +NGLayoutOpportunity +NGExclusionSpaceInternal::DerivedGeometry::FindLayoutOpportunity( const NGBfcOffset& offset, const LayoutUnit available_inline_size, const NGLogicalSize& minimum_size) const { @@ -511,7 +516,7 @@ } LayoutOpportunityVector -NGExclusionSpace::DerivedGeometry::AllLayoutOpportunities( +NGExclusionSpaceInternal::DerivedGeometry::AllLayoutOpportunities( const NGBfcOffset& offset, const LayoutUnit available_inline_size) const { LayoutOpportunityVector opportunities; @@ -567,7 +572,7 @@ return opportunities; } -LayoutUnit NGExclusionSpace::DerivedGeometry::ClearanceOffset( +LayoutUnit NGExclusionSpaceInternal::DerivedGeometry::ClearanceOffset( EClear clear_type) const { switch (clear_type) { case EClear::kNone: @@ -585,8 +590,8 @@ return LayoutUnit::Min(); } -const NGExclusionSpace::DerivedGeometry& NGExclusionSpace::GetDerivedGeometry() - const { +const NGExclusionSpaceInternal::DerivedGeometry& +NGExclusionSpaceInternal::GetDerivedGeometry() const { // Re-build the geometry if it isn't present. if (!derived_geometry_) { derived_geometry_ = std::make_unique<DerivedGeometry>(); @@ -598,7 +603,8 @@ return *derived_geometry_; } -bool NGExclusionSpace::operator==(const NGExclusionSpace& other) const { +bool NGExclusionSpaceInternal::operator==( + const NGExclusionSpaceInternal& other) const { if (num_exclusions_ == 0 && other.num_exclusions_ == 0) return true; return num_exclusions_ == other.num_exclusions_ &&
diff --git a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h index bba16ba..724a45b 100644 --- a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h +++ b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h
@@ -20,27 +20,21 @@ typedef Vector<NGLayoutOpportunity, 8> LayoutOpportunityVector; -// The exclusion space represents all of the exclusions within a block -// formatting context. -// -// The space is mutated simply by adding exclusions, and various information -// can be queried based on the exclusions. -class CORE_EXPORT NGExclusionSpace { - USING_FAST_MALLOC(NGExclusionSpace); +// This class is an implementation detail. For use of the exclusion space, +// see NGExclusionSpace below. NGExclusionSpace was designed to be cheap +// to construct and cheap to copy if empty. +class CORE_EXPORT NGExclusionSpaceInternal { + USING_FAST_MALLOC(NGExclusionSpaceInternal); public: - NGExclusionSpace(); - NGExclusionSpace(const NGExclusionSpace&); - NGExclusionSpace(NGExclusionSpace&&) noexcept; - NGExclusionSpace& operator=(const NGExclusionSpace&); - ~NGExclusionSpace(){}; + NGExclusionSpaceInternal(); + NGExclusionSpaceInternal(const NGExclusionSpaceInternal&); + NGExclusionSpaceInternal(NGExclusionSpaceInternal&&) noexcept; + NGExclusionSpaceInternal& operator=(const NGExclusionSpaceInternal&); + ~NGExclusionSpaceInternal(){}; void Add(scoped_refptr<const NGExclusion> exclusion); - // Returns a layout opportunity, within the BFC. - // The area to search for layout opportunities is defined by the given offset, - // and available_inline_size. The layout opportunity must be greater than the - // given minimum_size. NGLayoutOpportunity FindLayoutOpportunity( const NGBfcOffset& offset, const LayoutUnit available_inline_size, @@ -75,7 +69,6 @@ available_inline_size); } - // Returns the clearance offset based on the provided {@code clear_type}. LayoutUnit ClearanceOffset(EClear clear_type) const { if (clear_type == EClear::kNone) return LayoutUnit::Min(); @@ -83,15 +76,14 @@ return GetDerivedGeometry().ClearanceOffset(clear_type); } - // Returns the block start offset of the last float added. LayoutUnit LastFloatBlockStart() const { return GetDerivedGeometry().LastFloatBlockStart(); } bool IsEmpty() const { return !num_exclusions_; } - bool operator==(const NGExclusionSpace& other) const; - bool operator!=(const NGExclusionSpace& other) const { + bool operator==(const NGExclusionSpaceInternal& other) const; + bool operator!=(const NGExclusionSpaceInternal& other) const { return !(*this == other); } @@ -183,8 +175,8 @@ private: // In order to reduce the amount of Vector copies, instances of a - // NGExclusionSpace can share the same exclusions_ Vector. See the copy - // constructor. + // NGExclusionSpaceInternal can share the same exclusions_ Vector. See the + // copy constructor. // // We implement a copy-on-write behaviour when adding an exclusion (if // exclusions_.size(), and num_exclusions_ differs). @@ -290,6 +282,102 @@ mutable std::unique_ptr<DerivedGeometry> derived_geometry_; }; +// The exclusion space represents all of the exclusions within a block +// formatting context. +// +// The space is mutated simply by adding exclusions, and various information +// can be queried based on the exclusions. +class CORE_EXPORT NGExclusionSpace { + DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); + + public: + NGExclusionSpace() = default; + NGExclusionSpace(const NGExclusionSpace& other) + : exclusion_space_(other.exclusion_space_ ? new NGExclusionSpaceInternal( + *other.exclusion_space_) + : nullptr) {} + NGExclusionSpace(NGExclusionSpace&& other) noexcept + : exclusion_space_(std::move(other.exclusion_space_)) {} + + NGExclusionSpace& operator=(const NGExclusionSpace& other) { + exclusion_space_ = other.exclusion_space_ + ? std::make_unique<NGExclusionSpaceInternal>( + *other.exclusion_space_) + : nullptr; + return *this; + } + + void Add(scoped_refptr<const NGExclusion> exclusion) { + if (!exclusion_space_) + exclusion_space_ = std::make_unique<NGExclusionSpaceInternal>(); + exclusion_space_->Add(exclusion); + } + + // Returns a layout opportunity, within the BFC. + // The area to search for layout opportunities is defined by the given offset, + // and available_inline_size. The layout opportunity must be greater than the + // given minimum_size. + NGLayoutOpportunity FindLayoutOpportunity( + const NGBfcOffset& offset, + const LayoutUnit available_inline_size, + const NGLogicalSize& minimum_size) const { + if (!exclusion_space_) { + NGBfcOffset end_offset( + offset.line_offset + available_inline_size.ClampNegativeToZero(), + LayoutUnit::Max()); + return NGLayoutOpportunity(NGBfcRect(offset, end_offset), nullptr); + } + return exclusion_space_->FindLayoutOpportunity( + offset, available_inline_size, minimum_size); + } + + LayoutOpportunityVector AllLayoutOpportunities( + const NGBfcOffset& offset, + const LayoutUnit available_inline_size) const { + if (!exclusion_space_) { + NGBfcOffset end_offset( + offset.line_offset + available_inline_size.ClampNegativeToZero(), + LayoutUnit::Max()); + return LayoutOpportunityVector( + {NGLayoutOpportunity(NGBfcRect(offset, end_offset), nullptr)}); + } + return exclusion_space_->AllLayoutOpportunities(offset, + available_inline_size); + } + + // Returns the clearance offset based on the provided {@code clear_type}. + LayoutUnit ClearanceOffset(EClear clear_type) const { + if (!exclusion_space_) + return LayoutUnit::Min(); + return exclusion_space_->ClearanceOffset(clear_type); + } + + // Returns the block start offset of the last float added. + LayoutUnit LastFloatBlockStart() const { + if (!exclusion_space_) + return LayoutUnit::Min(); + return exclusion_space_->LastFloatBlockStart(); + } + + bool IsEmpty() const { + return !exclusion_space_ || exclusion_space_->IsEmpty(); + } + + bool operator==(const NGExclusionSpace& other) const { + if (exclusion_space_ == other.exclusion_space_) + return true; + if (exclusion_space_ && other.exclusion_space_) + return *exclusion_space_ == *other.exclusion_space_; + return false; + } + bool operator!=(const NGExclusionSpace& other) const { + return !(*this == other); + } + + private: + std::unique_ptr<NGExclusionSpaceInternal> exclusion_space_; +}; + } // namespace blink #endif // NGExclusionSpace_h
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc index 670bb2f1..97e8c200 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -613,8 +613,7 @@ } scoped_refptr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() { - std::unique_ptr<NGExclusionSpace> initial_exclusion_space( - std::make_unique<NGExclusionSpace>(ConstraintSpace().ExclusionSpace())); + NGExclusionSpace initial_exclusion_space(ConstraintSpace().ExclusionSpace()); bool is_empty_inline = Node().IsEmptyInline(); @@ -649,13 +648,12 @@ // In order to get the correct list of layout opportunities, we need to // position any "leading" items (floats) within the exclusion space first. - unsigned handled_item_index = - PositionLeadingFloats(initial_exclusion_space.get()); + unsigned handled_item_index = PositionLeadingFloats(&initial_exclusion_space); // We query all the layout opportunities on the initial exclusion space up // front, as if the line breaker may add floats and change the opportunities. const LayoutOpportunityVector opportunities = - initial_exclusion_space->AllLayoutOpportunities( + initial_exclusion_space.AllLayoutOpportunities( ConstraintSpace().BfcOffset(), ConstraintSpace().AvailableSize().inline_size); @@ -663,7 +661,7 @@ // We shouldn't have any unpositioned floats if we aren't empty. DCHECK(unpositioned_floats_.IsEmpty() || is_empty_inline); - std::unique_ptr<NGExclusionSpace> exclusion_space; + NGExclusionSpace exclusion_space; NGInlineBreakToken* break_token = BreakToken(); LayoutUnit line_block_size; @@ -694,19 +692,17 @@ positioned_floats.clear(); unpositioned_floats_.clear(); container_builder_.Reset(); - exclusion_space = - std::make_unique<NGExclusionSpace>(*initial_exclusion_space); + exclusion_space = initial_exclusion_space; NGLineLayoutOpportunity line_opportunity = opportunity.ComputeLineLayoutOpportunity(ConstraintSpace(), line_block_size, block_delta); NGLineInfo line_info; - NGLineBreaker line_breaker(Node(), NGLineBreakerMode::kContent, - constraint_space_, &positioned_floats, - &unpositioned_floats_, &container_builder_, - exclusion_space.get(), handled_item_index, - line_opportunity, break_token); + NGLineBreaker line_breaker( + Node(), NGLineBreakerMode::kContent, constraint_space_, + &positioned_floats, &unpositioned_floats_, &container_builder_, + &exclusion_space, handled_item_index, line_opportunity, break_token); line_breaker.NextLine(&line_info); // If this fragment will be larger than the inline-size of the opportunity, @@ -734,7 +730,7 @@ } PrepareBoxStates(line_info, break_token); - CreateLine(&line_info, exclusion_space.get()); + CreateLine(&line_info, &exclusion_space); // We now can check the block-size of the fragment, and it fits within the // opportunity. @@ -786,13 +782,13 @@ DCHECK_EQ(container_builder_.BlockSize(), 0); } else { // Place any remaining floats which couldn't fit on the line. - PositionPendingFloats(line_height, exclusion_space.get()); + PositionPendingFloats(line_height, &exclusion_space); // A <br clear=both> will strech the line-box height, such that the // block-end edge will clear any floats. // TODO(ikilpatrick): Move this into ng_block_layout_algorithm. container_builder_.SetBlockSize( - ComputeContentSize(line_info, *exclusion_space, line_height)); + ComputeContentSize(line_info, exclusion_space, line_height)); } break; } @@ -800,9 +796,7 @@ // We shouldn't have any unpositioned floats if we aren't empty. DCHECK(unpositioned_floats_.IsEmpty() || is_empty_inline); container_builder_.SwapPositionedFloats(&positioned_floats_); - container_builder_.SetExclusionSpace( - exclusion_space ? std::move(exclusion_space) - : std::move(initial_exclusion_space)); + container_builder_.SetExclusionSpace(std::move(exclusion_space)); container_builder_.MoveOutOfFlowDescendantCandidatesToDescendants(nullptr); return container_builder_.ToLineBoxFragment(); }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h index 4522aee3..44f800f 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h
@@ -19,6 +19,7 @@ namespace blink { class NGConstraintSpace; +class NGExclusionSpace; class NGInlineBreakToken; class NGInlineNode; class NGInlineItem;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc index b6ee9a0..18aea29 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.cc
@@ -149,9 +149,10 @@ : NGInlineBreakToken::Create(node_))); return base::AdoptRef(new NGLayoutResult( - std::move(fragment), oof_positioned_descendants_, positioned_floats_, - unpositioned_list_marker_, std::move(exclusion_space_), bfc_line_offset_, - bfc_block_offset_, end_margin_strut_, + std::move(fragment), std::move(oof_positioned_descendants_), + std::move(positioned_floats_), unpositioned_list_marker_, + std::move(exclusion_space_), bfc_line_offset_, bfc_block_offset_, + end_margin_strut_, /* intrinsic_block_size */ LayoutUnit(), /* minimal_space_shortage */ LayoutUnit::Max(), EBreakBetween::kAuto, EBreakBetween::kAuto, /* has_forced_break */ false, is_pushed_by_floats_,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h index e107aef2..5149c48e 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -183,6 +183,8 @@ scoped_refptr<NGInlineBreakToken> break_token_; TextDirection base_direction_; + + DISALLOW_COPY_AND_ASSIGN(NGLineBoxFragmentBuilder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc index d1e91f9..e65db54 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -158,7 +158,7 @@ NGBlockBreakToken* break_token) : NGLayoutAlgorithm(node, space, break_token), is_resuming_(break_token && !break_token->IsBreakBefore()), - exclusion_space_(new NGExclusionSpace(space.ExclusionSpace())) {} + exclusion_space_(space.ExclusionSpace()) {} // Define the destructor here, so that we can forward-declare more in the // header. @@ -537,9 +537,8 @@ // If the current layout is a new formatting context, we need to encapsulate // all of our floats. if (ConstraintSpace().IsNewFormattingContext()) { - intrinsic_block_size_ = - std::max(intrinsic_block_size_, - exclusion_space_->ClearanceOffset(EClear::kBoth)); + intrinsic_block_size_ = std::max( + intrinsic_block_size_, exclusion_space_.ClearanceOffset(EClear::kBoth)); } // The end margin strut of an in-flow fragment contributes to the size of the @@ -671,7 +670,6 @@ // An exclusion space is confined to nodes within the same formatting context. if (!ConstraintSpace().IsNewFormattingContext()) { - DCHECK(exclusion_space_); container_builder_.SetExclusionSpace(std::move(exclusion_space_)); } @@ -966,7 +964,7 @@ bool abort_if_cleared) { // The origin offset is where we should start looking for layout // opportunities. It needs to be adjusted by the child's clearance. - AdjustToClearance(exclusion_space_->ClearanceOffset(child.Style().Clear()), + AdjustToClearance(exclusion_space_.ClearanceOffset(child.Style().Clear()), &origin_offset); DCHECK(container_builder_.BfcBlockOffset()); @@ -985,7 +983,7 @@ .ClampNegativeToZero(); LayoutOpportunityVector opportunities = - exclusion_space_->AllLayoutOpportunities(origin_offset, inline_size); + exclusion_space_.AllLayoutOpportunities(origin_offset, inline_size); // We should always have at least one opportunity. DCHECK_GT(opportunities.size(), 0u); @@ -1037,7 +1035,7 @@ // Since this child establishes a new formatting context, no exclusion space // should be returned. - DCHECK(!layout_result->ExclusionSpace()); + DCHECK(layout_result->ExclusionSpace().IsEmpty()); DCHECK(layout_result->PhysicalFragment()); NGFragment fragment(ConstraintSpace().GetWritingMode(), @@ -1233,9 +1231,7 @@ } // It is now safe to update our version of the exclusion space. - DCHECK(layout_result->ExclusionSpace()); - exclusion_space_ = - std::make_unique<NGExclusionSpace>(*layout_result->ExclusionSpace()); + exclusion_space_ = layout_result->ExclusionSpace(); // If we don't know our BFC block offset yet, and the child stumbled into // something that needs it (unable to position floats when the BFC block @@ -1843,7 +1839,7 @@ } else { const ComputedStyle& child_style = child.Style(); LayoutUnit child_clearance_offset = - exclusion_space_->ClearanceOffset(child_style.Clear()); + exclusion_space_.ClearanceOffset(child_style.Clear()); clearance_offset = std::max(clearance_offset, child_clearance_offset); space_builder.SetIsShrinkToFit(ShouldShrinkToFit(Style(), child_style)); space_builder.SetTextDirection(child_style.Direction()); @@ -1860,7 +1856,7 @@ space_builder.SetShouldForceClearance(true); if (!is_new_fc) { - space_builder.SetExclusionSpace(*exclusion_space_); + space_builder.SetExclusionSpace(exclusion_space_); space_builder.SetAdjoiningFloatTypes( container_builder_.AdjoiningFloatTypes()); } @@ -2052,7 +2048,7 @@ const auto positioned_floats = PositionFloats(child_available_size_, child_percentage_size_, origin_bfc_offset, bfc_block_offset, unpositioned_floats_, - ConstraintSpace(), exclusion_space_.get()); + ConstraintSpace(), &exclusion_space_); AddPositionedFloats(positioned_floats);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h index dab8d19c..abc0826 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
@@ -7,6 +7,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_margin_strut.h" #include "third_party/blink/renderer/core/layout/ng/ng_block_break_token.h" #include "third_party/blink/renderer/core/layout/ng/ng_block_node.h" @@ -299,7 +300,7 @@ bool has_processed_first_child_ = false; - std::unique_ptr<NGExclusionSpace> exclusion_space_; + NGExclusionSpace exclusion_space_; NGUnpositionedFloatVector unpositioned_floats_; };
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.cc b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.cc index 5e32e73..424deb8 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.cc
@@ -48,7 +48,7 @@ margin_strut_(margin_strut), bfc_offset_(bfc_offset), floats_bfc_block_offset_(floats_bfc_block_offset), - exclusion_space_(std::make_unique<NGExclusionSpace>(exclusion_space)), + exclusion_space_(exclusion_space), clearance_offset_(clearance_offset) { baseline_requests_.swap(baseline_requests); } @@ -184,10 +184,6 @@ } bool NGConstraintSpace::operator==(const NGConstraintSpace& other) const { - if (exclusion_space_ && other.exclusion_space_ && - *exclusion_space_ != *other.exclusion_space_) - return false; - return available_size_ == other.available_size_ && percentage_resolution_size_ == other.percentage_resolution_size_ && parent_percentage_resolution_inline_size_ == @@ -206,6 +202,7 @@ margin_strut_ == other.margin_strut_ && bfc_offset_ == other.bfc_offset_ && floats_bfc_block_offset_ == other.floats_bfc_block_offset_ && + exclusion_space_ == other.exclusion_space_ && clearance_offset_ == other.clearance_offset_ && baseline_requests_ == other.baseline_requests_; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h index 73c7bd7b..d8b4c02 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h +++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
@@ -58,7 +58,7 @@ static scoped_refptr<NGConstraintSpace> CreateFromLayoutObject( const LayoutBox&); - const NGExclusionSpace& ExclusionSpace() const { return *exclusion_space_; } + const NGExclusionSpace& ExclusionSpace() const { return exclusion_space_; } TextDirection Direction() const { return static_cast<TextDirection>(direction_); @@ -294,7 +294,7 @@ NGBfcOffset bfc_offset_; base::Optional<LayoutUnit> floats_bfc_block_offset_; - const std::unique_ptr<const NGExclusionSpace> exclusion_space_; + const NGExclusionSpace exclusion_space_; LayoutUnit clearance_offset_; Vector<NGBaselineRequest> baseline_requests_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc index fb9e2d2..1d58500 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
@@ -151,9 +151,8 @@ bool is_new_fc_ = flags_ & NGConstraintSpace::kNewFormattingContext; DCHECK(!is_new_fc_ || !adjoining_floats_); - DEFINE_STATIC_LOCAL(NGExclusionSpace, empty_exclusion_space, ()); const NGExclusionSpace& exclusion_space = (is_new_fc_ || !exclusion_space_) - ? empty_exclusion_space + ? NGExclusionSpace() : *exclusion_space_; NGBfcOffset bfc_offset = is_new_fc_ ? NGBfcOffset() : bfc_offset_; NGMarginStrut margin_strut = is_new_fc_ ? NGMarginStrut() : margin_strut_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc index 02ff8195..c0f42002 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -34,7 +34,7 @@ } NGContainerFragmentBuilder& NGContainerFragmentBuilder::SetExclusionSpace( - std::unique_ptr<const NGExclusionSpace> exclusion_space) { + NGExclusionSpace&& exclusion_space) { exclusion_space_ = std::move(exclusion_space); return *this; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h index 7c88074..b83499f 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h +++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -7,6 +7,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_logical_size.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_margin_strut.h" @@ -61,7 +62,7 @@ NGContainerFragmentBuilder& SetEndMarginStrut(const NGMarginStrut&); NGContainerFragmentBuilder& SetExclusionSpace( - std::unique_ptr<const NGExclusionSpace> exclusion_space); + NGExclusionSpace&& exclusion_space); const NGUnpositionedListMarker& UnpositionedListMarker() const { return unpositioned_list_marker_; @@ -199,7 +200,7 @@ LayoutUnit bfc_line_offset_; base::Optional<LayoutUnit> bfc_block_offset_; NGMarginStrut end_margin_strut_; - std::unique_ptr<const NGExclusionSpace> exclusion_space_; + NGExclusionSpace exclusion_space_; Vector<NGOutOfFlowPositionedCandidate> oof_positioned_candidates_; Vector<NGOutOfFlowPositionedDescendant> oof_positioned_descendants_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc index fbe4d56..eeddb4c 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.cc
@@ -321,12 +321,12 @@ Vector<NGPositionedFloat> positioned_floats; return base::AdoptRef(new NGLayoutResult( - std::move(fragment), oof_positioned_descendants_, positioned_floats, - unpositioned_list_marker_, std::move(exclusion_space_), bfc_line_offset_, - bfc_block_offset_, end_margin_strut_, intrinsic_block_size_, - minimal_space_shortage_, initial_break_before_, previous_break_after_, - has_forced_break_, is_pushed_by_floats_, adjoining_floats_, - NGLayoutResult::kSuccess)); + std::move(fragment), std::move(oof_positioned_descendants_), + std::move(positioned_floats), unpositioned_list_marker_, + std::move(exclusion_space_), bfc_line_offset_, bfc_block_offset_, + end_margin_strut_, intrinsic_block_size_, minimal_space_shortage_, + initial_break_before_, previous_break_after_, has_forced_break_, + is_pushed_by_floats_, adjoining_floats_, NGLayoutResult::kSuccess)); } scoped_refptr<NGLayoutResult> NGFragmentBuilder::Abort( @@ -334,8 +334,9 @@ Vector<NGOutOfFlowPositionedDescendant> oof_positioned_descendants; Vector<NGPositionedFloat> positioned_floats; return base::AdoptRef(new NGLayoutResult( - nullptr, oof_positioned_descendants, positioned_floats, - NGUnpositionedListMarker(), nullptr, bfc_line_offset_, bfc_block_offset_, + nullptr, std::move(oof_positioned_descendants), + std::move(positioned_floats), NGUnpositionedListMarker(), + NGExclusionSpace(), bfc_line_offset_, bfc_block_offset_, end_margin_strut_, LayoutUnit(), LayoutUnit(), EBreakBetween::kAuto, EBreakBetween::kAuto, false, false, kFloatTypeNone, status)); }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc index efb0076..7c47dcb 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc
@@ -14,10 +14,10 @@ NGLayoutResult::NGLayoutResult( scoped_refptr<const NGPhysicalFragment> physical_fragment, - Vector<NGOutOfFlowPositionedDescendant>& oof_positioned_descendants, - Vector<NGPositionedFloat>& positioned_floats, + Vector<NGOutOfFlowPositionedDescendant>&& oof_positioned_descendants, + Vector<NGPositionedFloat>&& positioned_floats, const NGUnpositionedListMarker& unpositioned_list_marker, - std::unique_ptr<const NGExclusionSpace> exclusion_space, + NGExclusionSpace&& exclusion_space, LayoutUnit bfc_line_offset, const base::Optional<LayoutUnit> bfc_block_offset, const NGMarginStrut end_margin_strut, @@ -55,18 +55,13 @@ Vector<NGOutOfFlowPositionedDescendant> oof_positioned_descendants( oof_positioned_descendants_); Vector<NGPositionedFloat> positioned_floats(positioned_floats_); - std::unique_ptr<const NGExclusionSpace> exclusion_space; - // TODO(layoutng) Replace this with DCHECK(exclusion_space_) when - // callers guarantee exclusion_space_ != null. - if (exclusion_space_) { - exclusion_space = std::make_unique<NGExclusionSpace>(*exclusion_space_); - } return base::AdoptRef(new NGLayoutResult( - root_fragment_.fragment_, oof_positioned_descendants, positioned_floats, - unpositioned_list_marker_, std::move(exclusion_space), bfc_line_offset_, - bfc_block_offset_, end_margin_strut_, intrinsic_block_size_, - minimal_space_shortage_, initial_break_before_, final_break_after_, - has_forced_break_, is_pushed_by_floats_, adjoining_floats_, Status())); + root_fragment_.fragment_, std::move(oof_positioned_descendants), + std::move(positioned_floats), unpositioned_list_marker_, + NGExclusionSpace(exclusion_space_), bfc_line_offset_, bfc_block_offset_, + end_margin_strut_, intrinsic_block_size_, minimal_space_shortage_, + initial_break_before_, final_break_after_, has_forced_break_, + is_pushed_by_floats_, adjoining_floats_, Status())); } } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h index 84e32ed..c62d89d2 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
@@ -7,6 +7,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_margin_strut.h" #include "third_party/blink/renderer/core/layout/ng/list/ng_unpositioned_list_marker.h" @@ -62,9 +63,7 @@ return unpositioned_list_marker_; } - const NGExclusionSpace* ExclusionSpace() const { - return exclusion_space_.get(); - } + const NGExclusionSpace& ExclusionSpace() const { return exclusion_space_; } NGLayoutResultStatus Status() const { return static_cast<NGLayoutResultStatus>(status_); @@ -116,11 +115,11 @@ friend class NGLineBoxFragmentBuilder; NGLayoutResult(scoped_refptr<const NGPhysicalFragment> physical_fragment, - Vector<NGOutOfFlowPositionedDescendant>& + Vector<NGOutOfFlowPositionedDescendant>&& out_of_flow_positioned_descendants, - Vector<NGPositionedFloat>& positioned_floats, + Vector<NGPositionedFloat>&& positioned_floats, const NGUnpositionedListMarker& unpositioned_list_marker, - std::unique_ptr<const NGExclusionSpace> exclusion_space, + NGExclusionSpace&& exclusion_space, LayoutUnit bfc_line_offset, const base::Optional<LayoutUnit> bfc_block_offset, const NGMarginStrut end_margin_strut, @@ -140,7 +139,7 @@ NGUnpositionedListMarker unpositioned_list_marker_; - const std::unique_ptr<const NGExclusionSpace> exclusion_space_; + const NGExclusionSpace exclusion_space_; const LayoutUnit bfc_line_offset_; const base::Optional<LayoutUnit> bfc_block_offset_; const NGMarginStrut end_margin_strut_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_link.h b/third_party/blink/renderer/core/layout/ng/ng_link.h index a36f9d4..0f16e2e 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_link.h +++ b/third_party/blink/renderer/core/layout/ng/ng_link.h
@@ -27,6 +27,9 @@ NGLink(NGLink&& o) noexcept : fragment_(std::move(o.fragment_)), offset_(o.offset_) {} ~NGLink() = default; + NGLink(const NGLink&) = default; + NGLink& operator=(const NGLink&) = default; + NGLink& operator=(NGLink&&) = default; // Returns the offset relative to the parent fragment's content-box. NGPhysicalOffset Offset() const { return offset_; } @@ -46,8 +49,6 @@ friend class NGFragmentBuilder; friend class NGLineBoxFragmentBuilder; friend class NGLayoutResult; - - DISALLOW_COPY_AND_ASSIGN(NGLink); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 62d3b18c..f9fa4af 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -137,7 +137,8 @@ in_data_received_(false), data_buffer_(SharedBuffer::Create()), devtools_navigation_token_(devtools_navigation_token), - user_activated_(false), + had_sticky_activation_(false), + had_transient_activation_(Frame::HasTransientUserActivation(frame_)), use_counter_(frame_->GetChromeClient().IsSVGImageChromeClient() ? UseCounter::kSVGImageContext : UseCounter::kDefaultContext) { @@ -469,7 +470,7 @@ } void DocumentLoader::SetUserActivated() { - user_activated_ = true; + had_sticky_activation_ = true; } const AtomicString& DocumentLoader::RequiredCSP() { @@ -1138,10 +1139,12 @@ // The DocumentLoader was flagged as activated if it needs to notify the frame // that it was activated before navigation. Update the frame state based on // the new value. - if (frame_->HasReceivedUserGestureBeforeNavigation() != user_activated_) { - frame_->SetDocumentHasReceivedUserGestureBeforeNavigation(user_activated_); + if (frame_->HasReceivedUserGestureBeforeNavigation() != + had_sticky_activation_) { + frame_->SetDocumentHasReceivedUserGestureBeforeNavigation( + had_sticky_activation_); GetLocalFrameClient().SetHasReceivedUserGestureBeforeNavigation( - user_activated_); + had_sticky_activation_); } if (ShouldClearWindowName(*frame_, previous_security_origin, *document)) {
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h index 5aa5120..07a75d3 100644 --- a/third_party/blink/renderer/core/loader/document_loader.h +++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -290,6 +290,8 @@ const SecurityOrigin* previous_security_origin, const Document& new_document); + bool had_transient_activation() const { return had_transient_activation_; } + Vector<KURL> redirect_chain_; private: @@ -429,8 +431,11 @@ scoped_refptr<SharedBuffer> data_buffer_; base::UnguessableToken devtools_navigation_token_; - // Whether this load request comes from a user activation. - bool user_activated_; + // Whether this load request comes with a sitcky user activation. + bool had_sticky_activation_; + // Whether this load request had a user activation when created. + bool had_transient_activation_; + // This UseCounter tracks feature usage associated with the lifetime of the // document load. Features recorded prior to commit will be recorded locally. // Once commited, feature usage will be piped to the browser side page load
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index 5673852..7791a67 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -913,7 +913,14 @@ policy == kNavigationPolicyHandledByClient || policy == kNavigationPolicyHandledByClientForInitialHistory); - if (!CancelProvisionalLoaderForNewNavigation(policy)) + bool cancel_scheduled_navigations = policy != kNavigationPolicyCurrentTab; + if (!CancelProvisionalLoaderForNewNavigation(cancel_scheduled_navigations)) + return; + + // TODO(japhet): This case wants to flag the frame as loading and do nothing + // else. It'd be nice if it could go through the placeholder DocumentLoader + // path, too. + if (policy == kNavigationPolicyHandledByClientForInitialHistory) return; provisional_document_loader_ = CreateDocumentLoader( @@ -1009,8 +1016,10 @@ RecordLatestRequiredCSP(); - if (!CancelProvisionalLoaderForNewNavigation(kNavigationPolicyCurrentTab)) + if (!CancelProvisionalLoaderForNewNavigation( + false /* cancel_scheduled_navigations */)) { return; + } // TODO(dgozman): navigation type should probably be passed by the caller. // It seems incorrect to pass |false| for |have_event| and then use @@ -1502,7 +1511,7 @@ } bool FrameLoader::CancelProvisionalLoaderForNewNavigation( - NavigationPolicy navigation_policy) { + bool cancel_scheduled_navigations) { bool had_placeholder_client_document_loader = provisional_document_loader_ && !provisional_document_loader_->DidStart(); @@ -1529,19 +1538,10 @@ return false; progress_tracker_->ProgressStarted(); - // TODO(japhet): This case wants to flag the frame as loading and do nothing - // else. It'd be nice if it could go through the placeholder DocumentLoader - // path, too. - if (navigation_policy == kNavigationPolicyHandledByClientForInitialHistory) - return false; - DCHECK(navigation_policy == kNavigationPolicyCurrentTab || - navigation_policy == kNavigationPolicyHandledByClient); // We need to ensure that script initiated navigations are honored. - if (!had_placeholder_client_document_loader || - navigation_policy == kNavigationPolicyHandledByClient) { + if (!had_placeholder_client_document_loader || cancel_scheduled_navigations) frame_->GetNavigationScheduler().Cancel(); - } return true; }
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h index 3360a8c..2771023 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.h +++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -243,7 +243,8 @@ void ProcessFragment(const KURL&, WebFrameLoadType, LoadStartType); // Returns whether we should continue with new navigation. - bool CancelProvisionalLoaderForNewNavigation(NavigationPolicy); + bool CancelProvisionalLoaderForNewNavigation( + bool cancel_scheduled_navigations); void ClearInitialScrollState();
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 5af515b..061abdd 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -382,6 +382,15 @@ WebRange range = selected_frame->GetInputMethodController().GetSelectionOffsets(); data.selection_start_offset = range.StartOffset(); + // TODO(crbug.com/850954): Remove redundant log after we identified the + // issue. + DCHECK_GE(data.selection_start_offset, 0) + << "Log issue against https://crbug.com/850954\n" + << "data.selection_start_offset: " << data.selection_start_offset + << "\nrange: [" << range.StartOffset() << ", " << range.EndOffset() + << "]\nVisibleSelection: " + << selected_frame->Selection() + .ComputeVisibleSelectionInDOMTreeDeprecated(); } if (result.IsContentEditable()) {
diff --git a/third_party/blink/renderer/core/paint/BUILD.gn b/third_party/blink/renderer/core/paint/BUILD.gn index d13a316..913fe19 100644 --- a/third_party/blink/renderer/core/paint/BUILD.gn +++ b/third_party/blink/renderer/core/paint/BUILD.gn
@@ -76,6 +76,8 @@ "embedded_object_painter.h", "fallback_theme.cc", "fallback_theme.h", + "fieldset_paint_info.cc", + "fieldset_paint_info.h", "fieldset_painter.cc", "fieldset_painter.h", "file_upload_control_painter.cc",
diff --git a/third_party/blink/renderer/core/paint/fieldset_paint_info.cc b/third_party/blink/renderer/core/paint/fieldset_paint_info.cc new file mode 100644 index 0000000..4f49214 --- /dev/null +++ b/third_party/blink/renderer/core/paint/fieldset_paint_info.cc
@@ -0,0 +1,53 @@ +// 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. + +#include "third_party/blink/renderer/core/paint/fieldset_paint_info.h" + +#include "third_party/blink/renderer/core/style/computed_style.h" + +namespace blink { + +FieldsetPaintInfo::FieldsetPaintInfo(const ComputedStyle& fieldset_style, + LayoutSize fieldset_size, + LayoutRectOutsets fieldset_borders, + LayoutRect legend_border_box) { + if (fieldset_style.IsHorizontalWritingMode()) { + // horizontal-tb + LayoutUnit legend_size = legend_border_box.Height(); + LayoutUnit border_size = fieldset_borders.Top(); + LayoutUnit legend_excess_size = legend_size - border_size; + if (legend_excess_size > LayoutUnit()) + border_outsets.SetTop(legend_excess_size / 2); + legend_cutout_rect = LayoutRect(legend_border_box.X(), LayoutUnit(), + legend_border_box.Width(), + std::max(legend_size, border_size)); + } else { + LayoutUnit legend_size = legend_border_box.Width(); + LayoutUnit border_size; + if (fieldset_style.IsFlippedBlocksWritingMode()) { + // vertical-rl + border_size = fieldset_borders.Right(); + LayoutUnit legend_excess_size = legend_size - border_size; + if (legend_excess_size > LayoutUnit()) + border_outsets.SetRight(legend_excess_size / 2); + } else { + // vertical-lr + border_size = fieldset_borders.Left(); + LayoutUnit legend_excess_size = legend_size - border_size; + if (legend_excess_size > LayoutUnit()) + border_outsets.SetLeft(legend_excess_size / 2); + } + LayoutUnit legend_total_block_size = std::max(legend_size, border_size); + legend_cutout_rect = + LayoutRect(LayoutUnit(), legend_border_box.Y(), legend_total_block_size, + legend_border_box.Height()); + if (fieldset_style.IsFlippedBlocksWritingMode()) { + // Offset cutout to right fieldset edge for vertical-rl + LayoutUnit clip_x = fieldset_size.Width() - legend_total_block_size; + legend_cutout_rect.Move(clip_x, LayoutUnit()); + } + } +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/paint/fieldset_paint_info.h b/third_party/blink/renderer/core/paint/fieldset_paint_info.h new file mode 100644 index 0000000..c8442df --- /dev/null +++ b/third_party/blink/renderer/core/paint/fieldset_paint_info.h
@@ -0,0 +1,35 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_FIELDSET_PAINT_INFO_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_FIELDSET_PAINT_INFO_H_ + +#include "third_party/blink/renderer/platform/geometry/layout_rect.h" +#include "third_party/blink/renderer/platform/geometry/layout_rect_outsets.h" + +namespace blink { + +class ComputedStyle; + +struct FieldsetPaintInfo { + // Calculate the fieldset block-start border offset and the cut-out rectangle + // caused by the rendered legend. + FieldsetPaintInfo(const ComputedStyle& fieldset_style, + LayoutSize fieldset_size, + LayoutRectOutsets fieldset_borders, + LayoutRect legend_border_box); + + // Block-start border outset caused by the rendered legend. + LayoutRectOutsets border_outsets; + + // The cutout rectangle (where the border is not to be painted) occupied by + // the legend. Note that this may intersect with other border sides than the + // block-start one, if the legend happens to overlap with any of the other + // borders. + LayoutRect legend_cutout_rect; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_FIELDSET_PAINT_INFO_H_
diff --git a/third_party/blink/renderer/core/paint/fieldset_painter.cc b/third_party/blink/renderer/core/paint/fieldset_painter.cc index 845d6b93..5d762f2c 100644 --- a/third_party/blink/renderer/core/paint/fieldset_painter.cc +++ b/third_party/blink/renderer/core/paint/fieldset_painter.cc
@@ -9,12 +9,27 @@ #include "third_party/blink/renderer/core/paint/box_decoration_data.h" #include "third_party/blink/renderer/core/paint/box_model_object_painter.h" #include "third_party/blink/renderer/core/paint/box_painter.h" +#include "third_party/blink/renderer/core/paint/fieldset_paint_info.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h" namespace blink { +namespace { + +FieldsetPaintInfo CreateFieldsetPaintInfo(const LayoutBox& fieldset, + const LayoutBox& legend) { + LayoutRectOutsets fieldset_borders( + fieldset.BorderTop(), fieldset.BorderRight(), + LayoutUnit(), // bottom border will always be left alone. + fieldset.BorderLeft()); + return FieldsetPaintInfo(fieldset.StyleRef(), fieldset.Size(), + fieldset_borders, legend.FrameRect()); +} + +} // anonymous namespace + void FieldsetPainter::PaintBoxDecorationBackground( const PaintInfo& paint_info, const LayoutPoint& paint_offset) { @@ -28,24 +43,9 @@ paint_info.context, layout_fieldset_, paint_info.phase)) return; - // FIXME: We need to work with "rl" and "bt" block flow directions. In those - // cases the legend is embedded in the right and bottom borders respectively. - // https://bugs.webkit.org/show_bug.cgi?id=47236 - if (layout_fieldset_.StyleRef().IsHorizontalWritingMode()) { - LayoutUnit y_off = - (legend->Location().Y() > 0) - ? LayoutUnit() - : (legend->Size().Height() - layout_fieldset_.BorderTop()) / 2; - paint_rect.SetHeight(paint_rect.Height() - y_off); - paint_rect.SetY(paint_rect.Y() + y_off); - } else { - LayoutUnit x_off = - (legend->Location().X() > 0) - ? LayoutUnit() - : (legend->Size().Width() - layout_fieldset_.BorderLeft()) / 2; - paint_rect.SetWidth(paint_rect.Width() - x_off); - paint_rect.SetX(paint_rect.X() + x_off); - } + FieldsetPaintInfo fieldset_paint_info = + CreateFieldsetPaintInfo(layout_fieldset_, *legend); + paint_rect.Contract(fieldset_paint_info.border_outsets); DrawingRecorder recorder(paint_info.context, layout_fieldset_, paint_info.phase); @@ -68,27 +68,9 @@ GraphicsContext& graphics_context = paint_info.context; GraphicsContextStateSaver state_saver(graphics_context); - // FIXME: We need to work with "rl" and "bt" block flow directions. In those - // cases the legend is embedded in the right and bottom borders respectively. - // https://bugs.webkit.org/show_bug.cgi?id=47236 - if (layout_fieldset_.StyleRef().IsHorizontalWritingMode()) { - LayoutUnit clip_top = paint_rect.Y(); - LayoutUnit clip_height = max( - static_cast<LayoutUnit>(layout_fieldset_.StyleRef().BorderTopWidth()), - legend->Size().Height() - - ((legend->Size().Height() - layout_fieldset_.BorderTop()) / 2)); - graphics_context.ClipOut( - PixelSnappedIntRect(paint_rect.X() + legend->Location().X(), clip_top, - legend->Size().Width(), clip_height)); - } else { - LayoutUnit clip_left = paint_rect.X(); - LayoutUnit clip_width = max( - static_cast<LayoutUnit>(layout_fieldset_.StyleRef().BorderLeftWidth()), - legend->Size().Width()); - graphics_context.ClipOut( - PixelSnappedIntRect(clip_left, paint_rect.Y() + legend->Location().Y(), - clip_width, legend->Size().Height())); - } + LayoutRect legend_cutout_rect = fieldset_paint_info.legend_cutout_rect; + legend_cutout_rect.MoveBy(paint_offset); + graphics_context.ClipOut(PixelSnappedIntRect(legend_cutout_rect)); Node* node = nullptr; const LayoutObject* layout_object = &layout_fieldset_; @@ -114,24 +96,9 @@ paint_info.context, layout_fieldset_, paint_info.phase)) return; - // FIXME: We need to work with "rl" and "bt" block flow directions. In those - // cases the legend is embedded in the right and bottom borders respectively. - // https://bugs.webkit.org/show_bug.cgi?id=47236 - if (layout_fieldset_.StyleRef().IsHorizontalWritingMode()) { - LayoutUnit y_off = - (legend->Location().Y() > LayoutUnit()) - ? LayoutUnit() - : (legend->Size().Height() - layout_fieldset_.BorderTop()) / 2; - paint_rect.Expand(LayoutUnit(), -y_off); - paint_rect.Move(LayoutUnit(), y_off); - } else { - LayoutUnit x_off = - (legend->Location().X() > LayoutUnit()) - ? LayoutUnit() - : (legend->Size().Width() - layout_fieldset_.BorderLeft()) / 2; - paint_rect.Expand(-x_off, LayoutUnit()); - paint_rect.Move(x_off, LayoutUnit()); - } + FieldsetPaintInfo fieldset_paint_info = + CreateFieldsetPaintInfo(layout_fieldset_, *legend); + paint_rect.Contract(fieldset_paint_info.border_outsets); DrawingRecorder recorder(paint_info.context, layout_fieldset_, paint_info.phase);
diff --git a/third_party/blink/renderer/core/paint/object_paint_properties.h b/third_party/blink/renderer/core/paint/object_paint_properties.h index 179a1ff..e9415c7 100644 --- a/third_party/blink/renderer/core/paint/object_paint_properties.h +++ b/third_party/blink/renderer/core/paint/object_paint_properties.h
@@ -209,6 +209,8 @@ DCHECK(!ScrollTranslation() || !ReplacedContentTransform()) << "Replaced elements don't scroll so there should never be both a " "scroll translation and a replaced content transform."; + DCHECK(!ClipPathClip() || !ClipPath()) + << "ClipPathClip and ClipPathshould be mutually exclusive."; } #endif
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc index c3b6dbf..5320115 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc
@@ -56,8 +56,10 @@ CreateBackingThreadStartupData(ToIsolate(GetExecutionContext()))); if (options.type() == "classic") { + // Dedicated worker is origin-bound, so use kSharableCrossOrigin. GetWorkerThread()->EvaluateClassicScript( - script_url, source_code, nullptr /* cached_meta_data */, stack_id); + script_url, kSharableCrossOrigin, source_code, + nullptr /* cached_meta_data */, stack_id); } else if (options.type() == "module") { network::mojom::FetchCredentialsMode credentials_mode; bool result =
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc index 72c5f55c..b4b93238 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/core/workers/worker_thread.h" #include "third_party/blink/renderer/core/workers/worker_thread_test_helper.h" #include "third_party/blink/renderer/platform/cross_thread_functional.h" +#include "third_party/blink/renderer/platform/loader/fetch/access_control_status.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/weborigin/security_policy.h" @@ -143,9 +144,9 @@ WorkerBackingThreadStartupData( WorkerBackingThreadStartupData::HeapLimitMode::kDefault, WorkerBackingThreadStartupData::AtomicsWaitMode::kAllow)); - GetWorkerThread()->EvaluateClassicScript(script_url, source, - nullptr /* cached_meta_data */, - v8_inspector::V8StackTraceId()); + GetWorkerThread()->EvaluateClassicScript( + script_url, kOpaqueResource, source, nullptr /* cached_meta_data */, + v8_inspector::V8StackTraceId()); } DedicatedWorkerThreadForTest* GetDedicatedWorkerThread() {
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc index 398301b..2c272cdb 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -195,6 +195,14 @@ return; } + // importScripts always uses "no-cors", so simply checking the origin is + // enough. + // TODO(yhirano): Remove this ad-hoc logic and use the response type. + const AccessControlStatus access_control_status = + execution_context.GetSecurityOrigin()->CanReadContent(response_url) + ? kSharableCrossOrigin + : kOpaqueResource; + ErrorEvent* error_event = nullptr; SingleCachedMetadataHandler* handler( CreateWorkerScriptCachedMetadataHandler(complete_url, @@ -204,7 +212,7 @@ ScriptController()->Evaluate( ScriptSourceCode(source_code, ScriptSourceLocationType::kUnknown, handler, response_url), - &error_event, v8_cache_options_); + access_control_status, &error_event, v8_cache_options_); if (error_event) { ScriptController()->RethrowExceptionFromImportedScript(error_event, exception_state); @@ -322,20 +330,22 @@ void WorkerGlobalScope::EvaluateClassicScriptPausable( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id) { if (IsContextPaused()) { - paused_calls_.push_back( - WTF::Bind(&WorkerGlobalScope::EvaluateClassicScriptPausable, - WrapWeakPersistent(this), script_url, source_code, - WTF::Passed(std::move(cached_meta_data)), stack_id)); + paused_calls_.push_back(WTF::Bind( + &WorkerGlobalScope::EvaluateClassicScriptPausable, + WrapWeakPersistent(this), script_url, access_control_status, + source_code, WTF::Passed(std::move(cached_meta_data)), stack_id)); return; } ThreadDebugger* debugger = ThreadDebugger::From(GetThread()->GetIsolate()); if (debugger) debugger->ExternalAsyncTaskStarted(stack_id); - EvaluateClassicScript(script_url, source_code, std::move(cached_meta_data)); + EvaluateClassicScript(script_url, access_control_status, source_code, + std::move(cached_meta_data)); if (debugger) debugger->ExternalAsyncTaskFinished(stack_id); } @@ -382,6 +392,7 @@ void WorkerGlobalScope::EvaluateClassicScript( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data) { DCHECK(IsContextThread()); @@ -395,7 +406,7 @@ bool success = ScriptController()->Evaluate( ScriptSourceCode(source_code, ScriptSourceLocationType::kUnknown, handler, script_url), - nullptr /* error_event */, v8_cache_options_); + access_control_status, nullptr /* error_event */, v8_cache_options_); ReportingProxy().DidEvaluateClassicScript(success); }
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 982fd28..f9043c4 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.h +++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -138,6 +138,7 @@ // so that WorkerGlobalScope can be paused. void EvaluateClassicScriptPausable( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id); @@ -177,6 +178,7 @@ // Evaluates the given top-level classic script. virtual void EvaluateClassicScript( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data);
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc index 36ee681..745fa5b 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.cc +++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -167,6 +167,7 @@ void WorkerThread::EvaluateClassicScript( const KURL& script_url, + AccessControlStatus access_control_status, const String& source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id) { @@ -174,7 +175,8 @@ PostCrossThreadTask( *GetTaskRunner(TaskType::kInternalWorker), FROM_HERE, CrossThreadBind(&WorkerThread::EvaluateClassicScriptOnWorkerThread, - CrossThreadUnretained(this), script_url, source_code, + CrossThreadUnretained(this), script_url, + access_control_status, source_code, WTF::Passed(std::move(cached_meta_data)), stack_id)); } @@ -496,11 +498,13 @@ void WorkerThread::EvaluateClassicScriptOnWorkerThread( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id) { ToWorkerGlobalScope(GlobalScope()) - ->EvaluateClassicScriptPausable(script_url, std::move(source_code), + ->EvaluateClassicScriptPausable(script_url, access_control_status, + std::move(source_code), std::move(cached_meta_data), stack_id); }
diff --git a/third_party/blink/renderer/core/workers/worker_thread.h b/third_party/blink/renderer/core/workers/worker_thread.h index c3ae979..41c1ce3 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.h +++ b/third_party/blink/renderer/core/workers/worker_thread.h
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h" #include "third_party/blink/renderer/core/workers/worker_backing_thread_startup_data.h" #include "third_party/blink/renderer/core/workers/worker_inspector_proxy.h" +#include "third_party/blink/renderer/platform/loader/fetch/access_control_status.h" #include "third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h" #include "third_party/blink/renderer/platform/web_task_runner.h" #include "third_party/blink/renderer/platform/wtf/allocator.h" @@ -106,6 +107,7 @@ // Posts a task to evaluate a top-level classic script on the worker thread. // Called on the main thread after Start(). void EvaluateClassicScript(const KURL& script_url, + AccessControlStatus access_control_status, const String& source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id); @@ -281,6 +283,7 @@ void EvaluateClassicScriptOnWorkerThread( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data, const v8_inspector::V8StackTraceId& stack_id);
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 d5ffccb9..0341251 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
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/core/workers/worker_thread.h" #include "third_party/blink/renderer/platform/cross_thread_functional.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/loader/fetch/access_control_status.h" #include "third_party/blink/renderer/platform/network/content_security_policy_parsers.h" #include "third_party/blink/renderer/platform/waitable_event.h" #include "third_party/blink/renderer/platform/web_thread_supporting_gc.h" @@ -103,7 +104,8 @@ WorkerBackingThreadStartupData::CreateDefault(), WorkerInspectorProxy::PauseOnWorkerStart::kDontPause, parent_execution_context_task_runners); - EvaluateClassicScript(script_url, source, nullptr /* cached_meta_data */, + EvaluateClassicScript(script_url, kOpaqueResource, source, + nullptr /* cached_meta_data */, v8_inspector::V8StackTraceId()); }
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn index a3b41d2..a3609bbd1 100644 --- a/third_party/blink/renderer/devtools/BUILD.gn +++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -527,6 +527,7 @@ "front_end/profiler/ProfileTypeRegistry.js", "front_end/profiler/ProfileView.js", "front_end/profiler/TopDownProfileDataGrid.js", + "front_end/protocol/NodeURL.js", "front_end/protocol/InspectorBackend.js", "front_end/protocol/module.json", "front_end/quick_open/CommandMenu.js",
diff --git a/third_party/blink/renderer/devtools/front_end/protocol/InspectorBackend.js b/third_party/blink/renderer/devtools/front_end/protocol/InspectorBackend.js index d4d9a4a..c8f5919 100644 --- a/third_party/blink/renderer/devtools/front_end/protocol/InspectorBackend.js +++ b/third_party/blink/renderer/devtools/front_end/protocol/InspectorBackend.js
@@ -229,9 +229,10 @@ */ Protocol.TargetBase = class extends Common.Object { /** - * @param {!Protocol.InspectorBackend.Connection.Factory} connectionFactory + * @param {!Protocol.InspectorBackend.Connection.Factory} connectionFactory + * @param {boolean} isNodeJS */ - constructor(connectionFactory) { + constructor(connectionFactory, isNodeJS) { super(); this._connection = connectionFactory({onMessage: this._onMessage.bind(this), onDisconnect: this._onDisconnect.bind(this)}); @@ -248,6 +249,7 @@ } if (!Protocol.InspectorBackend.sendRawMessageForTesting) Protocol.InspectorBackend.sendRawMessageForTesting = this._sendRawMessageForTesting.bind(this); + this._isNodeJS = isNodeJS; } /** @@ -361,6 +363,8 @@ const messageObject = /** @type {!Object} */ ((typeof message === 'string') ? JSON.parse(message) : message); + Protocol.NodeURL.patch(this, messageObject); + if ('id' in messageObject) { // just a response for some request const callback = this._callbacks[messageObject.id]; if (!callback) { @@ -500,6 +504,17 @@ this._agent(domain), messageObject, methodName, callback), 0); } + + /** + * @return {boolean} + */ + isNodeJS() { + return this._isNodeJS; + } + + markAsNodeJSForTest() { + this._isNodeJS = true; + } }; Protocol.TargetBase.Events = {
diff --git a/third_party/blink/renderer/devtools/front_end/protocol/NodeURL.js b/third_party/blink/renderer/devtools/front_end/protocol/NodeURL.js new file mode 100644 index 0000000..b4234cb --- /dev/null +++ b/third_party/blink/renderer/devtools/front_end/protocol/NodeURL.js
@@ -0,0 +1,44 @@ +// 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. + +Protocol.NodeURL = class { + /** + * @param {!Protocol.TargetBase} target + * @param {!Object} object + */ + static patch(target, object) { + if (target.isNodeJS()) + process(object, ''); + + /** + * @param {!Object} object + * @param {string} path + */ + function process(object, path) { + if (object.url && Protocol.NodeURL._isPlatformPath(object.url, Host.isWin())) + object.url = Common.ParsedURL.platformPathToURL(object.url); + for (const entry of Object.entries(object)) { + const key = entry[0]; + const value = entry[1]; + const entryPath = path + '.' + key; + if (entryPath !== '.result.result.value' && value !== null && typeof value === 'object') + process(value, entryPath); + } + } + } + + /** + * @param {string} fileSystemPath + * @param {boolean} isWindows + * @return {boolean} + */ + static _isPlatformPath(fileSystemPath, isWindows) { + if (isWindows) { + const re = /^([a-z]:[\/\\]|\\\\)/i; + return re.test(fileSystemPath); + } else { + return fileSystemPath.length ? fileSystemPath[0] === '/' : false; + } + } +};
diff --git a/third_party/blink/renderer/devtools/front_end/protocol/module.json b/third_party/blink/renderer/devtools/front_end/protocol/module.json index c69e67ac..9dda4bda 100644 --- a/third_party/blink/renderer/devtools/front_end/protocol/module.json +++ b/third_party/blink/renderer/devtools/front_end/protocol/module.json
@@ -1,8 +1,10 @@ { "dependencies": [ - "common" + "common", + "host" ], "scripts": [ + "NodeURL.js", "InspectorBackend.js", "../InspectorBackendCommands.js" ],
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js index f5d1082..add9a53 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js
@@ -563,14 +563,7 @@ let isContentScript = false; if (executionContextAuxData && ('isDefault' in executionContextAuxData)) isContentScript = !executionContextAuxData['isDefault']; - // Support file URL for node.js. - if (this.target().isNodeJS() && sourceURL && !hasSourceURLComment) { - const nodeJSPath = sourceURL; - sourceURL = Common.ParsedURL.platformPathToURL(nodeJSPath); - sourceURL = this._internString(sourceURL); - } else { - sourceURL = this._internString(sourceURL); - } + sourceURL = this._internString(sourceURL); const script = new SDK.Script( this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, this._internString(hash), isContentScript, isLiveEdit, sourceMapURL, hasSourceURLComment, length,
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/Target.js b/third_party/blink/renderer/devtools/front_end/sdk/Target.js index d338bda..9ed9f30 100644 --- a/third_party/blink/renderer/devtools/front_end/sdk/Target.js +++ b/third_party/blink/renderer/devtools/front_end/sdk/Target.js
@@ -19,7 +19,7 @@ * @param {boolean} isNodeJS */ constructor(targetManager, id, name, capabilitiesMask, connectionFactory, parentTarget, suspended, isNodeJS) { - super(connectionFactory); + super(connectionFactory, isNodeJS); this._targetManager = targetManager; this._name = name; this._inspectedURL = ''; @@ -28,7 +28,6 @@ this._id = id; this._modelByConstructor = new Map(); this._isSuspended = suspended; - this._isNodeJS = isNodeJS; } createModels(required) { @@ -45,17 +44,6 @@ } /** - * @return {boolean} - */ - isNodeJS() { - return this._isNodeJS; - } - - markAsNodeJSForTest() { - this._isNodeJS = true; - } - - /** * @return {string} */ id() {
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc index 04887c1..ecb7f0e 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc
@@ -262,13 +262,14 @@ ScriptState::Scope scope(script_state); global_scope->ScriptController()->Evaluate(ScriptSourceCode( - R"JS( + R"JS( registerAnimator('test', class { animate (currentTime, effect) { effect.localTime = 123; } }); - )JS")); + )JS"), + kSharableCrossOrigin); // Passing a new input state with a new animation id should cause the // worklet to create and animate an animator. @@ -307,13 +308,14 @@ ScriptState::Scope scope(script_state); global_scope->ScriptController()->Evaluate(ScriptSourceCode( - R"JS( + R"JS( registerAnimator('test', class { animate (currentTime, effect) { effect.localTime = 123; } }); - )JS")); + )JS"), + kSharableCrossOrigin); cc::WorkletAnimationId animation_id = {1, 1}; AnimationWorkletInput state; @@ -355,13 +357,14 @@ ScriptState::Scope scope(script_state); global_scope->ScriptController()->Evaluate(ScriptSourceCode( - R"JS( + R"JS( registerAnimator('test', class { animate (currentTime, effect) { effect.localTime = 123; } }); - )JS")); + )JS"), + kSharableCrossOrigin); cc::WorkletAnimationId animation_id = {1, 1}; AnimationWorkletInput state;
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_test.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_test.cc index a9f8c45c..a58249d1 100644 --- a/third_party/blink/renderer/modules/csspaint/paint_worklet_test.cc +++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_test.cc
@@ -106,7 +106,8 @@ TEST_F(PaintWorkletTest, GarbageCollectionOfCSSPaintDefinition) { PaintWorkletGlobalScope* global_scope = GetProxy()->global_scope(); global_scope->ScriptController()->Evaluate( - ScriptSourceCode("registerPaint('foo', class { paint() { } });")); + ScriptSourceCode("registerPaint('foo', class { paint() { } });"), + kSharableCrossOrigin); CSSPaintDefinition* definition = global_scope->FindDefinition("foo"); DCHECK(definition); @@ -147,7 +148,8 @@ TEST_F(PaintWorkletTest, PaintWithNullPaintArguments) { PaintWorkletGlobalScope* global_scope = GetProxy()->global_scope(); global_scope->ScriptController()->Evaluate( - ScriptSourceCode("registerPaint('foo', class { paint() { } });")); + ScriptSourceCode("registerPaint('foo', class { paint() { } });"), + kSharableCrossOrigin); CSSPaintDefinition* definition = global_scope->FindDefinition("foo"); ASSERT_TRUE(definition); @@ -168,7 +170,8 @@ TEST_F(PaintWorkletTest, SinglyRegisteredDocumentDefinitionNotUsed) { PaintWorkletGlobalScope* global_scope = GetProxy()->global_scope(); global_scope->ScriptController()->Evaluate( - ScriptSourceCode("registerPaint('foo', class { paint() { } });")); + ScriptSourceCode("registerPaint('foo', class { paint() { } });"), + kSharableCrossOrigin); CSSPaintImageGeneratorImpl* generator = static_cast<CSSPaintImageGeneratorImpl*>(
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 1489cec6..ea4caf3dc 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
@@ -469,9 +469,10 @@ // > "classic": Fetch a classic worker script given job’s serialized script // > url, job’s client, "serviceworker", and the to-be-created environment // > settings object for this service worker. + // Service worker is origin-bound, so use kSharableCrossOrigin. worker_thread_->EvaluateClassicScript( - worker_start_data_.script_url, source_code, std::move(cached_meta_data), - v8_inspector::V8StackTraceId()); + worker_start_data_.script_url, kSharableCrossOrigin, source_code, + std::move(cached_meta_data), v8_inspector::V8StackTraceId()); } else { // > "module": Fetch a module worker script graph given job’s serialized // > script url, job’s client, "serviceworker", "omit", and the
diff --git a/third_party/blink/renderer/modules/filesystem/OWNERS b/third_party/blink/renderer/modules/filesystem/OWNERS index a4c6d78..373163c 100644 --- a/third_party/blink/renderer/modules/filesystem/OWNERS +++ b/third_party/blink/renderer/modules/filesystem/OWNERS
@@ -1,3 +1,4 @@ +mek@chromium.org jsbell@chromium.org kinuko@chromium.org pwnall@chromium.org
diff --git a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc index 2aabdee..ed71550 100644 --- a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc +++ b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
@@ -9,6 +9,7 @@ #include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "services/network/public/mojom/request_context_frame_type.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_response.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" @@ -287,25 +288,23 @@ return; } // Handle the stream response body. - mojo::ScopedDataPipeProducerHandle producer; - mojo::ScopedDataPipeConsumerHandle consumer; - MojoResult result = mojo::CreateDataPipe(nullptr, &producer, &consumer); - if (result != MOJO_RESULT_OK) { + mojo::DataPipe pipe(BlobUtils::GetDataPipeCapacity()); + if (!pipe.consumer_handle.is_valid()) { OnResponseRejected(ServiceWorkerResponseError::kDataPipeCreationFailed); return; } - DCHECK(producer.is_valid()); - DCHECK(consumer.is_valid()); + DCHECK(pipe.producer_handle.is_valid()); std::unique_ptr<WebServiceWorkerStreamHandle> body_stream_handle = - std::make_unique<WebServiceWorkerStreamHandle>(std::move(consumer)); + std::make_unique<WebServiceWorkerStreamHandle>( + std::move(pipe.consumer_handle)); ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) ->RespondToFetchEventWithResponseStream(event_id_, web_response, body_stream_handle.get(), event_dispatch_time_); buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( - std::move(producer), task_runner_), + std::move(pipe.producer_handle), task_runner_), new FetchLoaderClient(std::move(body_stream_handle)), exception_state); if (exception_state.HadException()) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_client.cc b/third_party/blink/renderer/modules/service_worker/service_worker_client.cc index 959f27b..cb30ae7b 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_client.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_client.cc
@@ -120,7 +120,7 @@ return; ServiceWorkerGlobalScopeClient::From(context)->PostMessageToClient( - uuid_, ToTransferableMessage(std::move(msg))); + uuid_, std::move(msg)); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_clients.cc b/third_party/blink/renderer/modules/service_worker/service_worker_clients.cc index 662f0e1a..4ae4923 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_clients.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_clients.cc
@@ -11,7 +11,6 @@ #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom-blink.h" -#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_client_query_options.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_info.h" #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" @@ -130,14 +129,13 @@ ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); ScriptPromise promise = resolver->Promise(); - WebServiceWorkerClientQueryOptions web_options; - web_options.client_type = GetClientType(options.type()); - web_options.include_uncontrolled = options.includeUncontrolled(); ServiceWorkerGlobalScopeClient::From(execution_context) - ->GetClients(web_options, - std::make_unique< - CallbackPromiseAdapter<ClientArray, ServiceWorkerError>>( - resolver)); + ->GetClients( + mojom::blink::ServiceWorkerClientQueryOptions::New( + options.includeUncontrolled(), GetClientType(options.type())), + std::make_unique< + CallbackPromiseAdapter<ClientArray, ServiceWorkerError>>( + resolver)); return promise; }
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc index 077b0eb8..6a45a51 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -116,6 +116,7 @@ void ServiceWorkerGlobalScope::EvaluateClassicScript( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data) { DCHECK(IsContextThread()); @@ -123,8 +124,8 @@ if (!evaluate_script_ready_) { evaluate_script_ = WTF::Bind(&ServiceWorkerGlobalScope::EvaluateClassicScript, - WrapWeakPersistent(this), script_url, std::move(source_code), - std::move(cached_meta_data)); + WrapWeakPersistent(this), script_url, access_control_status, + std::move(source_code), std::move(cached_meta_data)); return; } @@ -164,7 +165,8 @@ ReportingProxy().DidLoadInstalledScript(); } - WorkerGlobalScope::EvaluateClassicScript(script_url, source_code, + WorkerGlobalScope::EvaluateClassicScript(script_url, access_control_status, + source_code, std::move(cached_meta_data)); } @@ -181,6 +183,13 @@ new WorkerModuleTreeClient(modulator)); } +void ServiceWorkerGlobalScope::Dispose() { + DCHECK(IsContextThread()); + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) + ->WillDestroyWorkerContext(); + WorkerGlobalScope::Dispose(); +} + void ServiceWorkerGlobalScope::CountWorkerScript(size_t script_size, size_t cached_metadata_size) { DEFINE_THREAD_SAFE_STATIC_LOCAL( @@ -261,6 +270,12 @@ return promise; } +void ServiceWorkerGlobalScope::BindServiceWorkerHost( + mojom::blink::ServiceWorkerHostAssociatedPtrInfo service_worker_host) { + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) + ->BindServiceWorkerHost(std::move(service_worker_host)); +} + void ServiceWorkerGlobalScope::SetRegistration( std::unique_ptr<WebServiceWorkerRegistration::Handle> handle) { if (!GetExecutionContext())
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h index f00b656..8738cff 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -31,6 +31,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_GLOBAL_SCOPE_H_ #include <memory> +#include "third_party/blink/public/mojom/service_worker/service_worker.mojom-blink.h" #include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_registration.h" #include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h" @@ -70,12 +71,14 @@ // Implements WorkerGlobalScope. void EvaluateClassicScript( const KURL& script_url, + AccessControlStatus access_control_status, String source_code, std::unique_ptr<Vector<char>> cached_meta_data) override; void ImportModuleScript( const KURL& module_url_record, FetchClientSettingsObjectSnapshot* outside_settings_object, network::mojom::FetchCredentialsMode) override; + void Dispose() override; // Counts an evaluated script and its size. Called for the main worker script. void CountWorkerScript(size_t script_size, size_t cached_metadata_size); @@ -98,6 +101,8 @@ ScriptPromise skipWaiting(ScriptState*); + void BindServiceWorkerHost(mojom::blink::ServiceWorkerHostAssociatedPtrInfo); + void SetRegistration(std::unique_ptr<WebServiceWorkerRegistration::Handle>); // EventTarget
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.cc index ae17974..58c02a2 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.cc
@@ -33,51 +33,223 @@ #include <memory> #include <utility> #include "third_party/blink/public/platform/modules/payments/web_payment_handler_response.h" +#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_error.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h" -#include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fetch/response.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { +namespace { + +// TODO(leonhsl): Remove this function, pass ServiceWorkerClientInfoPtr through +// to replace WebServiceWorkerClientInfo. +blink::WebServiceWorkerClientInfo ToWebServiceWorkerClientInfo( + mojom::blink::ServiceWorkerClientInfoPtr client_info) { + DCHECK(!client_info->client_uuid.IsEmpty()); + + blink::WebServiceWorkerClientInfo web_client_info; + + web_client_info.uuid = client_info->client_uuid; + web_client_info.page_visibility_state = client_info->page_visibility_state; + web_client_info.is_focused = client_info->is_focused; + web_client_info.url = client_info->url; + web_client_info.frame_type = client_info->frame_type; + web_client_info.client_type = client_info->client_type; + + return web_client_info; +} + +void DidGetClient( + std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, + mojom::blink::ServiceWorkerClientInfoPtr client) { + std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; + if (client) { + web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( + ToWebServiceWorkerClientInfo(std::move(client))); + } + callbacks->OnSuccess(std::move(web_client)); +} + +void DidGetClients( + std::unique_ptr<blink::WebServiceWorkerClientsCallbacks> callbacks, + Vector<mojom::blink::ServiceWorkerClientInfoPtr> clients) { + blink::WebServiceWorkerClientsInfo info; + blink::WebVector<blink::WebServiceWorkerClientInfo> web_clients( + clients.size()); + for (size_t i = 0; i < clients.size(); ++i) + web_clients[i] = ToWebServiceWorkerClientInfo(std::move(clients[i])); + info.clients.Swap(web_clients); + callbacks->OnSuccess(info); +} + +void DidOpenWindow( + std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, + bool success, + mojom::blink::ServiceWorkerClientInfoPtr client, + const String& error_msg) { + if (!success) { + DCHECK(!client); + DCHECK(!error_msg.IsNull()); + callbacks->OnError(blink::WebServiceWorkerError( + mojom::blink::ServiceWorkerErrorType::kNavigation, error_msg)); + return; + } + + std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; + if (client) { + web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( + ToWebServiceWorkerClientInfo(std::move(client))); + } + callbacks->OnSuccess(std::move(web_client)); +} + +void DidFocusClient( + std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, + mojom::blink::ServiceWorkerClientInfoPtr client) { + if (!client) { + callbacks->OnError(blink::WebServiceWorkerError( + mojom::blink::ServiceWorkerErrorType::kNotFound, + "The client was not found.")); + return; + } + auto web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( + ToWebServiceWorkerClientInfo(std::move(client))); + callbacks->OnSuccess(std::move(web_client)); +} + +void DidNavigateClient( + std::unique_ptr<blink::WebServiceWorkerClientCallbacks> callbacks, + bool success, + mojom::blink::ServiceWorkerClientInfoPtr client, + const String& error_msg) { + if (!success) { + DCHECK(!client); + DCHECK(!error_msg.IsNull()); + callbacks->OnError(blink::WebServiceWorkerError( + mojom::blink::ServiceWorkerErrorType::kNavigation, error_msg)); + return; + } + + std::unique_ptr<blink::WebServiceWorkerClientInfo> web_client; + if (client) { + web_client = std::make_unique<blink::WebServiceWorkerClientInfo>( + ToWebServiceWorkerClientInfo(std::move(client))); + } + callbacks->OnSuccess(std::move(web_client)); +} + +void DidSkipWaiting( + std::unique_ptr<blink::WebServiceWorkerSkipWaitingCallbacks> callbacks, + bool success) { + // OnError() should not be called here since per spec the promise returned by + // skipWaiting() can never reject. + if (!success) + return; + callbacks->OnSuccess(); +} + +void DidClaimClients( + std::unique_ptr<blink::WebServiceWorkerClientsClaimCallbacks> callbacks, + mojom::blink::ServiceWorkerErrorType error, + const String& error_msg) { + if (error != blink::mojom::ServiceWorkerErrorType::kNone) { + DCHECK(!error_msg.IsNull()); + callbacks->OnError(blink::WebServiceWorkerError(error, error_msg)); + return; + } + DCHECK(error_msg.IsNull()); + callbacks->OnSuccess(); +} + +} // namespace + ServiceWorkerGlobalScopeClient::ServiceWorkerGlobalScopeClient( WebServiceWorkerContextClient& client) : client_(client) {} void ServiceWorkerGlobalScopeClient::GetClient( - const WebString& id, + const String& id, std::unique_ptr<WebServiceWorkerClientCallbacks> callbacks) { - client_.GetClient(id, std::move(callbacks)); + DCHECK(callbacks); + service_worker_host_->GetClient( + id, WTF::Bind(&DidGetClient, std::move(callbacks))); } void ServiceWorkerGlobalScopeClient::GetClients( - const WebServiceWorkerClientQueryOptions& options, + mojom::blink::ServiceWorkerClientQueryOptionsPtr options, std::unique_ptr<WebServiceWorkerClientsCallbacks> callbacks) { - client_.GetClients(options, std::move(callbacks)); + DCHECK(callbacks); + service_worker_host_->GetClients( + std::move(options), WTF::Bind(&DidGetClients, std::move(callbacks))); } void ServiceWorkerGlobalScopeClient::OpenWindowForClients( - const WebURL& url, + const KURL& url, std::unique_ptr<WebServiceWorkerClientCallbacks> callbacks) { - client_.OpenNewTab(url, std::move(callbacks)); + DCHECK(callbacks); + service_worker_host_->OpenNewTab( + url, WTF::Bind(&DidOpenWindow, std::move(callbacks))); } void ServiceWorkerGlobalScopeClient::OpenWindowForPaymentHandler( - const WebURL& url, + const KURL& url, std::unique_ptr<WebServiceWorkerClientCallbacks> callbacks) { - client_.OpenPaymentHandlerWindow(url, std::move(callbacks)); + DCHECK(callbacks); + service_worker_host_->OpenPaymentHandlerWindow( + url, WTF::Bind(&DidOpenWindow, std::move(callbacks))); } -void ServiceWorkerGlobalScopeClient::SetCachedMetadata(const WebURL& url, +void ServiceWorkerGlobalScopeClient::SetCachedMetadata(const KURL& url, const char* data, size_t size) { - client_.SetCachedMetadata(url, data, size); + Vector<uint8_t> meta_data; + meta_data.Append(data, size); + service_worker_host_->SetCachedMetadata(url, meta_data); } -void ServiceWorkerGlobalScopeClient::ClearCachedMetadata(const WebURL& url) { - client_.ClearCachedMetadata(url); +void ServiceWorkerGlobalScopeClient::ClearCachedMetadata(const KURL& url) { + service_worker_host_->ClearCachedMetadata(url); +} + +void ServiceWorkerGlobalScopeClient::PostMessageToClient( + const String& client_uuid, + BlinkTransferableMessage message) { + service_worker_host_->PostMessageToClient(client_uuid, std::move(message)); +} + +void ServiceWorkerGlobalScopeClient::SkipWaiting( + std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks> callbacks) { + DCHECK(callbacks); + service_worker_host_->SkipWaiting( + WTF::Bind(&DidSkipWaiting, std::move(callbacks))); +} + +void ServiceWorkerGlobalScopeClient::Claim( + std::unique_ptr<WebServiceWorkerClientsClaimCallbacks> callbacks) { + DCHECK(callbacks); + service_worker_host_->ClaimClients( + WTF::Bind(&DidClaimClients, std::move(callbacks))); +} + +void ServiceWorkerGlobalScopeClient::Focus( + const String& client_uuid, + std::unique_ptr<WebServiceWorkerClientCallbacks> callbacks) { + DCHECK(callbacks); + service_worker_host_->FocusClient( + client_uuid, WTF::Bind(&DidFocusClient, std::move(callbacks))); +} + +void ServiceWorkerGlobalScopeClient::Navigate( + const String& client_uuid, + const KURL& url, + std::unique_ptr<WebServiceWorkerClientCallbacks> callbacks) { + DCHECK(callbacks); + service_worker_host_->NavigateClient( + client_uuid, url, WTF::Bind(&DidNavigateClient, std::move(callbacks))); } void ServiceWorkerGlobalScopeClient::DidHandleActivateEvent( @@ -247,33 +419,15 @@ event_dispatch_time); } -void ServiceWorkerGlobalScopeClient::PostMessageToClient( - const WebString& client_uuid, - TransferableMessage message) { - client_.PostMessageToClient(client_uuid, std::move(message)); +void ServiceWorkerGlobalScopeClient::BindServiceWorkerHost( + mojom::blink::ServiceWorkerHostAssociatedPtrInfo service_worker_host) { + DCHECK(service_worker_host.is_valid()); + DCHECK(!service_worker_host_); + service_worker_host_.Bind(std::move(service_worker_host)); } -void ServiceWorkerGlobalScopeClient::SkipWaiting( - std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks> callbacks) { - client_.SkipWaiting(std::move(callbacks)); -} - -void ServiceWorkerGlobalScopeClient::Claim( - std::unique_ptr<WebServiceWorkerClientsClaimCallbacks> callbacks) { - client_.Claim(std::move(callbacks)); -} - -void ServiceWorkerGlobalScopeClient::Focus( - const WebString& client_uuid, - std::unique_ptr<WebServiceWorkerClientCallbacks> callback) { - client_.Focus(client_uuid, std::move(callback)); -} - -void ServiceWorkerGlobalScopeClient::Navigate( - const WebString& client_uuid, - const WebURL& url, - std::unique_ptr<WebServiceWorkerClientCallbacks> callback) { - client_.Navigate(client_uuid, url, std::move(callback)); +void ServiceWorkerGlobalScopeClient::WillDestroyWorkerContext() { + service_worker_host_.reset(); } const char ServiceWorkerGlobalScopeClient::kSupplementName[] =
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.h index d6b8b7f..593467d4 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_client.h
@@ -35,6 +35,7 @@ #include "base/macros.h" #include "third_party/blink/public/common/messaging/transferable_message.h" +#include "third_party/blink/public/mojom/service_worker/service_worker.mojom-blink.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-blink.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_claim_callbacks.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_clients_info.h" @@ -43,21 +44,21 @@ #include "third_party/blink/renderer/core/messaging/message_port.h" #include "third_party/blink/renderer/core/workers/worker_clients.h" #include "third_party/blink/renderer/modules/modules_export.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { struct WebPaymentHandlerResponse; -struct WebServiceWorkerClientQueryOptions; class ExecutionContext; class WebServiceWorkerContextClient; class WebServiceWorkerResponse; -class WebURL; +class KURL; class WorkerClients; // See WebServiceWorkerContextClient for documentation for the methods in this // class. -class MODULES_EXPORT ServiceWorkerGlobalScopeClient - : public GarbageCollected<ServiceWorkerGlobalScopeClient>, +class MODULES_EXPORT ServiceWorkerGlobalScopeClient final + : public GarbageCollectedFinalized<ServiceWorkerGlobalScopeClient>, public Supplement<WorkerClients> { USING_GARBAGE_COLLECTED_MIXIN(ServiceWorkerGlobalScopeClient); @@ -67,17 +68,25 @@ explicit ServiceWorkerGlobalScopeClient(WebServiceWorkerContextClient&); // Called from ServiceWorkerClients. - void GetClient(const WebString&, + void GetClient(const String&, std::unique_ptr<WebServiceWorkerClientCallbacks>); - void GetClients(const WebServiceWorkerClientQueryOptions&, + void GetClients(mojom::blink::ServiceWorkerClientQueryOptionsPtr, std::unique_ptr<WebServiceWorkerClientsCallbacks>); - void OpenWindowForClients(const WebURL&, + void OpenWindowForClients(const KURL&, std::unique_ptr<WebServiceWorkerClientCallbacks>); void OpenWindowForPaymentHandler( - const WebURL&, + const KURL&, std::unique_ptr<WebServiceWorkerClientCallbacks>); - void SetCachedMetadata(const WebURL&, const char*, size_t); - void ClearCachedMetadata(const WebURL&); + void SetCachedMetadata(const KURL&, const char*, size_t); + void ClearCachedMetadata(const KURL&); + void PostMessageToClient(const String& client_uuid, BlinkTransferableMessage); + void SkipWaiting(std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>); + void Claim(std::unique_ptr<WebServiceWorkerClientsClaimCallbacks>); + void Focus(const String& client_uuid, + std::unique_ptr<WebServiceWorkerClientCallbacks>); + void Navigate(const String& client_uuid, + const KURL&, + std::unique_ptr<WebServiceWorkerClientCallbacks>); void DidHandleActivateEvent(int event_id, mojom::ServiceWorkerEventStatus, @@ -145,14 +154,11 @@ void DidHandlePaymentRequestEvent(int payment_request_event_id, mojom::ServiceWorkerEventStatus, double event_dispatch_time); - void PostMessageToClient(const WebString& client_uuid, TransferableMessage); - void SkipWaiting(std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>); - void Claim(std::unique_ptr<WebServiceWorkerClientsClaimCallbacks>); - void Focus(const WebString& client_uuid, - std::unique_ptr<WebServiceWorkerClientCallbacks>); - void Navigate(const WebString& client_uuid, - const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>); + + void BindServiceWorkerHost( + mojom::blink::ServiceWorkerHostAssociatedPtrInfo service_worker_host); + + void WillDestroyWorkerContext(); static ServiceWorkerGlobalScopeClient* From(ExecutionContext*); @@ -161,6 +167,12 @@ private: WebServiceWorkerContextClient& client_; + // Lives on the service worker thread, is bound by BindServiceWorkerHost() + // which is triggered by the first Mojo call received on the service worker + // thread content::mojom::ServiceWorker::InitializeGlobalScope(), and is + // closed by WillDestroyWorkerContext(). + mojom::blink::ServiceWorkerHostAssociatedPtr service_worker_host_; + DISALLOW_COPY_AND_ASSIGN(ServiceWorkerGlobalScopeClient); };
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc index e6a8d2b..1f91d168 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -182,8 +182,13 @@ visitor->Trace(parent_execution_context_task_runners_); } -void ServiceWorkerGlobalScopeProxy::ReadyToEvaluateScript() { - WorkerGlobalScope()->ReadyToEvaluateScript(); +void ServiceWorkerGlobalScopeProxy::BindServiceWorkerHost( + mojo::ScopedInterfaceEndpointHandle service_worker_host) { + DCHECK(WorkerGlobalScope()->IsContextThread()); + WorkerGlobalScope()->BindServiceWorkerHost( + mojom::blink::ServiceWorkerHostAssociatedPtrInfo( + std::move(service_worker_host), + mojom::blink::ServiceWorkerHost::Version_)); } void ServiceWorkerGlobalScopeProxy::SetRegistration( @@ -192,6 +197,10 @@ WorkerGlobalScope()->SetRegistration(std::move(handle)); } +void ServiceWorkerGlobalScopeProxy::ReadyToEvaluateScript() { + WorkerGlobalScope()->ReadyToEvaluateScript(); +} + void ServiceWorkerGlobalScopeProxy::DispatchBackgroundFetchAbortEvent( int event_id, const WebBackgroundFetchRegistration& registration) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h index 21491661..ac4863e 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
@@ -77,9 +77,13 @@ ~ServiceWorkerGlobalScopeProxy() override; // WebServiceWorkerContextProxy overrides: - void ReadyToEvaluateScript() override; + void BindServiceWorkerHost( + mojo::ScopedInterfaceEndpointHandle service_worker_host) override; void SetRegistration( std::unique_ptr<WebServiceWorkerRegistration::Handle>) override; + // Must be called after the above BindServiceWorkerHost() and + // SetRegistration() got called. + void ReadyToEvaluateScript() override; void DispatchActivateEvent(int) override; void DispatchBackgroundFetchAbortEvent( int event_id,
diff --git a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc index 7a29b91..a4431d2b 100644 --- a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc +++ b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc
@@ -64,43 +64,6 @@ return std::unique_ptr<WebServiceWorkerProvider>( CreateServiceWorkerProviderProxy()); } - void GetClient(const WebString&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) override { - NOTREACHED(); - } - void GetClients(const WebServiceWorkerClientQueryOptions&, - std::unique_ptr<WebServiceWorkerClientsCallbacks>) override { - NOTREACHED(); - } - void OpenNewTab(const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) override { - NOTREACHED(); - } - void OpenPaymentHandlerWindow( - const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) override { - NOTREACHED(); - } - void PostMessageToClient(const WebString& uuid, - TransferableMessage) override { - NOTREACHED(); - } - void SkipWaiting( - std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>) override { - NOTREACHED(); - } - void Claim(std::unique_ptr<WebServiceWorkerClientsClaimCallbacks>) override { - NOTREACHED(); - } - void Focus(const WebString& uuid, - std::unique_ptr<WebServiceWorkerClientCallbacks>) override { - NOTREACHED(); - } - void Navigate(const WebString& uuid, - const WebURL&, - std::unique_ptr<WebServiceWorkerClientCallbacks>) override { - NOTREACHED(); - } void WorkerContextDestroyed() override { termination_event_.Signal(); } void WaitUntilScriptEvaluated() { script_evaluated_event_.Wait(); }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc index 78bb325..f06cfa4 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -484,7 +484,11 @@ DCHECK(IsMainThread()); DCHECK(audio_context_manager_); - audio_context_manager_->AudioContextAudiblePlaybackStopped(context_id_); + // If we don't have a document, we don't need to notify anyone that we've + // stopped. + if (GetDocument()) { + audio_context_manager_->AudioContextAudiblePlaybackStopped(context_id_); + } } } // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font.cc b/third_party/blink/renderer/platform/fonts/font.cc index 4acff51..def231a9 100644 --- a/third_party/blink/renderer/platform/fonts/font.cc +++ b/third_party/blink/renderer/platform/fonts/font.cc
@@ -255,11 +255,9 @@ return; ShapeResultBloberizer bloberizer(*this, device_scale_factor); - // TODO(layout-dev): This should either not take a direction argument or we - // need to plumb the proper one through. I don't think we need it. - bloberizer.FillTextEmphasisGlyphs( - text_info.text, TextDirection::kLtr, text_info.from, text_info.to, - emphasis_glyph_data, text_info.shape_result); + bloberizer.FillTextEmphasisGlyphs(text_info.text, text_info.from, + text_info.to, emphasis_glyph_data, + text_info.shape_result); DrawBlobs(canvas, flags, bloberizer.Blobs(), point); }
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc index 3788c84..b39e912 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
@@ -710,6 +710,105 @@ return total_advance; } +namespace { + +inline unsigned CountGraphemesInCluster(const UChar* str, + unsigned str_length, + uint16_t start_index, + uint16_t end_index) { + if (start_index > end_index) + std::swap(start_index, end_index); + uint16_t length = end_index - start_index; + DCHECK_LE(static_cast<unsigned>(start_index + length), str_length); + TextBreakIterator* cursor_pos_iterator = + CursorMovementIterator(&str[start_index], length); + + int cursor_pos = cursor_pos_iterator->current(); + int num_graphemes = -1; + while (0 <= cursor_pos) { + cursor_pos = cursor_pos_iterator->next(); + num_graphemes++; + } + return std::max(0, num_graphemes); +} + +} // anonymous namespace + +float ShapeResult::ForEachGraphemeClusters(const StringView& text, + float initial_advance, + unsigned from, + unsigned to, + unsigned index_offset, + GraphemeClusterCallback callback, + void* context) const { + unsigned run_offset = index_offset; + float advance_so_far = initial_advance; + for (const auto& run : runs_) { + unsigned graphemes_in_cluster = 1; + float cluster_advance = 0; + + // FIXME: should this be run->direction_? + bool rtl = Direction() == TextDirection::kRtl; + + // A "cluster" in this context means a cluster as it is used by HarfBuzz: + // The minimal group of characters and corresponding glyphs, that cannot be + // broken down further from a text shaping point of view. A cluster can + // contain multiple glyphs and grapheme clusters, with mutually overlapping + // boundaries. + uint16_t cluster_start = static_cast<uint16_t>( + rtl ? run->start_index_ + run->num_characters_ + run_offset + : run->GlyphToCharacterIndex(0) + run_offset); + + const unsigned num_glyphs = run->glyph_data_.size(); + for (unsigned i = 0; i < num_glyphs; ++i) { + const HarfBuzzRunGlyphData& glyph_data = run->glyph_data_[i]; + uint16_t current_character_index = + run->start_index_ + glyph_data.character_index + run_offset; + bool is_run_end = (i + 1 == num_glyphs); + bool is_cluster_end = + is_run_end || (run->GlyphToCharacterIndex(i + 1) + run_offset != + current_character_index); + + if ((rtl && current_character_index >= to) || + (!rtl && current_character_index < from)) { + advance_so_far += glyph_data.advance; + rtl ? --cluster_start : ++cluster_start; + continue; + } + + cluster_advance += glyph_data.advance; + + if (text.Is8Bit()) { + callback(context, current_character_index, advance_so_far, 1, + glyph_data.advance, run->canvas_rotation_); + + advance_so_far += glyph_data.advance; + } else if (is_cluster_end) { + uint16_t cluster_end; + if (rtl) { + cluster_end = current_character_index; + } else { + cluster_end = static_cast<uint16_t>( + is_run_end ? run->start_index_ + run->num_characters_ + run_offset + : run->GlyphToCharacterIndex(i + 1) + run_offset); + } + graphemes_in_cluster = CountGraphemesInCluster( + text.Characters16(), text.length(), cluster_start, cluster_end); + if (!graphemes_in_cluster || !cluster_advance) + continue; + + callback(context, current_character_index, advance_so_far, + graphemes_in_cluster, cluster_advance, run->canvas_rotation_); + advance_so_far += cluster_advance; + + cluster_start = cluster_end; + cluster_advance = 0; + } + } + } + return advance_so_far; +} + // TODO(kojii): VC2015 fails to explicit instantiation of a member function. // Typed functions + this private function are to instantiate instances. template <typename TextContainerType>
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h index c157513d..2716bf6b 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
@@ -97,6 +97,13 @@ CanvasRotationInVertical, const SimpleFontData*); +typedef void (*GraphemeClusterCallback)(void* context, + unsigned character_index, + float total_advance, + unsigned graphemes_in_cluster, + float cluster_advance, + CanvasRotationInVertical); + class PLATFORM_EXPORT ShapeResult : public RefCounted<ShapeResult> { public: static scoped_refptr<ShapeResult> Create(const Font* font, @@ -258,6 +265,21 @@ GlyphCallback, void* context) const; + // Iterates over, and calls the specified callback function, for all the + // grapheme clusters. As ShapeResuls do not contain the original text content + // a StringView with the text must be supplied and must match the text that + // was used generate the ShapeResult. + // Also tracks (and returns) a seeded total advance. + // The context parameter will be given as the first parameter for the callback + // function. + float ForEachGraphemeClusters(const StringView& text, + float initial_advance, + unsigned from, + unsigned to, + unsigned index_offset, + GraphemeClusterCallback, + void* context) const; + String ToString() const; void ToString(StringBuilder*) const;
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.cc index f3b38f9f..d9dc728 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.cc
@@ -8,7 +8,6 @@ #include "third_party/blink/renderer/platform/fonts/font.h" #include "third_party/blink/renderer/platform/fonts/shaping/caching_word_shaper.h" #include "third_party/blink/renderer/platform/fonts/shaping/shape_result.h" -#include "third_party/blink/renderer/platform/fonts/shaping/shape_result_inline_headers.h" #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h" #include "third_party/blink/renderer/platform/text/text_break_iterator.h" #include "third_party/blink/renderer/platform/text/text_run.h" @@ -123,45 +122,6 @@ return FillGlyphsForResult(result, text, from, to, advance, word_offset); } -void ShapeResultBloberizer::FillTextEmphasisGlyphs( - const TextRunPaintInfo& run_info, - const GlyphData& emphasis_data, - const ShapeResultBuffer& result_buffer) { - float advance = 0; - unsigned word_offset = run_info.run.Rtl() ? run_info.run.length() : 0; - auto results = result_buffer.results_; - - for (unsigned j = 0; j < results.size(); j++) { - unsigned resolved_index = run_info.run.Rtl() ? results.size() - 1 - j : j; - const scoped_refptr<const ShapeResult>& word_result = results[resolved_index]; - for (unsigned i = 0; i < word_result->runs_.size(); i++) { - unsigned resolved_offset = - word_offset - (run_info.run.Rtl() ? word_result->NumCharacters() : 0); - advance += FillTextEmphasisGlyphsForRun( - word_result->runs_[i].get(), run_info.run.ToStringView(), - run_info.run.CharactersLength(), run_info.run.Direction(), - run_info.from, run_info.to, emphasis_data, advance, resolved_offset); - } - word_offset += word_result->NumCharacters() * (run_info.run.Rtl() ? -1 : 1); - } -} - -void ShapeResultBloberizer::FillTextEmphasisGlyphs(const StringView& text, - TextDirection direction, - unsigned from, - unsigned to, - const GlyphData& emphasis, - const ShapeResult* result) { - float advance = 0; - unsigned offset = 0; - - for (unsigned i = 0; i < result->runs_.size(); i++) { - advance += FillTextEmphasisGlyphsForRun(result->runs_[i].get(), text, - text.length(), direction, from, to, - emphasis, advance, offset); - } -} - namespace { inline bool IsSkipInkException(const ShapeResultBloberizer& bloberizer, @@ -199,29 +159,6 @@ } } -inline unsigned CountGraphemesInCluster(const UChar* str, - unsigned str_length, - uint16_t start_index, - uint16_t end_index) { - if (start_index > end_index) { - uint16_t temp_index = start_index; - start_index = end_index; - end_index = temp_index; - } - uint16_t length = end_index - start_index; - DCHECK_LE(static_cast<unsigned>(start_index + length), str_length); - TextBreakIterator* cursor_pos_iterator = - CursorMovementIterator(&str[start_index], length); - - int cursor_pos = cursor_pos_iterator->current(); - int num_graphemes = -1; - while (0 <= cursor_pos) { - cursor_pos = cursor_pos_iterator->next(); - num_graphemes++; - } - return std::max(0, num_graphemes); -} - class GlyphCallbackContext { WTF_MAKE_NONCOPYABLE(GlyphCallbackContext); STACK_ALLOCATED(); @@ -268,8 +205,102 @@ advance + glyph_offset.Width()); } +class ClusterCallbackContext { + WTF_MAKE_NONCOPYABLE(ClusterCallbackContext); + STACK_ALLOCATED(); + + public: + ShapeResultBloberizer* bloberizer; + const StringView& text; + const GlyphData& emphasis_data; + FloatPoint glyph_center; +}; + +void AddEmphasisMarkToBloberizer(void* context, + unsigned character_index, + float advance_so_far, + unsigned graphemes_in_cluster, + float cluster_advance, + CanvasRotationInVertical canvas_rotation) { + ClusterCallbackContext* parsed_context = + static_cast<ClusterCallbackContext*>(context); + ShapeResultBloberizer* bloberizer = parsed_context->bloberizer; + const StringView& text = parsed_context->text; + const GlyphData& emphasis_data = parsed_context->emphasis_data; + FloatPoint glyph_center = parsed_context->glyph_center; + + if (text.Is8Bit()) { + if (Character::CanReceiveTextEmphasis(text[character_index])) { + AddEmphasisMark(*bloberizer, emphasis_data, canvas_rotation, glyph_center, + advance_so_far + cluster_advance / 2); + } + } else { + float glyph_advance_x = cluster_advance / graphemes_in_cluster; + for (unsigned j = 0; j < graphemes_in_cluster; ++j) { + // Do not put emphasis marks on space, separator, and control + // characters. + if (Character::CanReceiveTextEmphasis(text[character_index])) { + AddEmphasisMark(*bloberizer, emphasis_data, canvas_rotation, + glyph_center, advance_so_far + glyph_advance_x / 2); + } + advance_so_far += glyph_advance_x; + } + } +} + } // namespace +void ShapeResultBloberizer::FillTextEmphasisGlyphs( + const TextRunPaintInfo& run_info, + const GlyphData& emphasis, + const ShapeResultBuffer& result_buffer) { + FloatPoint glyph_center = + emphasis.font_data->BoundsForGlyph(emphasis.glyph).Center(); + + float advance = 0; + auto results = result_buffer.results_; + + if (run_info.run.Rtl()) { + unsigned word_offset = run_info.run.length(); + for (unsigned j = 0; j < results.size(); j++) { + unsigned resolved_index = results.size() - 1 - j; + const scoped_refptr<const ShapeResult>& word_result = + results[resolved_index]; + word_offset -= word_result->NumCharacters(); + StringView text = run_info.run.ToStringView(); + ClusterCallbackContext context = {this, text, emphasis, glyph_center}; + advance = word_result->ForEachGraphemeClusters( + text, advance, run_info.from, run_info.to, word_offset, + AddEmphasisMarkToBloberizer, static_cast<void*>(&context)); + } + } else { // Left-to-right. + unsigned word_offset = 0; + for (const auto& word_result : results) { + StringView text = run_info.run.ToStringView(); + ClusterCallbackContext context = {this, text, emphasis, glyph_center}; + advance = word_result->ForEachGraphemeClusters( + text, advance, run_info.from, run_info.to, word_offset, + AddEmphasisMarkToBloberizer, static_cast<void*>(&context)); + word_offset += word_result->NumCharacters(); + } + } +} + +void ShapeResultBloberizer::FillTextEmphasisGlyphs(const StringView& text, + unsigned from, + unsigned to, + const GlyphData& emphasis, + const ShapeResult* result) { + FloatPoint glyph_center = + emphasis.font_data->BoundsForGlyph(emphasis.glyph).Center(); + ClusterCallbackContext context = {this, text, emphasis, glyph_center}; + float initial_advance = 0; + unsigned index_offset = 0; + result->ForEachGraphemeClusters(text, initial_advance, from, to, index_offset, + AddEmphasisMarkToBloberizer, + static_cast<void*>(&context)); +} + float ShapeResultBloberizer::FillGlyphsForResult(const ShapeResult* result, const StringView& text, unsigned from, @@ -327,93 +358,4 @@ static_cast<void*>(this)); } -float ShapeResultBloberizer::FillTextEmphasisGlyphsForRun( - const ShapeResult::RunInfo* run, - const StringView& text, - unsigned text_length, - TextDirection direction, - unsigned from, - unsigned to, - const GlyphData& emphasis_data, - float initial_advance, - unsigned run_offset) { - if (!run) - return 0; - - unsigned graphemes_in_cluster = 1; - float cluster_advance = 0; - - FloatPoint glyph_center = - emphasis_data.font_data->BoundsForGlyph(emphasis_data.glyph).Center(); - - // A "cluster" in this context means a cluster as it is used by HarfBuzz: - // The minimal group of characters and corresponding glyphs, that cannot be - // broken down further from a text shaping point of view. A cluster can - // contain multiple glyphs and grapheme clusters, with mutually overlapping - // boundaries. Below we count grapheme clusters per HarfBuzz clusters, then - // linearly split the sum of corresponding glyph advances by the number of - // grapheme clusters in order to find positions for emphasis mark drawing. - uint16_t cluster_start = static_cast<uint16_t>( - direction == TextDirection::kRtl - ? run->start_index_ + run->num_characters_ + run_offset - : run->GlyphToCharacterIndex(0) + run_offset); - - float advance_so_far = initial_advance; - const unsigned num_glyphs = run->glyph_data_.size(); - for (unsigned i = 0; i < num_glyphs; ++i) { - const HarfBuzzRunGlyphData& glyph_data = run->glyph_data_[i]; - uint16_t current_character_index = - run->start_index_ + glyph_data.character_index + run_offset; - bool is_run_end = (i + 1 == num_glyphs); - bool is_cluster_end = - is_run_end || (run->GlyphToCharacterIndex(i + 1) + run_offset != - current_character_index); - - if ((direction == TextDirection::kRtl && current_character_index >= to) || - (direction != TextDirection::kRtl && current_character_index < from)) { - advance_so_far += glyph_data.advance; - direction == TextDirection::kRtl ? --cluster_start : ++cluster_start; - continue; - } - - cluster_advance += glyph_data.advance; - - if (text.Is8Bit()) { - float glyph_advance_x = glyph_data.advance; - if (Character::CanReceiveTextEmphasis(text[current_character_index])) { - AddEmphasisMark(*this, emphasis_data, run->CanvasRotation(), - glyph_center, advance_so_far + glyph_advance_x / 2); - } - advance_so_far += glyph_advance_x; - } else if (is_cluster_end) { - uint16_t cluster_end; - if (direction == TextDirection::kRtl) { - cluster_end = current_character_index; - } else { - cluster_end = static_cast<uint16_t>( - is_run_end ? run->start_index_ + run->num_characters_ + run_offset - : run->GlyphToCharacterIndex(i + 1) + run_offset); - } - graphemes_in_cluster = CountGraphemesInCluster( - text.Characters16(), text_length, cluster_start, cluster_end); - if (!graphemes_in_cluster || !cluster_advance) - continue; - - float glyph_advance_x = cluster_advance / graphemes_in_cluster; - for (unsigned j = 0; j < graphemes_in_cluster; ++j) { - // Do not put emphasis marks on space, separator, and control - // characters. - if (Character::CanReceiveTextEmphasis(text[current_character_index])) { - AddEmphasisMark(*this, emphasis_data, run->CanvasRotation(), - glyph_center, advance_so_far + glyph_advance_x / 2); - } - advance_so_far += glyph_advance_x; - } - cluster_start = cluster_end; - cluster_advance = 0; - } - } - return advance_so_far - initial_advance; -} - } // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.h index 083e806..571f250 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_bloberizer.h
@@ -44,12 +44,10 @@ const GlyphData& emphasis_data, const ShapeResultBuffer&); void FillTextEmphasisGlyphs(const StringView&, - TextDirection, unsigned from, unsigned to, const GlyphData& emphasis_data, const ShapeResult*); - void Add(Glyph glyph, const SimpleFontData* font_data, CanvasRotationInVertical canvas_rotation, @@ -125,16 +123,6 @@ float FillFastHorizontalGlyphs(const ShapeResultBuffer&, TextDirection); float FillFastHorizontalGlyphs(const ShapeResult*, float advance = 0); - float FillTextEmphasisGlyphsForRun(const ShapeResult::RunInfo*, - const StringView&, - unsigned text_length, - TextDirection, - unsigned from, - unsigned to, - const GlyphData& emphasis_data, - float initial_advance, - unsigned run_offset); - void CommitPendingRun(); void CommitPendingBlob();
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index cf0048aa..9603c55 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -318,8 +318,7 @@ ReportResourceProviderCreationFailure(); if (resource_provider && IsAccelerated() && !layer_) { - layer_ = cc::TextureLayer::CreateForMailbox( - this, cc::TextureLayer::kMaxResourcesWaitingCanvasWebGL); + layer_ = cc::TextureLayer::CreateForMailbox(this); layer_->SetIsDrawable(true); layer_->SetContentsOpaque(ColorParams().GetOpacityMode() == kOpaque); layer_->SetBlendBackgroundColor(ColorParams().GetOpacityMode() != kOpaque);
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc index 70f2a59..7920d50 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.cc
@@ -12,7 +12,8 @@ void ChunkToLayerMapper::SwitchToChunk(const PaintChunk& chunk) { outset_for_raster_effects_ = chunk.outset_for_raster_effects; - const auto& new_chunk_state = chunk.properties.GetPropertyTreeState(); + const auto& new_chunk_state = + chunk.properties.GetPropertyTreeState().Unalias(); if (new_chunk_state == chunk_state_) return; @@ -35,7 +36,8 @@ if (new_chunk_state.Effect() != chunk_state_.Effect()) { new_has_filter_that_moves_pixels = false; for (const auto* effect = new_chunk_state.Effect(); - effect && effect != layer_state_.Effect(); effect = effect->Parent()) { + effect && effect != layer_state_.Effect(); + effect = effect->Parent()->Unalias()) { if (effect->HasFilterThatMovesPixels()) { new_has_filter_that_moves_pixels = true; break;
diff --git a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h index dc83ce0fd..e699f59 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h +++ b/third_party/blink/renderer/platform/graphics/compositing/chunk_to_layer_mapper.h
@@ -22,7 +22,7 @@ ChunkToLayerMapper(const PropertyTreeState& layer_state, const gfx::Vector2dF& layer_offset, const FloatSize& visual_rect_subpixel_offset = FloatSize()) - : layer_state_(layer_state), + : layer_state_(layer_state.Unalias()), layer_offset_(layer_offset), visual_rect_subpixel_offset_(visual_rect_subpixel_offset), chunk_state_(nullptr, nullptr, nullptr) {}
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc index 7d84c4d1..ce41070 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -288,7 +288,8 @@ : bounds(first_paint_chunk.bounds), rect_known_to_be_opaque( first_paint_chunk.known_to_be_opaque ? bounds : FloatRect()), - property_tree_state(first_paint_chunk.properties.GetPropertyTreeState()), + property_tree_state( + first_paint_chunk.properties.GetPropertyTreeState().Unalias()), requires_own_layer(chunk_requires_own_layer) { paint_chunk_indices.push_back(chunk_index); } @@ -313,8 +314,10 @@ const PendingLayer& guest) const { if (requires_own_layer || guest.requires_own_layer) return false; - if (property_tree_state.Effect() != guest.property_tree_state.Effect()) + if (property_tree_state.Effect()->Unalias() != + guest.property_tree_state.Effect()->Unalias()) { return false; + } return CanUpcastTo(guest.property_tree_state, property_tree_state); } @@ -368,21 +371,27 @@ // transform space. static bool CanUpcastTo(const PropertyTreeState& guest, const PropertyTreeState& home) { - DCHECK_EQ(home.Effect(), guest.Effect()); + DCHECK_EQ(home.Effect()->Unalias(), guest.Effect()->Unalias()); if (IsBackfaceHidden(home.Transform()) != IsBackfaceHidden(guest.Transform())) return false; - for (const ClipPaintPropertyNode* current_clip = guest.Clip(); - current_clip != home.Clip(); current_clip = current_clip->Parent()) { + auto* home_clip = home.Clip()->Unalias(); + for (const ClipPaintPropertyNode* current_clip = guest.Clip()->Unalias(); + current_clip != home_clip; + current_clip = current_clip->Parent() ? current_clip->Parent()->Unalias() + : nullptr) { if (!current_clip || current_clip->HasDirectCompositingReasons()) return false; - if (!IsNonCompositingAncestorOf(home.Transform(), - current_clip->LocalTransformSpace())) + if (!IsNonCompositingAncestorOf( + home.Transform()->Unalias(), + current_clip->LocalTransformSpace()->Unalias())) { return false; + } } - return IsNonCompositingAncestorOf(home.Transform(), guest.Transform()); + return IsNonCompositingAncestorOf(home.Transform()->Unalias(), + guest.Transform()->Unalias()); } // Returns nullptr if 'ancestor' is not a strict ancestor of 'node'. @@ -413,10 +422,11 @@ bool PaintArtifactCompositor::CanDecompositeEffect( const EffectPaintPropertyNode* effect, const PendingLayer& layer) { + effect = effect->Unalias(); // If the effect associated with the layer is deeper than than the effect // we are attempting to decomposite, than implies some previous decision // did not allow to decomposite intermediate effects. - if (layer.property_tree_state.Effect() != effect) + if (layer.property_tree_state.Effect()->Unalias() != effect) return false; if (layer.requires_own_layer) return false; @@ -475,7 +485,8 @@ Vector<PaintChunk>::const_iterator& chunk_it) { // Skip paint chunks that are effectively invisible due to opacity and don't // have a direct compositing reason. - if (SkipGroupIfEffectivelyInvisible(paint_artifact, current_group, chunk_it)) + if (SkipGroupIfEffectivelyInvisible(paint_artifact, *current_group.Unalias(), + chunk_it)) return; size_t first_layer_in_current_group = pending_layers.size(); @@ -502,7 +513,7 @@ // A. The next chunk belongs to the current group but no subgroup. // B. The next chunk does not belong to the current group. // C. The next chunk belongs to some subgroup of the current group. - const auto* chunk_effect = chunk_it->properties.Effect(); + const auto* chunk_effect = chunk_it->properties.Effect()->Unalias(); if (chunk_effect == ¤t_group) { // Case A: The next chunk belongs to the current group but no subgroup. const auto& last_display_item =
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index 1f57e88..d4e7543 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -354,6 +354,46 @@ } } +TEST_P(PaintArtifactCompositorTest, OneTransformWithAlias) { + // A 90 degree clockwise rotation about (100, 100). + auto real_transform = CreateTransform(t0(), TransformationMatrix().Rotate(90), + FloatPoint3D(100, 100, 0), + CompositingReason::k3DTransform); + auto transform = TransformPaintPropertyNode::CreateAlias(*real_transform); + + TestPaintArtifact artifact; + artifact.Chunk(*transform, c0(), e0()) + .RectDrawing(FloatRect(0, 0, 100, 100), Color::kWhite); + artifact.Chunk().RectDrawing(FloatRect(0, 0, 100, 100), Color::kGray); + artifact.Chunk(*transform, c0(), e0()) + .RectDrawing(FloatRect(100, 100, 200, 100), Color::kBlack); + Update(artifact.Build()); + + ASSERT_EQ(2u, ContentLayerCount()); + { + const cc::Layer* layer = ContentLayerAt(0); + + Vector<RectWithColor> rects_with_color; + rects_with_color.push_back( + RectWithColor(FloatRect(0, 0, 100, 100), Color::kWhite)); + rects_with_color.push_back( + RectWithColor(FloatRect(100, 100, 200, 100), Color::kBlack)); + + EXPECT_THAT(layer->GetPicture(), + Pointee(DrawsRectangles(rects_with_color))); + gfx::RectF mapped_rect(0, 0, 100, 100); + layer->ScreenSpaceTransform().TransformRect(&mapped_rect); + EXPECT_EQ(gfx::RectF(100, 0, 100, 100), mapped_rect); + } + { + const cc::Layer* layer = ContentLayerAt(1); + EXPECT_THAT( + layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 100, 100), Color::kGray))); + EXPECT_EQ(gfx::Transform(), layer->ScreenSpaceTransform()); + } +} + TEST_P(PaintArtifactCompositorTest, TransformCombining) { // A translation by (5, 5) within a 2x scale about (10, 10). auto transform1 = @@ -480,6 +520,59 @@ } } +TEST_P(PaintArtifactCompositorTest, FlattensInheritedTransformWithAlias) { + for (bool transform_is_flattened : {true, false}) { + SCOPED_TRACE(transform_is_flattened); + + // The flattens_inherited_transform bit corresponds to whether the _parent_ + // transform node flattens the transform. This is because Blink's notion of + // flattening determines whether content within the node's local transform + // is flattened, while cc's notion applies in the parent's coordinate space. + auto real_transform1 = CreateTransform(t0(), TransformationMatrix()); + auto transform1 = TransformPaintPropertyNode::CreateAlias(*real_transform1); + auto real_transform2 = + CreateTransform(*transform1, TransformationMatrix().Rotate3d(0, 45, 0)); + auto transform2 = TransformPaintPropertyNode::CreateAlias(*real_transform2); + TransformPaintPropertyNode::State transform3_state; + transform3_state.matrix = TransformationMatrix().Rotate3d(0, 45, 0); + transform3_state.flattens_inherited_transform = transform_is_flattened; + auto real_transform3 = TransformPaintPropertyNode::Create( + *transform2, std::move(transform3_state)); + auto transform3 = TransformPaintPropertyNode::CreateAlias(*real_transform3); + + TestPaintArtifact artifact; + artifact.Chunk(*transform3, c0(), e0()) + .RectDrawing(FloatRect(0, 0, 300, 200), Color::kWhite); + Update(artifact.Build()); + + ASSERT_EQ(1u, ContentLayerCount()); + const cc::Layer* layer = ContentLayerAt(0); + EXPECT_THAT( + layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 300, 200), Color::kWhite))); + + // The leaf transform node should flatten its inherited transform node + // if and only if the intermediate rotation transform in the Blink tree + // flattens. + const cc::TransformNode* transform_node3 = + GetPropertyTrees().transform_tree.Node(layer->transform_tree_index()); + EXPECT_EQ(transform_is_flattened, + transform_node3->flattens_inherited_transform); + + // Given this, we should expect the correct screen space transform for + // each case. If the transform was flattened, we should see it getting + // an effective horizontal scale of 1/sqrt(2) each time, thus it gets + // half as wide. If the transform was not flattened, we should see an + // empty rectangle (as the total 90 degree rotation makes it + // perpendicular to the viewport). + gfx::RectF rect(0, 0, 100, 100); + layer->ScreenSpaceTransform().TransformRect(&rect); + if (transform_is_flattened) + EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 100), rect); + else + EXPECT_TRUE(rect.IsEmpty()); + } +} TEST_P(PaintArtifactCompositorTest, SortingContextID) { // Has no 3D rendering context. auto transform1 = CreateTransform(t0(), TransformationMatrix()); @@ -580,6 +673,32 @@ EXPECT_EQ(gfx::RectF(100, 100, 300, 200), clip_node->clip); } +TEST_P(PaintArtifactCompositorTest, OneClipWithAlias) { + auto real_clip = + CreateClip(c0(), &t0(), FloatRoundedRect(100, 100, 300, 200)); + auto clip = ClipPaintPropertyNode::CreateAlias(*real_clip); + + TestPaintArtifact artifact; + artifact.Chunk(t0(), *clip, e0()) + .RectDrawing(FloatRect(220, 80, 300, 200), Color::kBlack); + Update(artifact.Build()); + + ASSERT_EQ(1u, ContentLayerCount()); + const cc::Layer* layer = ContentLayerAt(0); + // The layer is clipped. + EXPECT_EQ(gfx::Size(180, 180), layer->bounds()); + EXPECT_EQ(gfx::Vector2dF(220, 100), layer->offset_to_transform_parent()); + EXPECT_THAT( + layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 300, 180), Color::kBlack))); + EXPECT_EQ(Translation(220, 100), layer->ScreenSpaceTransform()); + + const cc::ClipNode* clip_node = + GetPropertyTrees().clip_tree.Node(layer->clip_tree_index()); + EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, clip_node->clip_type); + EXPECT_EQ(gfx::RectF(100, 100, 300, 200), clip_node->clip); +} + TEST_P(PaintArtifactCompositorTest, NestedClips) { auto clip1 = CreateClip(c0(), &t0(), FloatRoundedRect(100, 100, 700, 700), CompositingReason::kOverflowScrollingTouch); @@ -638,6 +757,68 @@ EXPECT_EQ(outer_clip->id, inner_clip->parent_id); } +TEST_P(PaintArtifactCompositorTest, NestedClipsWithAlias) { + auto real_clip1 = + CreateClip(c0(), &t0(), FloatRoundedRect(100, 100, 700, 700), + CompositingReason::kOverflowScrollingTouch); + auto clip1 = ClipPaintPropertyNode::CreateAlias(*real_clip1); + auto real_clip2 = + CreateClip(*clip1, &t0(), FloatRoundedRect(200, 200, 700, 700), + CompositingReason::kOverflowScrollingTouch); + auto clip2 = ClipPaintPropertyNode::CreateAlias(*real_clip2); + + TestPaintArtifact artifact; + artifact.Chunk(t0(), *clip1, e0()) + .RectDrawing(FloatRect(300, 350, 100, 100), Color::kWhite); + artifact.Chunk(t0(), *clip2, e0()) + .RectDrawing(FloatRect(300, 350, 100, 100), Color::kLightGray); + artifact.Chunk(t0(), *clip1, e0()) + .RectDrawing(FloatRect(300, 350, 100, 100), Color::kDarkGray); + artifact.Chunk(t0(), *clip2, e0()) + .RectDrawing(FloatRect(300, 350, 100, 100), Color::kBlack); + Update(artifact.Build()); + + ASSERT_EQ(4u, ContentLayerCount()); + + const cc::Layer* white_layer = ContentLayerAt(0); + EXPECT_THAT( + white_layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 100, 100), Color::kWhite))); + EXPECT_EQ(Translation(300, 350), white_layer->ScreenSpaceTransform()); + + const cc::Layer* light_gray_layer = ContentLayerAt(1); + EXPECT_THAT( + light_gray_layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 100, 100), Color::kLightGray))); + EXPECT_EQ(Translation(300, 350), light_gray_layer->ScreenSpaceTransform()); + + const cc::Layer* dark_gray_layer = ContentLayerAt(2); + EXPECT_THAT( + dark_gray_layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 100, 100), Color::kDarkGray))); + EXPECT_EQ(Translation(300, 350), dark_gray_layer->ScreenSpaceTransform()); + + const cc::Layer* black_layer = ContentLayerAt(3); + EXPECT_THAT( + black_layer->GetPicture(), + Pointee(DrawsRectangle(FloatRect(0, 0, 100, 100), Color::kBlack))); + EXPECT_EQ(Translation(300, 350), black_layer->ScreenSpaceTransform()); + + EXPECT_EQ(white_layer->clip_tree_index(), dark_gray_layer->clip_tree_index()); + const cc::ClipNode* outer_clip = + GetPropertyTrees().clip_tree.Node(white_layer->clip_tree_index()); + EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, outer_clip->clip_type); + EXPECT_EQ(gfx::RectF(100, 100, 700, 700), outer_clip->clip); + + EXPECT_EQ(light_gray_layer->clip_tree_index(), + black_layer->clip_tree_index()); + const cc::ClipNode* inner_clip = + GetPropertyTrees().clip_tree.Node(black_layer->clip_tree_index()); + EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, inner_clip->clip_type); + EXPECT_EQ(gfx::RectF(200, 200, 700, 700), inner_clip->clip); + EXPECT_EQ(outer_clip->id, inner_clip->parent_id); +} + TEST_P(PaintArtifactCompositorTest, DeeplyNestedClips) { Vector<scoped_refptr<ClipPaintPropertyNode>> clips; for (unsigned i = 1; i <= 10; i++) { @@ -671,12 +852,16 @@ } } -TEST_P(PaintArtifactCompositorTest, SiblingClips) { - auto common_clip = CreateClip(c0(), &t0(), FloatRoundedRect(0, 0, 800, 600)); - auto clip1 = +TEST_P(PaintArtifactCompositorTest, SiblingClipsWithAlias) { + auto real_common_clip = + CreateClip(c0(), &t0(), FloatRoundedRect(0, 0, 800, 600)); + auto common_clip = ClipPaintPropertyNode::CreateAlias(*real_common_clip); + auto real_clip1 = CreateClip(*common_clip, &t0(), FloatRoundedRect(0, 0, 400, 600)); - auto clip2 = + auto clip1 = ClipPaintPropertyNode::CreateAlias(*real_clip1); + auto real_clip2 = CreateClip(*common_clip, &t0(), FloatRoundedRect(400, 0, 400, 600)); + auto clip2 = ClipPaintPropertyNode::CreateAlias(*real_clip2); TestPaintArtifact artifact; artifact.Chunk(t0(), *clip1, e0()) @@ -738,17 +923,21 @@ EXPECT_EQ(Translation(50, 60), layer->ScreenSpaceTransform()); } -TEST_P(PaintArtifactCompositorTest, EffectTreeConversion) { +TEST_P(PaintArtifactCompositorTest, EffectTreeConversionWithAlias) { EffectPaintPropertyNode::State effect1_state; effect1_state.local_transform_space = &t0(); effect1_state.output_clip = &c0(); effect1_state.opacity = 0.5; effect1_state.direct_compositing_reasons = CompositingReason::kAll; effect1_state.compositor_element_id = CompositorElementId(2); - auto effect1 = + auto real_effect1 = EffectPaintPropertyNode::Create(e0(), std::move(effect1_state)); - auto effect2 = CreateOpacityEffect(*effect1, 0.3, CompositingReason::kAll); - auto effect3 = CreateOpacityEffect(e0(), 0.2, CompositingReason::kAll); + auto effect1 = EffectPaintPropertyNode::CreateAlias(*real_effect1); + auto real_effect2 = + CreateOpacityEffect(*effect1, 0.3, CompositingReason::kAll); + auto effect2 = EffectPaintPropertyNode::CreateAlias(*real_effect2); + auto real_effect3 = CreateOpacityEffect(e0(), 0.2, CompositingReason::kAll); + auto effect3 = EffectPaintPropertyNode::CreateAlias(*real_effect3); TestPaintArtifact artifact; artifact.Chunk(t0(), c0(), *effect2) @@ -1311,16 +1500,52 @@ } } -TEST_P(PaintArtifactCompositorTest, MergeNested) { +TEST_P(PaintArtifactCompositorTest, MergeOpacityWithAlias) { + float opacity = 2.0 / 255.0; + auto real_effect = CreateOpacityEffect(e0(), opacity); + auto effect = EffectPaintPropertyNode::CreateAlias(*real_effect); + + TestPaintArtifact test_artifact; + test_artifact.Chunk().RectDrawing(FloatRect(0, 0, 100, 100), Color::kWhite); + test_artifact.Chunk(t0(), c0(), *effect) + .RectDrawing(FloatRect(0, 0, 100, 100), Color::kBlack); + test_artifact.Chunk().RectDrawing(FloatRect(0, 0, 200, 300), Color::kGray); + + auto artifact = test_artifact.Build(); + ASSERT_EQ(3u, artifact->PaintChunks().size()); + Update(artifact); + ASSERT_EQ(1u, ContentLayerCount()); + { + Vector<RectWithColor> rects_with_color; + rects_with_color.push_back( + RectWithColor(FloatRect(0, 0, 100, 100), Color::kWhite)); + // Transform is applied to this PaintChunk. + rects_with_color.push_back( + RectWithColor(FloatRect(0, 0, 100, 100), + Color(Color::kBlack).CombineWithAlpha(opacity).Rgb())); + rects_with_color.push_back( + RectWithColor(FloatRect(0, 0, 200, 300), Color::kGray)); + + const cc::Layer* layer = ContentLayerAt(0); + EXPECT_THAT(layer->GetPicture(), + Pointee(DrawsRectangles(rects_with_color))); + } +} + +TEST_P(PaintArtifactCompositorTest, MergeNestedWithAlias) { // Tests merging of an opacity effect, inside of a clip, inside of a // transform. - auto transform = + auto real_transform = CreateTransform(t0(), TransformationMatrix().Translate(50, 50), FloatPoint3D(100, 100, 0)); - auto clip = + auto transform = TransformPaintPropertyNode::CreateAlias(*real_transform); + auto real_clip = CreateClip(c0(), transform.get(), FloatRoundedRect(10, 20, 50, 60)); + auto clip = ClipPaintPropertyNode::CreateAlias(*real_clip); float opacity = 2.0 / 255.0; - auto effect = CreateOpacityEffect(e0(), transform.get(), clip.get(), opacity); + auto real_effect = + CreateOpacityEffect(e0(), transform.get(), clip.get(), opacity); + auto effect = EffectPaintPropertyNode::CreateAlias(*real_effect); TestPaintArtifact test_artifact; test_artifact.Chunk().RectDrawing(FloatRect(0, 0, 100, 100), Color::kWhite); @@ -1759,6 +1984,18 @@ EXPECT_EQ(2, ElementIdToEffectNodeIndex(effect->GetCompositorElementId())); } +TEST_P(PaintArtifactCompositorTest, EffectWithElementIdWithAlias) { + auto real_effect = CreateSampleEffectNodeWithElementId(); + auto effect = EffectPaintPropertyNode::CreateAlias(*real_effect); + TestPaintArtifact artifact; + artifact.Chunk(t0(), c0(), *effect) + .RectDrawing(FloatRect(100, 100, 200, 100), Color::kBlack); + Update(artifact.Build()); + + EXPECT_EQ(2, + ElementIdToEffectNodeIndex(real_effect->GetCompositorElementId())); +} + TEST_P(PaintArtifactCompositorTest, CompositedLuminanceMask) { auto masked = CreateOpacityEffect( e0(), 1.0, CompositingReason::kIsolateCompositedDescendants);
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index 96605f2e..ae00c26 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -42,7 +42,7 @@ layer_offset_(layer_offset), current_transform_(Unalias(layer_state.Transform())), current_clip_(Unalias(layer_state.Clip())), - current_effect_(layer_state.Effect()), + current_effect_(Unalias(layer_state.Effect())), chunk_to_layer_mapper_(layer_state_, layer_offset_, visual_rect_subpixel_offset), @@ -419,12 +419,13 @@ void ConversionContext::SwitchToEffect( const EffectPaintPropertyNode* target_effect) { + target_effect = Unalias(target_effect); if (target_effect == current_effect_) return; // Step 1: Exit all effects until the lowest common ancestor is found. const EffectPaintPropertyNode* lca_effect = - &LowestCommonAncestor(*target_effect, *current_effect_); + LowestCommonAncestor(*target_effect, *current_effect_).Unalias(); while (current_effect_ != lca_effect) { // This EndClips() and the later EndEffect() pop to the parent effect. EndClips(); @@ -444,7 +445,7 @@ // effect. At this point the current effect must be an ancestor of the target. Vector<const EffectPaintPropertyNode*, 1u> pending_effects; for (const EffectPaintPropertyNode* effect = target_effect; - effect != current_effect_; effect = effect->Parent()) { + effect != current_effect_; effect = Unalias(effect->Parent())) { // This should never happen unless the DCHECK in step 1 failed. if (!effect) break; @@ -454,12 +455,14 @@ // Step 3: Now apply the list of effects in top-down order. for (size_t i = pending_effects.size(); i--;) { const EffectPaintPropertyNode* sub_effect = pending_effects[i]; - DCHECK_EQ(current_effect_, sub_effect->Parent()); + DCHECK_EQ(current_effect_, Unalias(sub_effect->Parent())); StartEffect(sub_effect); } } void ConversionContext::StartEffect(const EffectPaintPropertyNode* effect) { + DCHECK_EQ(effect, Unalias(effect)); + // Before each effect can be applied, we must enter its output clip first, // or exit all clips if it doesn't have one. if (effect->OutputClip()) @@ -560,7 +563,7 @@ void ConversionContext::EndEffect() { const auto& previous_state = state_stack_.back(); DCHECK_EQ(previous_state.type, StateEntry::kEffect); - DCHECK_EQ(current_effect_->Parent(), previous_state.effect); + DCHECK(Unalias(current_effect_->Parent()) == previous_state.effect); DCHECK_EQ(current_clip_, previous_state.clip); DCHECK(effect_bounds_stack_.size());
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc index a3aeb43..7fe9338 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer_test.cc
@@ -1186,5 +1186,42 @@ EXPECT_THAT(*output, PaintRecordMatcher::Make({cc::PaintOpType::DrawRecord})); } +TEST_F(PaintChunksToCcLayerTest, NoopEffectDoesNotEmitItems) { + auto e1 = CreateOpacityEffect(e0(), 0.5f); + auto noop_e2 = EffectPaintPropertyNode::CreateAlias(*e1); + auto noop_e3 = EffectPaintPropertyNode::CreateAlias(*noop_e2); + auto e4 = CreateOpacityEffect(*noop_e3, 0.5f); + + TestChunks chunks; + chunks.AddChunk(t0(), c0(), e0()); + chunks.AddChunk(t0(), c0(), *e1); + chunks.AddChunk(t0(), c0(), *noop_e2); + chunks.AddChunk(t0(), c0(), *noop_e3); + chunks.AddChunk(t0(), c0(), *e4); + chunks.AddChunk(t0(), c0(), *noop_e2); + chunks.AddChunk(t0(), c0(), *e1); + + auto output = + PaintChunksToCcLayer::Convert( + chunks.chunks, PropertyTreeState::Root(), gfx::Vector2dF(), + chunks.items, cc::DisplayItemList::kToBeReleasedAsPaintOpBuffer) + ->ReleaseAsRecord(); + + EXPECT_THAT(*output, + PaintRecordMatcher::Make({ + cc::PaintOpType::DrawRecord, // e0 + cc::PaintOpType::SaveLayerAlpha, // e1 + cc::PaintOpType::DrawRecord, // draw with e1 + cc::PaintOpType::DrawRecord, // draw with noop_e2 + cc::PaintOpType::DrawRecord, // draw_with noop_e3 + cc::PaintOpType::SaveLayerAlpha, // e4 + cc::PaintOpType::DrawRecord, // draw with e4 + cc::PaintOpType::Restore, // end e4 + cc::PaintOpType::DrawRecord, // draw with noop_e2 + cc::PaintOpType::DrawRecord, // draw with e1 + cc::PaintOpType::Restore // end noop_e2 (or e1) + })); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc index 5f87eeea..c68dd5a 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -161,6 +161,7 @@ if (!transform_node) return kSecondaryRootNodeId; + transform_node = transform_node->Unalias(); auto it = transform_node_map_.find(transform_node); if (it != transform_node_map_.end()) return it->value; @@ -279,6 +280,7 @@ if (!clip_node) return kSecondaryRootNodeId; + clip_node = clip_node->Unalias(); auto it = clip_node_map_.find(clip_node); if (it != clip_node_map_.end()) return it->value; @@ -479,7 +481,8 @@ // At last, the caller invokes Finalize() to close the unclosed synthetic // effect. Another mask layer L_C1_2 is generated, along with its internal // effect node for blending. - const auto& ancestor = LowestCommonAncestor(*current_effect_, next_effect); + const auto& ancestor = + *LowestCommonAncestor(*current_effect_, next_effect).Unalias(); while (current_effect_ != &ancestor) CloseCcEffect(); @@ -510,6 +513,7 @@ const ClipPaintPropertyNode* target_clip, SkBlendMode delegated_blend, bool effect_is_newly_built) { + target_clip = target_clip->Unalias(); if (delegated_blend != SkBlendMode::kSrcOver) { // Exit all synthetic effect node for rounded clip if the next child has // exotic blending mode because it has to access the backdrop of enclosing @@ -524,7 +528,8 @@ } else { // Exit synthetic effects until there are no more synthesized clips below // our lowest common ancestor. - const auto& lca = LowestCommonAncestor(*current_clip_, *target_clip); + const auto& lca = + *LowestCommonAncestor(*current_clip_, *target_clip).Unalias(); while (current_clip_ != &lca) { DCHECK(IsCurrentCcEffectSynthetic()); const auto* pre_exit_clip = current_clip_; @@ -549,7 +554,8 @@ DCHECK(current_clip_->IsAncestorOf(*target_clip)); Vector<const ClipPaintPropertyNode*> pending_clips; - for (; target_clip != current_clip_; target_clip = target_clip->Parent()) { + for (; target_clip != current_clip_; + target_clip = target_clip->Parent()->Unalias()) { DCHECK(target_clip); bool should_synthesize = target_clip->ClipRect().IsRounded() || target_clip->ClipPath(); @@ -590,12 +596,13 @@ bool PropertyTreeManager::BuildEffectNodesRecursively( const EffectPaintPropertyNode* next_effect) { + next_effect = next_effect ? next_effect->Unalias() : nullptr; if (next_effect == current_effect_) return false; DCHECK(next_effect); bool newly_built = BuildEffectNodesRecursively(next_effect->Parent()); - DCHECK_EQ(next_effect->Parent(), current_effect_); + DCHECK_EQ(next_effect->Parent()->Unalias(), current_effect_); #if DCHECK_IS_ON() DCHECK(!effect_nodes_converted_.Contains(next_effect)) @@ -675,7 +682,7 @@ current_effect_type_ = CcEffectType::kEffect; current_effect_ = next_effect; if (next_effect->OutputClip()) - current_clip_ = next_effect->OutputClip(); + current_clip_ = next_effect->OutputClip()->Unalias(); return true; }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index 2b71c43e..66b94d2 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -913,8 +913,7 @@ cc::Layer* DrawingBuffer::CcLayer() { if (!layer_) { - layer_ = cc::TextureLayer::CreateForMailbox( - this, cc::TextureLayer::kMaxResourcesWaitingCanvasWebGL); + layer_ = cc::TextureLayer::CreateForMailbox(this); layer_->SetIsDrawable(true); layer_->SetContentsOpaque(!want_alpha_channel_);
diff --git a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc index 13c0caf..10ff62a 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc
@@ -26,8 +26,7 @@ ImageLayerBridge::ImageLayerBridge(OpacityMode opacity_mode) : opacity_mode_(opacity_mode) { - layer_ = cc::TextureLayer::CreateForMailbox( - this, cc::TextureLayer::kMaxResourcesWaitingCanvasWebGL); + layer_ = cc::TextureLayer::CreateForMailbox(this); layer_->SetIsDrawable(true); layer_->SetNearestNeighbor(filter_quality_ == kNone_SkFilterQuality); if (opacity_mode_ == kOpaque) {
diff --git a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc index 29802333..2d198ba 100644 --- a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc +++ b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc
@@ -11,8 +11,10 @@ const EffectPaintPropertyNode& EffectPaintPropertyNode::Root() { DEFINE_STATIC_REF(EffectPaintPropertyNode, root, base::AdoptRef(new EffectPaintPropertyNode( - nullptr, State{&TransformPaintPropertyNode::Root(), - &ClipPaintPropertyNode::Root()}))); + nullptr, + State{&TransformPaintPropertyNode::Root(), + &ClipPaintPropertyNode::Root()}, + true /* is_parent_alias */))); return *root; } @@ -27,14 +29,23 @@ bool EffectPaintPropertyNode::Changed( const PropertyTreeState& relative_to_state, const TransformPaintPropertyNode* transform_not_to_check) const { - for (const auto* node = this; node && node != relative_to_state.Effect(); - node = node->Parent()) { + auto* relative_effect = relative_to_state.Effect() + ? relative_to_state.Effect()->Unalias() + : nullptr; + if (transform_not_to_check) + transform_not_to_check = transform_not_to_check->Unalias(); + for (const auto* node = Unalias(); node && node != relative_effect; + node = node->Parent() ? node->Parent()->Unalias() : nullptr) { if (node->NodeChanged()) return true; + auto* local_transform = node->LocalTransformSpace() + ? node->LocalTransformSpace()->Unalias() + : nullptr; if (node->HasFilterThatMovesPixels() && - node->LocalTransformSpace() != transform_not_to_check && - node->LocalTransformSpace()->Changed(*relative_to_state.Transform())) + local_transform != transform_not_to_check && + local_transform->Changed(*relative_to_state.Transform()->Unalias())) { return true; + } // We don't check for change of OutputClip here to avoid N^3 complexity. // The caller should check for clip change in other ways. }
diff --git a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h index 54c773fa..11e4600 100644 --- a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h
@@ -69,8 +69,13 @@ static scoped_refptr<EffectPaintPropertyNode> Create( const EffectPaintPropertyNode& parent, State&& state) { - return base::AdoptRef( - new EffectPaintPropertyNode(&parent, std::move(state))); + return base::AdoptRef(new EffectPaintPropertyNode( + &parent, std::move(state), false /* is_parent_alias */)); + } + static scoped_refptr<EffectPaintPropertyNode> CreateAlias( + const EffectPaintPropertyNode& parent) { + return base::AdoptRef(new EffectPaintPropertyNode( + &parent, State{}, true /* is_parent_alias */)); } bool Update(const EffectPaintPropertyNode& parent, State&& state) { @@ -78,6 +83,7 @@ if (state == state_) return parent_changed; + DCHECK(!IsParentAlias()) << "Changed the state of an alias node."; SetChanged(); state_ = std::move(state); return true; @@ -95,37 +101,58 @@ const TransformPaintPropertyNode* transform_not_to_check) const; const TransformPaintPropertyNode* LocalTransformSpace() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.local_transform_space.get(); } const ClipPaintPropertyNode* OutputClip() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.output_clip.get(); } - SkBlendMode BlendMode() const { return state_.blend_mode; } - float Opacity() const { return state_.opacity; } - const CompositorFilterOperations& Filter() const { return state_.filter; } - ColorFilter GetColorFilter() const { return state_.color_filter; } + SkBlendMode BlendMode() const { + DCHECK(!Parent() || !IsParentAlias()); + return state_.blend_mode; + } + float Opacity() const { + DCHECK(!Parent() || !IsParentAlias()); + return state_.opacity; + } + const CompositorFilterOperations& Filter() const { + DCHECK(!Parent() || !IsParentAlias()); + return state_.filter; + } + ColorFilter GetColorFilter() const { + DCHECK(!Parent() || !IsParentAlias()); + return state_.color_filter; + } bool HasFilterThatMovesPixels() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.filter.HasFilterThatMovesPixels(); } - FloatPoint PaintOffset() const { return state_.paint_offset; } + FloatPoint PaintOffset() const { + DCHECK(!Parent() || !IsParentAlias()); + return state_.paint_offset; + } // Returns a rect covering the pixels that can be affected by pixels in // |inputRect|. The rects are in the space of localTransformSpace. FloatRect MapRect(const FloatRect& input_rect) const; bool HasDirectCompositingReasons() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.direct_compositing_reasons != CompositingReason::kNone; } bool RequiresCompositingForAnimation() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.direct_compositing_reasons & CompositingReason::kComboActiveAnimation; } const CompositorElementId& GetCompositorElementId() const { + DCHECK(!Parent() || !IsParentAlias()); return state_.compositor_element_id; } @@ -133,13 +160,15 @@ // The clone function is used by FindPropertiesNeedingUpdate.h for recording // an effect node before it has been updated, to later detect changes. scoped_refptr<EffectPaintPropertyNode> Clone() const { - return base::AdoptRef(new EffectPaintPropertyNode(Parent(), State(state_))); + return base::AdoptRef( + new EffectPaintPropertyNode(Parent(), State(state_), IsParentAlias())); } // The equality operator is used by FindPropertiesNeedingUpdate.h for checking // if an effect node has changed. bool operator==(const EffectPaintPropertyNode& o) const { - return Parent() == o.Parent() && state_ == o.state_; + return Parent() == o.Parent() && state_ == o.state_ && + IsParentAlias() == o.IsParentAlias(); } #endif @@ -149,8 +178,10 @@ size_t TreeMemoryUsageInBytes() const; private: - EffectPaintPropertyNode(const EffectPaintPropertyNode* parent, State&& state) - : PaintPropertyNode(parent), state_(std::move(state)) {} + EffectPaintPropertyNode(const EffectPaintPropertyNode* parent, + State&& state, + bool is_parent_alias) + : PaintPropertyNode(parent, is_parent_alias), state_(std::move(state)) {} State state_; };
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc index ae00c4d..4513fb9 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
@@ -9,6 +9,11 @@ namespace blink { +template <typename NodeType> +const NodeType* SafeUnalias(const NodeType* node) { + return node ? node->Unalias() : nullptr; +} + const TransformationMatrix& GeometryMapper::SourceToDestinationProjection( const TransformPaintPropertyNode* source, const TransformPaintPropertyNode* destination) { @@ -67,6 +72,9 @@ DEFINE_STATIC_LOCAL(TransformationMatrix, identity, (TransformationMatrix())); DEFINE_STATIC_LOCAL(TransformationMatrix, temp, (TransformationMatrix())); + source = source->Unalias(); + destination = destination->Unalias(); + if (source == destination) { success = true; return identity; @@ -145,8 +153,9 @@ const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state, const FloatPoint& local_point) { - for (const auto* clip = local_state.Clip(); - clip && clip != ancestor_state.Clip(); clip = clip->Parent()) { + auto* ancestor_clip = ancestor_state.Clip()->Unalias(); + for (const auto* clip = local_state.Clip()->Unalias(); + clip && clip != ancestor_clip; clip = SafeUnalias(clip->Parent())) { FloatPoint mapped_point = SourceToDestinationProjection(local_state.Transform(), clip->LocalTransformSpace()) @@ -175,7 +184,8 @@ return true; } - if (local_state.Effect() != ancestor_state.Effect()) { + if (SafeUnalias(local_state.Effect()) != + SafeUnalias(ancestor_state.Effect())) { return SlowLocalToAncestorVisualRectWithEffects( local_state, ancestor_state, rect_to_map, clip_behavior, inclusive_behavior, success); @@ -236,8 +246,10 @@ PropertyTreeState last_transform_and_clip_state(local_state.Transform(), local_state.Clip(), nullptr); - for (const auto* effect = local_state.Effect(); - effect && effect != ancestor_state.Effect(); effect = effect->Parent()) { + auto* ancestor_effect = ancestor_state.Effect()->Unalias(); + for (const auto* effect = local_state.Effect()->Unalias(); + effect && effect != ancestor_effect; + effect = SafeUnalias(effect->Parent())) { if (!effect->HasFilterThatMovesPixels()) continue; @@ -272,7 +284,7 @@ const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state, OverlayScrollbarClipBehavior clip_behavior) { - if (local_state.Clip() == ancestor_state.Clip()) + if (local_state.Clip()->Unalias() == ancestor_state.Clip()->Unalias()) return FloatClipRect(); bool success = false; @@ -282,7 +294,7 @@ DCHECK(success); // Many effects (e.g. filters, clip-paths) can make a clip rect not tight. - if (local_state.Effect() != ancestor_state.Effect()) + if (SafeUnalias(local_state.Effect()) != SafeUnalias(ancestor_state.Effect())) result.ClearIsTight(); return result; @@ -290,6 +302,7 @@ static FloatClipRect GetClipRect(const ClipPaintPropertyNode* clip_node, OverlayScrollbarClipBehavior clip_behavior) { + clip_node = clip_node->Unalias(); FloatClipRect clip_rect( UNLIKELY(clip_behavior == kExcludeOverlayScrollbarSizeForHitTesting) ? clip_node->ClipRectExcludingOverlayScrollbars() @@ -306,12 +319,14 @@ OverlayScrollbarClipBehavior clip_behavior, InclusiveIntersectOrNot inclusive_behavior, bool& success) { + descendant = descendant->Unalias(); + ancestor_clip = ancestor_clip->Unalias(); if (descendant == ancestor_clip) { success = true; return FloatClipRect(); } - - if (descendant->Parent() == ancestor_clip && + ancestor_transform = ancestor_transform->Unalias(); + if (SafeUnalias(descendant->Parent()) == ancestor_clip && descendant->LocalTransformSpace() == ancestor_transform) { success = true; return GetClipRect(descendant, clip_behavior); @@ -337,7 +352,7 @@ } intermediate_nodes.push_back(clip_node); - clip_node = clip_node->Parent(); + clip_node = SafeUnalias(clip_node->Parent()); } if (!clip_node) { success = false;
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc index 9eef0c8..58d4e40 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
@@ -113,22 +113,21 @@ EXPECT_EQ(expected_transform, actual_transform_to_ancestor); \ } while (false) -#define CHECK_CACHED_CLIP() \ - do { \ - if (ancestor_state.Effect() != local_state.Effect()) \ - break; \ - SCOPED_TRACE("Check cached clip"); \ - const auto* cached_clip = \ - GetCachedClip(local_state.Clip(), ancestor_state); \ - if (ancestor_state.Clip() == local_state.Clip() || \ - (ancestor_state.Clip() == local_state.Clip()->Parent() && \ - ancestor_state.Transform() == \ - local_state.Clip()->LocalTransformSpace())) { \ - EXPECT_EQ(nullptr, cached_clip); \ - break; \ - } \ - ASSERT_NE(nullptr, cached_clip); \ - EXPECT_CLIP_RECT_EQ(expected_clip, *cached_clip); \ +#define CHECK_CACHED_CLIP() \ + do { \ + if (ancestor_state.Effect() != local_state.Effect()) \ + break; \ + SCOPED_TRACE("Check cached clip"); \ + auto* local_clip = local_state.Clip()->Unalias(); \ + const auto* cached_clip = GetCachedClip(local_clip, ancestor_state); \ + if (ancestor_state.Clip() == local_clip || \ + (ancestor_state.Clip() == local_clip->Parent() && \ + ancestor_state.Transform() == local_clip->LocalTransformSpace())) { \ + EXPECT_EQ(nullptr, cached_clip); \ + break; \ + } \ + ASSERT_NE(nullptr, cached_clip); \ + EXPECT_CLIP_RECT_EQ(expected_clip, *cached_clip); \ } while (false) // See the data fields of GeometryMapperTest for variables that will be used in @@ -181,6 +180,22 @@ EXPECT_FLOAT_RECT_NEAR(input_rect, rect); } +TEST_P(GeometryMapperTest, TranslationTransformWithAlias) { + expected_transform = TransformationMatrix().Translate(20, 10); + auto real_transform = CreateTransform(t0(), expected_transform); + auto transform = TransformPaintPropertyNode::CreateAlias(*real_transform); + local_state.SetTransform(transform.get()); + + input_rect = FloatRect(0, 0, 100, 100); + expected_transformed_rect = expected_transform.MapRect(input_rect); + expected_visual_rect = FloatClipRect(expected_transformed_rect); + CHECK_MAPPINGS(); + + FloatRect rect = expected_transformed_rect; + GeometryMapper::SourceToDestinationRect(&t0(), local_state.Transform(), rect); + EXPECT_FLOAT_RECT_NEAR(input_rect, rect); +} + TEST_P(GeometryMapperTest, RotationAndScaleTransform) { expected_transform = TransformationMatrix().Rotate(45).Scale(2); auto transform = CreateTransform(t0(), expected_transform); @@ -193,6 +208,19 @@ CHECK_MAPPINGS(); } +TEST_P(GeometryMapperTest, RotationAndScaleTransformWithAlias) { + expected_transform = TransformationMatrix().Rotate(45).Scale(2); + auto real_transform = CreateTransform(t0(), expected_transform); + auto transform = TransformPaintPropertyNode::CreateAlias(*real_transform); + local_state.SetTransform(transform.get()); + + input_rect = FloatRect(0, 0, 100, 100); + expected_transformed_rect = expected_transform.MapRect(input_rect); + expected_visual_rect = FloatClipRect(expected_transformed_rect); + expected_visual_rect.ClearIsTight(); + CHECK_MAPPINGS(); +} + TEST_P(GeometryMapperTest, RotationAndScaleTransformWithTransformOrigin) { expected_transform = TransformationMatrix().Rotate(45).Scale(2); auto transform = @@ -294,6 +322,18 @@ CHECK_MAPPINGS(); } +TEST_P(GeometryMapperTest, SimpleClipWithAlias) { + auto real_clip = CreateClip(c0(), &t0(), FloatRoundedRect(10, 10, 50, 50)); + auto clip = ClipPaintPropertyNode::CreateAlias(*real_clip); + local_state.SetClip(clip.get()); + + input_rect = FloatRect(0, 0, 100, 100); + expected_transformed_rect = input_rect; // not clipped. + expected_clip = FloatClipRect(clip->Unalias()->ClipRect()); + expected_visual_rect = expected_clip; + CHECK_MAPPINGS(); +} + TEST_P(GeometryMapperTest, SimpleClipOverlayScrollbars) { ClipPaintPropertyNode::State clip_state; clip_state.local_transform_space = &t0(); @@ -652,6 +692,55 @@ CHECK_MAPPINGS(); } +TEST_P(GeometryMapperTest, FilterWithClipsAndTransformsWithAlias) { + auto transform_above_effect = + CreateTransform(t0(), TransformationMatrix().Translate(40, 50)); + auto transform_below_effect = CreateTransform( + *transform_above_effect, TransformationMatrix().Translate(20, 30)); + + // This clip is between transformAboveEffect and the effect. + auto clip_above_effect = CreateClip(c0(), transform_above_effect.get(), + FloatRoundedRect(-100, -100, 200, 200)); + // This clip is between the effect and transformBelowEffect. + auto clip_below_effect = + CreateClip(*clip_above_effect, transform_above_effect.get(), + FloatRoundedRect(10, 10, 100, 100)); + + CompositorFilterOperations filters; + filters.AppendBlurFilter(20); + auto real_effect = CreateFilterEffect(e0(), transform_above_effect.get(), + clip_above_effect.get(), filters); + auto effect = EffectPaintPropertyNode::CreateAlias(*real_effect); + + local_state = PropertyTreeState(transform_below_effect.get(), + clip_below_effect.get(), effect.get()); + + input_rect = FloatRect(0, 0, 100, 100); + // 1. transformBelowEffect + auto output = transform_below_effect->Matrix().MapRect(input_rect); + // 2. clipBelowEffect + output.Intersect(clip_below_effect->ClipRect().Rect()); + EXPECT_EQ(FloatRect(20, 30, 90, 80), output); + // 3. effect (the outset is 3 times of blur amount). + output = filters.MapRect(output); + EXPECT_EQ(FloatRect(-40, -30, 210, 200), output); + // 4. clipAboveEffect + output.Intersect(clip_above_effect->ClipRect().Rect()); + EXPECT_EQ(FloatRect(-40, -30, 140, 130), output); + // 5. transformAboveEffect + output = transform_above_effect->Matrix().MapRect(output); + EXPECT_EQ(FloatRect(0, 20, 140, 130), output); + + expected_transform = + transform_above_effect->Matrix() * transform_below_effect->Matrix(); + expected_transformed_rect = expected_transform.MapRect(input_rect); + expected_visual_rect = FloatClipRect(output); + expected_visual_rect.ClearIsTight(); + expected_clip = FloatClipRect(FloatRect(50, 60, 90, 90)); + expected_clip.ClearIsTight(); + CHECK_MAPPINGS(); +} + TEST_P(GeometryMapperTest, ReflectionWithPaintOffset) { CompositorFilterOperations filters; filters.AppendReferenceFilter(PaintFilterBuilder::BuildBoxReflectFilter(
diff --git a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc index 8b0bfc87..45263767 100644 --- a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc +++ b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc
@@ -16,6 +16,12 @@ return root; } +PropertyTreeState PropertyTreeState::Unalias() const { + return PropertyTreeState(transform_ ? transform_->Unalias() : nullptr, + clip_ ? clip_->Unalias() : nullptr, + effect_ ? effect_->Unalias() : nullptr); +} + const CompositorElementId PropertyTreeState::GetCompositorElementId( const CompositorElementIdSet& element_ids) const { // The effect or transform nodes could have a compositor element id. The order
diff --git a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.h b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.h index 521aa15..60d60a0 100644 --- a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.h +++ b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.h
@@ -25,7 +25,8 @@ const EffectPaintPropertyNode* effect) : transform_(transform), clip_(clip), effect_(effect) {} - bool HasDirectCompositingReasons() const; + // Returns an unaliased property tree state. + PropertyTreeState Unalias() const; const TransformPaintPropertyNode* Transform() const { return transform_; } void SetTransform(const TransformPaintPropertyNode* node) {
diff --git a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h index 5d852e9..3126bba 100644 --- a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h +++ b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h
@@ -41,8 +41,9 @@ const EffectPaintPropertyNode& parent, float opacity, CompositingReasons compositing_reasons = CompositingReason::kNone) { - return CreateOpacityEffect(parent, parent.LocalTransformSpace(), - parent.OutputClip(), opacity, compositing_reasons); + return CreateOpacityEffect(parent, parent.Unalias()->LocalTransformSpace(), + parent.Unalias()->OutputClip(), opacity, + compositing_reasons); } inline scoped_refptr<EffectPaintPropertyNode> CreateFilterEffect( @@ -66,9 +67,9 @@ CompositorFilterOperations filter, const FloatPoint& paint_offset = FloatPoint(), CompositingReasons compositing_reasons = CompositingReason::kNone) { - return CreateFilterEffect(parent, parent.LocalTransformSpace(), - parent.OutputClip(), filter, paint_offset, - compositing_reasons); + return CreateFilterEffect(parent, parent.Unalias()->LocalTransformSpace(), + parent.Unalias()->OutputClip(), filter, + paint_offset, compositing_reasons); } inline scoped_refptr<ClipPaintPropertyNode> CreateClip(
diff --git a/third_party/blink/renderer/platform/wtf/threading_primitives.h b/third_party/blink/renderer/platform/wtf/threading_primitives.h index 281c49f0..2d6f306 100644 --- a/third_party/blink/renderer/platform/wtf/threading_primitives.h +++ b/third_party/blink/renderer/platform/wtf/threading_primitives.h
@@ -56,7 +56,9 @@ #elif defined(OS_POSIX) || defined(OS_FUCHSIA) struct PlatformMutex { pthread_mutex_t internal_mutex_; +#if DCHECK_IS_ON() size_t recursion_count_; +#endif }; typedef pthread_cond_t PlatformCondition; #endif
diff --git a/third_party/blink/renderer/platform/wtf/threading_pthreads.cc b/third_party/blink/renderer/platform/wtf/threading_pthreads.cc index 030c0364..4e7db8d 100644 --- a/third_party/blink/renderer/platform/wtf/threading_pthreads.cc +++ b/third_party/blink/renderer/platform/wtf/threading_pthreads.cc
@@ -70,7 +70,9 @@ int result = pthread_mutex_init(&mutex_.internal_mutex_, &attr); DCHECK_EQ(result, 0); +#if DCHECK_IS_ON() mutex_.recursion_count_ = 0; +#endif pthread_mutexattr_destroy(&attr); } @@ -83,14 +85,18 @@ void MutexBase::lock() { int result = pthread_mutex_lock(&mutex_.internal_mutex_); DCHECK_EQ(result, 0); - CHECK(!mutex_.recursion_count_) +#if DCHECK_IS_ON() + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; ++mutex_.recursion_count_; +#endif } void MutexBase::unlock() { +#if DCHECK_IS_ON() DCHECK(mutex_.recursion_count_); --mutex_.recursion_count_; +#endif int result = pthread_mutex_unlock(&mutex_.internal_mutex_); DCHECK_EQ(result, 0); } @@ -103,11 +109,13 @@ bool Mutex::TryLock() { int result = pthread_mutex_trylock(&mutex_.internal_mutex_); if (result == 0) { +#if DCHECK_IS_ON() // The Mutex class is not recursive, so the recursionCount should be // zero after getting the lock. - CHECK(!mutex_.recursion_count_) + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; ++mutex_.recursion_count_; +#endif return true; } if (result == EBUSY) @@ -120,9 +128,11 @@ bool RecursiveMutex::TryLock() { int result = pthread_mutex_trylock(&mutex_.internal_mutex_); if (result == 0) { - CHECK(!mutex_.recursion_count_) +#if DCHECK_IS_ON() + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; ++mutex_.recursion_count_; +#endif return true; } if (result == EBUSY) @@ -142,10 +152,14 @@ void ThreadCondition::Wait() { base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK); +#if DCHECK_IS_ON() --mutex_.recursion_count_; +#endif int result = pthread_cond_wait(&condition_, &mutex_.internal_mutex_); DCHECK_EQ(result, 0); +#if DCHECK_IS_ON() ++mutex_.recursion_count_; +#endif } void ThreadCondition::Signal() {
diff --git a/third_party/blink/renderer/platform/wtf/threading_win.cc b/third_party/blink/renderer/platform/wtf/threading_win.cc index fc375f8..4898e9a 100644 --- a/third_party/blink/renderer/platform/wtf/threading_win.cc +++ b/third_party/blink/renderer/platform/wtf/threading_win.cc
@@ -122,7 +122,7 @@ void MutexBase::lock() { EnterCriticalSection(&mutex_.internal_mutex_); - CHECK(!mutex_.recursion_count_) + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; ++mutex_.recursion_count_; } @@ -149,7 +149,7 @@ // check in the lock method (presumably due to performance?). This // means lock() will succeed even if the current thread has already // entered the critical section. - CHECK(!mutex_.recursion_count_) + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; if (mutex_.recursion_count_ > 0) { LeaveCriticalSection(&mutex_.internal_mutex_); @@ -169,7 +169,7 @@ if (result == 0) { // We didn't get the lock. return false; } - CHECK(!mutex_.recursion_count_) + DCHECK(!mutex_.recursion_count_) << "WTF does not support recursive mutex acquisition!"; ++mutex_.recursion_count_; return true;
diff --git a/third_party/blink/tools/audit_non_blink_usage.py b/third_party/blink/tools/audit_non_blink_usage.py index eb63f531..acd308d 100755 --- a/third_party/blink/tools/audit_non_blink_usage.py +++ b/third_party/blink/tools/audit_non_blink_usage.py
@@ -521,6 +521,8 @@ A list of line number, disallowed identifier tuples. """ results = [] + # Because Windows. + path = path.replace('\\', '/') basename, ext = os.path.splitext(path) # Only check code. Ignore tests. # TODO(tkent): Remove 'Test' after the great mv.
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js index de5ae60..ddeeac9 100644 --- a/third_party/closure_compiler/externs/file_manager_private.js +++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -798,13 +798,6 @@ chrome.fileManagerPrivate.requestWebStoreAccessToken = function(callback) {}; /** - * Requests a share dialog url for the specified file. - * @param {!Entry} entry - * @param {function((string|undefined))} callback Callback with the result url. - */ -chrome.fileManagerPrivate.getShareUrl = function(entry, callback) {}; - -/** * Requests a download url to download the file contents. * @param {!Entry} entry * @param {function((string|undefined))} callback Callback with the result url.
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium index 36d9de6..f9f90329 100644 --- a/third_party/libaom/README.chromium +++ b/third_party/libaom/README.chromium
@@ -2,9 +2,9 @@ Short Name: libaom URL: https://aomedia.googlesource.com/aom/ Version: 0 -Date: Tuesday September 11 2018 +Date: Thursday September 13 2018 Branch: master -Commit: 7d447f5b0021abd363dd64912c59196393e9b159 +Commit: 67645b8f529cd4e56b31147db57882089345bedc License: BSD License File: source/libaom/LICENSE Security Critical: yes
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h index cb2f632..af5e3774 100644 --- a/third_party/libaom/source/config/config/aom_version.h +++ b/third_party/libaom/source/config/config/aom_version.h
@@ -12,8 +12,8 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 0 #define VERSION_PATCH 0 -#define VERSION_EXTRA "541-g7d447f5b0" +#define VERSION_EXTRA "566-g67645b8f5" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "1.0.0-541-g7d447f5b0" -#define VERSION_STRING " 1.0.0-541-g7d447f5b0" +#define VERSION_STRING_NOSP "1.0.0-566-g67645b8f5" +#define VERSION_STRING " 1.0.0-566-g67645b8f5"
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h index 7ad23d63..f23dae8 100644 --- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
@@ -556,6 +556,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_16x16 av1_highbd_inv_txfm_add_16x16_c +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_16x8 av1_highbd_inv_txfm_add_16x8_c + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -568,6 +574,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_4x4 av1_highbd_inv_txfm_add_4x4_c +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_8x16 av1_highbd_inv_txfm_add_8x16_c + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -964,36 +976,36 @@ const int subpel_y_q4, ConvolveParams* conv_params); -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_neon(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -RTCD_EXTERN void (*av1_selfguided_restoration)(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_neon(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +RTCD_EXTERN int (*av1_selfguided_restoration)(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); void av1_upsample_intra_edge_c(uint8_t* p, int sz); #define av1_upsample_intra_edge av1_upsample_intra_edge_c
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h index 18c2386..7433e42 100644 --- a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
@@ -495,6 +495,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_16x16 av1_highbd_inv_txfm_add_16x16_c +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_16x8 av1_highbd_inv_txfm_add_16x8_c + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -507,6 +513,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_4x4 av1_highbd_inv_txfm_add_4x4_c +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_8x16 av1_highbd_inv_txfm_add_8x16_c + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -856,26 +868,26 @@ ConvolveParams* conv_params); #define av1_jnt_convolve_y av1_jnt_convolve_y_neon -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_neon(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_neon(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); #define av1_selfguided_restoration av1_selfguided_restoration_neon void av1_upsample_intra_edge_c(uint8_t* p, int sz);
diff --git a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h index c01c44b..919c420 100644 --- a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
@@ -430,6 +430,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_16x16 av1_highbd_inv_txfm_add_16x16_c +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_16x8 av1_highbd_inv_txfm_add_16x8_c + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -442,6 +448,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_4x4 av1_highbd_inv_txfm_add_4x4_c +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_8x16 av1_highbd_inv_txfm_add_8x16_c + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -743,16 +755,16 @@ ConvolveParams* conv_params); #define av1_jnt_convolve_y av1_jnt_convolve_y_c -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); #define av1_selfguided_restoration av1_selfguided_restoration_c void av1_upsample_intra_edge_c(uint8_t* p, int sz);
diff --git a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h index 18c2386..7433e42 100644 --- a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
@@ -495,6 +495,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_16x16 av1_highbd_inv_txfm_add_16x16_c +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_16x8 av1_highbd_inv_txfm_add_16x8_c + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -507,6 +513,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_4x4 av1_highbd_inv_txfm_add_4x4_c +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_8x16 av1_highbd_inv_txfm_add_8x16_c + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -856,26 +868,26 @@ ConvolveParams* conv_params); #define av1_jnt_convolve_y av1_jnt_convolve_y_neon -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_neon(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_neon(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); #define av1_selfguided_restoration av1_selfguided_restoration_neon void av1_upsample_intra_edge_c(uint8_t* p, int sz);
diff --git a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h index ade634d..2e48c32 100644 --- a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
@@ -430,6 +430,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_16x16 av1_highbd_inv_txfm_add_16x16_c +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_16x8 av1_highbd_inv_txfm_add_16x8_c + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -442,6 +448,12 @@ const TxfmParam* txfm_param); #define av1_highbd_inv_txfm_add_4x4 av1_highbd_inv_txfm_add_4x4_c +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +#define av1_highbd_inv_txfm_add_8x16 av1_highbd_inv_txfm_add_8x16_c + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -743,16 +755,16 @@ ConvolveParams* conv_params); #define av1_jnt_convolve_y av1_jnt_convolve_y_c -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); #define av1_selfguided_restoration av1_selfguided_restoration_c void av1_upsample_intra_edge_c(uint8_t* p, int sz);
diff --git a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h index a1a5fae..e7019f2 100644 --- a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
@@ -940,6 +940,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_16x8)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -966,6 +979,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_8x16)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -1655,46 +1681,46 @@ const int subpel_y_q4, ConvolveParams* conv_params); -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_avx2(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -RTCD_EXTERN void (*av1_selfguided_restoration)(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_avx2(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +RTCD_EXTERN int (*av1_selfguided_restoration)(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); void av1_upsample_intra_edge_c(uint8_t* p, int sz); void av1_upsample_intra_edge_sse4_1(uint8_t* p, int sz); @@ -2121,12 +2147,18 @@ av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_sse4_1; + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_sse4_1; av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_c; if (flags & HAS_AVX2) av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_avx2; av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_sse4_1; + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_sse4_1; av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_sse4_1;
diff --git a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h index e6e4c68..6aa4f72 100644 --- a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h +++ b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
@@ -973,6 +973,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_16x8)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -999,6 +1012,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_8x16)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -1688,46 +1714,46 @@ const int subpel_y_q4, ConvolveParams* conv_params); -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_avx2(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -RTCD_EXTERN void (*av1_selfguided_restoration)(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_avx2(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +RTCD_EXTERN int (*av1_selfguided_restoration)(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); void av1_upsample_intra_edge_c(uint8_t* p, int sz); void av1_upsample_intra_edge_sse4_1(uint8_t* p, int sz); @@ -2154,12 +2180,18 @@ av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_sse4_1; + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_sse4_1; av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_c; if (flags & HAS_AVX2) av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_avx2; av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_sse4_1; + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_sse4_1; av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_sse4_1;
diff --git a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h index a1a5fae..e7019f2 100644 --- a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h +++ b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
@@ -940,6 +940,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_16x8)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -966,6 +979,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_8x16)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -1655,46 +1681,46 @@ const int subpel_y_q4, ConvolveParams* conv_params); -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_avx2(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -RTCD_EXTERN void (*av1_selfguided_restoration)(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_avx2(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +RTCD_EXTERN int (*av1_selfguided_restoration)(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); void av1_upsample_intra_edge_c(uint8_t* p, int sz); void av1_upsample_intra_edge_sse4_1(uint8_t* p, int sz); @@ -2121,12 +2147,18 @@ av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_sse4_1; + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_sse4_1; av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_c; if (flags & HAS_AVX2) av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_avx2; av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_sse4_1; + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_sse4_1; av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_sse4_1;
diff --git a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h index e6e4c68..6aa4f72 100644 --- a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h +++ b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
@@ -973,6 +973,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_16x8_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_16x8)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_32x32_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -999,6 +1012,19 @@ int stride, const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_c(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +void av1_highbd_inv_txfm_add_8x16_sse4_1(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); +RTCD_EXTERN void (*av1_highbd_inv_txfm_add_8x16)(const tran_low_t* dqcoeff, + uint8_t* dst, + int stride, + const TxfmParam* txfm_param); + void av1_highbd_inv_txfm_add_8x8_c(const tran_low_t* dqcoeff, uint8_t* dst, int stride, @@ -1688,46 +1714,46 @@ const int subpel_y_q4, ConvolveParams* conv_params); -void av1_selfguided_restoration_c(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -void av1_selfguided_restoration_avx2(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); -RTCD_EXTERN void (*av1_selfguided_restoration)(const uint8_t* dgd8, - int width, - int height, - int dgd_stride, - int32_t* flt0, - int32_t* flt1, - int flt_stride, - int sgr_params_idx, - int bit_depth, - int highbd); +int av1_selfguided_restoration_c(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_sse4_1(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +int av1_selfguided_restoration_avx2(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); +RTCD_EXTERN int (*av1_selfguided_restoration)(const uint8_t* dgd8, + int width, + int height, + int dgd_stride, + int32_t* flt0, + int32_t* flt1, + int flt_stride, + int sgr_params_idx, + int bit_depth, + int highbd); void av1_upsample_intra_edge_c(uint8_t* p, int sz); void av1_upsample_intra_edge_sse4_1(uint8_t* p, int sz); @@ -2154,12 +2180,18 @@ av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_16x16 = av1_highbd_inv_txfm_add_16x16_sse4_1; + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_16x8 = av1_highbd_inv_txfm_add_16x8_sse4_1; av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_c; if (flags & HAS_AVX2) av1_highbd_inv_txfm_add_32x32 = av1_highbd_inv_txfm_add_32x32_avx2; av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_4x4 = av1_highbd_inv_txfm_add_4x4_sse4_1; + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_c; + if (flags & HAS_SSE4_1) + av1_highbd_inv_txfm_add_8x16 = av1_highbd_inv_txfm_add_8x16_sse4_1; av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_c; if (flags & HAS_SSE4_1) av1_highbd_inv_txfm_add_8x8 = av1_highbd_inv_txfm_add_8x8_sse4_1;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b8a84d9..1d4b447 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -29218,6 +29218,7 @@ <int value="-170986053" label="EnableManualFallbacksFilling:enabled"/> <int value="-167744090" label="EnableHomeLauncher:enabled"/> <int value="-165756594" label="enable-touch-feedback"/> + <int value="-161782023" label="AndroidMessagesProdEndpoint:enabled"/> <int value="-159877930" label="MaterialDesignUserManager:disabled"/> <int value="-158549277" label="enable-embeddedsearch-api"/> <int value="-152677714" label="AsmJsToWebAssembly:enabled"/> @@ -30243,6 +30244,7 @@ <int value="1888812860" label="ChromeModernAlternateCardLayout:enabled"/> <int value="1889076955" label="disable-app-link"/> <int value="1891210939" label="enable-blink-features"/> + <int value="1891312456" label="AndroidMessagesProdEndpoint:disabled"/> <int value="1892201400" label="enable-password-separated-signin-flow"/> <int value="1892311584" label="NewStyleNotifications:disabled"/> <int value="1892640848" label="third-party-doodle-url"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 725d174..9aa248b 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -121093,6 +121093,8 @@ </histogram_suffixes> <histogram_suffixes name="CustomTabOpenSource" separator="."> + <suffix name="MediaLauncherActivity" + label="CustomTab opened by MediaLauncherActivity."/> <suffix name="Other" label="CustomTab opened by other apps."/> <suffix name="TWA" label="CustomTab opened by Trusted Web Activity."/> <suffix name="WebApk" label="CustomTab opened by WebApk."/> @@ -124570,6 +124572,10 @@ <histogram_suffixes name="NavigationTypeTiming" separator="."> <suffix name="BackForward" label="History (back/forward) navigation"/> + <suffix name="BackgroundProcessPriority" + label="process priority = background"/> + <suffix name="ForegroundProcessPriority" + label="process priority = foreground"/> <suffix name="NewNavigation" label="New navigation"/> <suffix name="Reload" label="Reload"/> <affected-histogram name="Navigation.IsSameProcess"/>
diff --git a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc index 809a927c..a64e32e 100644 --- a/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc +++ b/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
@@ -22,6 +22,10 @@ scoped_refptr<BitmapCursorOzone> CreateDefaultBitmapCursor(CursorType type) { Cursor cursor(type); + // Ozone must honor the lowest possible scale value, which is 1.0f. Otherwise, + // it can happen that cursor chooses wrong hotspots if max scaling value is + // set to 200p, for example. + cursor.set_device_scale_factor(1.0f); SkBitmap bitmap = cursor.GetBitmap(); gfx::Point hotspot = cursor.GetHotspot(); if (!bitmap.isNull())
diff --git a/ui/file_manager/externs/command_handler_deps.js b/ui/file_manager/externs/command_handler_deps.js index 2e5ff96..7573da93 100644 --- a/ui/file_manager/externs/command_handler_deps.js +++ b/ui/file_manager/externs/command_handler_deps.js
@@ -94,7 +94,7 @@ CommandHandlerDeps.prototype.volumeManager; /** - * @return {DirectoryEntry|FakeEntry|FilesAppEntry} + * @return {DirectoryEntry|FilesAppEntry} */ CommandHandlerDeps.prototype.getCurrentDirectoryEntry = function() {};
diff --git a/ui/file_manager/externs/volume_info_list.js b/ui/file_manager/externs/volume_info_list.js index da5715f..09a362b 100644 --- a/ui/file_manager/externs/volume_info_list.js +++ b/ui/file_manager/externs/volume_info_list.js
@@ -47,7 +47,7 @@ /** * Searches the information of the volume that contains the passed entry. - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry Entry on the volume to be + * @param {!Entry|!FilesAppEntry} entry Entry on the volume to be * found. * @return {VolumeInfo} The volume's information, or null if not found. */
diff --git a/ui/file_manager/externs/volume_manager.js b/ui/file_manager/externs/volume_manager.js index ba92628..4072811 100644 --- a/ui/file_manager/externs/volume_manager.js +++ b/ui/file_manager/externs/volume_manager.js
@@ -59,7 +59,7 @@ /** * Obtains location information from an entry. * - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry File or directory entry. It + * @param {!Entry|!FilesAppEntry} entry File or directory entry. It * can be a fake entry. * @return {EntryLocation} Location information. */
diff --git a/ui/file_manager/file_manager/background/js/device_handler_unittest.html b/ui/file_manager/file_manager/background/js/device_handler_unittest.html index 0ef3316..49a1c13 100644 --- a/ui/file_manager/file_manager/background/js/device_handler_unittest.html +++ b/ui/file_manager/file_manager/background/js/device_handler_unittest.html
@@ -19,6 +19,7 @@ <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/volume_manager_common.js"></script> <script src="../../common/js/importer_common.js"></script> +<script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="device_handler.js"></script> <script src="mock_volume_manager.js"></script>
diff --git a/ui/file_manager/file_manager/background/js/duplicate_finder_unittest.html b/ui/file_manager/file_manager/background/js/duplicate_finder_unittest.html index dce0ddb..04ee1fe 100644 --- a/ui/file_manager/file_manager/background/js/duplicate_finder_unittest.html +++ b/ui/file_manager/file_manager/background/js/duplicate_finder_unittest.html
@@ -17,6 +17,7 @@ <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/test_tracker.js"></script> <script src="../../common/js/unittest_util.js"></script> + <script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/volume_manager_common.js"></script> <script src="../../common/js/importer_common.js"></script>
diff --git a/ui/file_manager/file_manager/background/js/media_import_handler_unittest.html b/ui/file_manager/file_manager/background/js/media_import_handler_unittest.html index b58a48c..db6286d5 100644 --- a/ui/file_manager/file_manager/background/js/media_import_handler_unittest.html +++ b/ui/file_manager/file_manager/background/js/media_import_handler_unittest.html
@@ -18,6 +18,7 @@ <script src="../../common/js/metrics_events.js"></script> <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/unittest_util.js"></script> + <script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/volume_manager_common.js"></script> <script src="../../common/js/importer_common.js"></script>
diff --git a/ui/file_manager/file_manager/background/js/mock_volume_manager.js b/ui/file_manager/file_manager/background/js/mock_volume_manager.js index 19402d5..6fe0b63 100644 --- a/ui/file_manager/file_manager/background/js/mock_volume_manager.js +++ b/ui/file_manager/file_manager/background/js/mock_volume_manager.js
@@ -59,7 +59,7 @@ /** * Returns the corresponding VolumeInfo. * - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry FileEntry pointing anywhere + * @param {!Entry|!FilesAppEntry} entry FileEntry pointing anywhere * on a volume. * @return {VolumeInfo} Corresponding VolumeInfo. */ @@ -71,13 +71,13 @@ * Obtains location information from an entry. * Current implementation can handle only fake entries. * - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry A fake entry. + * @param {!Entry|!FilesAppEntry} entry A fake entry. * @return {EntryLocation} Location information. */ MockVolumeManager.prototype.getLocationInfo = function(entry) { if (util.isFakeEntry(entry)) { return new EntryLocationImpl( - this.volumeInfoList.item(0), entry.rootType, true, true); + this.volumeInfoList.item(0), assert(entry.rootType), true, true); } if (entry.filesystem.name === VolumeManagerCommon.VolumeType.DRIVE) { @@ -242,7 +242,7 @@ * Obtains location information from an entry. * Current implementation can handle only fake entries. * - * @param {!Entry} entry A fake entry. + * @param {!Entry|!FilesAppEntry} entry A fake entry. * @return {EntryLocation} Location information. */ MockVolumeManagerWrapper.prototype.getLocationInfo = function(entry) {
diff --git a/ui/file_manager/file_manager/background/js/volume_info_impl.js b/ui/file_manager/file_manager/background/js/volume_info_impl.js index 7075b68..230072aa 100644 --- a/ui/file_manager/file_manager/background/js/volume_info_impl.js +++ b/ui/file_manager/file_manager/background/js/volume_info_impl.js
@@ -69,17 +69,15 @@ this.displayRootPromise_ = null; if (volumeType === VolumeManagerCommon.VolumeType.DRIVE) { - // TODO(mtomasz): Convert fake entries to DirectoryProvider. - this.fakeEntries_[VolumeManagerCommon.RootType.DRIVE_OFFLINE] = { - isDirectory: true, - rootType: VolumeManagerCommon.RootType.DRIVE_OFFLINE, - toURL: function() { return 'fake-entry://drive_offline'; } - }; - this.fakeEntries_[VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME] = { - isDirectory: true, - rootType: VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME, - toURL: function() { return 'fake-entry://drive_shared_with_me'; } - }; + this.fakeEntries_[VolumeManagerCommon.RootType.DRIVE_OFFLINE] = + new FakeEntry( + str('DRIVE_OFFLINE_COLLECTION_LABEL'), + VolumeManagerCommon.RootType.DRIVE_OFFLINE, true); + + this.fakeEntries_[VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME] = + new FakeEntry( + str('DRIVE_SHARED_WITH_ME_COLLECTION_LABEL'), + VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME, true); } // Note: This represents if the mounting of the volume is successfully done
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_impl.js b/ui/file_manager/file_manager/background/js/volume_manager_impl.js index 60095e8c..d26067d 100644 --- a/ui/file_manager/file_manager/background/js/volume_manager_impl.js +++ b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
@@ -290,7 +290,7 @@ if (util.isFakeEntry(entry)) { return new EntryLocationImpl( - volumeInfo, entry.rootType, + volumeInfo, assert(entry.rootType), true /* the entry points a root directory. */, true /* fake entries are read only. */); }
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_unittest.html b/ui/file_manager/file_manager/background/js/volume_manager_unittest.html index 94ed65c..4e3aff7 100644 --- a/ui/file_manager/file_manager/background/js/volume_manager_unittest.html +++ b/ui/file_manager/file_manager/background/js/volume_manager_unittest.html
@@ -14,6 +14,7 @@ <script src="../../common/js/async_util.js"></script> <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/unittest_util.js"></script> + <script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/volume_manager_common.js"></script> <script src="entry_location_impl.js"></script>
diff --git a/ui/file_manager/file_manager/common/js/files_app_entry_types.js b/ui/file_manager/file_manager/common/js/files_app_entry_types.js index 47238ef..faad490c 100644 --- a/ui/file_manager/file_manager/common/js/files_app_entry_types.js +++ b/ui/file_manager/file_manager/common/js/files_app_entry_types.js
@@ -35,14 +35,14 @@ class FilesAppEntry { constructor() { /** - * @public {!boolean} true if this entry represents a Directory-like entry, + * @public {boolean} true if this entry represents a Directory-like entry, * as in have sub-entries and implements {createReader} method. * This attribute is defined on Entry. */ this.isDirectory = false; /** - * @public {!boolean} true if this entry represents a File-like entry. + * @public {boolean} true if this entry represents a File-like entry. * Implementations of FilesAppEntry are expected to have this as |true|. * Whereas implementations of FilesAppDirEntry are expected to have this as * |false|. @@ -66,11 +66,14 @@ this.name = ''; /** - * @public {!string} the class name for this class. It's workaround for the + * @public {string} the class name for this class. It's workaround for the * fact that an instance created on foreground page and sent to background * page can't be checked with "instanceof". */ this.type_name = 'FilesAppEntry'; + + /** @public {VolumeManagerCommon.RootType|null} */ + this.rootType = null; } /** @@ -81,7 +84,7 @@ getParent(success, error) {} /** - * @return {!string} used to compare entries. It should return an unique + * @return {string} used to compare entries. It should return an unique * identifier for such entry, usually prefixed with it's root type like: * "fake-entry://unique/path/to/entry". * This method is defined on Entry. @@ -101,7 +104,7 @@ /** * Returns true if this entry object has a native representation such as Entry * or DirectoryEntry, this means it can interact with VolumeManager. - * @return {!boolean} + * @return {boolean} */ get isNativeType() {} } @@ -115,7 +118,7 @@ */ class StaticReader { /** - * @param {Array<Entry|FakeEntry|FilesAppEntry>} children: Array of Entry-like + * @param {!Array<!Entry|!FilesAppEntry>} children: Array of Entry-like * instances that will be returned/read by this reader. */ constructor(children) { @@ -158,7 +161,7 @@ constructor() { super(); /** - * @public {!boolean} true if this entry represents a Directory-like entry, + * @public {boolean} true if this entry represents a Directory-like entry, * as in have sub-entries and implements {createReader} method. * Implementations of FilesAppEntry are expected to have this as |true|. * This attribute is defined on Entry. @@ -200,7 +203,7 @@ this.rootType_ = rootType; /** - * @private {!Array<!Entry|!FilesAppEntry|!FakeEntry>} children entries of + * @private {!Array<!Entry|!FilesAppEntry>} children entries of * this EntryList instance. */ this.children_ = []; @@ -238,7 +241,7 @@ } /** - * @return {!string} used to compare entries. + * @return {string} used to compare entries. * @override */ toURL() { @@ -259,7 +262,7 @@ } /** - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry that should be added as + * @param {!Entry|!FilesAppEntry} entry that should be added as * child of this EntryList. * This method is specific to EntryList instance. */ @@ -285,7 +288,7 @@ } /** - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry that should be removed as + * @param {!Entry|!FilesAppEntry} entry that should be removed as * child of this EntryList. * This method is specific to EntryList instance. * @return {boolean} if entry was removed. @@ -399,7 +402,7 @@ } /** - * @return {!string} Full path for this volume. + * @return {string} Full path for this volume. * This method is defined on Entry. * @override. */ @@ -414,7 +417,7 @@ } /** - * @return {!string} Name for this volume. + * @return {string} Name for this volume. * @override. */ get name() { @@ -479,3 +482,86 @@ this.volumeInfo_.prefixEntry = entry; } } + +/** + * FakeEntry is used for entries that used only for UI, that weren't generated + * by FileSystem API, like Drive, Downloads or Provided. + * + * @implements FilesAppEntry + */ +class FakeEntry { + /** + * @param {string} label Translated text to be displayed to user. + * @param {!VolumeManagerCommon.RootType} rootType Root type of this entry. + * @param {boolean} isDirectory Is this entry a directory-like entry? + * @param {chrome.fileManagerPrivate.SourceRestriction=} opt_sourceRestriction + * used on Recents to filter the source of recent files/directories. + */ + constructor(label, rootType, isDirectory, opt_sourceRestriction) { + /** + * @public {string} label: Label to be used when displaying to user, it + * should be already translated. */ + this.label = label; + + /** @public {string} Name for this volume. */ + this.name = label; + + /** @public {!VolumeManagerCommon.RootType} */ + this.rootType = rootType; + + /** + * @public {boolean} true if this entry represents a Directory-like entry. + */ + this.isDirectory = isDirectory; + + /** @public {boolean} true if this entry represents a File-like entry. */ + this.isFile = !this.isDirectory; + + /** + * @public {chrome.fileManagerPrivate.SourceRestriction|undefined} It's used + * to communicate restrictions about sources to + * chrome.fileManagerPrivate.getRecentFiles API. + */ + this.sourceRestriction = opt_sourceRestriction; + + /** + * @public {string} the class name for this class. It's workaround for the + * fact that an instance created on foreground page and sent to background + * page can't be checked with "instanceof". + */ + this.type_name = 'FakeEntry'; + } + + /** + * FakeEntry is used as root, so doesn't have a parent and should return + * itself. + * + * @override + */ + getParent(success, error) { + setTimeout(success, 0, this); + } + + /** @override */ + toURL() { + return 'fake-entry://' + this.rootType; + } + + /** + * String used to determine the icon. + * @return {string} + */ + get iconName() { + return /** @type{string} */ (this.rootType); + } + + /** @override */ + getMetadata(success, error) { + setTimeout(() => success({})); + } + + /** @override */ + get isNativeType() { + return false; + } +}
diff --git a/ui/file_manager/file_manager/common/js/files_app_entry_types_unittest.js b/ui/file_manager/file_manager/common/js/files_app_entry_types_unittest.js index a8ac05e..262fd15 100644 --- a/ui/file_manager/file_manager/common/js/files_app_entry_types_unittest.js +++ b/ui/file_manager/file_manager/common/js/files_app_entry_types_unittest.js
@@ -337,3 +337,50 @@ // entryList is parent of volumeEntry so it should be its prefix. assertEquals(entryList, volumeEntry.volumeInfo.prefixEntry); } + +/** + * Test FakeEntry, which is only static data. + */ +function testFakeEntry(testReportCallback) { + let fakeEntry = + new FakeEntry('label', VolumeManagerCommon.RootType.CROSTINI, true, null); + + assertEquals(null, fakeEntry.sourceRestriction); + assertEquals('FakeEntry', fakeEntry.type_name); + assertEquals('label', fakeEntry.label); + assertEquals('label', fakeEntry.name); + assertEquals('fake-entry://crostini', fakeEntry.toURL()); + assertEquals('crostini', fakeEntry.iconName); + assertEquals(VolumeManagerCommon.RootType.CROSTINI, fakeEntry.rootType); + assertFalse(fakeEntry.isNativeType); + assertTrue(fakeEntry.isDirectory); + assertFalse(fakeEntry.isFile); + + // Check the isDirectory and sourceRestriction constructor args. + fakeEntry = new FakeEntry( + 'label', VolumeManagerCommon.RootType.CROSTINI, false, + AllowedPaths.NATIVE_PATH); + assertEquals(AllowedPaths.NATIVE_PATH, fakeEntry.sourceRestriction); + assertFalse(fakeEntry.isDirectory); + assertTrue(fakeEntry.isFile); + + let callCounter = 0; + + fakeEntry.getMetadata((metadata) => { + // Returns empty metadata {}. + assertEquals(0, Object.keys(metadata).length); + callCounter++; + }); + fakeEntry.getParent((parentEntry) => { + // Should return itself. + assertEquals(fakeEntry, parentEntry); + callCounter++; + }); + + reportPromise( + waitUntil(() => { + // It should be called for getMetadata and for getParent. + return callCounter == 2; + }), + testReportCallback); +}
diff --git a/ui/file_manager/file_manager/common/js/importer_common.js b/ui/file_manager/file_manager/common/js/importer_common.js index bca92c9..eb36378 100644 --- a/ui/file_manager/file_manager/common/js/importer_common.js +++ b/ui/file_manager/file_manager/common/js/importer_common.js
@@ -183,7 +183,7 @@ * Returns true if the entry represents a media directory for the purposes * of Cloud Import. * - * @param {Entry|FakeEntry|FilesAppEntry} entry + * @param {Entry|FilesAppEntry} entry * @param {VolumeManagerCommon.VolumeInfoProvider} volumeInfoProvider * @return {boolean} */
diff --git a/ui/file_manager/file_manager/common/js/importer_common_unittest.html b/ui/file_manager/file_manager/common/js/importer_common_unittest.html index 0e83618..601a062 100644 --- a/ui/file_manager/file_manager/common/js/importer_common_unittest.html +++ b/ui/file_manager/file_manager/common/js/importer_common_unittest.html
@@ -11,6 +11,7 @@ <script src="../../../../../ui/webui/resources/js/cr/ui/array_data_model.js"></script> <script src="../../../../../ui/webui/resources/js/load_time_data.js"></script> <script src="volume_manager_common.js"></script> + <script src="files_app_entry_types.js"></script> <script src="../../common/js/lru_cache.js"></script> <script src="../../background/js/entry_location_impl.js"></script> <script src="../../background/js/metadata_proxy.js"></script>
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js index 86e07ec..2f8fb65 100644 --- a/ui/file_manager/file_manager/common/js/util.js +++ b/ui/file_manager/file_manager/common/js/util.js
@@ -649,7 +649,7 @@ /** * Obtains whether an entry is fake or not. - * @param {(!Entry|!FakeEntry|!FilesAppEntry)} entry Entry or a fake entry. + * @param {(!Entry|!FilesAppEntry)} entry Entry or a fake entry. * @return {boolean} True if the given entry is fake. * @suppress {missingProperties} Closure compiler doesn't allow to call isNative * on Entry which is native and thus doesn't define this property, however we @@ -665,7 +665,7 @@ /** * Obtains whether an entry is the root directory of a Team Drive. - * @param {(!Entry|!FakeEntry|!FilesAppEntry)|null} entry Entry or a fake entry. + * @param {Entry|FilesAppEntry} entry Entry or a fake entry. * @return {boolean} True if the given entry is root of a Team Drive. */ util.isTeamDriveRoot = function(entry) { @@ -691,7 +691,7 @@ /** * Obtains whether an entry is descendant of the Team Drives directory. - * @param {(!Entry|!FakeEntry|!FilesAppEntry)} entry Entry or a fake entry. + * @param {!Entry|!FilesAppEntry} entry Entry or a fake entry. * @return {boolean} True if the given entry is under Team Drives. */ util.isTeamDriveEntry = function(entry) { @@ -719,7 +719,7 @@ /** * Returns true if the given entry is the root folder of recent files. - * @param {(!Entry|!FakeEntry|!FilesAppEntry)} entry Entry or a fake entry. + * @param {!Entry|!FilesAppEntry} entry Entry or a fake entry. * @returns {boolean} */ util.isRecentRoot = function(entry) { @@ -779,10 +779,10 @@ /** * Compares two entries. - * @param {Entry|FakeEntry|FilesAppEntry} entry1 The entry to be compared. Can - * be a fake. - * @param {Entry|FakeEntry|FilesAppEntry} entry2 The entry to be compared. Can - * be a fake. + * @param {Entry|FilesAppEntry} entry1 The entry to be compared. Can + * be a fake. + * @param {Entry|FilesAppEntry} entry2 The entry to be compared. Can + * be a fake. * @return {boolean} True if the both entry represents a same file or * directory. Returns true if both entries are null. */ @@ -880,7 +880,7 @@ * Checks if {@code entry} is an immediate child of {@code directory}. * * @param {Entry} entry The presumptive child. - * @param {DirectoryEntry|FakeEntry|FilesAppEntry} directory The presumptive + * @param {DirectoryEntry|FilesAppEntry} directory The presumptive * parent. * @return {!Promise<boolean>} Resolves with true if {@code directory} is * parent of {@code entry}. @@ -904,9 +904,9 @@ * Checks if the child entry is a descendant of another entry. If the entries * point to the same file or directory, then returns false. * - * @param {!DirectoryEntry|!FakeEntry} ancestorEntry The ancestor directory - * entry. Can be a fake. - * @param {!Entry|!FakeEntry} childEntry The child entry. Can be a fake. + * @param {!DirectoryEntry|!FilesAppEntry} ancestorEntry The ancestor + * directory entry. Can be a fake. + * @param {!Entry|!FilesAppEntry} childEntry The child entry. Can be a fake. * @return {boolean} True if the child entry is contained in the ancestor path. */ util.isDescendantEntry = function(ancestorEntry, childEntry) { @@ -1469,7 +1469,7 @@ * property without Closure compiler complaining. * TODO(lucmult): Wrap Entry in a FilesAppEntry derived class and remove * this function. https://crbug.com/835203. - * @param {Entry|FilesAppEntry|FakeEntry} entry + * @param {Entry|FilesAppEntry} entry * @return {FilesAppEntry} */ util.toFilesAppEntry = function(entry) { @@ -1481,7 +1481,7 @@ * returns false if it's FakeEntry or any one of the FilesAppEntry types. * TODO(lucmult): Wrap Entry in a FilesAppEntry derived class and remove * this function. https://crbug.com/835203. - * @param {Entry|FilesAppEntry|FakeEntry} entry + * @param {Entry|FilesAppEntry} entry * @return {boolean} */ util.isNativeEntry = function(entry) {
diff --git a/ui/file_manager/file_manager/common/js/volume_manager_common.js b/ui/file_manager/file_manager/common/js/volume_manager_common.js index ef373583..73a29aa 100644 --- a/ui/file_manager/file_manager/common/js/volume_manager_common.js +++ b/ui/file_manager/file_manager/common/js/volume_manager_common.js
@@ -341,7 +341,7 @@ /** * Obtains a volume info containing the passed entry. - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry Entry on the volume to be + * @param {!Entry|!FilesAppEntry} entry Entry on the volume to be * returned. Can be fake. * @return {?VolumeInfo} The VolumeInfo instance or null if not found. */ @@ -373,19 +373,6 @@ }; /** - * Fake entries for virtual folders which hold Google Drive offline files, - * Google Drive "Shared with me" files, and mixed Recent files. - * |sourceRestriction| is valid only for the Recent folder. - * @typedef {{ - * isDirectory: boolean, - * rootType: VolumeManagerCommon.RootType, - * toURL: function(): string, - * sourceRestriction: (string|undefined) - * }} - */ -var FakeEntry; - -/** * An event name trigerred when a user tries to mount the volume which is * already mounted. The event object must have a volumeId property. * @const {string}
diff --git a/ui/file_manager/file_manager/foreground/elements/files_quick_view.html b/ui/file_manager/file_manager/foreground/elements/files_quick_view.html index 7245e280..4f14f6ec 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_quick_view.html +++ b/ui/file_manager/file_manager/foreground/elements/files_quick_view.html
@@ -40,7 +40,7 @@ </template> <!-- document/HTML --> <template is="dom-if" if="[[isHtml_(type, subtype)]]"> - <files-safe-media hidden="[[!contentUrl]]" type="html" class="content" src="[[contentUrl]]"></files-safe-media> + <files-safe-media hidden="[[!contentUrl]]" type="html" class="content text-content" src="[[contentUrl]]"></files-safe-media> <template is="dom-if" if="[[!contentUrl]]"> <div generic-thumbnail="[[type]]"></div> <div class="no-preview">[[noPreviewText]]</div>
diff --git a/ui/file_manager/file_manager/foreground/js/BUILD.gn b/ui/file_manager/file_manager/foreground/js/BUILD.gn index 4387a271..45305c7 100644 --- a/ui/file_manager/file_manager/foreground/js/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -56,7 +56,6 @@ ":scan_controller", ":search_controller", ":selection_menu_controller", - ":share_client", ":sort_menu_controller", ":spinner_controller", ":task_controller", @@ -117,11 +116,11 @@ js_library("actions_model") { deps = [ ":folder_shortcuts_data_model", + "../../common/js:util", "metadata:metadata_model", "ui:error_dialog", "ui:files_alert_dialog", "ui:list_container", - "ui:share_dialog", "//ui/webui/resources/js:cr", ] } @@ -549,14 +548,6 @@ ] } -js_library("share_client") { - deps = [ - "../../../externs:webview_tag", - "../../common/js:volume_manager_common", - "//ui/webui/resources/js/cr:event_target", - ] -} - js_library("sort_menu_controller") { deps = [ ":file_list_model",
diff --git a/ui/file_manager/file_manager/foreground/js/actions_model.js b/ui/file_manager/file_manager/foreground/js/actions_model.js index 632241f..3a762ac0 100644 --- a/ui/file_manager/file_manager/foreground/js/actions_model.js +++ b/ui/file_manager/file_manager/foreground/js/actions_model.js
@@ -34,7 +34,6 @@ * alertDialog: FilesAlertDialog, * errorDialog: ErrorDialog, * listContainer: ListContainer, - * shareDialog: ShareDialog, * }} */ var ActionModelUI; @@ -91,32 +90,25 @@ * @override */ DriveShareAction.prototype.execute = function() { - // For Team Drives entries, open the Sharing dialog in a new window. - if (util.isTeamDriveEntry(this.entry_)) { - chrome.fileManagerPrivate.getEntryProperties( - [this.entry_], ['shareUrl'], function(results) { - if (chrome.runtime.lastError) { - console.error(chrome.runtime.lastError.message); - return; - } - if (results.length != 1) { - console.error( - 'getEntryProperties for shareUrl should return 1 entry ' + - '(returned ' + results.length + ')'); - return; - } - if (results[0].shareUrl === undefined) { - console.error('getEntryProperties shareUrl is undefined'); - return; - } - util.visitURL(results[0].shareUrl); - }.bind(this)); - return; - } - this.ui_.shareDialog.showEntry(this.entry_, function(result) { - if (result == ShareDialog.Result.NETWORK_ERROR) - this.ui_.errorDialog.show(str('SHARE_ERROR'), null, null, null); - }.bind(this)); + // Open the Sharing dialog in a new window. + chrome.fileManagerPrivate.getEntryProperties( + [this.entry_], ['shareUrl'], function(results) { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + return; + } + if (results.length != 1) { + console.error( + 'getEntryProperties for shareUrl should return 1 entry ' + + '(returned ' + results.length + ')'); + return; + } + if (results[0].shareUrl === undefined) { + console.error('getEntryProperties shareUrl is undefined'); + return; + } + util.visitURL(results[0].shareUrl); + }.bind(this)); }; /**
diff --git a/ui/file_manager/file_manager/foreground/js/actions_model_unittest.html b/ui/file_manager/file_manager/foreground/js/actions_model_unittest.html index b1adba13..4e16461 100644 --- a/ui/file_manager/file_manager/foreground/js/actions_model_unittest.html +++ b/ui/file_manager/file_manager/foreground/js/actions_model_unittest.html
@@ -14,6 +14,7 @@ <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/unittest_util.js"></script> +<script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/volume_manager_common.js"></script>
diff --git a/ui/file_manager/file_manager/foreground/js/directory_contents.js b/ui/file_manager/file_manager/foreground/js/directory_contents.js index 668b0d3..d04448f 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_contents.js +++ b/ui/file_manager/file_manager/foreground/js/directory_contents.js
@@ -787,8 +787,8 @@ /** * @return {DirectoryEntry|FakeEntry|FilesAppDirEntry} A DirectoryEntry for - * current directory. - * In case of search -- the top directory from which search is run. + * current directory. In case of search -- the top directory from which + * search is run. */ DirectoryContents.prototype.getDirectoryEntry = function() { return this.directoryEntry_;
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js index 8c073fc..d30947e8 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_model.js +++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -1209,7 +1209,7 @@ * Creates directory contents for the entry and query. * * @param {FileListContext} context File list context. - * @param {!DirectoryEntry|!FakeEntry|!FilesAppEntry} entry Current directory. + * @param {!DirectoryEntry|!FilesAppEntry} entry Current directory. * @param {string=} opt_query Search query string. * @return {DirectoryContents} Directory contents. * @private
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js index 63e14f4..78b6df95 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -1204,14 +1204,11 @@ fakeEntriesVisible && !DialogType.isFolderDialog(this.launchParams_.type) ? new NavigationModelFakeItem( - str('RECENT_ROOT_LABEL'), NavigationModelItemType.RECENT, { - isDirectory: true, - rootType: VolumeManagerCommon.RootType.RECENT, - toURL: function() { - return 'fake-entry://recent'; - }, - sourceRestriction: this.getSourceRestriction_() - }) : + str('RECENT_ROOT_LABEL'), NavigationModelItemType.RECENT, + new FakeEntry( + str('RECENT_ROOT_LABEL'), + VolumeManagerCommon.RootType.RECENT, true, + this.getSourceRestriction_())) : null, null, // TODO(crbug.com/869252) remove this null. this.commandLineFlags_['disable-my-files-navigation']); @@ -1227,18 +1224,10 @@ chrome.fileManagerPrivate.isCrostiniEnabled((enabled) => { this.directoryTree.dataModel.linuxFilesItem = enabled ? new NavigationModelFakeItem( - str('LINUX_FILES_ROOT_LABEL'), NavigationModelItemType.CROSTINI, { - isDirectory: true, - rootType: VolumeManagerCommon.RootType.CROSTINI, - name: str('LINUX_FILES_ROOT_LABEL'), - toURL: () => { - return 'fake-entry://linux-files'; - }, - getMetadata: (onSuccess) => { - onSuccess({}); - }, - iconName: VolumeManagerCommon.VolumeType.CROSTINI, - }) : + str('LINUX_FILES_ROOT_LABEL'), NavigationModelItemType.CROSTINI, + new FakeEntry( + str('LINUX_FILES_ROOT_LABEL'), + VolumeManagerCommon.RootType.CROSTINI, true)) : null; this.directoryTree.redraw(false); });
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index e41092d..6099bfe0 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -69,7 +69,7 @@ * * @param {EventTarget} element Element which is the command event's target. * @param {DirectoryModel} directoryModel - * @return {DirectoryEntry|FakeEntry|FilesAppEntry} The extracted parent entry. + * @return {DirectoryEntry|FilesAppEntry} The extracted parent entry. */ CommandUtil.getParentEntry = function(element, directoryModel) { if (element instanceof DirectoryTree) {
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js index 53f2130..5840cd33 100644 --- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js +++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -1501,7 +1501,7 @@ /** * @param {!ClipboardData} clipboardData Clipboard data object. - * @param {DirectoryEntry|FakeEntry|FilesAppEntry} destinationEntry Destination + * @param {DirectoryEntry|FilesAppEntry} destinationEntry Destination * entry. * @return {boolean} Returns true if items stored in {@code clipboardData} can * be pasted to {@code destinationEntry}. Otherwise, returns false. @@ -1541,7 +1541,7 @@ /** * Execute paste command. * - * @param {DirectoryEntry|FakeEntry|FilesAppEntry} destinationEntry + * @param {DirectoryEntry|FilesAppEntry} destinationEntry * @return {boolean} Returns true, the paste is success. Otherwise, returns * false. */ @@ -1649,7 +1649,7 @@ * @param {!Event} event Drag event. * @param {Object<string>} dragAndDropData drag & drop data from * getDragAndDropGlobalData_(). - * @param {DirectoryEntry|FakeEntry|FilesAppEntry} destinationEntry Destination + * @param {DirectoryEntry|FilesAppEntry} destinationEntry Destination * entry. * @return {DropEffectAndLabel} Returns the appropriate drop query type * ('none', 'move' or copy') to the current modifiers status and the
diff --git a/ui/file_manager/file_manager/foreground/js/import_controller.js b/ui/file_manager/file_manager/foreground/js/import_controller.js index c935ab6..74444fc 100644 --- a/ui/file_manager/file_manager/foreground/js/import_controller.js +++ b/ui/file_manager/file_manager/foreground/js/import_controller.js
@@ -1071,7 +1071,7 @@ /** * Returns the directory entry for the current directory. - * @return {DirectoryEntry|FakeEntry|FilesAppEntry} + * @return {DirectoryEntry|FilesAppEntry} */ importer.ControllerEnvironment.prototype.getCurrentDirectory;
diff --git a/ui/file_manager/file_manager/foreground/js/import_controller_unittest.html b/ui/file_manager/file_manager/foreground/js/import_controller_unittest.html index 56930128..27cc1c9 100644 --- a/ui/file_manager/file_manager/foreground/js/import_controller_unittest.html +++ b/ui/file_manager/file_manager/foreground/js/import_controller_unittest.html
@@ -17,6 +17,7 @@ <script src="../../common/js/async_util.js"></script> <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/unittest_util.js"></script> + <script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/metrics_base.js"></script> <script src="../../common/js/metrics_events.js"></script>
diff --git a/ui/file_manager/file_manager/foreground/js/main_scripts.js b/ui/file_manager/file_manager/foreground/js/main_scripts.js index 99d513d..3d346db 100644 --- a/ui/file_manager/file_manager/foreground/js/main_scripts.js +++ b/ui/file_manager/file_manager/foreground/js/main_scripts.js
@@ -152,7 +152,6 @@ // <include src="scan_controller.js"> // <include src="search_controller.js"> // <include src="selection_menu_controller.js"> -// <include src="share_client.js"> // <include src="spinner_controller.js"> // <include src="task_controller.js"> // <include src="task_history.js"> @@ -186,7 +185,6 @@ // <include src="ui/progress_center_panel.js"> // <include src="ui/providers_menu.js"> // <include src="ui/search_box.js"> -// <include src="ui/share_dialog.js"> // <include src="ui/suggest_apps_dialog.js"> // <include src="main_window_component.js"> // <include src="volume_manager_wrapper.js">
diff --git a/ui/file_manager/file_manager/foreground/js/main_window_component.js b/ui/file_manager/file_manager/foreground/js/main_window_component.js index b7fd19f..cb61acef 100644 --- a/ui/file_manager/file_manager/foreground/js/main_window_component.js +++ b/ui/file_manager/file_manager/foreground/js/main_window_component.js
@@ -474,7 +474,6 @@ MainWindowComponent.prototype.onDriveConnectionChanged_ = function() { var connection = this.volumeManager_.getDriveConnectionState(); this.ui_.dialogContainer.setAttribute('connection', connection.type); - this.ui_.shareDialog.hideWithResult(ShareDialog.Result.NETWORK_ERROR); this.ui_.suggestAppsDialog.onDriveConnectionChanged(connection.type); };
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js index 048f898..3f8e3aa6 100644 --- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js +++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -163,7 +163,7 @@ * * @param {string} label Label on the menu button. * @param {NavigationModelItemType} type - * @param {!FakeEntry} entry Fake entry for the root folder. + * @param {!FilesAppEntry} entry Fake entry for the root folder. * @constructor * @extends {NavigationModelItem} * @struct
diff --git a/ui/file_manager/file_manager/foreground/js/providers_model_unittest.html b/ui/file_manager/file_manager/foreground/js/providers_model_unittest.html index 4e005fe..b2c1115 100644 --- a/ui/file_manager/file_manager/foreground/js/providers_model_unittest.html +++ b/ui/file_manager/file_manager/foreground/js/providers_model_unittest.html
@@ -15,6 +15,7 @@ <script src="../../common/js/mock_entry.js"></script> <script src="../../common/js/unittest_util.js"></script> +<script src="../../common/js/files_app_entry_types.js"></script> <script src="../../common/js/util.js"></script> <script src="../../common/js/volume_manager_common.js"></script>
diff --git a/ui/file_manager/file_manager/foreground/js/share_client.js b/ui/file_manager/file_manager/foreground/js/share_client.js deleted file mode 100644 index f332dd6b..0000000 --- a/ui/file_manager/file_manager/foreground/js/share_client.js +++ /dev/null
@@ -1,178 +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. - -/** - * @param {WebView} webView Web View tag. - * @param {string} url Share Url for an entry. - * @param {ShareClient.Observer} observer Observer instance. - * @constructor - */ -function ShareClient(webView, url, observer) { - this.webView_ = webView; - this.url_ = url; - this.observer_ = observer; - this.loaded_ = false; - this.loading_ = false; - this.onMessageBound_ = this.onMessage_.bind(this); - this.onLoadStopBound_ = this.onLoadStop_.bind(this); - this.onLoadAbortBound_ = this.onLoadAbort_.bind(this); -} - -/** - * Target origin of the embedded dialog. - * @type {string} - * @const - */ -ShareClient.SHARE_TARGET = 'https://drive.google.com'; - -/** - * Observes for state changes of the embedded dialog. - * @interface - */ -ShareClient.Observer = function() { -}; - -/** - * Notifies about the embedded dialog being loaded. - */ -ShareClient.Observer.prototype.onLoaded = function() { -}; - -/** - * Notifies when the the embedded dialog failed to load. - */ -ShareClient.Observer.prototype.onLoadFailed = function() { -}; - -/** - * Notifies about changed dimensions of the embedded dialog. - * @param {number} width Width in pixels. - * @param {number} height Height in pixels. - * @param {function()} callback Completion callback. Call when finished - * handling the resize. - */ -ShareClient.Observer.prototype.onResized = function(width, height, callback) { -}; - -/** - * Notifies about the embedded dialog being closed. - */ -ShareClient.Observer.prototype.onClosed = function() { -}; - -/** - * Handles messages from the embedded dialog. - * @param {Event} e Message event. - * @private - */ -ShareClient.prototype.onMessage_ = function(e) { - if (e.origin != ShareClient.SHARE_TARGET && !window.IN_TEST) { - // Logs added temporarily to track crbug.com/288783. - console.debug('Received a message from an illegal origin: ' + e.origin); - return; - } - - var data = JSON.parse(e.data); - // Logs added temporarily to track crbug.com/288783. - console.debug('Received message: ' + data.type); - - switch (data.type) { - case 'resize': - this.observer_.onResized(data.args.width, - data.args.height, - this.postMessage_.bind(this, 'resizeComplete')); - break; - case 'prepareForVisible': - this.postMessage_('prepareComplete'); - if (!this.loaded_) { - this.loading_ = false; - this.loaded_ = true; - this.observer_.onLoaded(); - } - break; - case 'setVisible': - if (!data.args.visible) - this.observer_.onClosed(); - break; - } -}; - -/** - * Handles completion of the web view request. - * @param {Event} e Message event. - * @private - */ -ShareClient.prototype.onLoadStop_ = function(e) { - // Logs added temporarily to track crbug.com/288783. - console.debug('Web View loaded.'); - - this.postMessage_('makeBodyVisible'); -}; - -/** - * Handles termination of the web view request. - * @param {Event} e Message event. - * @private - */ -ShareClient.prototype.onLoadAbort_ = function(e) { - // Logs added temporarily to track crbug.com/288783. - console.debug('Web View failed to load with error: ' + e.reason + ', url: ' + - e.url + ' while requested: ' + this.url_); - - this.observer_.onLoadFailed(); -}; - -/** - * Sends a message to the embedded dialog. - * @param {string} type Message type. - * @param {Object=} opt_args Optional arguments. - * @private - */ -ShareClient.prototype.postMessage_ = function(type, opt_args) { - // Logs added temporarily to track crbug.com/288783. - console.debug('Sending message: ' + type); - - var message = { - type: type, - args: opt_args - }; - this.webView_.contentWindow.postMessage( - JSON.stringify(message), - !window.IN_TEST ? ShareClient.SHARE_TARGET : '*'); -}; - -/** - * Loads the embedded dialog. Can be called only one. - */ -ShareClient.prototype.load = function() { - if (this.loading_ || this.loaded_) - throw new Error('Already loaded.'); - this.loading_ = true; - - // Logs added temporarily to track crbug.com/288783. - console.debug('Loading.'); - - window.addEventListener('message', this.onMessageBound_); - this.webView_.addEventListener('loadstop', this.onLoadStopBound_); - this.webView_.addEventListener('loadabort', this.onLoadAbortBound_); - this.webView_.setAttribute('src', this.url_); -}; - -/** - * Aborts loading of the embedded dialog and performs cleanup. - */ -ShareClient.prototype.abort = function() { - window.removeEventListener('message', this.onMessageBound_); - this.webView_.removeEventListener('loadstop', this.onLoadStopBound_); - this.webView_.removeEventListener( - 'loadabort', this.onLoadAbortBound_); - this.webView_.stop(); -}; - -/** - * Cleans the dialog by removing all handlers. - */ -ShareClient.prototype.dispose = function() { - this.abort(); -};
diff --git a/ui/file_manager/file_manager/foreground/js/task_controller.js b/ui/file_manager/file_manager/foreground/js/task_controller.js index ab85fd53..eea1b09d 100644 --- a/ui/file_manager/file_manager/foreground/js/task_controller.js +++ b/ui/file_manager/file_manager/foreground/js/task_controller.js
@@ -269,7 +269,11 @@ TaskController.prototype.executeDefaultTask = function() { this.getFileTasks() .then(function(tasks) { - tasks.execute(this.ui_.fileContextMenu.defaultTaskMenuItem); + var task = { + taskId: this.ui_.fileContextMenu.defaultTaskMenuItem.taskId, + title: this.ui_.fileContextMenu.defaultTaskMenuItem.label, + }; + tasks.execute(task); }.bind(this)) .catch(function(error) { if (error)
diff --git a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn index 59d232e..51f062e 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -38,7 +38,6 @@ ":progress_center_panel", ":providers_menu", ":search_box", - ":share_dialog", ":suggest_apps_dialog", ] } @@ -211,7 +210,6 @@ ":progress_center_panel", ":providers_menu", ":search_box", - ":share_dialog", ":suggest_apps_dialog", "..:launch_param", "..:providers_model", @@ -358,17 +356,6 @@ ] } -# TODO(tapted): Move this into //ui/file_manager/base. -js_library("share_dialog") { - visibility += [ "//ui/file_manager/gallery/*" ] - deps = [ - ":file_manager_dialog_base", - "..:share_client", - "../../../common/js:async_util", - "../../../common/js:util", - ] -} - js_library("suggest_apps_dialog") { deps = [ ":file_manager_dialog_base",
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html index 2cd9bc5..79118e09 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html +++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html
@@ -16,6 +16,7 @@ <script src="../../../common/js/async_util.js"></script> <script src="../../../common/js/mock_entry.js"></script> <script src="../../../common/js/unittest_util.js"></script> + <script src="../../../common/js/files_app_entry_types.js"></script> <script src="../../../common/js/util.js"></script> <script src="../../../common/js/volume_manager_common.js"></script>
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js index bade340..f5c3216 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -89,13 +89,6 @@ this.copyConfirmDialog.setOkLabel(str('CONFIRM_COPY_BUTTON_LABEL')); /** - * Share dialog. - * @type {!ShareDialog} - * @const - */ - this.shareDialog = new ShareDialog(this.element); - - /** * Multi-profile share dialog. * @type {!MultiProfileShareDialog} * @const
diff --git a/ui/file_manager/file_manager/foreground/js/ui/location_line.js b/ui/file_manager/file_manager/foreground/js/ui/location_line.js index 3d70dc49e..ffe396b 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/location_line.js +++ b/ui/file_manager/file_manager/foreground/js/ui/location_line.js
@@ -60,7 +60,7 @@ /** * Get components for the path of entry. - * @param {!Entry|!FakeEntry|!FilesAppEntry} entry An entry. + * @param {!Entry|!FilesAppEntry} entry An entry. * @return {!Array<!LocationLine.PathComponent>} Components. * @private */ @@ -358,7 +358,7 @@ * Path component. * @param {string} name Name. * @param {string} url Url. - * @param {FakeEntry|FilesAppEntry=} opt_fakeEntry Fake entry should be set when + * @param {FilesAppEntry=} opt_fakeEntry Fake entry should be set when * this component represents fake entry. * @constructor * @struct @@ -371,12 +371,12 @@ /** * Resolve an entry of the component. - * @return {!Promise<!Entry|!FakeEntry|!FilesAppEntry>} A promise which is + * @return {!Promise<!Entry|!FilesAppEntry>} A promise which is * resolved with an entry. */ LocationLine.PathComponent.prototype.resolveEntry = function() { if (this.fakeEntry_) - return /** @type {!Promise<!Entry|!FakeEntry|!FilesAppEntry>} */ ( + return /** @type {!Promise<!Entry|!FilesAppEntry>} */ ( Promise.resolve(this.fakeEntry_)); else return new Promise(
diff --git a/ui/file_manager/file_manager/foreground/js/ui/share_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/share_dialog.js deleted file mode 100644 index e6dcf93..0000000 --- a/ui/file_manager/file_manager/foreground/js/ui/share_dialog.js +++ /dev/null
@@ -1,361 +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. - -/** - * @param {HTMLElement} parentNode Node to be parent for this dialog. - * @constructor - * @extends {FileManagerDialogBase} - * @implements {ShareClient.Observer} - */ -function ShareDialog(parentNode) { - this.queue_ = new AsyncUtil.Queue(); - this.onQueueTaskFinished_ = null; - this.shareClient_ = null; - this.webViewWrapper_ = null; - this.webView_ = null; - this.failureTimeout_ = null; - this.callback_ = null; - this.overrideURLForTesting_ = null; - - FileManagerDialogBase.call(this, parentNode); -} - -/** - * Timeout for loading the share dialog before giving up. - * @type {number} - * @const - */ -ShareDialog.FAILURE_TIMEOUT = 20000; - -/** - * Polling interval for detecting the end of resizing animation. - * @type {number} - * @const - */ -ShareDialog.WEBVIEW_CHECKSIZE_INTERVAL = 66; - -/** - * The result of opening the dialog. - * @enum {string} - * @const - */ -ShareDialog.Result = { - // The dialog is closed normally. This includes user cancel. - SUCCESS: 'success', - // The dialog is closed by network error. - NETWORK_ERROR: 'networkError', - // The dialog is not opened because it is already showing. - ALREADY_SHOWING: 'alreadyShowing' -}; -Object.freeze(ShareDialog.Result); - -/** - * Wraps a Web View element and adds authorization headers to it. - * @param {string} urlPattern Pattern of urls to be authorized. - * @param {WebView} webView Web View element to be wrapped. - * @constructor - */ -ShareDialog.WebViewAuthorizer = function(urlPattern, webView) { - this.urlPattern_ = urlPattern; - this.webView_ = webView; - this.initialized_ = false; - this.accessToken_ = null; -}; - -/** - * Initializes the web view by installing hooks injecting the authorization - * headers. - * @param {function()} callback Completion callback. - */ -ShareDialog.WebViewAuthorizer.prototype.initialize = function(callback) { - if (this.initialized_) { - callback(); - return; - } - - var registerInjectionHooks = function() { - this.webView_.removeEventListener('loadstop', registerInjectionHooks); - this.webView_.request.onBeforeSendHeaders.addListener( - this.authorizeRequest_.bind(this), - /** @type {!RequestFilter} */ ({urls: [this.urlPattern_]}), - ['blocking', 'requestHeaders']); - this.initialized_ = true; - callback(); - }.bind(this); - - this.webView_.addEventListener('loadstop', registerInjectionHooks); - this.webView_.setAttribute('src', 'data:text/html,'); -}; - -/** - * Authorizes the web view by fetching the freshest access tokens. - * @param {function()} callback Completion callback. - */ -ShareDialog.WebViewAuthorizer.prototype.authorize = function(callback) { - // Fetch or update the access token. - chrome.fileManagerPrivate.requestAccessToken(false, // force_refresh - function(inAccessToken) { - this.accessToken_ = inAccessToken; - callback(); - }.bind(this)); -}; - -/** - * Injects headers into the passed request. - * @param {!Object} e Request event. - * @return {!BlockingResponse} Modified headers. - * @private - */ -ShareDialog.WebViewAuthorizer.prototype.authorizeRequest_ = function(e) { - e.requestHeaders.push({ - name: 'Authorization', - value: 'Bearer ' + this.accessToken_ - }); - return /** @type {!BlockingResponse} */ ({requestHeaders: e.requestHeaders}); -}; - -ShareDialog.prototype = { - __proto__: FileManagerDialogBase.prototype -}; - -/** - * Sets an override URLs for testing. It will be used instead of the sharing URL - * fetched from Drive. Note, that the domain still has to match - * ShareClient.SHARE_TARGET, as well as the hostname access enabled in the - * manifest (if different). - * - * @param {?string} url - */ -ShareDialog.prototype.setOverrideURLForTesting = function(url) { - this.overrideURLForTesting_ = url; -}; - -/** - * One-time initialization of DOM. - * @protected - */ -ShareDialog.prototype.initDom_ = function() { - FileManagerDialogBase.prototype.initDom_.call(this); - this.frame_.classList.add('share-dialog-frame'); - - this.webViewWrapper_ = this.document_.createElement('div'); - this.webViewWrapper_.className = 'share-dialog-webview-wrapper'; - this.cancelButton_.hidden = true; - this.okButton_.hidden = true; - this.closeButton_.hidden = true; - this.frame_.insertBefore(this.webViewWrapper_, - this.frame_.querySelector('.cr-dialog-buttons')); -}; - -/** - * @override - */ -ShareDialog.prototype.onResized = function(width, height, callback) { - if (!width || !height) - return; - - this.webViewWrapper_.style.width = width + 'px'; - this.webViewWrapper_.style.height = height + 'px'; - - // Wait sending 'resizeComplete' event until the size of the WebView - // stabilizes. This is a workaround for crbug.com/693416. - // TODO(yamaguchi): Detect animation end by the absolute size to distinguish - // it from frame drops. - /** - * @param {number} previousWidth Width in pixels. - * @param {number} previousHeight Height in pixels. - */ - var checkSize = function(previousWidth, previousHeight) { - this.webView_.executeScript({ - code: "[document.documentElement.clientWidth," + - " document.documentElement.clientHeight];" - }, function(results) { - var newWidth = results[0][0]; - var newHeight = results[0][1]; - if (newWidth === previousWidth && newHeight === previousHeight) { - callback(); - } else { - setTimeout(checkSize.bind(null, newWidth, newHeight), - ShareDialog.WEBVIEW_CHECKSIZE_INTERVAL); - } - }.bind(this)); - }.bind(this); - - setTimeout(checkSize.bind(null, -1, -1), - ShareDialog.WEBVIEW_CHECKSIZE_INTERVAL); -}; - -/** - * @override - */ -ShareDialog.prototype.onClosed = function() { - this.hide(); -}; - -/** - * @override - */ -ShareDialog.prototype.onLoaded = function() { - if (this.failureTimeout_) { - clearTimeout(this.failureTimeout_); - this.failureTimeout_ = null; - } - - // Logs added temporarily to track crbug.com/288783. - console.debug('Loaded.'); - - this.okButton_.hidden = false; - this.webViewWrapper_.classList.add('loaded'); - this.webView_.focus(); -}; - -/** - * @override - */ -ShareDialog.prototype.onLoadFailed = function() { - this.hideWithResult(ShareDialog.Result.NETWORK_ERROR); -}; - -/** - * @param {Function=} opt_onHide Called when the dialog is hidden. - * @override - */ -ShareDialog.prototype.hide = function(opt_onHide) { - this.hideWithResult(ShareDialog.Result.SUCCESS, opt_onHide); -}; - -/** - * Hide the dialog with the result and the callback. - * @param {ShareDialog.Result} result Result passed to the closing callback. - * @param {Function=} opt_onHide Callback called at the end of hiding. - */ -ShareDialog.prototype.hideWithResult = function(result, opt_onHide) { - if (!this.isShowing()) - return; - - if (this.shareClient_) { - this.shareClient_.dispose(); - this.shareClient_ = null; - } - - this.webViewWrapper_.textContent = ''; - if (this.failureTimeout_) { - clearTimeout(this.failureTimeout_); - this.failureTimeout_ = null; - } - - FileManagerDialogBase.prototype.hide.call( - this, - function() { - if (opt_onHide) - opt_onHide(); - this.callback_(result); - this.callback_ = null; - }.bind(this)); -}; - -/** - * Shows the dialog. - * @param {!Entry} entry Entry to share. - * @param {function(ShareDialog.Result)} callback Callback to be called when the - * showing task is completed. The argument is whether to succeed or not. - * Note that cancel is regarded as success. - */ -ShareDialog.prototype.showEntry = function(entry, callback) { - // If the dialog is already showing, return the error. - if (this.isShowing()) { - callback(ShareDialog.Result.ALREADY_SHOWING); - return; - } - - // Initialize the variables. - this.callback_ = callback; - this.webViewWrapper_.style.width = ''; - this.webViewWrapper_.style.height = ''; - this.webViewWrapper_.classList.remove('loaded'); - - // If the embedded share dialog is not started within some time, then - // give up and show an error message. - this.failureTimeout_ = setTimeout(function() { - this.hideWithResult(ShareDialog.Result.NETWORK_ERROR); - - // Logs added temporarily to track crbug.com/288783. - console.debug('Timeout. Web View points at: ' + this.webView_.src); - }.bind(this), ShareDialog.FAILURE_TIMEOUT); - - // TODO(mtomasz): Move to initDom_() once and reuse <webview> once it gets - // fixed. See: crbug.com/260622. - this.webView_ = /** @type {WebView} */ (util.createChild( - this.webViewWrapper_, 'share-dialog-webview', 'webview')); - this.webViewAuthorizer_ = new ShareDialog.WebViewAuthorizer( - !window.IN_TEST ? (ShareClient.SHARE_TARGET + '/*') : '<all_urls>', - this.webView_); - this.webView_.addEventListener('newwindow', function(e) { - e = /** @type {NewWindowEvent} */ (e); - // Discard the window object and reopen in an external window. - e.window.discard(); - util.visitURL(e.targetUrl); - }); - var show = FileManagerDialogBase.prototype.showBlankDialog.call(this); - if (!show) { - // The code shoundn't get here, since already-showing was handled before. - console.error('ShareDialog can\'t be shown.'); - return; - } - - // Initialize and authorize the Web View tag asynchronously. - var group = new AsyncUtil.Group(); - - var shareUrl; - if (this.overrideURLForTesting_) { - console.debug('Using an override URL for testing: ' + - this.overrideURLForTesting_); - shareUrl = this.overrideURLForTesting_; - } else { - // Fetches an url to the sharing dialog. - group.add(function(inCallback) { - chrome.fileManagerPrivate.getShareUrl( - entry, - function(inShareUrl) { - if (!chrome.runtime.lastError) - shareUrl = inShareUrl; - else - console.error(chrome.runtime.lastError.message); - inCallback(); - }); - }); - } - - group.add(this.webViewAuthorizer_.initialize.bind(this.webViewAuthorizer_)); - group.add(this.webViewAuthorizer_.authorize.bind(this.webViewAuthorizer_)); - - // Loads the share widget once all the previous async calls are finished. - group.run(function() { - // If the url is not obtained, return the network error. - if (!shareUrl) { - // Logs added temporarily to track crbug.com/288783. - console.debug('The share URL is not available.'); - - this.hideWithResult(ShareDialog.Result.NETWORK_ERROR); - return; - } - // Already inactive, therefore ignore. - if (!this.isShowing()) - return; - this.shareClient_ = new ShareClient(this.webView_, - shareUrl, - this); - this.shareClient_.load(); - }.bind(this)); -}; - -/** - * Tells whether the share dialog is showing or not. - * - * @return {boolean} True since the show method is called and until the closing - * callback is invoked. - */ -ShareDialog.prototype.isShowing = function() { - return !!this.callback_; -};
diff --git a/ui/file_manager/file_manager/foreground/js/volume_manager_wrapper.js b/ui/file_manager/file_manager/foreground/js/volume_manager_wrapper.js index 4a3696e..db346d2 100644 --- a/ui/file_manager/file_manager/foreground/js/volume_manager_wrapper.js +++ b/ui/file_manager/file_manager/foreground/js/volume_manager_wrapper.js
@@ -300,7 +300,7 @@ /** * Obtains location information from an entry. * - * @param {(!Entry|!FakeEntry|!FilesAppEntry)} entry File or directory entry. + * @param {(!Entry|!FilesAppEntry)} entry File or directory entry. * @return {EntryLocation} Location information. */ VolumeManagerWrapper.prototype.getLocationInfo = function(entry) {
diff --git a/ui/file_manager/file_manager/test/crostini.js b/ui/file_manager/file_manager/test/crostini.js index 2966aaac..0ca0b22 100644 --- a/ui/file_manager/file_manager/test/crostini.js +++ b/ui/file_manager/file_manager/test/crostini.js
@@ -195,6 +195,57 @@ }); }; +crostini.testErrorOpeningDownloadsWithDefaultCrostiniApp = (done) => { + // Save old fmp.getFileTasks and replace with version that returns + // crostini app and chrome Text app. + let oldGetFileTasks = chrome.fileManagerPrivate.getFileTasks; + chrome.fileManagerPrivate.getFileTasks = (entries, callback) => { + setTimeout(callback, 0, [{ + taskId: 'crostini-app-id|crostini|open-with', + title: 'Crostini App', + verb: 'open_with', + isDefault: true, + }]); + }; + + test.setupAndWaitUntilReady() + .then(() => { + // Right click on 'world.ogv' file, wait for dialog with the default + // task action. + assertTrue(test.fakeMouseRightClick('[file-name="world.ogv"]')); + return test.repeatUntil(() => { + return document + .querySelector( + 'cr-menu-item[command="#default-task"]:not([hidden])') + .label === 'Crostini App' || + test.pending('Waiting for default task menu item'); + }); + }) + .then(() => { + // Click 'Open with', wait for picker. + assertTrue( + test.fakeMouseClick('cr-menu-item[command="#default-task"]')); + return test.waitForElement('.cr-dialog-container'); + }) + .then(() => { + // Validate error messages, click 'OK' to close. Ensure dialog closes. + assertEquals( + 'Unable to open with Crostini App', + document.querySelector('.cr-dialog-title').innerText); + assertEquals( + 'To open files with Crostini App, ' + + 'first copy to Linux files folder.', + document.querySelector('.cr-dialog-text').innerText); + assertTrue(test.fakeMouseClick('button.cr-dialog-ok')); + return test.waitForElementLost('.cr-dialog-container.shown'); + }) + .then(() => { + // Restore fmp.getFileTasks. + chrome.fileManagerPrivate.getFileTasks = oldGetFileTasks; + done(); + }); +}; + crostini.testSharePathCrostiniSuccess = (done) => { let sharePathCalled = false; chrome.fileManagerPrivate.sharePathWithCrostini = (callback) => {
diff --git a/ui/file_manager/file_manager/test/js/test_util.js b/ui/file_manager/file_manager/test/js/test_util.js index 0004e04a..9642706 100644 --- a/ui/file_manager/file_manager/test/js/test_util.js +++ b/ui/file_manager/file_manager/test/js/test_util.js
@@ -8,7 +8,7 @@ var test = test || {}; // Update paths for testing. -constants.FILES_QUICK_VIEW_HTML = 'test/gen/elements/files_quick_view.html'; +constants.FILES_QUICK_VIEW_HTML = 'test/gen/foreground/elements/files_quick_view.html'; constants.DRIVE_WELCOME_CSS = FILE_MANAGER_ROOT + constants.DRIVE_WELCOME_CSS; // Stores Blobs loaded from src/chrome/test/data/chromeos/file_manager. @@ -238,7 +238,12 @@ hiddenFile: new test.TestEntryInfo( test.EntryType.FILE, 'text.txt', '.hiddenfile.txt', 'text/plain', test.SharedOption.NONE, 'Sep 30, 2014, 3:30 PM', - '.hiddenfile.txt', '51 bytes', 'Plain text') + '.hiddenfile.txt', '51 bytes', 'Plain text'), + + mhtml: new test.TestEntryInfo( + test.EntryType.FILE, 'text.txt', 'hello.mhtml', 'text/html', + test.SharedOption.NONE, 'Sep 4, 1998, 12:34 PM', 'hello.mhtml', + '51 bytes', 'HTML document'), }; /**
diff --git a/ui/file_manager/file_manager/test/quick_view.js b/ui/file_manager/file_manager/test/quick_view.js index bd45cc8..6c16936 100644 --- a/ui/file_manager/file_manager/test/quick_view.js +++ b/ui/file_manager/file_manager/test/quick_view.js
@@ -6,12 +6,15 @@ /** * Helper function to open and close Quick View. + * @param {string} file file to open and close. + * @param {function(!Element)=} opt_validate optional validation function that + * receives the QuickView element as argument. */ -quickview.openCloseQuickView = () => { +quickview.openCloseQuickView = (file, opt_validate) => { // Using an image file for testing https://crbug.com/845830. // If this test starts to take too long on the bots, the image could be // changed to text file 'hello.txt'. - assertTrue(test.selectFile('My Desktop Background.png')); + assertTrue(test.selectFile(file)); // Press Space key. assertTrue(test.fakeKeyDown('#file-list', ' ', ' ', false, false, false)); // Wait until Quick View is displayed and files-safe-media.src is set. @@ -27,6 +30,10 @@ return test.pending('Quick View is not opened yet.'); }) .then((result) => { + // Run optional validate. + if (opt_validate) + opt_validate(result); + // Click panel and wait for close. assertTrue(test.fakeMouseClick(['#quick-view', '#contentPanel'])); return test.repeatUntil(() => { @@ -43,7 +50,25 @@ quickview.testOpenCloseQuickViewDownloads = (done) => { test.setupAndWaitUntilReady() .then(() => { - return quickview.openCloseQuickView(); + return quickview.openCloseQuickView('My Desktop Background.png'); + }) + .then(() => { + // Add hello.mhtml file and verify background is white. + const entriesWithMhtml = + test.BASIC_LOCAL_ENTRY_SET.concat([test.ENTRIES.mhtml]); + test.addEntries(entriesWithMhtml, [], []); + assertTrue(test.fakeMouseClick('#refresh-button'), 'click refresh'); + return test.waitForFiles( + test.TestEntryInfo.getExpectedRows(entriesWithMhtml)); + }) + .then(() => { + return quickview.openCloseQuickView('hello.mhtml', (qv) => { + const htmlPanel = qv.querySelector( + '#innerContentPanel files-safe-media[type="html"]'); + const style = window.getComputedStyle(htmlPanel); + // White background is 'rgb(255, 255, 255)'. + assertEquals('rgb(255, 255, 255)', style.backgroundColor, 'bg white'); + }); }) .then(() => { done(); @@ -67,7 +92,7 @@ test.TestEntryInfo.getExpectedRows(test.BASIC_CROSTINI_ENTRY_SET)); }) .then(() => { - return quickview.openCloseQuickView(); + return quickview.openCloseQuickView('My Desktop Background.png'); }) .then(() => { chrome.fileManagerPrivate.removeMount('crostini');
diff --git a/ui/file_manager/file_manager/test/scripts/create_test_main.py b/ui/file_manager/file_manager/test/scripts/create_test_main.py index f19105b1..0ef82c0a 100755 --- a/ui/file_manager/file_manager/test/scripts/create_test_main.py +++ b/ui/file_manager/file_manager/test/scripts/create_test_main.py
@@ -129,6 +129,7 @@ '../../webui/resources/js/load_time_data.js', '../../webui/resources/js/webui_resource_test.js', 'test/js/strings.js', + 'common/js/files_app_entry_types.js', 'common/js/util.js', 'common/js/mock_entry.js', 'common/js/volume_manager_common.js',
diff --git a/ui/file_manager/gallery/js/BUILD.gn b/ui/file_manager/gallery/js/BUILD.gn index 55b0ac3..cdeb20b 100644 --- a/ui/file_manager/gallery/js/BUILD.gn +++ b/ui/file_manager/gallery/js/BUILD.gn
@@ -81,7 +81,6 @@ "../../file_manager/common/js:util", "../../file_manager/foreground/js:volume_manager_wrapper", "../../file_manager/foreground/js/ui:files_confirm_dialog", - "../../file_manager/foreground/js/ui:share_dialog", "../../gallery/js:slide_mode", "//ui/webui/resources/js:i18n_template_no_process", ]
diff --git a/ui/file_manager/gallery/js/gallery.js b/ui/file_manager/gallery/js/gallery.js index ba9eb5c..9f1fd20c 100644 --- a/ui/file_manager/gallery/js/gallery.js +++ b/ui/file_manager/gallery/js/gallery.js
@@ -181,8 +181,6 @@ this.selectionModel_.addEventListener('change', this.onSelection_.bind(this)); this.slideMode_.addEventListener('useraction', this.onUserAction_.bind(this)); - this.shareDialog_ = new ShareDialog(this.container_); - // ----------------------------------------------------------------- // Initialize listeners. @@ -739,10 +737,6 @@ break; } - // Do not capture keys when share dialog is shown. - if (this.shareDialog_.isShowing()) - return; - // Show UIs when user types any key. this.dimmableUIController_.kick(); @@ -991,7 +985,24 @@ var item = this.getSingleSelectedItem(); if (!item) return; - this.shareDialog_.showEntry(item.getEntry(), function() {}); + chrome.fileManagerPrivate.getEntryProperties( + [item.getEntry()], ['shareUrl'], results => { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + return; + } + if (results.length != 1) { + console.error( + 'getEntryProperties for shareUrl should return 1 entry ' + + '(returned ' + results.length + ')'); + return; + } + if (results[0].shareUrl === undefined) { + console.error('getEntryProperties shareUrl is undefined'); + return; + } + util.visitURL(assert(results[0].shareUrl)); + }); }; /**
diff --git a/ui/file_manager/gallery/js/gallery_scripts.js b/ui/file_manager/gallery/js/gallery_scripts.js index b86d48a4..00371b9 100644 --- a/ui/file_manager/gallery/js/gallery_scripts.js +++ b/ui/file_manager/gallery/js/gallery_scripts.js
@@ -55,12 +55,10 @@ // <include src="../../file_manager/foreground/js/metadata/metadata_model.js"> // <include src="../../file_manager/foreground/js/metadata/multi_metadata_provider.js"> // <include src="../../file_manager/foreground/js/metadata/thumbnail_model.js"> -// <include src="../../file_manager/foreground/js/share_client.js"> // <include src="../../file_manager/foreground/js/thumbnail_loader.js"> // <include src="../../file_manager/foreground/js/ui/file_manager_dialog_base.js"> // <include src="../../file_manager/foreground/js/ui/files_alert_dialog.js"> // <include src="../../file_manager/foreground/js/ui/files_confirm_dialog.js"> -// <include src="../../file_manager/foreground/js/ui/share_dialog.js"> // <include src="../../file_manager/foreground/js/volume_manager_wrapper.js"> // <include src="image_editor/image_util.js">
diff --git a/ui/file_manager/image_loader/image_loader_util.js b/ui/file_manager/image_loader/image_loader_util.js index df19d05..07b1727 100644 --- a/ui/file_manager/image_loader/image_loader_util.js +++ b/ui/file_manager/image_loader/image_loader_util.js
@@ -2,30 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -var ImageLoaderUtil = {}; +function ImageLoaderUtil() {} /** - * Checks if the options contain any image processing. + * Checks if the options on the request contain any image processing. * * @param {number} width Source width. * @param {number} height Source height. - * @param {!LoadImageRequest} options The request, containing resizing options. + * @param {!LoadImageRequest} request The request, containing resizing options. * @return {boolean} True if yes, false if not. */ -ImageLoaderUtil.shouldProcess = function(width, height, options) { - var targetDimensions = ImageLoaderUtil.resizeDimensions( - width, height, options); +ImageLoaderUtil.shouldProcess = function(width, height, request) { + const targetDimensions = + ImageLoaderUtil.resizeDimensions(width, height, request); // Dimensions has to be adjusted. if (targetDimensions.width != width || targetDimensions.height != height) return true; // Orientation has to be adjusted. - if (!options.orientation.isIdentity()) + if (!request.orientation.isIdentity()) return true; // Non-standard color space has to be converted. - if (options.colorSpace && options.colorSpace !== ColorSpace.SRGB) + if (request.colorSpace && request.colorSpace !== ColorSpace.SRGB) return true; // No changes required. @@ -41,33 +41,33 @@ * * @param {number} width Source width. * @param {number} height Source height. - * @param {!LoadImageRequest} options The request, containing resizing options. + * @param {!LoadImageRequest} request The request, containing resizing options. * @return {!{width: number, height:number}} Dimensions. */ -ImageLoaderUtil.resizeDimensions = function(width, height, options) { - var scale = options.scale || 1; - var targetDimensions = options.orientation.getSizeAfterCancelling( - width * scale, height * scale); - var targetWidth = targetDimensions.width; - var targetHeight = targetDimensions.height; +ImageLoaderUtil.resizeDimensions = function(width, height, request) { + const scale = request.scale || 1; + const targetDimensions = + request.orientation.getSizeAfterCancelling(width * scale, height * scale); + let targetWidth = targetDimensions.width; + let targetHeight = targetDimensions.height; - if (options.maxWidth && targetWidth > options.maxWidth) { - var scale = options.maxWidth / targetWidth; + if (request.maxWidth && targetWidth > request.maxWidth) { + const scale = request.maxWidth / targetWidth; targetWidth *= scale; targetHeight *= scale; } - if (options.maxHeight && targetHeight > options.maxHeight) { - var scale = options.maxHeight / targetHeight; + if (request.maxHeight && targetHeight > request.maxHeight) { + const scale = request.maxHeight / targetHeight; targetWidth *= scale; targetHeight *= scale; } - if (options.width) - targetWidth = options.width; + if (request.width) + targetWidth = request.width; - if (options.height) - targetHeight = options.height; + if (request.height) + targetHeight = request.height; targetWidth = Math.round(targetWidth); targetHeight = Math.round(targetHeight); @@ -80,20 +80,20 @@ * * @param {HTMLCanvasElement|Image} source Source image or canvas. * @param {HTMLCanvasElement} target Target canvas. - * @param {!LoadImageRequest} options The request, containing resizing options. + * @param {!LoadImageRequest} request The request, containing resizing options. */ -ImageLoaderUtil.resizeAndCrop = function(source, target, options) { +ImageLoaderUtil.resizeAndCrop = function(source, target, request) { // Calculates copy parameters. - var copyParameters = ImageLoaderUtil.calculateCopyParameters( - source, options); + const copyParameters = + ImageLoaderUtil.calculateCopyParameters(source, request); target.width = copyParameters.canvas.width; target.height = copyParameters.canvas.height; // Apply. - var targetContext = + let targetContext = /** @type {CanvasRenderingContext2D} */ (target.getContext('2d')); targetContext.save(); - options.orientation.cancelImageOrientation( + request.orientation.cancelImageOrientation( targetContext, copyParameters.target.width, copyParameters.target.height); targetContext.drawImage( source, @@ -121,45 +121,45 @@ * Calculates copy parameters. * * @param {HTMLCanvasElement|Image} source Source image or canvas. - * @param {!LoadImageRequest} options The request, containing resizing options. + * @param {!LoadImageRequest} request The request, containing resizing options. * @return {!ImageLoaderUtil.CopyParameters} Calculated copy parameters. */ -ImageLoaderUtil.calculateCopyParameters = function(source, options) { - if (options.crop) { +ImageLoaderUtil.calculateCopyParameters = function(source, request) { + if (request.crop) { // When an image is cropped, target should be a fixed size square. - assert(options.width); - assert(options.height); - assert(options.width === options.height); + assert(request.width); + assert(request.height); + assert(request.width === request.height); // The length of shorter edge becomes dimension of cropped area in the // source. - var cropSourceDimension = Math.min(source.width, source.height); + const cropSourceDimension = Math.min(source.width, source.height); return { source: { x: Math.floor((source.width / 2) - (cropSourceDimension / 2)), y: Math.floor((source.height / 2) - (cropSourceDimension / 2)), width: cropSourceDimension, - height: cropSourceDimension + height: cropSourceDimension, }, target: { x: 0, y: 0, - width: options.width, - height: options.height + width: request.width, + height: request.height, }, canvas: { - width: options.width, - height: options.height + width: request.width, + height: request.height, } }; } // Target dimension is calculated in the rotated(transformed) coordinate. - var targetCanvasDimensions = ImageLoaderUtil.resizeDimensions( - source.width, source.height, options); + const targetCanvasDimensions = + ImageLoaderUtil.resizeDimensions(source.width, source.height, request); - var targetDimensions = options.orientation.getSizeAfterCancelling( + const targetDimensions = request.orientation.getSizeAfterCancelling( targetCanvasDimensions.width, targetCanvasDimensions.height); return { @@ -201,15 +201,16 @@ if (colorSpace === ColorSpace.SRGB) return; if (colorSpace === ColorSpace.ADOBE_RGB) { - var matrix = ImageLoaderUtil.MATRIX_FROM_ADOBE_TO_STANDARD; - var context = target.getContext('2d'); - var imageData = context.getImageData(0, 0, target.width, target.height); - var data = imageData.data; - for (var i = 0; i < data.length; i += 4) { + const matrix = ImageLoaderUtil.MATRIX_FROM_ADOBE_TO_STANDARD; + let context = + assertInstanceof(target.getContext('2d'), CanvasRenderingContext2D); + let imageData = context.getImageData(0, 0, target.width, target.height); + let data = imageData.data; + for (let i = 0; i < data.length; i += 4) { // Scale to [0, 1]. - var adobeR = data[i] / 255; - var adobeG = data[i + 1] / 255; - var adobeB = data[i + 2] / 255; + let adobeR = data[i] / 255; + let adobeG = data[i + 1] / 255; + let adobeB = data[i + 2] / 255; // Revert gannma transformation. adobeR = adobeR <= 0.0556 ? adobeR / 32 : Math.pow(adobeR, 2.2); @@ -217,9 +218,9 @@ adobeB = adobeB <= 0.0556 ? adobeB / 32 : Math.pow(adobeB, 2.2); // Convert color space. - var sR = matrix[0] * adobeR + matrix[1] * adobeG + matrix[2] * adobeB; - var sG = matrix[3] * adobeR + matrix[4] * adobeG + matrix[5] * adobeB; - var sB = matrix[6] * adobeR + matrix[7] * adobeG + matrix[8] * adobeB; + let sR = matrix[0] * adobeR + matrix[1] * adobeG + matrix[2] * adobeB; + let sG = matrix[3] * adobeR + matrix[4] * adobeG + matrix[5] * adobeB; + let sB = matrix[6] * adobeR + matrix[7] * adobeG + matrix[8] * adobeB; // Gannma transformation. sR = sR <= 0.0031308 ? 12.92 * sR : 1.055 * Math.pow(sR, 1 / 2.4) - 0.055;
diff --git a/ui/file_manager/integration_tests/file_manager/share_and_manage_dialog.js b/ui/file_manager/integration_tests/file_manager/share_and_manage_dialog.js index 0102473..15782216 100644 --- a/ui/file_manager/integration_tests/file_manager/share_and_manage_dialog.js +++ b/ui/file_manager/integration_tests/file_manager/share_and_manage_dialog.js
@@ -8,7 +8,7 @@ * Test sharing dialog for a file or directory on Drive * @param {string} path Path for a file or a directory to be shared. */ -function share(path) { +function share(path, expected_share_url) { var appId; var caller = getCaller(); StepsRunner.run([ @@ -46,31 +46,14 @@ const item = ['#share-menu [command="#share"]']; remoteCall.callRemoteTestUtil('fakeMouseClick', appId, item, this.next); }, - // Wait until the share dialog's (mocked) content is shown. + // Wait for the browser window to appear. function(result) { chrome.test.assertTrue(!!result); - remoteCall.waitForElement(appId, '.share-dialog-webview-wrapper.loaded') - .then(this.next); + remoteCall.callRemoteTestUtil('getLastVisitedURL', appId, [], this.next); }, - // Wait until the share dialog's contents are shown. - function() { - remoteCall.callRemoteTestUtil( - 'executeScriptInWebView', appId, - [ - '.share-dialog-webview-wrapper.loaded webview', - 'document.querySelector("button").click()' - ], - this.next); - }, - // Wait until the share dialog's contents are hidden. - function(result) { - chrome.test.assertTrue(!!result); - remoteCall - .waitForElementLost(appId, '.share-dialog-webview-wrapper.loaded') - .then(this.next); - }, - // Check for Javascript errros. - function() { + // Check we went to the correct URL, and for Javascript errors. + function(visitedUrl) { + chrome.test.assertEq(expected_share_url, visitedUrl); checkIfNoErrorsOccured(this.next); } ]); @@ -153,14 +136,16 @@ * Tests sharing a file on Drive. */ testcase.shareFileDrive = function() { - share('world.ogv'); + share( + 'world.ogv', + 'https://file_alternate_link/world.ogv?userstoinvite=%22%22'); }; /** * Tests sharing a directory on Drive. */ testcase.shareDirectoryDrive = function() { - share('photos'); + share('photos', 'https://folder_alternate_link/photos?userstoinvite=%22%22'); }; // TODO(sashab): Add tests for sharing a file on Team Drives.
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc index 66d5f54d..a8f1c62 100644 --- a/ui/gl/gl_context_egl.cc +++ b/ui/gl/gl_context_egl.cc
@@ -27,17 +27,17 @@ #ifndef EGL_CHROMIUM_create_context_bind_generates_resource #define EGL_CHROMIUM_create_context_bind_generates_resource 1 -#define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x3AAD +#define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x33AD #endif /* EGL_CHROMIUM_create_context_bind_generates_resource */ #ifndef EGL_ANGLE_create_context_webgl_compatibility #define EGL_ANGLE_create_context_webgl_compatibility 1 -#define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x3AAC +#define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x33AC #endif /* EGL_ANGLE_create_context_webgl_compatibility */ #ifndef EGL_ANGLE_display_texture_share_group #define EGL_ANGLE_display_texture_share_group 1 -#define EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE 0x3AAF +#define EGL_DISPLAY_TEXTURE_SHARE_GROUP_ANGLE 0x33AF #endif /* EGL_ANGLE_display_texture_share_group */ #ifndef EGL_ANGLE_create_context_client_arrays
diff --git a/ui/strings/ui_strings.grd b/ui/strings/ui_strings.grd index fcf59a3d..cf60587 100644 --- a/ui/strings/ui_strings.grd +++ b/ui/strings/ui_strings.grd
@@ -444,6 +444,9 @@ <message name="IDS_APP_ACCNAME_MENU" desc="The accessible name for the Menu button."> Menu </message> + <message name="IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT" desc="The accessible name for the color chooser hexadecimal input field"> + Hex color value + </message> <!-- Scroll Bar Context Menu Labels --> <message name="IDS_APP_SCROLLBAR_CXMENU_SCROLLHERE" desc="The label for the 'Scroll Here' item">
diff --git a/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT.png.sha1 b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT.png.sha1 new file mode 100644 index 0000000..6b9993fc --- /dev/null +++ b/ui/strings/ui_strings_grd/IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT.png.sha1
@@ -0,0 +1 @@ +6f818215e03008c17e7fe7f3ac6b88d0ca52e958 \ No newline at end of file
diff --git a/ui/strings/ui_strings_grd/OWNERS b/ui/strings/ui_strings_grd/OWNERS new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/ui/strings/ui_strings_grd/OWNERS
@@ -0,0 +1 @@ +*
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm index 8af88bc..f311338 100644 --- a/ui/views/cocoa/bridged_content_view.mm +++ b/ui/views/cocoa/bridged_content_view.mm
@@ -34,10 +34,6 @@ #import "ui/views/cocoa/bridged_native_widget.h" #import "ui/views/cocoa/bridged_native_widget_host.h" #import "ui/views/cocoa/drag_drop_client_mac.h" -#include "ui/views/controls/label.h" -#include "ui/views/view.h" -#include "ui/views/widget/native_widget_mac.h" -#include "ui/views/widget/widget.h" #include "ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom.h" namespace {
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h index fa54a1b..7e72147b 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.h +++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/mac/scoped_nsobject.h" #include "base/macros.h" #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" #include "ui/base/ime/input_method_delegate.h" @@ -16,13 +17,11 @@ #include "ui/views/views_export.h" #include "ui/views/widget/widget.h" #include "ui/views/window/dialog_observer.h" +#include "ui/views_bridge_mac/mojo/bridged_native_widget.mojom.h" #include "ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom.h" -namespace views_bridge_mac { -namespace mojom { -class BridgedNativeWidget; -} // namespace mojom -} // namespace views_bridge_mac +@class NativeWidgetMacNSWindow; +@class NSView; namespace ui { class RecyclableCompositorMac; @@ -67,6 +66,11 @@ return native_widget_mac_; } + // A NSWindow that is guaranteed to exist in this process. If the bridge + // object for this host is in this process, then this points to the bridge's + // NSWindow. Otherwise, it mirrors the id and bounds of the child window. + NativeWidgetMacNSWindow* GetLocalNSWindow() const; + // The mojo interface through which to communicate with the underlying // NSWindow and NSView. views_bridge_mac::mojom::BridgedNativeWidget* bridge() const; @@ -78,6 +82,10 @@ TooltipManager* tooltip_manager() { return tooltip_manager_.get(); } + // Create and set the bridge object to be in this process. + void CreateLocalBridge(base::scoped_nsobject<NativeWidgetMacNSWindow> window, + NSView* parent); + void InitWindow(const Widget::InitParams& params); // Changes the bounds of the window and the hosted layer if present. The @@ -268,6 +276,9 @@ // instance that may be in another process. std::unique_ptr<BridgedNativeWidgetImpl> bridge_impl_; + // Window that is guaranteed to exist in this process (see GetLocalNSWindow). + base::scoped_nsobject<NativeWidgetMacNSWindow> local_window_; + std::unique_ptr<TooltipManager> tooltip_manager_; std::unique_ptr<ui::InputMethod> input_method_; FocusManager* focus_manager_ = nullptr; // Weak. Owned by our Widget.
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm index 616579d..501af48 100644 --- a/ui/views/cocoa/bridged_native_widget_host_impl.mm +++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -74,9 +74,7 @@ BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl( NativeWidgetMac* parent) - : id_(++g_last_bridged_native_widget_id), - native_widget_mac_(parent), - bridge_impl_(new BridgedNativeWidgetImpl(id_, this, this)) { + : id_(++g_last_bridged_native_widget_id), native_widget_mac_(parent) { DCHECK(GetIdToWidgetHostImplMap().find(id_) == GetIdToWidgetHostImplMap().end()); GetIdToWidgetHostImplMap().insert(std::make_pair(id_, this)); @@ -100,9 +98,25 @@ DestroyCompositor(); } +NativeWidgetMacNSWindow* BridgedNativeWidgetHostImpl::GetLocalNSWindow() const { + return local_window_.get(); +} + views_bridge_mac::mojom::BridgedNativeWidget* BridgedNativeWidgetHostImpl::bridge() const { - return bridge_impl_.get(); + if (bridge_impl_) + return bridge_impl_.get(); + return nullptr; +} + +void BridgedNativeWidgetHostImpl::CreateLocalBridge( + base::scoped_nsobject<NativeWidgetMacNSWindow> window, + NSView* parent) { + local_window_ = window; + bridge_impl_ = std::make_unique<BridgedNativeWidgetImpl>(id_, this, this); + bridge_impl_->SetWindow(window); + if (parent) + bridge_impl_->SetParent(parent); } void BridgedNativeWidgetHostImpl::InitWindow(const Widget::InitParams& params) { @@ -112,8 +126,6 @@ widget_type_ = params.type; tooltip_manager_.reset(new TooltipManagerMac(bridge())); - bridge_impl_->SetParent(params.parent); - // Initialize the window. { auto bridge_params = BridgedNativeWidgetInitParams::New();
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index 7213a28..e1ac3a8 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -308,7 +308,7 @@ styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]); - bridge_impl()->SetWindow(window); + bridge_host_for_testing()->CreateLocalBridge(window, params.parent); bridge_host_for_testing()->InitWindow(params); // Usually the bridge gets initialized here. It is skipped to run extra @@ -384,7 +384,9 @@ } NSWindow* bridge_window() const { - return native_widget_mac_->bridge_impl()->ns_window(); + if (native_widget_mac_->bridge_impl()) + return native_widget_mac_->bridge_impl()->ns_window(); + return nil; } protected: @@ -844,8 +846,8 @@ std::unique_ptr<MockNativeWidgetMac> native_widget( new MockNativeWidgetMac(nullptr)); native_widget_mac_ = native_widget.get(); - EXPECT_FALSE(bridge()->ns_view()); - EXPECT_FALSE(bridge()->ns_window()); + EXPECT_FALSE(bridge()); + EXPECT_FALSE(bridge_host()->GetLocalNSWindow()); } // Tests the shadow type given in InitParams.
diff --git a/ui/views/color_chooser/color_chooser_view.cc b/ui/views/color_chooser/color_chooser_view.cc index d844b6a5..19eab2e 100644 --- a/ui/views/color_chooser/color_chooser_view.cc +++ b/ui/views/color_chooser/color_chooser_view.cc
@@ -15,10 +15,12 @@ #include "cc/paint/paint_shader.h" #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/effects/SkGradientShader.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/canvas.h" #include "ui/gfx/geometry/insets.h" +#include "ui/strings/grit/ui_strings.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/color_chooser/color_chooser_listener.h" @@ -389,6 +391,8 @@ textfield_ = new Textfield(); textfield_->set_controller(this); textfield_->SetDefaultWidthInChars(kTextfieldLengthInChars); + textfield_->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_COLOR_CHOOSER_HEX_INPUT)); layout->AddView(textfield_); selected_color_patch_ = new SelectedColorPatchView(); layout->AddView(selected_color_patch_);
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index db456522..5a08128 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -111,7 +111,7 @@ name_ = params.name; base::scoped_nsobject<NativeWidgetMacNSWindow> window( [CreateNSWindow(params) retain]); - bridge_impl()->SetWindow(window); + bridge_host_->CreateLocalBridge(std::move(window), params.parent); bridge_host_->InitWindow(params); // Only set always-on-top here if it is true since setting it may affect how @@ -174,7 +174,7 @@ } gfx::NativeWindow NativeWidgetMac::GetNativeWindow() const { - return bridge_impl() ? bridge_impl()->ns_window() : nil; + return bridge_host_ ? bridge_host_->GetLocalNSWindow() : nil; } Widget* NativeWidgetMac::GetTopLevelWidget() {
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js b/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js index 45d8db17..3eb059e 100644 --- a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js +++ b/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js
@@ -29,7 +29,7 @@ var dropShadow = document.createElement('div'); // This ID should match the CSS rules in shared_styles_css.html. dropShadow.id = 'cr-container-shadow'; - this.shadowRoot.insertBefore(dropShadow, this.$.container); + this.$.container.parentNode.insertBefore(dropShadow, this.$.container); // Dummy element used to detect scrolling. Has a 0px height intentionally. var intersectionProbe = document.createElement('div');
diff --git a/webrunner/app/sandbox_policy b/webrunner/app/sandbox_policy index cb3a3c7..2da7fcd 100644 --- a/webrunner/app/sandbox_policy +++ b/webrunner/app/sandbox_policy
@@ -2,7 +2,7 @@ "features": [], "services": [ "chromium.web.ContextProvider", - "fuchsia.fonts.FontProvider", + "fuchsia.fonts.Provider", "fuchsia.media.Audio", "fuchsia.net.LegacySocketProvider", "fuchsia.netstack.Netstack",