diff --git a/DEPS b/DEPS index 28315e8..b7571f0 100644 --- a/DEPS +++ b/DEPS
@@ -40,11 +40,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': '5df93de8ad968b4e25708964e558979375eeaa9e', + 'skia_revision': '4dc6474b73ec4e5d6a1a0070e50d3d6766e4c94a', # 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': '2226155eb547e4d882388043d706e424cf4c706f', + 'v8_revision': 'c53bb6821f70c309568a96481523f888566a461a', # 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. @@ -52,7 +52,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': 'd0fcb90d235cf768097271e2c8a47a5d4fdc3e26', + 'angle_revision': '4063e209547e91083f731ac7519e772fc7982855', # 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. @@ -64,7 +64,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': 'a8c2b919f7adec510cbca49675ad4a0cd0d30fd9', + 'pdfium_revision': '1a89e3691b320b2e577dad8e4617be6356545396', # 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. @@ -96,7 +96,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': '1b6a20ab7ee3656e6a23a0a09600401a70887f2b', + 'catapult_revision': '5c300b0898debe686d83fc3646b41c5b5e96ab21', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -202,10 +202,10 @@ Var('chromium_git') + '/external/selenium/py.git' + '@' + '5fd78261a75fe08d27ca4835fb6c5ce4b42275bd', 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '8121f85473b28183c93fdcef290ed6f74b0b52db', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '2fac50fa0ee099c632d97a941a9871e7cecbe720', 'src/third_party/ffmpeg': - Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'b9acb5c51eea352657323b33737fee503e42604a', + Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '6d2e444456b7694189165076ddfcccdf649147b2', 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '8679f2b0bf063ac894dc473debefd61dbbebf622', @@ -232,7 +232,7 @@ Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067', 'src/third_party/webrtc': - Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + 'fd3f94e79966277b3758a8633fdd1cea72c97093', # commit position 17339 + Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '77eda64f71b09a58643751ee86a97fffa1ef19a9', # commit position 17354 'src/third_party/openmax_dl': Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' + Var('openmax_dl_revision'),
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 16f00ad..00fb38c 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -340,6 +340,7 @@ _ANDROID_SPECIFIC_PYDEPS_FILES = [ 'build/android/test_runner.pydeps', + 'build/android/test_wrapper/logdog_wrapper.pydeps', 'net/tools/testserver/testserver.pydeps', ]
diff --git a/android_webview/common/aw_content_client.cc b/android_webview/common/aw_content_client.cc index 99258489..f686cf4 100644 --- a/android_webview/common/aw_content_client.cc +++ b/android_webview/common/aw_content_client.cc
@@ -14,6 +14,7 @@ #include "content/public/common/content_switches.h" #include "content/public/common/user_agent.h" #include "gpu/config/gpu_info.h" +#include "gpu/config/gpu_util.h" #include "ipc/ipc_message.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -83,14 +84,7 @@ std::replace_if(gpu_fingerprint_.begin(), gpu_fingerprint_.end(), [](char c) { return !::isprint(c); }, '_'); - base::debug::SetCrashKeyValue(crash_keys::kGPUDriverVersion, - gpu_info.driver_version); - base::debug::SetCrashKeyValue(crash_keys::kGPUPixelShaderVersion, - gpu_info.pixel_shader_version); - base::debug::SetCrashKeyValue(crash_keys::kGPUVertexShaderVersion, - gpu_info.vertex_shader_version); - base::debug::SetCrashKeyValue(crash_keys::kGPUVendor, gpu_info.gl_vendor); - base::debug::SetCrashKeyValue(crash_keys::kGPURenderer, gpu_info.gl_renderer); + gpu::SetKeysForCrashLogging(gpu_info); } bool AwContentClient::UsingSynchronousCompositing() {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index d2cf900b..5e44065c 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -72,6 +72,7 @@ "common/ash_layout_constants.h", "common/ash_switches.cc", "common/ash_switches.h", + "common/ash_view_ids.h", "common/cast_config_controller.cc", "common/cast_config_controller.h", "common/default_accessibility_delegate.cc", @@ -106,6 +107,7 @@ "common/gpu_support.h", "common/gpu_support_stub.cc", "common/gpu_support_stub.h", + "common/ime_control_delegate.h", "common/key_event_watcher.cc", "common/key_event_watcher.h", "common/keyboard/keyboard_observer_register.cc", @@ -121,6 +123,7 @@ "common/metrics/gesture_action_type.h", "common/metrics/pointer_metrics_recorder.cc", "common/metrics/pointer_metrics_recorder.h", + "common/metrics/task_switch_source.h", "common/metrics/user_metrics_action.h", "common/mojo_interface_factory.cc", "common/mojo_interface_factory.h", @@ -187,6 +190,7 @@ "common/shelf/wm_shelf_util.cc", "common/shelf/wm_shelf_util.h", "common/shell_delegate.h", + "common/shell_observer.h", "common/shutdown_controller.cc", "common/shutdown_controller.h", "common/system/accessibility_observer.h", @@ -499,6 +503,7 @@ "common/wm/overview/window_selector.h", "common/wm/overview/window_selector_controller.cc", "common/wm/overview/window_selector_controller.h", + "common/wm/overview/window_selector_delegate.h", "common/wm/overview/window_selector_item.cc", "common/wm/overview/window_selector_item.h", "common/wm/panels/panel_frame_view.cc", @@ -683,6 +688,7 @@ "rotator/screen_rotation_animation.h", "rotator/screen_rotation_animator.cc", "rotator/screen_rotation_animator.h", + "rotator/screen_rotation_animator_observer.h", "rotator/window_rotation.cc", "rotator/window_rotation.h", "screen_util.cc",
diff --git a/ash/ash_touch_exploration_manager_chromeos.cc b/ash/ash_touch_exploration_manager_chromeos.cc index e77cd13..873f6361 100644 --- a/ash/ash_touch_exploration_manager_chromeos.cc +++ b/ash/ash_touch_exploration_manager_chromeos.cc
@@ -9,6 +9,7 @@ #include "ash/common/wm_shell.h" #include "ash/common/wm_window.h" #include "ash/root_window_controller.h" +#include "ash/shared/app_types.h" #include "ash/shell.h" #include "ash/wm/window_util.h" #include "base/command_line.h" @@ -16,6 +17,7 @@ #include "chromeos/audio/chromeos_sounds.h" #include "chromeos/audio/cras_audio_handler.h" #include "chromeos/chromeos_switches.h" +#include "ui/aura/client/aura_constants.h" #include "ui/chromeos/touch_exploration_controller.h" #include "ui/wm/public/activation_client.h" @@ -24,7 +26,10 @@ AshTouchExplorationManager::AshTouchExplorationManager( RootWindowController* root_window_controller) : root_window_controller_(root_window_controller), - audio_handler_(chromeos::CrasAudioHandler::Get()) { + audio_handler_(chromeos::CrasAudioHandler::Get()), + enable_chromevox_arc_support_( + base::CommandLine::ForCurrentProcess()->HasSwitch( + chromeos::switches::kEnableChromeVoxArcSupport)) { WmShell::Get()->system_tray_notifier()->AddAccessibilityObserver(this); Shell::GetInstance()->activation_client()->AddObserver(this); display::Screen::GetScreen()->AddObserver(this); @@ -132,13 +137,12 @@ } void AshTouchExplorationManager::UpdateTouchExplorationState() { - // Comes from components/exo/shell_surface.cc. - const char kExoShellSurfaceWindowName[] = "ExoShellSurface"; - // See crbug.com/603745 for more details. const bool pass_through_surface = wm::GetActiveWindow() && - wm::GetActiveWindow()->GetName() == kExoShellSurfaceWindowName; + wm::GetActiveWindow()->GetProperty(aura::client::kAppType) == + static_cast<int>(ash::AppType::ARC_APP) && + !enable_chromevox_arc_support_; const bool spoken_feedback_enabled = Shell::GetInstance()->accessibility_delegate()->IsSpokenFeedbackEnabled();
diff --git a/ash/ash_touch_exploration_manager_chromeos.h b/ash/ash_touch_exploration_manager_chromeos.h index 8b2aa00..1c4af26 100644 --- a/ash/ash_touch_exploration_manager_chromeos.h +++ b/ash/ash_touch_exploration_manager_chromeos.h
@@ -76,6 +76,7 @@ std::unique_ptr<ui::TouchAccessibilityEnabler> touch_accessibility_enabler_; RootWindowController* root_window_controller_; chromeos::CrasAudioHandler* audio_handler_; + const bool enable_chromevox_arc_support_; DISALLOW_COPY_AND_ASSIGN(AshTouchExplorationManager); };
diff --git a/ash/common/shelf/shelf_delegate.h b/ash/common/shelf/shelf_delegate.h index 6a8d79d..f15920f 100644 --- a/ash/common/shelf/shelf_delegate.h +++ b/ash/common/shelf/shelf_delegate.h
@@ -17,7 +17,8 @@ public: virtual ~ShelfDelegate() {} - // Get the shelf ID from an application ID. + // Get the shelf ID from an application ID. Returns kInvalidShelfID if the + // app id is unknown, or has no associated ShelfID. virtual ShelfID GetShelfIDForAppID(const std::string& app_id) = 0; // Get the shelf ID from an application ID and a launch ID. @@ -25,17 +26,14 @@ // multiple shelf items per app. This id is used together with the app_id to // uniquely identify each shelf item that has the same app_id. // For example, a single virtualization app might want to show different - // shelf icons for different remote apps. + // shelf icons for different remote apps. Returns kInvalidShelfID if the app + // id is unknown or has no associated ShelfID. virtual ShelfID GetShelfIDForAppIDAndLaunchID( const std::string& app_id, const std::string& launch_id) = 0; - // Checks whether a mapping exists from the ShelfID |id| to an app id. - virtual bool HasShelfIDToAppIDMapping(ShelfID id) const = 0; - - // Get the application ID for a given shelf ID. - // |HasShelfIDToAppIDMapping(ShelfID)| should be called first to ensure the - // ShelfID can be successfully mapped to an app id. + // Get the application ID for a given shelf ID. Returns an empty string for + // an unknown or invalid ShelfID. virtual const std::string& GetAppIDForShelfID(ShelfID id) = 0; // Pins an app with |app_id| to shelf. A running instance will get pinned.
diff --git a/ash/common/shelf/shelf_widget.cc b/ash/common/shelf/shelf_widget.cc index 256c532..b18416c6 100644 --- a/ash/common/shelf/shelf_widget.cc +++ b/ash/common/shelf/shelf_widget.cc
@@ -250,6 +250,9 @@ // the shelf is hidden because its container is hidden. During auto-hide it is // hidden because ShelfWidget is transparent. Some of the ShelfView visibility // code could be simplified. http://crbug.com/674773 + // TODO(jdufualt|jamescook): Remove CHECK and shelf_view_->SetVisible call in + // m60 or beyond (see above TODO). + CHECK(Shell::Get()->session_controller()->IsActiveUserSessionStarted()); shelf_view_->SetVisible( Shell::Get()->session_controller()->IsActiveUserSessionStarted()); shelf_layout_manager_->LayoutShelf();
diff --git a/ash/common/shelf/shelf_window_watcher.cc b/ash/common/shelf/shelf_window_watcher.cc index 9c8b05a..090f296 100644 --- a/ash/common/shelf/shelf_window_watcher.cc +++ b/ash/common/shelf/shelf_window_watcher.cc
@@ -20,7 +20,6 @@ #include "ash/wm/window_state_aura.h" #include "ash/wm/window_util.h" #include "ui/aura/client/aura_constants.h" -#include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/base/resource/resource_bundle.h" #include "ui/display/display.h" @@ -34,7 +33,7 @@ // Returns the shelf item type, with special temporary behavior for Mash: // Mash provides a default shelf item type (TYPE_APP) for non-ignored windows. ShelfItemType GetShelfItemType(aura::Window* window) { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::LOCAL || + if (!WmShell::Get()->IsRunningInMash() || window->GetProperty(kShelfItemTypeKey) != TYPE_UNDEFINED) { return static_cast<ShelfItemType>(window->GetProperty(kShelfItemTypeKey)); }
diff --git a/ash/common/shelf/wm_shelf.cc b/ash/common/shelf/wm_shelf.cc index 48e7e05..12d06ad 100644 --- a/ash/common/shelf/wm_shelf.cc +++ b/ash/common/shelf/wm_shelf.cc
@@ -21,7 +21,6 @@ #include "ash/shell.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "ui/aura/env.h" #include "ui/display/types/display_constants.h" #include "ui/gfx/geometry/rect.h" @@ -122,7 +121,7 @@ // TODO: ShelfBezelEventHandler needs to work with mus too. // http://crbug.com/636647 - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::LOCAL) + if (!WmShell::Get()->IsRunningInMash()) bezel_event_handler_ = base::MakeUnique<ShelfBezelEventHandler>(this); } @@ -345,7 +344,7 @@ } void WmShelf::WillDeleteShelfLayoutManager() { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) { + if (WmShell::Get()->IsRunningInMash()) { // TODO(sky): this should be removed once Shell is used everywhere. ShutdownShelfWidget(); } @@ -364,8 +363,7 @@ observer.WillChangeVisibilityState(new_state); if (new_state != SHELF_AUTO_HIDE) { auto_hide_event_handler_.reset(); - } else if (!auto_hide_event_handler_ && - aura::Env::GetInstance()->mode() == aura::Env::Mode::LOCAL) { + } else if (!auto_hide_event_handler_ && !WmShell::Get()->IsRunningInMash()) { auto_hide_event_handler_ = base::MakeUnique<AutoHideEventHandler>(shelf_layout_manager()); }
diff --git a/ash/common/system/chromeos/network/network_info.cc b/ash/common/system/chromeos/network/network_info.cc index e58f5aa..f59186c44 100644 --- a/ash/common/system/chromeos/network/network_info.cc +++ b/ash/common/system/chromeos/network/network_info.cc
@@ -21,6 +21,25 @@ connecting(false), type(Type::UNKNOWN) {} +NetworkInfo::NetworkInfo(const NetworkInfo& other) + : guid(other.guid), + label(other.label), + tooltip(other.tooltip), + image(other.image), + disable(other.disable), + highlight(other.highlight), + connected(other.connected), + connecting(other.connecting), + type(other.type) {} + NetworkInfo::~NetworkInfo() {} +bool NetworkInfo::operator==(const NetworkInfo& other) const { + return guid == other.guid && label == other.label && + tooltip == other.tooltip && image.BackedBySameObjectAs(other.image) && + disable == other.disable && highlight == other.highlight && + connected == other.connected && connecting == other.connecting && + type == other.type; +} + } // namespace ash
diff --git a/ash/common/system/chromeos/network/network_info.h b/ash/common/system/chromeos/network/network_info.h index c321a837..b5a1be57 100644 --- a/ash/common/system/chromeos/network/network_info.h +++ b/ash/common/system/chromeos/network/network_info.h
@@ -23,8 +23,12 @@ NetworkInfo(); NetworkInfo(const std::string& guid); + NetworkInfo(const NetworkInfo& other); ~NetworkInfo(); + bool operator==(const NetworkInfo& other) const; + bool operator!=(const NetworkInfo& other) const { return !(*this == other); } + std::string guid; base::string16 label; base::string16 tooltip;
diff --git a/ash/common/system/chromeos/network/network_list_md.cc b/ash/common/system/chromeos/network/network_list_md.cc index 5b4716d..ae2e80d 100644 --- a/ash/common/system/chromeos/network/network_list_md.cc +++ b/ash/common/system/chromeos/network/network_list_md.cc
@@ -335,6 +335,12 @@ void NetworkListView::UpdateNetworks( const NetworkStateHandler::NetworkStateList& networks) { SCOPED_NET_LOG_IF_SLOW(); + // |network_list_| contains all the info and is going to be cleared and + // recreated. Save them to |last_network_info_map_|. + last_network_info_map_.clear(); + for (auto& info : network_list_) + last_network_info_map_[info->guid] = std::move(info); + network_list_.clear(); const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern(); for (const auto* network : networks) { @@ -583,10 +589,12 @@ network_view = delegate_->CreateViewForNetwork(*info); } else { network_view = found->second; - network_view->RemoveAllChildViews(true); - delegate_->UpdateViewForNetwork(network_view, *info); - network_view->Layout(); - network_view->SchedulePaint(); + if (NeedUpdateViewForNetwork(*info)) { + network_view->RemoveAllChildViews(true); + delegate_->UpdateViewForNetwork(network_view, *info); + network_view->Layout(); + network_view->SchedulePaint(); + } } PlaceViewAtIndex(network_view, index); if (info->disable) @@ -661,7 +669,18 @@ } void NetworkListView::NetworkIconChanged() { - UpdateNetworkIcons(); + Update(); +} + +bool NetworkListView::NeedUpdateViewForNetwork(const NetworkInfo& info) const { + NetworkInfoMap::const_iterator found = last_network_info_map_.find(info.guid); + if (found == last_network_info_map_.end()) { + // If we cannot find |info| in |last_network_info_map_|, just return true + // since this is a new network so we have nothing to compare. + return true; + } else { + return *found->second != info; + } } } // namespace ash
diff --git a/ash/common/system/chromeos/network/network_list_md.h b/ash/common/system/chromeos/network/network_list_md.h index a7e94f1..05765a49 100644 --- a/ash/common/system/chromeos/network/network_list_md.h +++ b/ash/common/system/chromeos/network/network_list_md.h
@@ -102,6 +102,10 @@ // network_icon::AnimationObserver: void NetworkIconChanged() override; + // Returns true if the info should be updated to the view for network, + // otherwise false. + bool NeedUpdateViewForNetwork(const NetworkInfo& info) const; + bool needs_relayout_; NetworkListDelegate* delegate_; @@ -121,9 +125,13 @@ NetworkMap network_map_; // A map of network guids to their view. - typedef std::map<std::string, views::View*> NetworkGuidMap; + using NetworkGuidMap = std::map<std::string, views::View*>; NetworkGuidMap network_guid_map_; + // Save a map of network guids to their infos against current |network_list_|. + using NetworkInfoMap = std::map<std::string, std::unique_ptr<NetworkInfo>>; + NetworkInfoMap last_network_info_map_; + DISALLOW_COPY_AND_ASSIGN(NetworkListView); };
diff --git a/ash/common/system/chromeos/network/vpn_list_view.cc b/ash/common/system/chromeos/network/vpn_list_view.cc index 942f233..8069efb 100644 --- a/ash/common/system/chromeos/network/vpn_list_view.cc +++ b/ash/common/system/chromeos/network/vpn_list_view.cc
@@ -9,7 +9,6 @@ #include <vector> #include "ash/common/ash_view_ids.h" -#include "ash/common/material_design/material_design_controller.h" #include "ash/common/system/chromeos/network/network_icon.h" #include "ash/common/system/chromeos/network/network_icon_animation.h" #include "ash/common/system/chromeos/network/network_icon_animation_observer.h" @@ -31,7 +30,7 @@ #include "base/logging.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "chromeos/network/network_connection_handler.h" +#include "chromeos/network/network_connect.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_type_pattern.h" @@ -47,7 +46,6 @@ #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/label.h" #include "ui/views/controls/separator.h" -#include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/view.h" @@ -55,10 +53,6 @@ namespace { -bool UseMd() { - return MaterialDesignController::IsSystemTrayMenuMaterial(); -} - // Indicates whether |network| belongs to this VPN provider. bool VpnProviderMatchesNetwork(const VPNProvider& provider, const chromeos::NetworkState& network) { @@ -85,27 +79,12 @@ }; // A list entry that represents a VPN provider. -class VPNListProviderEntry : public VPNListEntryBase { +class VPNListProviderEntry : public views::ButtonListener, public views::View { public: - VPNListProviderEntry(VPNListView* parent, const std::string& name) - : VPNListEntryBase(parent) { - views::Label* const label = AddLabel( - base::UTF8ToUTF16(name), gfx::ALIGN_LEFT, false /* highlight */); - label->SetBorder(views::CreateEmptyBorder(5, 0, 5, 0)); - } - - private: - DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntry); -}; - -// A list entry that represents a VPN provider with Material Design. -class VPNListProviderEntryMd : public views::ButtonListener, - public views::View { - public: - VPNListProviderEntryMd(ViewClickListener* parent, - bool top_item, - const std::string& name, - int button_accessible_name_id) + VPNListProviderEntry(ViewClickListener* parent, + bool top_item, + const std::string& name, + int button_accessible_name_id) : parent_(parent) { TrayPopupUtils::ConfigureAsStickyHeader(this); SetLayoutManager(new views::FillLayout); @@ -140,7 +119,7 @@ // Our parent to handle events. ViewClickListener* parent_; - DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntryMd); + DISALLOW_COPY_AND_ASSIGN(VPNListProviderEntry); }; // A list entry that represents a network. If the network is currently @@ -157,12 +136,15 @@ // network_icon::AnimationObserver: void NetworkIconChanged() override; + // views::ButtonListener: + void ButtonPressed(Button* sender, const ui::Event& event) override; + private: void UpdateFromNetworkState(const chromeos::NetworkState* network); - void SetupConnectedItemMd(const base::string16& text, - const gfx::ImageSkia& image); - void SetupConnectingItemMd(const base::string16& text, - const gfx::ImageSkia& image); + void SetupConnectedItem(const base::string16& text, + const gfx::ImageSkia& image); + void SetupConnectingItem(const base::string16& text, + const gfx::ImageSkia& image); const std::string guid_; @@ -172,10 +154,7 @@ }; VPNListEntryBase::VPNListEntryBase(VPNListView* parent) - : HoverHighlightView(parent) { - if (!UseMd()) - SetBorder(views::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0)); -} + : HoverHighlightView(parent) {} VPNListNetworkEntry::VPNListNetworkEntry(VPNListView* parent, const chromeos::NetworkState* network) @@ -193,6 +172,16 @@ ->GetNetworkStateFromGuid(guid_)); } +void VPNListNetworkEntry::ButtonPressed(Button* sender, + const ui::Event& event) { + if (sender != disconnect_button_) { + VPNListEntryBase::ButtonPressed(sender, event); + return; + } + + chromeos::NetworkConnect::Get()->DisconnectFromNetworkId(guid_); +} + void VPNListNetworkEntry::UpdateFromNetworkState( const chromeos::NetworkState* network) { if (network && network->IsConnectingState()) @@ -211,12 +200,11 @@ gfx::ImageSkia image = network_icon::GetImageForNetwork(network, network_icon::ICON_TYPE_LIST); base::string16 label = network_icon::GetLabelForNetwork( - network, UseMd() ? network_icon::ICON_TYPE_MENU_LIST - : network_icon::ICON_TYPE_LIST); + network, network_icon::ICON_TYPE_MENU_LIST); if (network->IsConnectedState()) - SetupConnectedItemMd(label, image); + SetupConnectedItem(label, image); else if (network->IsConnectingState()) - SetupConnectingItemMd(label, image); + SetupConnectingItem(label, image); else AddIconAndLabel(image, label, false); @@ -233,8 +221,8 @@ } // TODO(varkha): Consolidate with a similar method in tray_bluetooth.cc. -void VPNListNetworkEntry::SetupConnectedItemMd(const base::string16& text, - const gfx::ImageSkia& image) { +void VPNListNetworkEntry::SetupConnectedItem(const base::string16& text, + const gfx::ImageSkia& image) { AddIconAndLabels( image, text, l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTED)); @@ -244,8 +232,8 @@ } // TODO(varkha): Consolidate with a similar method in tray_bluetooth.cc. -void VPNListNetworkEntry::SetupConnectingItemMd(const base::string16& text, - const gfx::ImageSkia& image) { +void VPNListNetworkEntry::SetupConnectingItem(const base::string16& text, + const gfx::ImageSkia& image) { AddIconAndLabels( image, text, l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_STATUS_CONNECTING)); @@ -291,10 +279,6 @@ provider_view_map_.clear(); network_view_guid_map_.clear(); list_empty_ = true; - if (!UseMd()) { - container()->SetLayoutManager( - new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); - } // Get the list of available VPN networks, in shill's priority order. chromeos::NetworkStateHandler::NetworkStateList networks; @@ -396,12 +380,8 @@ // Add a list entry for the VPN provider. views::View* provider_view = nullptr; - if (UseMd()) { - provider_view = new VPNListProviderEntryMd( - this, list_empty_, vpn_name, IDS_ASH_STATUS_TRAY_ADD_CONNECTION); - } else { - provider_view = new VPNListProviderEntry(this, vpn_name); - } + provider_view = new VPNListProviderEntry(this, list_empty_, vpn_name, + IDS_ASH_STATUS_TRAY_ADD_CONNECTION); container()->AddChildView(provider_view); provider_view_map_[provider_view] = vpn_provider; list_empty_ = false;
diff --git a/ash/common/system/date/date_view.cc b/ash/common/system/date/date_view.cc index 6a09517..3cbd0bd 100644 --- a/ash/common/system/date/date_view.cc +++ b/ash/common/system/date/date_view.cc
@@ -57,43 +57,19 @@ return MaterialDesignController::IsSystemTrayMenuMaterial(); } -base::string16 FormatDateWithPattern(const base::Time& time, - const char* pattern) { - UErrorCode status = U_ZERO_ERROR; - std::unique_ptr<icu::DateTimePatternGenerator> generator( - icu::DateTimePatternGenerator::createInstance(status)); - DCHECK(U_SUCCESS(status)); - icu::UnicodeString generated_pattern = - generator->getBestPattern(icu::UnicodeString(pattern), status); - DCHECK(U_SUCCESS(status)); - icu::SimpleDateFormat simple_formatter(generated_pattern, status); - DCHECK(U_SUCCESS(status)); - icu::UnicodeString date_string; - simple_formatter.format(static_cast<UDate>(time.ToDoubleT() * 1000), - date_string, status); - DCHECK(U_SUCCESS(status)); - return base::string16(date_string.getBuffer(), - static_cast<size_t>(date_string.length())); -} - base::string16 FormatDate(const base::Time& time) { if (UseMd()) { // Use 'short' month format (e.g., "Oct") followed by non-padded day of // month (e.g., "2", "10"). - return FormatDateWithPattern(time, "LLLd"); + return base::TimeFormatWithPattern(time, "LLLd"); } else { - icu::UnicodeString date_string; - std::unique_ptr<icu::DateFormat> formatter( - icu::DateFormat::createDateInstance(icu::DateFormat::kMedium)); - formatter->format(static_cast<UDate>(time.ToDoubleT() * 1000), date_string); - return base::string16(date_string.getBuffer(), - static_cast<size_t>(date_string.length())); + return base::TimeFormatShortDate(time); } } base::string16 FormatDayOfWeek(const base::Time& time) { // Use 'short' day of week format (e.g., "Wed"). - return FormatDateWithPattern(time, "EEE"); + return base::TimeFormatWithPattern(time, "EEE"); } } // namespace
diff --git a/ash/common/system/tray/system_tray.cc b/ash/common/system/tray/system_tray.cc index b7a849b..4c6405eb 100644 --- a/ash/common/system/tray/system_tray.cc +++ b/ash/common/system/tray/system_tray.cc
@@ -197,8 +197,8 @@ if (bubble_widget == wm_gained_active->GetInternalWidget() || ::wm::HasTransientAncestor(gained_active, bubble_widget->GetNativeWindow()) || - ::wm::HasTransientAncestor(lost_active, - bubble_widget->GetNativeWindow())) { + (lost_active && ::wm::HasTransientAncestor( + lost_active, bubble_widget->GetNativeWindow()))) { return; }
diff --git a/ash/common/system/tray/system_tray_unittest.cc b/ash/common/system/tray/system_tray_unittest.cc index ffee9fa..05dc12b 100644 --- a/ash/common/system/tray/system_tray_unittest.cc +++ b/ash/common/system/tray/system_tray_unittest.cc
@@ -22,6 +22,7 @@ #include "ash/test/ash_test_base.h" #include "ash/test/status_area_widget_test_helper.h" #include "ash/test/test_system_tray_item.h" +#include "ash/wm/window_util.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/test/histogram_tester.h" @@ -232,6 +233,42 @@ EXPECT_FALSE(widget->IsActive()); } +// Makes sure that the system tray bubble closes when another window is +// activated, and does not crash regardless of the initial activation state. +// Regression test for crbug.com/704432 . +TEST_F(SystemTrayTest, CloseOnActivation) { + SystemTray* tray = GetPrimarySystemTray(); + + // Show the system bubble. + tray->ShowDefaultView(BUBBLE_CREATE_NEW); + EXPECT_FALSE(tray->GetSystemBubble()->bubble_view()->GetWidget()->IsActive()); + + // Test 1: no crash when there's no active window to begin with. + EXPECT_FALSE(wm::GetActiveWindow()); + + // Showing a new window and activating it will close the system bubble. + std::unique_ptr<views::Widget> widget(CreateTestWidget( + nullptr, kShellWindowId_DefaultContainer, gfx::Rect(0, 0, 100, 100))); + EXPECT_TRUE(widget->IsActive()); + EXPECT_FALSE(tray->GetSystemBubble()); + + // Show a second widget. + std::unique_ptr<views::Widget> second_widget(CreateTestWidget( + nullptr, kShellWindowId_DefaultContainer, gfx::Rect(0, 0, 100, 100))); + EXPECT_TRUE(second_widget->IsActive()); + + // Re-show the system bubble. + tray->ShowDefaultView(BUBBLE_CREATE_NEW); + EXPECT_FALSE(tray->GetSystemBubble()->bubble_view()->GetWidget()->IsActive()); + + // Test 2: also no crash when there is a previously active window. + EXPECT_TRUE(wm::GetActiveWindow()); + + // Re-activate the first widget. The system bubble should hide again. + widget->Activate(); + EXPECT_FALSE(tray->GetSystemBubble()); +} + // Opening and closing the bubble should change the coloring of the tray. TEST_F(SystemTrayTest, SystemTrayColoring) { SystemTray* tray = GetPrimarySystemTray();
diff --git a/ash/common/test/test_shelf_delegate.cc b/ash/common/test/test_shelf_delegate.cc index d27d813f..65565d1 100644 --- a/ash/common/test/test_shelf_delegate.cc +++ b/ash/common/test/test_shelf_delegate.cc
@@ -21,6 +21,21 @@ namespace ash { namespace test { +namespace { + +// Set the |type| of the item with the given |shelf_id|, if the item exists. +void SetItemType(ShelfID shelf_id, ShelfItemType type) { + ShelfModel* model = Shell::Get()->shelf_model(); + ash::ShelfItems::const_iterator item = model->ItemByID(shelf_id); + if (item != model->items().end()) { + ShelfItem pinned_item = *item; + pinned_item.type = type; + model->Set(item - model->items().begin(), pinned_item); + } +} + +} // namespace + TestShelfDelegate* TestShelfDelegate::instance_ = nullptr; // A ShellObserver that sets the shelf alignment and auto hide behavior when the @@ -59,25 +74,21 @@ } void TestShelfDelegate::AddShelfItem(WmWindow* window) { - AddShelfItem(window, STATUS_CLOSED); + AddShelfItem(window, std::string()); } void TestShelfDelegate::AddShelfItem(WmWindow* window, const std::string& app_id) { - AddShelfItem(window, STATUS_CLOSED); - ShelfID shelf_id = window->aura_window()->GetProperty(kShelfIDKey); - AddShelfIDToAppIDMapping(shelf_id, app_id); -} - -void TestShelfDelegate::AddShelfItem(WmWindow* window, ShelfItemStatus status) { ShelfItem item; + if (!app_id.empty()) + item.app_launch_id = AppLaunchId(app_id); if (window->GetType() == ui::wm::WINDOW_TYPE_PANEL) item.type = TYPE_APP_PANEL; else item.type = TYPE_APP; ShelfModel* model = Shell::Get()->shelf_model(); ShelfID id = model->next_id(); - item.status = status; + item.status = STATUS_CLOSED; model->Add(item); window->aura_window()->AddObserver(this); @@ -95,13 +106,9 @@ DCHECK_NE(-1, index); model->RemoveItemAt(index); window->aura_window()->RemoveObserver(this); - if (HasShelfIDToAppIDMapping(shelf_id)) { - const std::string& app_id = GetAppIDForShelfID(shelf_id); - if (IsAppPinned(app_id)) - UnpinAppWithID(app_id); - if (HasShelfIDToAppIDMapping(shelf_id)) - RemoveShelfIDToAppIDMapping(shelf_id); - } + const std::string& app_id = GetAppIDForShelfID(shelf_id); + if (IsAppPinned(app_id)) + UnpinAppWithID(app_id); } void TestShelfDelegate::OnWindowDestroying(aura::Window* window) { @@ -118,29 +125,32 @@ } ShelfID TestShelfDelegate::GetShelfIDForAppID(const std::string& app_id) { - for (auto const& iter : shelf_id_to_app_id_map_) { - if (iter.second == app_id) - return iter.first; - } - return 0; + // Get shelf id for |app_id| and an empty |launch_id|. + return GetShelfIDForAppIDAndLaunchID(app_id, std::string()); } ShelfID TestShelfDelegate::GetShelfIDForAppIDAndLaunchID( const std::string& app_id, const std::string& launch_id) { - return GetShelfIDForAppID(app_id); -} - -bool TestShelfDelegate::HasShelfIDToAppIDMapping(ShelfID id) const { - return shelf_id_to_app_id_map_.find(id) != shelf_id_to_app_id_map_.end(); + for (const ShelfItem& item : Shell::Get()->shelf_model()->items()) { + // Ash's ShelfWindowWatcher handles app panel windows separately. + if (item.type != TYPE_APP_PANEL && item.app_launch_id.app_id() == app_id && + item.app_launch_id.launch_id() == launch_id) { + return item.id; + } + } + return kInvalidShelfID; } const std::string& TestShelfDelegate::GetAppIDForShelfID(ShelfID id) { - DCHECK_GT(shelf_id_to_app_id_map_.count(id), 0u); - return shelf_id_to_app_id_map_[id]; + ShelfModel* model = Shell::Get()->shelf_model(); + ash::ShelfItems::const_iterator item = model->ItemByID(id); + return item != model->items().end() ? item->app_launch_id.app_id() + : base::EmptyString(); } void TestShelfDelegate::PinAppWithID(const std::string& app_id) { + SetItemType(GetShelfIDForAppID(app_id), TYPE_PINNED_APP); pinned_apps_.insert(app_id); } @@ -149,17 +159,9 @@ } void TestShelfDelegate::UnpinAppWithID(const std::string& app_id) { + SetItemType(GetShelfIDForAppID(app_id), TYPE_APP); pinned_apps_.erase(app_id); } -void TestShelfDelegate::AddShelfIDToAppIDMapping(ShelfID shelf_id, - const std::string& app_id) { - shelf_id_to_app_id_map_[shelf_id] = app_id; -} - -void TestShelfDelegate::RemoveShelfIDToAppIDMapping(ShelfID shelf_id) { - shelf_id_to_app_id_map_.erase(shelf_id); -} - } // namespace test } // namespace ash
diff --git a/ash/common/test/test_shelf_delegate.h b/ash/common/test/test_shelf_delegate.h index 5e274db..8bcec8d 100644 --- a/ash/common/test/test_shelf_delegate.h +++ b/ash/common/test/test_shelf_delegate.h
@@ -5,7 +5,6 @@ #ifndef ASH_COMMON_TEST_TEST_SHELF_DELEGATE_H_ #define ASH_COMMON_TEST_TEST_SHELF_DELEGATE_H_ -#include <map> #include <memory> #include <set> #include <string> @@ -33,14 +32,10 @@ // STATUS_CLOSED. void AddShelfItem(WmWindow* window); - // Adds a ShelfItem for the given |window| and adds a mapping from the added - // ShelfItem's ShelfID to the given |app_id|. The ShelfItem's status will be - // STATUS_CLOSED. + // Adds a ShelfItem for the given |window| and |app_id|. The ShelfItem's + // status will be STATUS_CLOSED. void AddShelfItem(WmWindow* window, const std::string& app_id); - // Adds a ShelfItem for the given |window| with the specified |status|. - void AddShelfItem(WmWindow* window, ShelfItemStatus status); - // Removes the ShelfItem for the specified |window| and unpins it if it was // pinned. The |window|'s ShelfID to app id mapping will be removed if it // exists. @@ -56,28 +51,18 @@ ShelfID GetShelfIDForAppID(const std::string& app_id) override; ShelfID GetShelfIDForAppIDAndLaunchID(const std::string& app_id, const std::string& launch_id) override; - bool HasShelfIDToAppIDMapping(ShelfID id) const override; const std::string& GetAppIDForShelfID(ShelfID id) override; void PinAppWithID(const std::string& app_id) override; bool IsAppPinned(const std::string& app_id) override; void UnpinAppWithID(const std::string& app_id) override; private: - // Adds a mapping from a ShelfID to an app id. - void AddShelfIDToAppIDMapping(ShelfID shelf_id, const std::string& app_id); - - // Removes the mapping from a ShelfID to an app id. - void RemoveShelfIDToAppIDMapping(ShelfID shelf_id); - static TestShelfDelegate* instance_; std::unique_ptr<ShelfInitializer> shelf_initializer_; std::set<std::string> pinned_apps_; - // Tracks the ShelfID to app id mappings. - std::map<ShelfID, std::string> shelf_id_to_app_id_map_; - DISALLOW_COPY_AND_ASSIGN(TestShelfDelegate); };
diff --git a/ash/common/wm/maximize_mode/maximize_mode_controller.cc b/ash/common/wm/maximize_mode/maximize_mode_controller.cc index 173de0c..7fbf2b6 100644 --- a/ash/common/wm/maximize_mode/maximize_mode_controller.cc +++ b/ash/common/wm/maximize_mode/maximize_mode_controller.cc
@@ -11,6 +11,7 @@ #include "ash/common/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h" #include "ash/common/wm_shell.h" #include "ash/shell.h" +#include "base/bind.h" #include "base/command_line.h" #include "base/metrics/histogram_macros.h" #include "base/time/default_tick_clock.h" @@ -92,7 +93,8 @@ touchview_usage_interval_start_time_(base::Time::Now()), tick_clock_(new base::DefaultTickClock()), tablet_mode_switch_is_on_(false), - lid_is_closed_(false) { + lid_is_closed_(false), + weak_factory_(this) { Shell::GetInstance()->AddShellObserver(this); WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_INITIALLY_DISABLED); @@ -104,8 +106,11 @@ WmShell::Get()->AddDisplayObserver(this); chromeos::AccelerometerReader::GetInstance()->AddObserver(this); } - chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver( - this); + chromeos::PowerManagerClient* power_manager_client = + chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); + power_manager_client->AddObserver(this); + power_manager_client->GetSwitchStates(base::Bind( + &MaximizeModeController::OnGetSwitchStates, weak_factory_.GetWeakPtr())); } MaximizeModeController::~MaximizeModeController() { @@ -419,6 +424,13 @@ } } +void MaximizeModeController::OnGetSwitchStates( + chromeos::PowerManagerClient::LidState lid_state, + chromeos::PowerManagerClient::TabletMode tablet_mode) { + LidEventReceived(lid_state, base::TimeTicks::Now()); + TabletModeEventReceived(tablet_mode, base::TimeTicks::Now()); +} + bool MaximizeModeController::WasLidOpenedRecently() const { if (last_lid_open_time_.is_null()) return false;
diff --git a/ash/common/wm/maximize_mode/maximize_mode_controller.h b/ash/common/wm/maximize_mode/maximize_mode_controller.h index cd0d28c..383f26e 100644 --- a/ash/common/wm/maximize_mode/maximize_mode_controller.h +++ b/ash/common/wm/maximize_mode/maximize_mode_controller.h
@@ -13,6 +13,7 @@ #include "ash/public/interfaces/touch_view.mojom.h" #include "base/compiler_specific.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "chromeos/accelerometer/accelerometer_reader.h" #include "chromeos/accelerometer/accelerometer_types.h" @@ -120,6 +121,9 @@ void HandleHingeRotation( scoped_refptr<const chromeos::AccelerometerUpdate> update); + void OnGetSwitchStates(chromeos::PowerManagerClient::LidState lid_state, + chromeos::PowerManagerClient::TabletMode tablet_mode); + // Returns true if the lid was recently opened. bool WasLidOpenedRecently() const; @@ -189,6 +193,8 @@ // The set of touchview observers to be notified about mode changes. mojo::InterfacePtrSet<mojom::TouchViewObserver> observers_; + base::WeakPtrFactory<MaximizeModeController> weak_factory_; + DISALLOW_COPY_AND_ASSIGN(MaximizeModeController); };
diff --git a/ash/common/wm/workspace/workspace_layout_manager_unittest.cc b/ash/common/wm/workspace/workspace_layout_manager_unittest.cc index 9d4a3bc..00d4042 100644 --- a/ash/common/wm/workspace/workspace_layout_manager_unittest.cc +++ b/ash/common/wm/workspace/workspace_layout_manager_unittest.cc
@@ -29,7 +29,6 @@ #include "ash/wm/window_state_aura.h" #include "base/command_line.h" #include "base/run_loop.h" -#include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/base/ui_base_switches.h" #include "ui/base/ui_base_types.h" @@ -399,7 +398,7 @@ // TODO: fix. This test verifies that when a window is added the bounds are // adjusted. CreateTestWindow() for mus adds, then sets the bounds (this comes // from NativeWidgetAura), which means this test now fails for aura-mus. - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) + if (WmShell::Get()->IsRunningInMash()) return; // Normal window bounds shouldn't be changed. @@ -484,7 +483,7 @@ // TODO: fix. This test verifies that when a window is added the bounds are // adjusted. CreateTestWindow() for mus adds, then sets the bounds (this comes // from NativeWidgetAura), which means this test now fails for aura-mus. - if (aura::Env::GetInstance()->mode() != aura::Env::Mode::MUS) { + if (!WmShell::Get()->IsRunningInMash()) { EXPECT_EQ(gfx::Rect(gfx::Point(100, 101), work_area).ToString(), window->GetBounds().ToString()); }
diff --git a/ash/common/wm_window.cc b/ash/common/wm_window.cc index 792c3a15..9882760 100644 --- a/ash/common/wm_window.cc +++ b/ash/common/wm_window.cc
@@ -26,7 +26,6 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/focus_client.h" #include "ui/aura/client/window_parenting_client.h" -#include "ui/aura/env.h" #include "ui/aura/layout_manager.h" #include "ui/aura/mus/window_manager_delegate.h" #include "ui/aura/mus/window_mus.h" @@ -580,7 +579,7 @@ } void WmWindow::SetPinned(bool trusted) { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) { + if (WmShell::Get()->IsRunningInMash()) { // TODO: fix, see http://crbug.com/622486. With aura-mus pinning may just // work. NOTIMPLEMENTED(); @@ -613,7 +612,7 @@ } void WmWindow::CloseWidget() { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS && + if (WmShell::Get()->IsRunningInMash() && aura_window()->GetProperty(kWidgetCreationTypeKey) == WidgetCreationType::FOR_CLIENT) { // NOTE: in the FOR_CLIENT case there is not necessarily a widget associated @@ -675,7 +674,7 @@ } void WmWindow::ShowResizeShadow(int component) { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) { + if (WmShell::Get()->IsRunningInMash()) { // TODO: http://crbug.com/640773. return; } @@ -686,7 +685,7 @@ } void WmWindow::HideResizeShadow() { - if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) { + if (WmShell::Get()->IsRunningInMash()) { // TODO: http://crbug.com/640773. return; } @@ -757,7 +756,7 @@ void WmWindow::AddLimitedPreTargetHandler(ui::EventHandler* handler) { // In mus AddPreTargetHandler() only works for windows created by this client. - DCHECK(aura::Env::GetInstance()->mode() == aura::Env::Mode::LOCAL || + DCHECK(!WmShell::Get()->IsRunningInMash() || Shell::window_tree_client()->WasCreatedByThisClient( aura::WindowMus::Get(window_))); window_->AddPreTargetHandler(handler);
diff --git a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc index 91bd3169..9f8683c 100644 --- a/ash/content/display/screen_orientation_controller_chromeos_unittest.cc +++ b/ash/content/display/screen_orientation_controller_chromeos_unittest.cc
@@ -10,14 +10,19 @@ #include "ash/common/ash_switches.h" #include "ash/common/test/test_system_tray_delegate.h" #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" +#include "ash/common/wm/window_state.h" #include "ash/common/wm_shell.h" +#include "ash/common/wm_window.h" #include "ash/content/shell_content_state.h" +#include "ash/display/screen_orientation_controller_chromeos.h" +#include "ash/shared/app_types.h" #include "ash/shell.h" #include "ash/system/chromeos/screen_layout_observer.h" #include "ash/test/ash_test_base.h" #include "ash/test/ash_test_environment_content.h" #include "ash/test/ash_test_helper.h" #include "ash/test/content/test_shell_content_state.h" +#include "ash/test/screen_orientation_controller_test_api.h" #include "ash/test/test_shell_delegate.h" #include "base/command_line.h" #include "chromeos/accelerometer/accelerometer_reader.h" @@ -63,6 +68,12 @@ ->rotation_locked(); } +bool UserRotationLocked() { + return Shell::GetInstance() + ->screen_orientation_controller() + ->user_rotation_locked(); +} + void SetDisplayRotationById(int64_t display_id, display::Display::Rotation rotation) { Shell::GetInstance()->display_manager()->SetDisplayRotation( @@ -73,11 +84,6 @@ SetDisplayRotationById(display::Display::InternalDisplayId(), rotation); } -void SetRotationLocked(bool rotation_locked) { - Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - rotation_locked); -} - void TriggerLidUpdate(const gfx::Vector3dF& lid) { scoped_refptr<chromeos::AccelerometerUpdate> update( new chromeos::AccelerometerUpdate()); @@ -129,6 +135,35 @@ // test::AshTestBase: void SetUp() override; + protected: + aura::Window* CreateAppWindowInShellWithId(int id) { + aura::Window* window = CreateTestWindowInShellWithId(id); + WmWindow::Get(window)->SetAppType(static_cast<int>(AppType::CHROME_APP)); + return window; + } + + void SetSystemRotationLocked(bool rotation_locked) { + test::ScreenOrientationControllerTestApi( + Shell::GetInstance()->screen_orientation_controller()) + .SetRotationLocked(rotation_locked); + } + + void SetUserRotationLocked(bool rotation_locked) { + if (Shell::GetInstance() + ->screen_orientation_controller() + ->user_rotation_locked() != rotation_locked) { + Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); + } + } + + blink::WebScreenOrientationLockType UserLockedOrientation() const { + test::ScreenOrientationControllerTestApi test_api( + Shell::GetInstance()->screen_orientation_controller()); + return test_api.UserLockedOrientation(); + } + private: // Optional content::BrowserContext used for two window tests. std::unique_ptr<content::BrowserContext> secondary_browser_context_; @@ -167,7 +202,7 @@ // Tests that a content::WebContents can lock rotation. TEST_F(ScreenOrientationControllerTest, LockOrientation) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); ASSERT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); ASSERT_FALSE(RotationLocked()); @@ -181,7 +216,7 @@ // Tests that a content::WebContents can unlock rotation. TEST_F(ScreenOrientationControllerTest, Unlock) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); ASSERT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); ASSERT_FALSE(RotationLocked()); @@ -199,7 +234,7 @@ // display after having locked rotation. TEST_F(ScreenOrientationControllerTest, OrientationChanges) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); ASSERT_NE(nullptr, content->GetNativeView()); ASSERT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); ASSERT_FALSE(RotationLocked()); @@ -218,8 +253,8 @@ TEST_F(ScreenOrientationControllerTest, SecondContentCannotChangeOrientation) { std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); - std::unique_ptr<aura::Window> focus_window1(CreateTestWindowInShellWithId(0)); - std::unique_ptr<aura::Window> focus_window2(CreateTestWindowInShellWithId(1)); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); ASSERT_NE(content1->GetNativeView(), content2->GetNativeView()); AttachAndActivateWebContents(content1.get(), focus_window1.get()); @@ -234,8 +269,8 @@ TEST_F(ScreenOrientationControllerTest, SecondContentCannotUnlock) { std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); - std::unique_ptr<aura::Window> focus_window1(CreateTestWindowInShellWithId(0)); - std::unique_ptr<aura::Window> focus_window2(CreateTestWindowInShellWithId(1)); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); ASSERT_NE(content1->GetNativeView(), content2->GetNativeView()); AttachAndActivateWebContents(content1.get(), focus_window1.get()); @@ -249,8 +284,8 @@ // a part of the active window. TEST_F(ScreenOrientationControllerTest, ActiveWindowChangesUpdateLock) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window1(CreateTestWindowInShellWithId(0)); - std::unique_ptr<aura::Window> focus_window2(CreateTestWindowInShellWithId(1)); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); AttachAndActivateWebContents(content.get(), focus_window1.get()); delegate()->Lock(content.get(), blink::WebScreenOrientationLockLandscape); @@ -270,8 +305,8 @@ TEST_F(ScreenOrientationControllerTest, ActiveWindowChangesUpdateOrientation) { std::unique_ptr<content::WebContents> content1(CreateWebContents()); std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); - std::unique_ptr<aura::Window> focus_window1(CreateTestWindowInShellWithId(0)); - std::unique_ptr<aura::Window> focus_window2(CreateTestWindowInShellWithId(1)); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); AttachAndActivateWebContents(content1.get(), focus_window1.get()); AttachWebContents(content2.get(), focus_window2.get()); @@ -294,7 +329,7 @@ // that it is reapplied when the window becomes visible. TEST_F(ScreenOrientationControllerTest, VisibilityChangesLock) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); AttachAndActivateWebContents(content.get(), focus_window.get()); delegate()->Lock(content.get(), blink::WebScreenOrientationLockLandscape); EXPECT_TRUE(RotationLocked()); @@ -311,8 +346,8 @@ // window activations no longer change the lock TEST_F(ScreenOrientationControllerTest, WindowDestructionRemovesLock) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window1(CreateTestWindowInShellWithId(0)); - std::unique_ptr<aura::Window> focus_window2(CreateTestWindowInShellWithId(1)); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); AttachAndActivateWebContents(content.get(), focus_window1.get()); delegate()->Lock(content.get(), blink::WebScreenOrientationLockLandscape); @@ -398,7 +433,7 @@ // rotation lock has been set. TEST_F(ScreenOrientationControllerTest, RotationLockPreventsRotation) { EnableMaximizeMode(true); - SetRotationLocked(true); + SetUserRotationLocked(true); // Turn past the threshold for rotation. float degrees = 90.0; @@ -408,7 +443,7 @@ TriggerLidUpdate(gravity); EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); - SetRotationLocked(false); + SetUserRotationLocked(false); TriggerLidUpdate(gravity); EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); } @@ -435,7 +470,7 @@ // adjusting the screen rotation directly when in maximize mode ASSERT_NE(display::Display::ROTATE_270, GetCurrentInternalDisplayRotation()); SetInternalDisplayRotation(display::Display::ROTATE_270); - SetRotationLocked(false); + SetSystemRotationLocked(false); EXPECT_EQ(display::Display::ROTATE_270, GetCurrentInternalDisplayRotation()); EXPECT_EQ(1u, message_center->NotificationCount()); EXPECT_TRUE(message_center->HasPopupNotifications()); @@ -449,7 +484,7 @@ // Make sure notifications are blocked when adjusting the screen rotation // via the accelerometer while in maximize mode // Rotate the screen 90 degrees - ASSERT_NE(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); + ASSERT_EQ(display::Display::ROTATE_270, GetCurrentInternalDisplayRotation()); TriggerLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); ASSERT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); EXPECT_EQ(0u, message_center->NotificationCount()); @@ -515,7 +550,7 @@ // be done between the two angles of the orientation. TEST_F(ScreenOrientationControllerTest, LandscapeOrientationAllowsRotation) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); EnableMaximizeMode(true); AttachAndActivateWebContents(content.get(), focus_window.get()); @@ -538,7 +573,7 @@ // done between the two angles of the orientation. TEST_F(ScreenOrientationControllerTest, PortraitOrientationAllowsRotation) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); EnableMaximizeMode(true); AttachAndActivateWebContents(content.get(), focus_window.get()); @@ -561,7 +596,7 @@ // display rotation remains constant. TEST_F(ScreenOrientationControllerTest, OrientationLockDisallowsRotation) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); EnableMaximizeMode(true); AttachAndActivateWebContents(content.get(), focus_window.get()); @@ -583,17 +618,18 @@ // supports rotation, that a user rotation lock does not allow rotation. TEST_F(ScreenOrientationControllerTest, UserRotationLockDisallowsRotation) { std::unique_ptr<content::WebContents> content(CreateWebContents()); - std::unique_ptr<aura::Window> focus_window(CreateTestWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window(CreateAppWindowInShellWithId(0)); EnableMaximizeMode(true); AttachAndActivateWebContents(content.get(), focus_window.get()); delegate()->Lock(content.get(), blink::WebScreenOrientationLockLandscape); delegate()->Unlock(content.get()); - SetRotationLocked(true); + SetUserRotationLocked(true); EXPECT_TRUE(RotationLocked()); - EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); + EXPECT_TRUE(UserRotationLocked()); + EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); TriggerLidUpdate(gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); } @@ -655,13 +691,121 @@ ASSERT_NE(kNewRotation, display_manager() ->GetDisplayInfo(kInternalDisplayId) .GetActiveRotation()); - - Shell::GetInstance()->screen_orientation_controller()->SetDisplayRotation( - kNewRotation, display::Display::ROTATION_SOURCE_ACTIVE); + test::ScreenOrientationControllerTestApi( + Shell::GetInstance()->screen_orientation_controller()) + .SetDisplayRotation(kNewRotation, + display::Display::ROTATION_SOURCE_ACTIVE); EXPECT_EQ(kNewRotation, display_manager() ->GetDisplayInfo(kInternalDisplayId) .GetActiveRotation()); } +TEST_F(ScreenOrientationControllerTest, UserRotationLockedOrientation) { + ScreenOrientationController* orientation_controller = + Shell::GetInstance()->screen_orientation_controller(); + orientation_controller->ToggleUserRotationLock(); + EXPECT_TRUE(orientation_controller->user_rotation_locked()); + EXPECT_EQ(blink::WebScreenOrientationLockLandscapePrimary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_90); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockPortraitPrimary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_180); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockLandscapeSecondary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_270); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockPortraitSecondary, + UserLockedOrientation()); + orientation_controller->ToggleUserRotationLock(); + + SetInternalDisplayRotation(display::Display::ROTATE_270); + + UpdateDisplay("800x1280"); + orientation_controller->ToggleUserRotationLock(); + EXPECT_TRUE(orientation_controller->user_rotation_locked()); + EXPECT_EQ(blink::WebScreenOrientationLockPortraitPrimary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_90); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockLandscapePrimary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_180); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockPortraitSecondary, + UserLockedOrientation()); + + orientation_controller->ToggleUserRotationLock(); + SetInternalDisplayRotation(display::Display::ROTATE_270); + orientation_controller->ToggleUserRotationLock(); + EXPECT_EQ(blink::WebScreenOrientationLockLandscapeSecondary, + UserLockedOrientation()); + orientation_controller->ToggleUserRotationLock(); +} + +TEST_F(ScreenOrientationControllerTest, UserRotationLock) { + std::unique_ptr<content::WebContents> content1(CreateWebContents()); + std::unique_ptr<content::WebContents> content2(CreateSecondaryWebContents()); + std::unique_ptr<aura::Window> focus_window1(CreateAppWindowInShellWithId(0)); + std::unique_ptr<aura::Window> focus_window2(CreateAppWindowInShellWithId(1)); + ASSERT_NE(content1->GetNativeView(), content2->GetNativeView()); + + AttachAndActivateWebContents(content2.get(), focus_window2.get()); + AttachAndActivateWebContents(content1.get(), focus_window1.get()); + + ASSERT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); + ASSERT_FALSE(RotationLocked()); + ASSERT_FALSE(UserRotationLocked()); + + ScreenOrientationController* orientation_controller = + Shell::GetInstance()->screen_orientation_controller(); + ASSERT_FALSE(orientation_controller->user_rotation_locked()); + orientation_controller->ToggleUserRotationLock(); + ASSERT_TRUE(orientation_controller->user_rotation_locked()); + + delegate()->Lock(content1.get(), blink::WebScreenOrientationLockPortrait); + + EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); + + aura::client::ActivationClient* activation_client = + Shell::GetInstance()->activation_client(); + // Activating any will switch to the natural orientation. + activation_client->ActivateWindow(focus_window2.get()); + EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); + + // Activating the portrait window will rotate to the portrait. + activation_client->ActivateWindow(focus_window1.get()); + EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); + + // User locked to the 90 dig. + orientation_controller->ToggleUserRotationLock(); + orientation_controller->ToggleUserRotationLock(); + + // Switching to Any orientation will stay to the user locked orientation. + activation_client->ActivateWindow(focus_window2.get()); + EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); + + // Application forced to be landscape. + delegate()->Lock(content2.get(), blink::WebScreenOrientationLockLandscape); + EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); + + delegate()->Lock(content1.get(), blink::WebScreenOrientationLockAny); + activation_client->ActivateWindow(focus_window1.get()); + // Switching back to any will rotate to user rotation. + EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); +} + } // namespace ash
diff --git a/ash/display/screen_orientation_controller_chromeos.cc b/ash/display/screen_orientation_controller_chromeos.cc index f836b38..cb6fb4d 100644 --- a/ash/display/screen_orientation_controller_chromeos.cc +++ b/ash/display/screen_orientation_controller_chromeos.cc
@@ -6,9 +6,12 @@ #include "ash/common/ash_switches.h" #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" +#include "ash/common/wm/mru_window_tracker.h" +#include "ash/common/wm/window_state.h" #include "ash/common/wm_shell.h" #include "ash/common/wm_window.h" #include "ash/display/display_configuration_controller.h" +#include "ash/shared/app_types.h" #include "ash/shell.h" #include "base/auto_reset.h" #include "base/command_line.h" @@ -114,7 +117,7 @@ pair.first->aura_window()->RemoveObserver(this); locking_windows_.clear(); Shell::GetInstance()->activation_client()->RemoveObserver(this); - SetRotationLocked(false); + SetRotationLockedInternal(false); if (user_rotation_ != current_rotation_) SetDisplayRotation(user_rotation_, display::Display::ROTATION_SOURCE_USER); } @@ -127,33 +130,60 @@ switches::kAshDisableScreenOrientationLock); } -void ScreenOrientationController::SetRotationLocked(bool rotation_locked) { - if (rotation_locked_ == rotation_locked) - return; - rotation_locked_ = rotation_locked; - if (!rotation_locked_) - rotation_locked_orientation_ = blink::WebScreenOrientationLockAny; +void ScreenOrientationController::ToggleUserRotationLock() { + if (user_rotation_locked()) { + user_locked_orientation_ = blink::WebScreenOrientationLockAny; + } else { + display::Display::Rotation current_rotation = + WmShell::Get() + ->GetDisplayInfo(display::Display::InternalDisplayId()) + .GetActiveRotation(); + blink::WebScreenOrientationLockType natural = + GetDisplayNaturalOrientation(); + if (natural == blink::WebScreenOrientationLockLandscape) { + switch (current_rotation) { + case display::Display::ROTATE_0: + user_locked_orientation_ = + blink::WebScreenOrientationLockLandscapePrimary; + break; + case display::Display::ROTATE_90: + user_locked_orientation_ = + blink::WebScreenOrientationLockPortraitPrimary; + break; + case display::Display::ROTATE_180: + user_locked_orientation_ = + blink::WebScreenOrientationLockLandscapeSecondary; + break; + case display::Display::ROTATE_270: + user_locked_orientation_ = + blink::WebScreenOrientationLockPortraitSecondary; + break; + } + } else { // Natural portrait + switch (current_rotation) { + case display::Display::ROTATE_0: + user_locked_orientation_ = + blink::WebScreenOrientationLockPortraitPrimary; + break; + case display::Display::ROTATE_90: + user_locked_orientation_ = + blink::WebScreenOrientationLockLandscapePrimary; + break; + case display::Display::ROTATE_180: + user_locked_orientation_ = + blink::WebScreenOrientationLockPortraitSecondary; + break; + case display::Display::ROTATE_270: + user_locked_orientation_ = + blink::WebScreenOrientationLockLandscapeSecondary; + break; + } + } + } + ApplyLockForActiveWindow(); + for (auto& observer : observers_) - observer.OnRotationLockChanged(rotation_locked_); - if (!display::Display::HasInternalDisplay()) - return; - base::AutoReset<bool> auto_ignore_display_configuration_updates( - &ignore_display_configuration_updates_, true); - Shell::GetInstance()->display_manager()->RegisterDisplayRotationProperties( - rotation_locked_, current_rotation_); -} - -void ScreenOrientationController::SetDisplayRotation( - display::Display::Rotation rotation, - display::Display::RotationSource source) { - if (!display::Display::HasInternalDisplay()) - return; - current_rotation_ = rotation; - base::AutoReset<bool> auto_ignore_display_configuration_updates( - &ignore_display_configuration_updates_, true); - - Shell::GetInstance()->display_configuration_controller()->SetDisplayRotation( - display::Display::InternalDisplayId(), rotation, source); + observer.OnUserRotationLockChanged(); } void ScreenOrientationController::OnWindowActivated(ActivationReason reason, @@ -205,10 +235,13 @@ ->GetDisplayInfo(display::Display::InternalDisplayId()) .GetActiveRotation(); if (user_rotation != current_rotation_) { + // TODO(oshima): We should disable the orientation change in settings + // because application may not work correctly. + // A user may change other display configuration settings. When the user // does change the rotation setting, then lock rotation to prevent the // accelerometer from erasing their change. - SetRotationLocked(true); + SetRotationLockedInternal(true); user_rotation_ = current_rotation_ = user_rotation; } } @@ -236,10 +269,38 @@ SetDisplayRotation(user_rotation_, display::Display::ROTATION_SOURCE_USER); } +void ScreenOrientationController::SetDisplayRotation( + display::Display::Rotation rotation, + display::Display::RotationSource source) { + if (!display::Display::HasInternalDisplay()) + return; + current_rotation_ = rotation; + base::AutoReset<bool> auto_ignore_display_configuration_updates( + &ignore_display_configuration_updates_, true); + + Shell::GetInstance()->display_configuration_controller()->SetDisplayRotation( + display::Display::InternalDisplayId(), rotation, source); +} + +void ScreenOrientationController::SetRotationLockedInternal( + bool rotation_locked) { + if (rotation_locked_ == rotation_locked) + return; + rotation_locked_ = rotation_locked; + if (!rotation_locked_) + rotation_locked_orientation_ = blink::WebScreenOrientationLockAny; + if (!display::Display::HasInternalDisplay()) + return; + base::AutoReset<bool> auto_ignore_display_configuration_updates( + &ignore_display_configuration_updates_, true); + Shell::GetInstance()->display_manager()->RegisterDisplayRotationProperties( + rotation_locked_, current_rotation_); +} + void ScreenOrientationController::LockRotation( display::Display::Rotation rotation, display::Display::RotationSource source) { - SetRotationLocked(true); + SetRotationLockedInternal(true); SetDisplayRotation(rotation, source); } @@ -248,7 +309,7 @@ rotation_locked_orientation_ = lock_orientation; switch (lock_orientation) { case blink::WebScreenOrientationLockAny: - SetRotationLocked(false); + SetRotationLockedInternal(false); break; case blink::WebScreenOrientationLockDefault: NOTREACHED(); @@ -310,7 +371,7 @@ if (natural_orientation_ == lock_orientation) { if (rotation == display::Display::ROTATE_0 || rotation == display::Display::ROTATE_180) { - SetRotationLocked(true); + SetRotationLockedInternal(true); } else { LockRotation(display::Display::ROTATE_0, display::Display::ROTATION_SOURCE_ACTIVE); @@ -318,7 +379,7 @@ } else { if (rotation == display::Display::ROTATE_90 || rotation == display::Display::ROTATE_270) { - SetRotationLocked(true); + SetRotationLockedInternal(true); } else { LockRotation(display::Display::ROTATE_90, display::Display::ROTATION_SOURCE_ACTIVE); @@ -385,21 +446,37 @@ return; SetDisplayRotation(display_manager->registered_internal_display_rotation(), display::Display::ROTATION_SOURCE_ACCELEROMETER); - SetRotationLocked(true); + SetRotationLockedInternal(true); } void ScreenOrientationController::ApplyLockForActiveWindow() { - WmWindow* active_window = WmShell::Get()->GetActiveWindow(); - if (active_window) { - for (auto const& windows : locking_windows_) { - if (windows.first->GetTargetVisibility() && - active_window->Contains(windows.first)) { - LockRotationToOrientation(windows.second); + MruWindowTracker::WindowList mru_windows( + Shell::GetInstance()->mru_window_tracker()->BuildMruWindowList()); + + for (WmWindow* window : mru_windows) { + if (!window->GetTargetVisibility()) + continue; + // TODO(oshima): If the application's orientation is landscape + // and user_locked_orientation_ is landscape primary or secondary, + // it should lock to the specific orientation. (and same for portrait). + for (auto const& pair : locking_windows_) { + if (pair.first->GetTargetVisibility() && window->Contains(pair.first)) { + LockRotationToOrientation(pair.second == + blink::WebScreenOrientationLockAny + ? user_locked_orientation_ + : pair.second); return; } } + // The default orientation for all chrome browser/apps windows is + // ANY, so use the user_locked_orientation_; + if (window->GetTargetVisibility() && + static_cast<AppType>(window->GetAppType()) != AppType::OTHERS) { + LockRotationToOrientation(user_locked_orientation_); + return; + } } - SetRotationLocked(false); + LockRotationToOrientation(user_locked_orientation_); } bool ScreenOrientationController::IsRotationAllowedInLockedState(
diff --git a/ash/display/screen_orientation_controller_chromeos.h b/ash/display/screen_orientation_controller_chromeos.h index 1189523..069d517 100644 --- a/ash/display/screen_orientation_controller_chromeos.h +++ b/ash/display/screen_orientation_controller_chromeos.h
@@ -20,6 +20,9 @@ #include "ui/wm/public/activation_change_observer.h" namespace ash { +namespace test { +class ScreenOrientationControllerTestApi; +} // Implements ChromeOS specific functionality for ScreenOrientationProvider. class ASH_EXPORT ScreenOrientationController @@ -33,8 +36,8 @@ // rotation lock. class Observer { public: - // Invoked when rotation is locked or unlocked. - virtual void OnRotationLockChanged(bool rotation_locked) {} + // Invoked when rotation is locked or unlocked by a user. + virtual void OnUserRotationLockChanged() {} protected: virtual ~Observer() {} @@ -66,15 +69,15 @@ // rotate the display. bool rotation_locked() const { return rotation_locked_; } - // If |rotation_locked| future accelerometer updates should not change the - // display rotation. - void SetRotationLocked(bool rotation_locked); + bool user_rotation_locked() const { + return user_locked_orientation_ != blink::WebScreenOrientationLockAny; + } - // Sets the display rotation for the given |source|. The new |rotation| will - // also become active. Display changed notifications are surpressed for this - // change. - void SetDisplayRotation(display::Display::Rotation rotation, - display::Display::RotationSource source); + // Trun on/off the user rotation lock. When turned on, it will lock + // the orientation to the current orientation. + // |user_rotation_locked()| method returns the current state of the + // user rotation lock. + void ToggleUserRotationLock(); // aura::client::ActivationChangeObserver: void OnWindowActivated(ActivationReason reason, @@ -97,6 +100,16 @@ void OnMaximizeModeEnded() override; private: + friend class test::ScreenOrientationControllerTestApi; + + // Sets the display rotation for the given |source|. The new |rotation| will + // also become active. Display changed notifications are surpressed for this + // change. + void SetDisplayRotation(display::Display::Rotation rotation, + display::Display::RotationSource source); + + void SetRotationLockedInternal(bool rotation_locked); + // Sets the display rotation to |rotation|. Future accelerometer updates // should not be used to change the rotation. SetRotationLocked(false) removes // the rotation lock. @@ -166,6 +179,10 @@ // restored upon exiting maximize mode. display::Display::Rotation user_rotation_; + // The orientation of the device locked by the user. + blink::WebScreenOrientationLockType user_locked_orientation_ = + blink::WebScreenOrientationLockAny; + // The current rotation set by ScreenOrientationController for the internal // display. display::Display::Rotation current_rotation_;
diff --git a/ash/laser/laser_pointer_view.cc b/ash/laser/laser_pointer_view.cc index d567506..69c5580 100644 --- a/ash/laser/laser_pointer_view.cc +++ b/ash/laser/laser_pointer_view.cc
@@ -243,11 +243,7 @@ .device_scale_factor(); } -LaserPointerView::~LaserPointerView() { - // Make sure GPU memory buffer is unmapped before being destroyed. - if (gpu_memory_buffer_) - gpu_memory_buffer_->Unmap(); -} +LaserPointerView::~LaserPointerView() {} void LaserPointerView::Stop() { buffer_damage_rect_.Union(GetBoundingBox()); @@ -294,7 +290,9 @@ base::TimeDelta::FromMilliseconds(kPredictionIntervalMs); base::TimeDelta max_point_interval = base::TimeDelta::FromMilliseconds(kMaxPointIntervalMs); - base::TimeTicks last_point_time = current_time; + base::TimeTicks last_point_time = new_time; + gfx::PointF last_point_location = + gfx::ScalePoint(new_point, scale.x(), scale.y()); // Use the last four points for prediction. using PositionArray = std::array<gfx::PointF, 4>; @@ -306,15 +304,16 @@ if ((last_point_time - point.time) > max_point_interval) break; - *it++ = gfx::ScalePoint(point.location, scale.x(), scale.y()); last_point_time = point.time; + last_point_location = gfx::ScalePoint(point.location, scale.x(), scale.y()); + *it++ = last_point_location; // Stop when no more positions are needed. if (it == position.end()) break; } // Pad with last point if needed. - std::fill(it, position.end(), *(it - 1)); + std::fill(it, position.end(), last_point_location); // Note: Currently there's no need to divide by the time delta between // points as we assume a constant delta between points that matches the @@ -470,13 +469,6 @@ return; } - // Map buffer and keep it mapped until destroyed. - bool rv = gpu_memory_buffer_->Map(); - if (!rv) { - LOG(ERROR) << "Failed to map GPU memory buffer"; - return; - } - // Make sure the first update rectangle covers the whole buffer. update_rect = gfx::Rect(screen_bounds.size()); } @@ -486,6 +478,12 @@ if (update_rect.IsEmpty()) return; + // Map buffer for writing. + if (!gpu_memory_buffer_->Map()) { + LOG(ERROR) << "Failed to map GPU memory buffer"; + return; + } + // Create a temporary canvas for update rectangle. gfx::Canvas canvas(update_rect.size(), scale_factor_, false); @@ -572,6 +570,9 @@ data + pixel_rect.y() * stride + pixel_rect.x() * 4, stride, 0, 0); } + // Unmap to flush writes to buffer. + gpu_memory_buffer_->Unmap(); + // Update surface damage rectangle. surface_damage_rect_.Union(update_rect);
diff --git a/ash/metrics/user_metrics_recorder.cc b/ash/metrics/user_metrics_recorder.cc index 3af9f7ea..0c99071e 100644 --- a/ash/metrics/user_metrics_recorder.cc +++ b/ash/metrics/user_metrics_recorder.cc
@@ -6,7 +6,6 @@ #include "ash/common/metrics/pointer_metrics_recorder.h" #include "ash/common/session/session_state_delegate.h" -#include "ash/common/shelf/shelf_delegate.h" #include "ash/common/shelf/shelf_model.h" #include "ash/common/shelf/shelf_view.h" #include "ash/common/shelf/wm_shelf.h" @@ -169,24 +168,13 @@ // Records the number of items in the shelf as an UMA statistic. void RecordShelfItemCounts() { - ShelfDelegate* shelf_delegate = Shell::Get()->shelf_delegate(); - DCHECK(shelf_delegate); - int pinned_item_count = 0; int unpinned_item_count = 0; - - for (const ShelfItem& shelf_item : Shell::Get()->shelf_model()->items()) { - if (shelf_item.type != TYPE_APP_LIST) { - // Internal ash apps do not have an app id and thus will always be counted - // as unpinned. - if (shelf_delegate->HasShelfIDToAppIDMapping(shelf_item.id) && - shelf_delegate->IsAppPinned( - shelf_delegate->GetAppIDForShelfID(shelf_item.id))) { - ++pinned_item_count; - } else { - ++unpinned_item_count; - } - } + for (const ShelfItem& item : Shell::Get()->shelf_model()->items()) { + if (item.type == TYPE_PINNED_APP || item.type == TYPE_BROWSER_SHORTCUT) + ++pinned_item_count; + else if (item.type != TYPE_APP_LIST) + ++unpinned_item_count; } UMA_HISTOGRAM_COUNTS_100("Ash.Shelf.NumberOfItems",
diff --git a/ash/mus/shelf_delegate_mus.cc b/ash/mus/shelf_delegate_mus.cc index 90dd0f91..8136fcc 100644 --- a/ash/mus/shelf_delegate_mus.cc +++ b/ash/mus/shelf_delegate_mus.cc
@@ -29,10 +29,6 @@ return ShelfDelegateMus::GetShelfIDForAppID(app_id); } -bool ShelfDelegateMus::HasShelfIDToAppIDMapping(ShelfID id) const { - return Shell::Get()->shelf_controller()->shelf_id_to_app_id().count(id) > 0; -} - const std::string& ShelfDelegateMus::GetAppIDForShelfID(ShelfID id) { if (Shell::Get()->shelf_controller()->shelf_id_to_app_id().count(id)) return Shell::Get()->shelf_controller()->shelf_id_to_app_id().at(id);
diff --git a/ash/mus/shelf_delegate_mus.h b/ash/mus/shelf_delegate_mus.h index e04362b..fe92a65 100644 --- a/ash/mus/shelf_delegate_mus.h +++ b/ash/mus/shelf_delegate_mus.h
@@ -24,7 +24,6 @@ ShelfID GetShelfIDForAppID(const std::string& app_id) override; ShelfID GetShelfIDForAppIDAndLaunchID(const std::string& app_id, const std::string& launch_id) override; - bool HasShelfIDToAppIDMapping(ShelfID id) const override; const std::string& GetAppIDForShelfID(ShelfID id) override; void PinAppWithID(const std::string& app_id) override; bool IsAppPinned(const std::string& app_id) override;
diff --git a/ash/resources/ash_resources.grd b/ash/resources/ash_resources.grd index 5dbcba2..e6be591 100644 --- a/ash/resources/ash_resources.grd +++ b/ash/resources/ash_resources.grd
@@ -28,14 +28,6 @@ <structure type="chrome_scaled_image" name="IDR_AURA_PHANTOM_WINDOW_TOP" file="common/phantom_window_top.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_PHANTOM_WINDOW_TOP_LEFT" file="common/phantom_window_top_left.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_PHANTOM_WINDOW_TOP_RIGHT" file="common/phantom_window_top_right.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_BOTTOM" file="common/resize_shadow_bottom.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_BOTTOM_LEFT" file="common/resize_shadow_bottom_left.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_BOTTOM_RIGHT" file="common/resize_shadow_bottom_right.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_LEFT" file="common/resize_shadow_left.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_RIGHT" file="common/resize_shadow_right.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_TOP" file="common/resize_shadow_top.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_TOP_LEFT" file="common/resize_shadow_top_left.png" /> - <structure type="chrome_scaled_image" name="IDR_AURA_RESIZE_SHADOW_TOP_RIGHT" file="common/resize_shadow_top_right.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_ACCESSIBILITY_DARK" file="cros/status/status_accessibility_dark.png" /> <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_HELP" file="cros/status/status_help.png" />
diff --git a/ash/resources/default_100_percent/common/resize_shadow_bottom.png b/ash/resources/default_100_percent/common/resize_shadow_bottom.png deleted file mode 100644 index f35b510..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_bottom.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_bottom_left.png b/ash/resources/default_100_percent/common/resize_shadow_bottom_left.png deleted file mode 100644 index a469177..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_bottom_left.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_bottom_right.png b/ash/resources/default_100_percent/common/resize_shadow_bottom_right.png deleted file mode 100644 index ecf05385..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_bottom_right.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_left.png b/ash/resources/default_100_percent/common/resize_shadow_left.png deleted file mode 100644 index f744e35..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_left.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_right.png b/ash/resources/default_100_percent/common/resize_shadow_right.png deleted file mode 100644 index f744e35..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_right.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_top.png b/ash/resources/default_100_percent/common/resize_shadow_top.png deleted file mode 100644 index f35b510..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_top.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_top_left.png b/ash/resources/default_100_percent/common/resize_shadow_top_left.png deleted file mode 100644 index 844c4ecd..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_top_left.png +++ /dev/null Binary files differ
diff --git a/ash/resources/default_100_percent/common/resize_shadow_top_right.png b/ash/resources/default_100_percent/common/resize_shadow_top_right.png deleted file mode 100644 index 5a0be1a2..0000000 --- a/ash/resources/default_100_percent/common/resize_shadow_top_right.png +++ /dev/null Binary files differ
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index 714b741..43a92bea 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -263,8 +263,6 @@ return base::checked_cast<ShelfID>(id); } - bool HasShelfIDToAppIDMapping(ShelfID id) const override { return true; } - const std::string& GetAppIDForShelfID(ShelfID id) override { // Use |app_id_| member variable because returning a reference to local // variable is not allowed.
diff --git a/ash/system/chromeos/rotation/tray_rotation_lock.cc b/ash/system/chromeos/rotation/tray_rotation_lock.cc index b5b4a0d..9b1ba25 100644 --- a/ash/system/chromeos/rotation/tray_rotation_lock.cc +++ b/ash/system/chromeos/rotation/tray_rotation_lock.cc
@@ -33,10 +33,10 @@ ->IsMaximizeModeWindowManagerEnabled(); } -bool IsRotationLocked() { +bool IsUserRotationLocked() { return Shell::GetInstance() ->screen_orientation_controller() - ->rotation_locked(); + ->user_rotation_locked(); } } // namespace @@ -66,7 +66,7 @@ void OnMaximizeModeEnded() override; // ScreenOrientationController::Obsever: - void OnRotationLockChanged(bool rotation_locked) override; + void OnUserRotationLockChanged() override; views::ImageView* icon_; views::Label* label_; @@ -104,14 +104,14 @@ void RotationLockDefaultView::Update() { TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::DEFAULT_VIEW_LABEL); - icon_->SetImage(gfx::CreateVectorIcon(IsRotationLocked() + icon_->SetImage(gfx::CreateVectorIcon(IsUserRotationLocked() ? kSystemMenuRotationLockLockedIcon : kSystemMenuRotationLockAutoIcon, kMenuIconSize, style.GetIconColor())); base::string16 label = l10n_util::GetStringUTF16( - IsRotationLocked() ? IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED - : IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO); + IsUserRotationLocked() ? IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED + : IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO); label_->SetText(label); style.SetupLabel(label_); @@ -133,8 +133,9 @@ } bool RotationLockDefaultView::PerformAction(const ui::Event& event) { - Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - !IsRotationLocked()); + Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); return true; } @@ -149,7 +150,7 @@ StopObservingRotation(); } -void RotationLockDefaultView::OnRotationLockChanged(bool rotation_locked) { +void RotationLockDefaultView::OnUserRotationLockChanged() { Update(); } @@ -166,7 +167,7 @@ Shell::GetInstance()->RemoveShellObserver(this); } -void TrayRotationLock::OnRotationLockChanged(bool rotation_locked) { +void TrayRotationLock::OnUserRotationLockChanged() { tray_view()->SetVisible(ShouldBeVisible()); } @@ -177,7 +178,7 @@ } void TrayRotationLock::OnMaximizeModeStarted() { - tray_view()->SetVisible(IsRotationLocked()); + tray_view()->SetVisible(IsUserRotationLocked()); Shell::GetInstance()->screen_orientation_controller()->AddObserver(this); } @@ -198,7 +199,7 @@ bool TrayRotationLock::ShouldBeVisible() { return OnPrimaryDisplay() && IsMaximizeModeWindowManagerEnabled() && - IsRotationLocked(); + IsUserRotationLocked(); } bool TrayRotationLock::OnPrimaryDisplay() const {
diff --git a/ash/system/chromeos/rotation/tray_rotation_lock.h b/ash/system/chromeos/rotation/tray_rotation_lock.h index 109376c..31f25c18 100644 --- a/ash/system/chromeos/rotation/tray_rotation_lock.h +++ b/ash/system/chromeos/rotation/tray_rotation_lock.h
@@ -26,7 +26,7 @@ ~TrayRotationLock() override; // ScreenOrientationController::Observer: - void OnRotationLockChanged(bool rotation_locked) override; + void OnUserRotationLockChanged() override; // SystemTrayItem: views::View* CreateDefaultView(LoginStatus status) override;
diff --git a/ash/system/chromeos/rotation/tray_rotation_lock_unittest.cc b/ash/system/chromeos/rotation/tray_rotation_lock_unittest.cc index 4c7788b..1b5cc4c7 100644 --- a/ash/system/chromeos/rotation/tray_rotation_lock_unittest.cc +++ b/ash/system/chromeos/rotation/tray_rotation_lock_unittest.cc
@@ -133,8 +133,9 @@ TearDownViews(); Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( true); - Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - true); + Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); SetUpForStatusAreaWidget(StatusAreaWidgetTestHelper::GetStatusAreaWidget()); EXPECT_TRUE(tray_view()->visible()); Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( @@ -148,8 +149,9 @@ ASSERT_FALSE(tray_view()->visible()); Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( true); - Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - true); + Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); EXPECT_TRUE(tray_view()->visible()); Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( false); @@ -258,8 +260,9 @@ Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( true); DestroyTrayView(); - Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - true); + Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); Shell::Get()->maximize_mode_controller()->EnableMaximizeModeWindowManager( false); }
diff --git a/ash/test/BUILD.gn b/ash/test/BUILD.gn index 3a7d24c..0c5e4cf 100644 --- a/ash/test/BUILD.gn +++ b/ash/test/BUILD.gn
@@ -115,6 +115,8 @@ "mirror_window_test_api.h", "overflow_bubble_view_test_api.cc", "overflow_bubble_view_test_api.h", + "screen_orientation_controller_test_api.cc", + "screen_orientation_controller_test_api.h", "shelf_button_pressed_metric_tracker_test_api.cc", "shelf_button_pressed_metric_tracker_test_api.h", "shelf_view_test_api.cc", @@ -157,6 +159,7 @@ public_deps = [ "//ash", "//testing/gtest", + "//third_party/WebKit/public:blink_headers", "//ui/display:display_manager_test_api", ] deps = [
diff --git a/ash/test/DEPS b/ash/test/DEPS index caa60c0..267fef88 100644 --- a/ash/test/DEPS +++ b/ash/test/DEPS
@@ -17,4 +17,7 @@ "mirror_window_test_api\.cc": [ "+ash/host" ], + "screen_orientation_controller_test_api.h": [ + "+third_party/WebKit/public/platform/modules/screen_orientation/WebScreenOrientationLockType.h", + ], }
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index 89bfe72..7709a75 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -57,6 +57,7 @@ namespace { bool IsMash() { + // TODO(sky): this won't work correctly for detecting mus vs mash. return aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS; }
diff --git a/ash/test/screen_orientation_controller_test_api.cc b/ash/test/screen_orientation_controller_test_api.cc new file mode 100644 index 0000000..16b5137 --- /dev/null +++ b/ash/test/screen_orientation_controller_test_api.cc
@@ -0,0 +1,32 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/test/screen_orientation_controller_test_api.h" + +#include "ash/display/screen_orientation_controller_chromeos.h" + +namespace ash { +namespace test { + +ScreenOrientationControllerTestApi::ScreenOrientationControllerTestApi( + ScreenOrientationController* controller) + : controller_(controller) {} + +void ScreenOrientationControllerTestApi::SetDisplayRotation( + display::Display::Rotation rotation, + display::Display::RotationSource source) { + controller_->SetDisplayRotation(rotation, source); +} + +void ScreenOrientationControllerTestApi::SetRotationLocked(bool locked) { + controller_->SetRotationLockedInternal(locked); +} + +blink::WebScreenOrientationLockType +ScreenOrientationControllerTestApi::UserLockedOrientation() const { + return controller_->user_locked_orientation_; +} + +} // namespace test +} // namespace ash
diff --git a/ash/test/screen_orientation_controller_test_api.h b/ash/test/screen_orientation_controller_test_api.h new file mode 100644 index 0000000..46b04c7 --- /dev/null +++ b/ash/test/screen_orientation_controller_test_api.h
@@ -0,0 +1,38 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_TEST_SCREEN_ORIENTATION_CONTROLLER_TEST_API_H_ +#define ASH_TEST_SCREEN_ORIENTATION_CONTROLLER_TEST_API_H_ + +#include "base/macros.h" +#include "third_party/WebKit/public/platform/modules/screen_orientation/WebScreenOrientationLockType.h" +#include "ui/display/display.h" + +namespace ash { +class ScreenOrientationController; + +namespace test { + +class ScreenOrientationControllerTestApi { + public: + explicit ScreenOrientationControllerTestApi( + ScreenOrientationController* controller); + + void SetDisplayRotation(display::Display::Rotation rotation, + display::Display::RotationSource source); + + void SetRotationLocked(bool rotation_locked); + + blink::WebScreenOrientationLockType UserLockedOrientation() const; + + private: + ScreenOrientationController* controller_; + + DISALLOW_COPY_AND_ASSIGN(ScreenOrientationControllerTestApi); +}; + +} // namespace test +} // namespace ash + +#endif // ASH_TEST_SCREEN_ORIENTATION_CONTROLLER_TEST_API_H_
diff --git a/ash/touch/touch_hud_debug.cc b/ash/touch/touch_hud_debug.cc index c009aad2..7979873 100644 --- a/ash/touch/touch_hud_debug.cc +++ b/ash/touch/touch_hud_debug.cc
@@ -6,6 +6,7 @@ #include <algorithm> #include <string> +#include <utility> #include <vector> #include "ash/root_window_controller.h" @@ -363,7 +364,7 @@ if (hud) { std::unique_ptr<base::ListValue> list = hud->GetLogAsList(); if (!list->empty()) - value->Set(base::Int64ToString(hud->display_id()), list.release()); + value->Set(base::Int64ToString(hud->display_id()), std::move(list)); } } return value;
diff --git a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc index 9bd694a3..759f53a 100644 --- a/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc +++ b/ash/wm/maximize_mode/maximize_mode_controller_unittest.cc
@@ -16,10 +16,13 @@ #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "base/command_line.h" +#include "base/run_loop.h" #include "base/test/simple_test_tick_clock.h" #include "base/test/user_action_tester.h" #include "chromeos/accelerometer/accelerometer_reader.h" #include "chromeos/accelerometer/accelerometer_types.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/fake_power_manager_client.h" #include "ui/display/manager/display_manager.h" #include "ui/display/test/display_manager_test_api.h" #include "ui/events/event_handler.h" @@ -583,4 +586,21 @@ } } +// Tests that when a MaximizeModeController is created that cached tablet mode +// state will trigger a mode update. +TEST_F(MaximizeModeControllerTest, InitializedWhileTabletModeSwitchOn) { + base::RunLoop().RunUntilIdle(); + // FakePowerManagerClient is always installed for tests + chromeos::FakePowerManagerClient* power_manager_client = + static_cast<chromeos::FakePowerManagerClient*>( + chromeos::DBusThreadManager::Get()->GetPowerManagerClient()); + power_manager_client->set_tablet_mode( + chromeos::PowerManagerClient::TabletMode::ON); + MaximizeModeController controller; + EXPECT_FALSE(controller.IsMaximizeModeWindowManagerEnabled()); + // PowerManagerClient callback is a posted task. + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(controller.IsMaximizeModeWindowManagerEnabled()); +} + } // namespace ash
diff --git a/ash/wm/resize_shadow.cc b/ash/wm/resize_shadow.cc index 14bd0f6e..847ded2 100644 --- a/ash/wm/resize_shadow.cc +++ b/ash/wm/resize_shadow.cc
@@ -4,72 +4,94 @@ #include "ash/wm/resize_shadow.h" -#include "ash/resources/grit/ash_resources.h" +#include "base/lazy_instance.h" #include "base/time/time.h" #include "ui/aura/window.h" #include "ui/base/hit_test.h" -#include "ui/base/resource/resource_bundle.h" #include "ui/compositor/layer.h" #include "ui/compositor/scoped_layer_animation_settings.h" -#include "ui/wm/core/image_grid.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/image/canvas_image_source.h" namespace { -// Final opacity for resize effect. -const float kShadowTargetOpacity = 0.25f; -// Animation time for resize effect in milliseconds. -const int kShadowAnimationDurationMs = 100; +// The width of the resize shadow that appears on the hovered edge of the +// window. +constexpr int kVisualThickness = 8; -// Sets up a layer as invisible and fully transparent, without animating. -void InitLayer(ui::Layer* layer) { - layer->SetVisible(false); - layer->SetOpacity(0.f); -} +// This class simply draws a roundrect. The layout and tiling is handled by +// ResizeShadow and NinePatchLayer. +class ResizeShadowImageSource : public gfx::CanvasImageSource { + public: + ResizeShadowImageSource() + : gfx::CanvasImageSource(gfx::Size(kImageSide, kImageSide), + false /* is opaque */) {} -// Triggers an opacity animation that will make |layer| become |visible|. -void ShowLayer(ui::Layer* layer, bool visible) { - ui::ScopedLayerAnimationSettings settings(layer->GetAnimator()); - settings.SetTransitionDuration( - base::TimeDelta::FromMilliseconds(kShadowAnimationDurationMs)); - layer->SetOpacity(visible ? kShadowTargetOpacity : 0.f); - // Sets the layer visibility after a delay, which will be identical to the - // opacity animation duration. - layer->SetVisible(visible); -} + ~ResizeShadowImageSource() override {} + + // gfx::CanvasImageSource: + void Draw(gfx::Canvas* canvas) override { + cc::PaintFlags paint; + paint.setAntiAlias(true); + paint.setColor(SK_ColorBLACK); + canvas->DrawRoundRect(gfx::RectF(gfx::SizeF(size())), kCornerRadius, paint); + } + + private: + static constexpr int kCornerRadius = 2; + static constexpr int kImageSide = 2 * kVisualThickness + 1; + + DISALLOW_COPY_AND_ASSIGN(ResizeShadowImageSource); +}; + +base::LazyInstance<std::unique_ptr<gfx::ImageSkia>>::Leaky g_shadow_image = + LAZY_INSTANCE_INITIALIZER; } // namespace namespace ash { -ResizeShadow::ResizeShadow() : last_hit_test_(HTNOWHERE) {} +ResizeShadow::ResizeShadow(aura::Window* window) + : window_(window), last_hit_test_(HTNOWHERE) { + window_->AddObserver(this); -ResizeShadow::~ResizeShadow() {} + // Use a NinePatchLayer to tile the shadow image (which is simply a + // roundrect). + layer_.reset(new ui::Layer(ui::LAYER_NINE_PATCH)); + layer_->set_name("WindowResizeShadow"); + layer_->SetFillsBoundsOpaquely(false); + layer_->SetOpacity(0.f); + layer_->SetVisible(false); -void ResizeShadow::Init(aura::Window* window) { - // Set up our image grid and images. - ResourceBundle& res = ResourceBundle::GetSharedInstance(); - image_grid_.reset(new ::wm::ImageGrid); - image_grid_->SetImages( - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_TOP_LEFT), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_TOP), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_TOP_RIGHT), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_LEFT), NULL, - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_RIGHT), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_BOTTOM_LEFT), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_BOTTOM), - &res.GetImageNamed(IDR_AURA_RESIZE_SHADOW_BOTTOM_RIGHT)); - // Initialize all layers to invisible/transparent. - InitLayer(image_grid_->top_left_layer()); - InitLayer(image_grid_->top_layer()); - InitLayer(image_grid_->top_right_layer()); - InitLayer(image_grid_->left_layer()); - InitLayer(image_grid_->right_layer()); - InitLayer(image_grid_->bottom_left_layer()); - InitLayer(image_grid_->bottom_layer()); - InitLayer(image_grid_->bottom_right_layer()); - // Add image grid as a child of the window's layer so it follows the window - // as it moves. - window->layer()->Add(image_grid_->layer()); + if (!g_shadow_image.Get()) { + auto* source = new ResizeShadowImageSource(); + g_shadow_image.Get().reset(new gfx::ImageSkia(source, source->size())); + } + layer_->UpdateNinePatchLayerImage(*g_shadow_image.Get()); + gfx::Rect aperture(g_shadow_image.Get()->size()); + constexpr gfx::Insets kApertureInsets(kVisualThickness); + aperture.Inset(kApertureInsets); + layer_->UpdateNinePatchLayerAperture(aperture); + layer_->UpdateNinePatchLayerBorder( + gfx::Rect(kApertureInsets.left(), kApertureInsets.top(), + kApertureInsets.width(), kApertureInsets.height())); + + ReparentLayer(); +} + +ResizeShadow::~ResizeShadow() { + window_->RemoveObserver(this); +} + +void ResizeShadow::OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds) { + UpdateBoundsAndVisibility(); +} + +void ResizeShadow::OnWindowHierarchyChanged( + const aura::WindowObserver::HierarchyChangeParams& params) { + ReparentLayer(); } void ResizeShadow::ShowForHitTest(int hit) { @@ -78,30 +100,54 @@ return; last_hit_test_ = hit; - // Show affected corners. - ShowLayer(image_grid_->top_left_layer(), hit == HTTOPLEFT); - ShowLayer(image_grid_->top_right_layer(), hit == HTTOPRIGHT); - ShowLayer(image_grid_->bottom_left_layer(), hit == HTBOTTOMLEFT); - ShowLayer(image_grid_->bottom_right_layer(), hit == HTBOTTOMRIGHT); - - // Show affected edges. - ShowLayer(image_grid_->top_layer(), - hit == HTTOPLEFT || hit == HTTOP || hit == HTTOPRIGHT); - ShowLayer(image_grid_->left_layer(), - hit == HTTOPLEFT || hit == HTLEFT || hit == HTBOTTOMLEFT); - ShowLayer(image_grid_->right_layer(), - hit == HTTOPRIGHT || hit == HTRIGHT || hit == HTBOTTOMRIGHT); - ShowLayer(image_grid_->bottom_layer(), - hit == HTBOTTOMLEFT || hit == HTBOTTOM || hit == HTBOTTOMRIGHT); + UpdateBoundsAndVisibility(); } void ResizeShadow::Hide() { ShowForHitTest(HTNOWHERE); } -void ResizeShadow::Layout(const gfx::Rect& content_bounds) { - gfx::Rect local_bounds(content_bounds.size()); - image_grid_->SetContentBounds(local_bounds); +void ResizeShadow::ReparentLayer() { + DCHECK(window_->layer()->parent()); + if (layer_->parent() != window_->layer()->parent()) + window_->layer()->parent()->Add(layer_.get()); + layer_->parent()->StackBelow(layer_.get(), window_->layer()); +} + +void ResizeShadow::UpdateBoundsAndVisibility() { + // The shadow layer is positioned such that one or two edges will stick out + // from underneath |window_|. Thus |window_| occludes the rest of the + // roundrect. + const int hit = last_hit_test_; + bool show_top = hit == HTTOPLEFT || hit == HTTOP || hit == HTTOPRIGHT; + bool show_left = hit == HTTOPLEFT || hit == HTLEFT || hit == HTBOTTOMLEFT; + bool show_bottom = + hit == HTBOTTOMLEFT || hit == HTBOTTOM || hit == HTBOTTOMRIGHT; + bool show_right = hit == HTTOPRIGHT || hit == HTRIGHT || hit == HTBOTTOMRIGHT; + + const int outset = -kVisualThickness; + gfx::Insets outsets(show_top ? outset : 0, show_left ? outset : 0, + show_bottom ? outset : 0, show_right ? outset : 0); + bool visible = !outsets.IsEmpty(); + if (!visible && !layer_->GetTargetVisibility()) + return; + + if (visible) { + gfx::Rect bounds = window_->bounds(); + bounds.Inset(outsets); + layer_->SetBounds(bounds); + } + + // The resize shadow snaps in but fades out. + ui::ScopedLayerAnimationSettings settings(layer_->GetAnimator()); + if (!visible) { + constexpr int kShadowFadeOutDurationMs = 100; + settings.SetTransitionDuration( + base::TimeDelta::FromMilliseconds(kShadowFadeOutDurationMs)); + } + constexpr float kShadowTargetOpacity = 0.5f; + layer_->SetOpacity(visible ? kShadowTargetOpacity : 0.f); + layer_->SetVisible(visible); } } // namespace ash
diff --git a/ash/wm/resize_shadow.h b/ash/wm/resize_shadow.h index 8f9ffa0..d9003ab 100644 --- a/ash/wm/resize_shadow.h +++ b/ash/wm/resize_shadow.h
@@ -8,15 +8,13 @@ #include <memory> #include "base/macros.h" +#include "ui/aura/window_observer.h" namespace aura { class Window; } -namespace gfx { -class Rect; -} -namespace wm { -class ImageGrid; +namespace ui { +class Layer; } namespace ash { @@ -24,13 +22,16 @@ // A class to render the resize edge effect when the user moves their mouse // over a sizing edge. This is just a visual effect; the actual resize is // handled by the EventFilter. -class ResizeShadow { +class ResizeShadow : public aura::WindowObserver { public: - ResizeShadow(); - ~ResizeShadow(); + explicit ResizeShadow(aura::Window* window); + ~ResizeShadow() override; - // Initializes the resize effect layers for a given |window|. - void Init(aura::Window* window); + // aura::WindowObserver: + void OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds) override; + void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override; // Shows resize effects for one or more edges based on a |hit_test| code, such // as HTRIGHT or HTBOTTOMRIGHT. @@ -39,14 +40,21 @@ // Hides all resize effects. void Hide(); - // Updates the effect positions based on the |bounds| of the window. - void Layout(const gfx::Rect& bounds); - int GetLastHitTestForTest() const { return last_hit_test_; } + const ui::Layer* GetLayerForTest() const { return layer_.get(); } private: - // Images for the shadow effect. - std::unique_ptr<::wm::ImageGrid> image_grid_; + // Reparents |layer_| so that it's behind the layer of |window_|. + void ReparentLayer(); + + // Updates bounds and visibility of |layer_|. + void UpdateBoundsAndVisibility(); + + aura::Window* window_; + + // The layer to which the shadow is drawn. The layer is stacked beneath the + // layer of |window_|. + std::unique_ptr<ui::Layer> layer_; // Hit test value from last call to ShowForHitTest(). Used to prevent // repeatedly triggering the same animations for the same hit.
diff --git a/ash/wm/resize_shadow_and_cursor_unittest.cc b/ash/wm/resize_shadow_and_cursor_unittest.cc index 44de897..96cce7a 100644 --- a/ash/wm/resize_shadow_and_cursor_unittest.cc +++ b/ash/wm/resize_shadow_and_cursor_unittest.cc
@@ -69,17 +69,35 @@ window_->AddChild(child); } + const ResizeShadow* GetShadow() const { + return Shell::GetInstance() + ->resize_shadow_controller() + ->GetShadowForWindowForTest(window_); + } + // Returns the hit test code if there is a resize shadow. Returns HTNOWHERE if // there is no resize shadow. int ResizeShadowHitTest() const { - ash::ResizeShadow* resize_shadow = ash::Shell::GetInstance() - ->resize_shadow_controller() - ->GetShadowForWindowForTest(window_); + auto* resize_shadow = GetShadow(); return resize_shadow ? resize_shadow->GetLastHitTestForTest() : HTNOWHERE; } // Returns true if there is a resize shadow. - bool HasResizeShadow() const { return ResizeShadowHitTest() != HTNOWHERE; } + void VerifyResizeShadow(bool visible) const { + if (visible) + EXPECT_TRUE(GetShadow()); + if (GetShadow()) { + const ui::Layer* shadow_layer = GetShadow()->GetLayerForTest(); + EXPECT_EQ(visible, shadow_layer->GetTargetVisibility()); + ASSERT_TRUE(window_->layer()); + EXPECT_EQ(window_->layer()->parent(), shadow_layer->parent()); + const auto& layers = shadow_layer->parent()->children(); + // Make sure the shadow layer is stacked directly beneath the window + // layer. + EXPECT_EQ(*(std::find(layers.begin(), layers.end(), shadow_layer) + 1), + window_->layer()); + } + } // Returns the current cursor type. int GetCurrentCursorType() const { @@ -93,8 +111,9 @@ const gfx::Vector2dF& delta) { if (type == ui::ET_GESTURE_SCROLL_END) { // After gesture scroll ends, there should be no resize shadow. - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); } else { + VerifyResizeShadow(true); EXPECT_EQ(HTBOTTOMRIGHT, ResizeShadowHitTest()); } } @@ -114,39 +133,44 @@ ASSERT_TRUE(ash::wm::GetWindowState(window())->IsNormalStateType()); generator.MoveMouseTo(50, 50); - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); EXPECT_EQ(ui::kCursorNull, GetCurrentCursorType()); generator.MoveMouseTo(gfx::Point(50, 0)); + VerifyResizeShadow(true); EXPECT_EQ(HTTOP, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorNorthResize, GetCurrentCursorType()); generator.MoveMouseTo(50, 50); - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); EXPECT_EQ(ui::kCursorNull, GetCurrentCursorType()); generator.MoveMouseTo(200, 100); + VerifyResizeShadow(true); EXPECT_EQ(HTBOTTOMRIGHT, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorSouthEastResize, GetCurrentCursorType()); generator.MoveMouseTo(50, 100); + VerifyResizeShadow(true); EXPECT_EQ(HTBOTTOM, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorSouthResize, GetCurrentCursorType()); generator.MoveMouseTo(50, 100 + ash::kResizeOutsideBoundsSize - 1); + VerifyResizeShadow(true); EXPECT_EQ(HTBOTTOM, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorSouthResize, GetCurrentCursorType()); generator.MoveMouseTo(50, 100 + ash::kResizeOutsideBoundsSize + 10); - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); EXPECT_EQ(ui::kCursorNull, GetCurrentCursorType()); generator.MoveMouseTo(50, 100 - ash::kResizeInsideBoundsSize); + VerifyResizeShadow(true); EXPECT_EQ(HTBOTTOM, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorSouthResize, GetCurrentCursorType()); generator.MoveMouseTo(50, 100 - ash::kResizeInsideBoundsSize - 10); - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); EXPECT_EQ(ui::kCursorNull, GetCurrentCursorType()); } @@ -159,14 +183,17 @@ generator.MoveMouseTo(200, 50); generator.PressLeftButton(); + VerifyResizeShadow(true); EXPECT_EQ(HTRIGHT, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorEastResize, GetCurrentCursorType()); generator.MoveMouseTo(210, 50); + VerifyResizeShadow(true); EXPECT_EQ(HTRIGHT, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorEastResize, GetCurrentCursorType()); generator.ReleaseLeftButton(); + VerifyResizeShadow(true); EXPECT_EQ(HTRIGHT, ResizeShadowHitTest()); EXPECT_EQ(ui::kCursorEastResize, GetCurrentCursorType()); @@ -206,7 +233,7 @@ gfx::Point right_center(bounds.right() - 1, (bounds.y() + bounds.bottom()) / 2); generator.MoveMouseTo(right_center); - EXPECT_FALSE(HasResizeShadow()); + VerifyResizeShadow(false); EXPECT_EQ(ui::kCursorNull, GetCurrentCursorType()); ash::wm::GetWindowState(window())->Restore();
diff --git a/ash/wm/resize_shadow_controller.cc b/ash/wm/resize_shadow_controller.cc index a3dc276..ebef13e 100644 --- a/ash/wm/resize_shadow_controller.cc +++ b/ash/wm/resize_shadow_controller.cc
@@ -37,26 +37,12 @@ return GetShadowForWindow(window); } -void ResizeShadowController::OnWindowBoundsChanged( - aura::Window* window, - const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) { - ResizeShadow* shadow = GetShadowForWindow(window); - if (shadow) - shadow->Layout(new_bounds); -} - -void ResizeShadowController::OnWindowDestroyed(aura::Window* window) { +void ResizeShadowController::OnWindowDestroying(aura::Window* window) { window_shadows_.erase(window); } ResizeShadow* ResizeShadowController::CreateShadow(aura::Window* window) { - auto shadow = base::MakeUnique<ResizeShadow>(); - // Attach the layers to this window. - shadow->Init(window); - // Ensure initial bounds are correct. - shadow->Layout(window->bounds()); - // Watch for bounds changes. + auto shadow = base::MakeUnique<ResizeShadow>(window); window->AddObserver(this); ResizeShadow* raw_shadow = shadow.get();
diff --git a/ash/wm/resize_shadow_controller.h b/ash/wm/resize_shadow_controller.h index cd07058..31fcf6e 100644 --- a/ash/wm/resize_shadow_controller.h +++ b/ash/wm/resize_shadow_controller.h
@@ -36,10 +36,7 @@ ResizeShadow* GetShadowForWindowForTest(aura::Window* window); // aura::WindowObserver overrides: - void OnWindowBoundsChanged(aura::Window* window, - const gfx::Rect& old_bounds, - const gfx::Rect& new_bounds) override; - void OnWindowDestroyed(aura::Window* window) override; + void OnWindowDestroying(aura::Window* window) override; private: // Creates a shadow for a given window and returns it. |window_shadows_|
diff --git a/base/BUILD.gn b/base/BUILD.gn index 9d2afd8..4790de0d 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -1196,6 +1196,7 @@ "process/internal_linux.cc", "process/memory_linux.cc", "process/process_handle_linux.cc", + "process/process_info_linux.cc", "process/process_iterator_linux.cc", "process/process_metrics_linux.cc", "sys_info_linux.cc", @@ -1702,6 +1703,7 @@ "i18n/time_formatting.h", "i18n/timezone.cc", "i18n/timezone.h", + "i18n/unicodestring.h", "i18n/utf8_validator_tables.cc", "i18n/utf8_validator_tables.h", ] @@ -2054,6 +2056,7 @@ "process/memory_unittest.cc", "process/memory_unittest_mac.h", "process/memory_unittest_mac.mm", + "process/process_info_unittest.cc", "process/process_metrics_unittest.cc", "process/process_metrics_unittest_ios.cc", "process/process_unittest.cc",
diff --git a/base/android/jni_weak_ref.cc b/base/android/jni_weak_ref.cc index 88efa72..fe7ea2e 100644 --- a/base/android/jni_weak_ref.cc +++ b/base/android/jni_weak_ref.cc
@@ -19,8 +19,7 @@ Assign(orig); } -JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef( - JavaObjectWeakGlobalRef&& orig) noexcept +JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef&& orig) : obj_(orig.obj_) { orig.obj_ = nullptr; }
diff --git a/base/android/jni_weak_ref.h b/base/android/jni_weak_ref.h index 43a26b5f..223c47b 100644 --- a/base/android/jni_weak_ref.h +++ b/base/android/jni_weak_ref.h
@@ -18,7 +18,7 @@ public: JavaObjectWeakGlobalRef(); JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef& orig); - JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef&& orig) noexcept; + JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef&& orig); JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj); JavaObjectWeakGlobalRef(JNIEnv* env, const base::android::JavaRef<jobject>& obj);
diff --git a/base/i18n/message_formatter.cc b/base/i18n/message_formatter.cc index 702e51b..6962a282 100644 --- a/base/i18n/message_formatter.cc +++ b/base/i18n/message_formatter.cc
@@ -4,6 +4,7 @@ #include "base/i18n/message_formatter.h" +#include "base/i18n/unicodestring.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/time/time.h" @@ -91,7 +92,7 @@ << u_errorName(error); return string16(); } - return string16(formatted.getBuffer(), formatted.length()); + return i18n::UnicodeStringToString16(formatted); } string16 MessageFormatter::FormatWithNamedArgs( @@ -134,7 +135,7 @@ << u_errorName(error); return string16(); } - return string16(formatted.getBuffer(), formatted.length()); + return i18n::UnicodeStringToString16(formatted); } } // namespace i18n
diff --git a/base/i18n/number_formatting.cc b/base/i18n/number_formatting.cc index 0365f2c..0ab031ec 100644 --- a/base/i18n/number_formatting.cc +++ b/base/i18n/number_formatting.cc
@@ -10,6 +10,7 @@ #include "base/format_macros.h" #include "base/i18n/message_formatter.h" +#include "base/i18n/unicodestring.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/strings/string_util.h" @@ -60,7 +61,7 @@ icu::UnicodeString ustr; number_format->format(number, ustr); - return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length())); + return i18n::UnicodeStringToString16(ustr); } string16 FormatDouble(double number, int fractional_digits) { @@ -76,7 +77,7 @@ icu::UnicodeString ustr; number_format->format(number, ustr); - return string16(ustr.getBuffer(), static_cast<size_t>(ustr.length())); + return i18n::UnicodeStringToString16(ustr); } string16 FormatPercent(int number) {
diff --git a/base/i18n/string_compare.cc b/base/i18n/string_compare.cc index 2851e7d..649c281 100644 --- a/base/i18n/string_compare.cc +++ b/base/i18n/string_compare.cc
@@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/strings/utf_string_conversions.h" +#include "third_party/icu/source/common/unicode/unistr.h" namespace base { namespace i18n { @@ -17,8 +18,8 @@ const string16& rhs) { UErrorCode error = U_ZERO_ERROR; UCollationResult result = collator.compare( - static_cast<const UChar*>(lhs.c_str()), static_cast<int>(lhs.length()), - static_cast<const UChar*>(rhs.c_str()), static_cast<int>(rhs.length()), + icu::UnicodeString(FALSE, lhs.c_str(), static_cast<int>(lhs.length())), + icu::UnicodeString(FALSE, rhs.c_str(), static_cast<int>(rhs.length())), error); DCHECK(U_SUCCESS(error)); return result;
diff --git a/base/i18n/time_formatting.cc b/base/i18n/time_formatting.cc index 4755bdd..3a5394a 100644 --- a/base/i18n/time_formatting.cc +++ b/base/i18n/time_formatting.cc
@@ -8,6 +8,7 @@ #include <memory> +#include "base/i18n/unicodestring.h" #include "base/logging.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" @@ -28,8 +29,7 @@ icu::UnicodeString date_string; formatter->format(static_cast<UDate>(time.ToDoubleT() * 1000), date_string); - return string16(date_string.getBuffer(), - static_cast<size_t>(date_string.length())); + return i18n::UnicodeStringToString16(date_string); } string16 TimeFormatWithoutAmPm(const icu::DateFormat* formatter, @@ -48,8 +48,7 @@ begin--; time_string.removeBetween(begin, ampm_field.getEndIndex()); } - return string16(time_string.getBuffer(), - static_cast<size_t>(time_string.length())); + return i18n::UnicodeStringToString16(time_string); } icu::SimpleDateFormat CreateSimpleDateFormatter(const char* pattern) { @@ -214,7 +213,7 @@ return false; } - *out = base::string16(formatted.getBuffer(), formatted.length()); + *out = i18n::UnicodeStringToString16(formatted); return true; } @@ -237,7 +236,7 @@ icu::UnicodeString formatted; icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE); measure_format.formatMeasures(measures, 3, formatted, ignore, status); - *out = base::string16(formatted.getBuffer(), formatted.length()); + *out = i18n::UnicodeStringToString16(formatted); return U_SUCCESS(status) == TRUE; } @@ -256,8 +255,7 @@ icu::DateInterval interval(start_date, end_date); icu::UnicodeString formatted; formatter->format(&interval, formatted, pos, status); - return string16(formatted.getBuffer(), - static_cast<size_t>(formatted.length())); + return i18n::UnicodeStringToString16(formatted); } HourClockType GetHourClockType() {
diff --git a/base/i18n/time_formatting_unittest.cc b/base/i18n/time_formatting_unittest.cc index aa6fe6e..98b6a209 100644 --- a/base/i18n/time_formatting_unittest.cc +++ b/base/i18n/time_formatting_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/i18n/rtl.h" +#include "base/i18n/unicodestring.h" #include "base/strings/utf_string_conversions.h" #include "base/test/icu_test_util.h" #include "base/time/time.h" @@ -37,7 +38,7 @@ zone_formatter->format(UTZFMT_STYLE_SPECIFIC_SHORT, *zone, static_cast<UDate>(time.ToDoubleT() * 1000), name, nullptr); - return string16(name.getBuffer(), name.length()); + return i18n::UnicodeStringToString16(name); } // Calls TimeDurationFormat() with |delta| and |width| and returns the resulting
diff --git a/base/i18n/timezone.cc b/base/i18n/timezone.cc index e881c9d..95e7aee3 100644 --- a/base/i18n/timezone.cc +++ b/base/i18n/timezone.cc
@@ -610,9 +610,9 @@ std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault()); icu::UnicodeString id; zone->getID(id); - string16 olson_code(id.getBuffer(), id.length()); + std::string olson_code; return TimezoneMap::GetInstance()->CountryCodeForTimezone( - UTF16ToUTF8(olson_code)); + id.toUTF8String(olson_code)); } } // namespace base
diff --git a/base/i18n/unicodestring.h b/base/i18n/unicodestring.h new file mode 100644 index 0000000..b62c526 --- /dev/null +++ b/base/i18n/unicodestring.h
@@ -0,0 +1,32 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_I18N_UNICODESTRING_H_ +#define BASE_I18N_UNICODESTRING_H_ + +#include "base/strings/string16.h" +#include "third_party/icu/source/common/unicode/unistr.h" +#include "third_party/icu/source/common/unicode/uvernum.h" + +#if U_ICU_VERSION_MAJOR_NUM >= 59 +#include "third_party/icu/source/common/unicode/char16ptr.h" +#endif + +namespace base { +namespace i18n { + +inline string16 UnicodeStringToString16(const icu::UnicodeString& unistr) { +#if U_ICU_VERSION_MAJOR_NUM >= 59 + return base::string16(icu::toUCharPtr(unistr.getBuffer()), + static_cast<size_t>(unistr.length())); +#else + return base::string16(unistr.getBuffer(), + static_cast<size_t>(unistr.length())); +#endif +} + +} // namespace i18n +} // namespace base + +#endif // BASE_UNICODESTRING_H_
diff --git a/base/process/process_info_linux.cc b/base/process/process_info_linux.cc index 7cec8f4e..2f22748 100644 --- a/base/process/process_info_linux.cc +++ b/base/process/process_info_linux.cc
@@ -17,10 +17,12 @@ const Time CurrentProcessInfo::CreationTime() { int64_t start_ticks = internal::ReadProcSelfStatsAndGetFieldAsInt64(internal::VM_STARTTIME); - DCHECK(start_ticks); + if (!start_ticks) + return Time(); TimeDelta start_offset = internal::ClockTicksToTimeDelta(start_ticks); Time boot_time = internal::GetBootTime(); - DCHECK(!boot_time.is_null()); + if (boot_time.is_null()) + return Time(); return Time(boot_time + start_offset); }
diff --git a/base/process/process_info_unittest.cc b/base/process/process_info_unittest.cc new file mode 100644 index 0000000..a757774 --- /dev/null +++ b/base/process/process_info_unittest.cc
@@ -0,0 +1,20 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/process/process_info.h" + +#include "base/time/time.h" +#include "build/build_config.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { + +#if !defined(OS_IOS) +TEST(ProcessInfoTest, CreationTime) { + Time creation_time = CurrentProcessInfo::CreationTime(); + ASSERT_FALSE(creation_time.is_null()); +} +#endif // !defined(OS_IOS) + +} // namespace base
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java index bdc083c7..377a1ee 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
@@ -27,6 +27,10 @@ mTargetContext = targetContext; } + protected Context getTargetContext() { + return mTargetContext; + } + @Override public boolean shouldSkip(FrameworkMethod frameworkMethod) { if (frameworkMethod == null) return true;
diff --git a/base/test/scoped_async_task_scheduler.h b/base/test/scoped_async_task_scheduler.h index 66757d3..3fec517 100644 --- a/base/test/scoped_async_task_scheduler.h +++ b/base/test/scoped_async_task_scheduler.h
@@ -14,20 +14,17 @@ namespace test { // Allows usage of the base/task_scheduler/post_task.h API within its scope. -// Tasks run asynchronously, one at a time. // -// To wait until all posted tasks have run, use +// To wait until all tasks posted without a delay have run, use // TaskScheduler::GetInstance()->FlushForTesting(). -// -// When possible, use ScopedTaskScheduler instead of this. Tasks posted within -// the scope of a ScopedTaskScheduler run synchronously, which makes tests -// easier to understand. class ScopedAsyncTaskScheduler { public: // Registers a single-threaded TaskScheduler. ScopedAsyncTaskScheduler(); // Shuts down and unregisters the TaskScheduler. + // + // It is guaranteed that all BLOCK_SHUTDOWN tasks have run when this returns. ~ScopedAsyncTaskScheduler(); private:
diff --git a/base/trace_event/memory_dump_scheduler.cc b/base/trace_event/memory_dump_scheduler.cc index eaa8d63..1c1c78e 100644 --- a/base/trace_event/memory_dump_scheduler.cc +++ b/base/trace_event/memory_dump_scheduler.cc
@@ -96,7 +96,7 @@ void MemoryDumpScheduler::NotifyDumpTriggered() { if (polling_state_.polling_task_runner && - polling_state_.polling_task_runner->RunsTasksOnCurrentThread()) { + !polling_state_.polling_task_runner->RunsTasksOnCurrentThread()) { polling_state_.polling_task_runner->PostTask( FROM_HERE, Bind(&MemoryDumpScheduler::NotifyDumpTriggered, Unretained(this))); @@ -115,7 +115,7 @@ } void MemoryDumpScheduler::DisablePolling() { - if (polling_state_.polling_task_runner->RunsTasksOnCurrentThread()) { + if (!polling_state_.polling_task_runner->RunsTasksOnCurrentThread()) { if (polling_state_.polling_task_runner->PostTask( FROM_HERE, Bind(&MemoryDumpScheduler::DisablePolling, Unretained(this))))
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc index 6dddb94..4c03aeb 100644 --- a/base/trace_event/trace_log.cc +++ b/base/trace_event/trace_log.cc
@@ -19,6 +19,7 @@ #include "base/memory/ref_counted_memory.h" #include "base/memory/singleton.h" #include "base/message_loop/message_loop.h" +#include "base/process/process_info.h" #include "base/process/process_metrics.h" #include "base/stl_util.h" #include "base/strings/string_split.h" @@ -1500,6 +1501,16 @@ process_name_); } +#if !defined(OS_NACL) && !defined(OS_IOS) + Time process_creation_time = CurrentProcessInfo::CreationTime(); + if (!process_creation_time.is_null()) { + TimeDelta process_uptime = Time::Now() - process_creation_time; + InitializeMetadataEvent(AddEventToThreadSharedChunkWhileLocked(NULL, false), + current_thread_id, "process_uptime_seconds", + "uptime", process_uptime.InSeconds()); + } +#endif // !defined(OS_NACL) && !defined(OS_IOS) + if (!process_labels_.empty()) { std::vector<std::string> labels; for (const auto& it : process_labels_)
diff --git a/base/value_conversions.cc b/base/value_conversions.cc index 9320fee..7f22000 100644 --- a/base/value_conversions.cc +++ b/base/value_conversions.cc
@@ -9,6 +9,7 @@ #include <string> #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "base/values.h" @@ -17,8 +18,8 @@ // |Value| internally stores strings in UTF-8, so we have to convert from the // system native code to UTF-8 and back. -Value* CreateFilePathValue(const FilePath& in_value) { - return new Value(in_value.AsUTF8Unsafe()); +std::unique_ptr<Value> CreateFilePathValue(const FilePath& in_value) { + return base::MakeUnique<Value>(in_value.AsUTF8Unsafe()); } bool GetValueAsFilePath(const Value& value, FilePath* file_path) { @@ -32,9 +33,9 @@ // |Value| does not support 64-bit integers, and doubles do not have enough // precision, so we store the 64-bit time value as a string instead. -Value* CreateTimeDeltaValue(const TimeDelta& time) { +std::unique_ptr<Value> CreateTimeDeltaValue(const TimeDelta& time) { std::string string_value = base::Int64ToString(time.ToInternalValue()); - return new Value(string_value); + return base::MakeUnique<Value>(string_value); } bool GetValueAsTimeDelta(const Value& value, TimeDelta* time) {
diff --git a/base/value_conversions.h b/base/value_conversions.h index 8a464ab..bfdec70 100644 --- a/base/value_conversions.h +++ b/base/value_conversions.h
@@ -7,9 +7,9 @@ // This file contains methods to convert things to a |Value| and back. +#include <memory> #include "base/base_export.h" - namespace base { class FilePath; @@ -17,10 +17,11 @@ class Value; // The caller takes ownership of the returned value. -BASE_EXPORT Value* CreateFilePathValue(const FilePath& in_value); +BASE_EXPORT std::unique_ptr<Value> CreateFilePathValue( + const FilePath& in_value); BASE_EXPORT bool GetValueAsFilePath(const Value& value, FilePath* file_path); -BASE_EXPORT Value* CreateTimeDeltaValue(const TimeDelta& time); +BASE_EXPORT std::unique_ptr<Value> CreateTimeDeltaValue(const TimeDelta& time); BASE_EXPORT bool GetValueAsTimeDelta(const Value& value, TimeDelta* time); } // namespace base
diff --git a/base/values.cc b/base/values.cc index 7ae3b63..fef999c4 100644 --- a/base/values.cc +++ b/base/values.cc
@@ -91,7 +91,7 @@ InternalCopyConstructFrom(that); } -Value::Value(Value&& that) noexcept { +Value::Value(Value&& that) { InternalMoveConstructFrom(std::move(that)); }
diff --git a/base/values.h b/base/values.h index f74f543..b7ca355 100644 --- a/base/values.h +++ b/base/values.h
@@ -74,7 +74,7 @@ size_t size); Value(const Value& that); - Value(Value&& that) noexcept; + Value(Value&& that); Value(); // A null value. explicit Value(Type type); explicit Value(bool in_bool);
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index 3a5a4d21..a09c0f5 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn
@@ -126,6 +126,16 @@ ] } +group("logdog_wrapper_py") { + _py_files = read_file("test_wrapper/logdog_wrapper.pydeps", "list lines") + + # Filter out comments. + set_sources_assignment_filter([ "#*" ]) + sources = _py_files + + data = sources +} + # Create wrapper scripts in out/bin that takes care of setting the # --output-directory. _scripts_to_wrap = [
diff --git a/build/android/pylib/android/logdog_logcat_monitor.py b/build/android/pylib/android/logdog_logcat_monitor.py index a89b9f4..5a51cdb 100644 --- a/build/android/pylib/android/logdog_logcat_monitor.py +++ b/build/android/pylib/android/logdog_logcat_monitor.py
@@ -59,10 +59,14 @@ def record_to_stream(): if self._logdog_stream: for data in self._adb.Logcat(filter_specs=self._filter_specs, - logcat_format='threadtime'): + logcat_format='threadtime', + iter_timeout=0.08): if self._stop_recording_event.isSet(): return - self._logdog_stream.write(data + '\n') + if data: + self._logdog_stream.write(data + '\n') + if self._stop_recording_event.isSet(): + return self._stop_recording_event.clear() if not self._record_thread:
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py index d3e636e..a8d9f5e 100644 --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -35,6 +35,7 @@ ('SmallTest', 1 * 60), ] +LOGCAT_FILTERS = ['*:e', 'chromium:v', 'cr_*:v'] # TODO(jbudorick): Make this private once the instrumentation test_runner is # deprecated. @@ -295,7 +296,8 @@ time.strftime('%Y%m%dT%H%M%S', time.localtime()), device.serial) logmon = logdog_logcat_monitor.LogdogLogcatMonitor( - device.adb, stream_name) + device.adb, stream_name, filter_specs=LOGCAT_FILTERS) + with contextlib_ext.Optional( logmon, self._test_instance.should_save_logcat): with contextlib_ext.Optional(
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py index dd007bd2..89e7dca 100755 --- a/build/android/resource_sizes.py +++ b/build/android/resource_sizes.py
@@ -736,6 +736,9 @@ argparser.add_argument('--no-output-dir', action='store_true', help='Skip all measurements that rely on having ' 'output-dir') + argparser.add_argument('--no-static-initializer-check', action='store_false', + dest='static_initializer_check', default=True, + help='Skip checking for static initializers') argparser.add_argument('-d', '--device', help='Dummy option for perf runner.') argparser.add_argument('--estimate-patch-size', action='store_true', @@ -772,8 +775,9 @@ args.reference_apk_bucket, chartjson=chartjson) if not args.no_output_dir: PrintPakAnalysis(args.apk, args.min_pak_resource_size) - _PrintStaticInitializersCountFromApk( - args.apk, tools_prefix, chartjson=chartjson) + if args.static_initializer_check: + _PrintStaticInitializersCountFromApk( + args.apk, tools_prefix, chartjson=chartjson) if chartjson: results_path = os.path.join(args.output_dir, 'results-chart.json') logging.critical('Dumping json to %s', results_path)
diff --git a/build/android/test_runner.py b/build/android/test_runner.py index 121a990..deacc6c 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py
@@ -12,6 +12,7 @@ import itertools import logging import os +import shutil import signal import sys import threading @@ -34,6 +35,7 @@ from pylib.base import test_run_factory from pylib.results import json_results from pylib.results import report_results +from pylib.utils import logdog_helper from py_utils import contextlib_ext @@ -233,6 +235,12 @@ help='Run the test under a tool ' '(use --tool help to list them)') + parser.add_argument( + '--upload-logcats-file', + action='store_true', + dest='upload_logcats_file', + help='Whether to upload logcat file to logdog.') + logcat_output_group = parser.add_mutually_exclusive_group() logcat_output_group.add_argument( '--logcat-output-dir', type=os.path.realpath, @@ -735,6 +743,24 @@ write_json_file(), args.json_results_file) + @contextlib.contextmanager + def upload_logcats_file(): + try: + yield + finally: + if not args.logcat_output_file: + logging.critical('Cannot upload logcats file. ' + 'File to save logcat is not specified.') + else: + with open(args.logcat_output_file) as src: + dst = logdog_helper.open_text('unified_logcats') + if dst: + shutil.copyfileobj(src, dst) + + logcats_uploader = contextlib_ext.Optional( + upload_logcats_file(), + 'upload_logcats_file' in args and args.upload_logcats_file) + ### Set up test objects. env = environment_factory.CreateEnvironment(args, infra_error) @@ -744,7 +770,7 @@ ### Run. - with json_writer, env, test_instance, test_run: + with json_writer, logcats_uploader, env, test_instance, test_run: repetitions = (xrange(args.repeat + 1) if args.repeat >= 0 else itertools.count())
diff --git a/build/android/test_wrapper/logdog_wrapper.py b/build/android/test_wrapper/logdog_wrapper.py index 14ed7d13..e3904f5 100755 --- a/build/android/test_wrapper/logdog_wrapper.py +++ b/build/android/test_wrapper/logdog_wrapper.py
@@ -11,81 +11,78 @@ import signal import subprocess import sys -import urllib +_SRC_PATH = os.path.abspath(os.path.join( + os.path.dirname(__file__), '..', '..', '..')) +sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'devil')) +sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'common', + 'py_utils')) + +from devil.utils import signal_handler +from py_utils import tempfile_ext + +PROJECT = 'chromium' +OUTPUT = 'logdog' +COORDINATOR_HOST = 'luci-logdog.appspot.com' +SERVICE_ACCOUNT_JSON = ('/creds/service_accounts' + '/service-account-luci-logdog-publisher.json') def CommandParser(): # Parses the command line arguments being passed in parser = argparse.ArgumentParser() + parser.add_argument('--target', required=True, + help='The test target to be run.') parser.add_argument('--logdog-bin-cmd', required=True, - help='Command for running logdog butler binary') - parser.add_argument('--project', required=True, - help='Name of logdog project') - parser.add_argument('--logdog-server', - default='services-dot-luci-logdog.appspot.com', - help='URL of logdog server, https:// is assumed.') - parser.add_argument('--service-account-json', required=True, - help='Location of authentication json') - parser.add_argument('--prefix', required=True, - help='Prefix to be used for logdog stream') - parser.add_argument('--source', required=True, - help='Location of file for logdog to stream') - parser.add_argument('--name', required=True, - help='Name to be used for logdog stream') + help='The logdog bin cmd.') + parser.add_argument('--target-devices-file', required=False, + help='The target devices file.') return parser - -def CreateUrl(server, project, prefix, name): - stream_name = '%s/%s/+/%s' % (project, prefix, name) - return 'https://%s/v/?s=%s' % (server, urllib.quote_plus(stream_name)) - - -def CreateSignalForwarder(proc): - def handler(signum, _frame): +def CreateStopTestsMethod(proc): + def StopTests(signum, _frame): logging.error('Forwarding signal %s to test process', str(signum)) proc.send_signal(signum) - - return handler - + return StopTests def main(): parser = CommandParser() - args, test_cmd = parser.parse_known_args(sys.argv[1:]) + args, extra_cmd_args = parser.parse_known_args(sys.argv[1:]) + logging.basicConfig(level=logging.INFO) - if not test_cmd: - parser.error('Must specify command to run after the logdog flags') - test_proc = subprocess.Popen(test_cmd) - original_sigterm_handler = signal.signal( - signal.SIGTERM, CreateSignalForwarder(test_proc)) - try: - result = test_proc.wait() - finally: - signal.signal(signal.SIGTERM, original_sigterm_handler) - if '${SWARMING_TASK_ID}' in args.prefix: - args.prefix = args.prefix.replace('${SWARMING_TASK_ID}', - os.environ.get('SWARMING_TASK_ID')) - url = CreateUrl('luci-logdog.appspot.com', args.project, args.prefix, - args.name) - logdog_cmd = [args.logdog_bin_cmd, '-project', args.project, - '-output', 'logdog,host=%s' % args.logdog_server, - '-prefix', args.prefix, - '-service-account-json', args.service_account_json, - 'stream', '-source', args.source, - '-stream', '-name=%s' % args.name] + with tempfile_ext.NamedTemporaryDirectory() as logcat_output_dir: + test_cmd = [ + os.path.join('bin', 'run_%s' % args.target), + '--logcat-output-file', os.path.join(logcat_output_dir, 'logcats'), + '--upload-logcats-file', + '--target-devices-file', args.target_devices_file, + '-v'] + extra_cmd_args - if not os.path.exists(args.logdog_bin_cmd): - logging.error( - 'Logdog binary %s unavailable. Unable to upload logcats.', - args.logdog_bin_cmd) - elif not os.path.exists(args.source): - logging.error( - 'Logcat sources not found at %s. Unable to upload logcats.', - args.source) - else: - subprocess.call(logdog_cmd) - logging.info('Logcats are located at: %s', url) - return result + with tempfile_ext.NamedTemporaryDirectory( + prefix='tmp_android_logdog_wrapper') as temp_directory: + if not os.path.exists(args.logdog_bin_cmd): + logging.error( + 'Logdog binary %s unavailable. Unable to create logdog client', + args.logdog_bin_cmd) + else: + streamserver_uri = 'unix:%s' % os.path.join(temp_directory, + 'butler.sock') + prefix = os.path.join('android', 'swarming', 'logcats', + os.environ.get('SWARMING_TASK_ID')) + # Call test_cmdline through logdog butler subcommand. + test_cmd = [ + args.logdog_bin_cmd, '-project', PROJECT, + '-output', OUTPUT, + '-prefix', prefix, + '--service-account-json', SERVICE_ACCOUNT_JSON, + '-coordinator-host', COORDINATOR_HOST, + 'run', '-streamserver-uri', streamserver_uri, '--'] + test_cmd + + test_proc = subprocess.Popen(test_cmd) + with signal_handler.SignalHandler(signal.SIGTERM, + CreateStopTestsMethod(test_proc)): + result = test_proc.wait() + return result if __name__ == '__main__': sys.exit(main())
diff --git a/build/android/test_wrapper/logdog_wrapper.pydeps b/build/android/test_wrapper/logdog_wrapper.pydeps new file mode 100644 index 0000000..cd57f2fd --- /dev/null +++ b/build/android/test_wrapper/logdog_wrapper.pydeps
@@ -0,0 +1,11 @@ +# Generated by running: +# build/print_python_deps.py --root build/android --output build/android/test_wrapper/logdog_wrapper.pydeps build/android/test_wrapper/logdog_wrapper.py +../../third_party/catapult/common/py_utils/py_utils/__init__.py +../../third_party/catapult/common/py_utils/py_utils/tempfile_ext.py +../../third_party/catapult/devil/devil/__init__.py +../../third_party/catapult/devil/devil/utils/__init__.py +../../third_party/catapult/devil/devil/utils/reraiser_thread.py +../../third_party/catapult/devil/devil/utils/signal_handler.py +../../third_party/catapult/devil/devil/utils/timeout_retry.py +../../third_party/catapult/devil/devil/utils/watchdog_timer.py +test_wrapper/logdog_wrapper.py
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index d2d9f99..9ef8d27 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -483,7 +483,11 @@ script = "//build/android/gyp/create_test_runner_script.py" depfile = "$target_gen_dir/$target_name.d" - data_deps += [ "//build/android:test_runner_py" ] + data_deps += [ + "//build/android:test_runner_py", + "//build/android:logdog_wrapper_py", + ] + data = [] test_runner_args = [
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 3fb6c90..0419926d 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -303,11 +303,17 @@ # --------------------------------- if (is_linux || is_android) { if (use_pic) { - cflags += [ "-fPIC" ] - ldflags += [ "-fPIC" ] + cflags += [ + "-fPIC", + ] + ldflags += [ + "-fPIC", + ] } - cflags += [ "-pipe" ] # Use pipes for communicating between sub-processes. Faster. + cflags += [ + "-pipe", # Use pipes for communicating between sub-processes. Faster. + ] ldflags += [ "-Wl,-z,noexecstack", @@ -899,10 +905,6 @@ # This is necessary for the shared library build. "/wd4251", - # C4312 is a VS 2015 64-bit warning for integer to larger pointer. - # TODO(brucedawson): fix warnings, crbug.com/554200 - "/wd4312", - # C4351: new behavior: elements of array 'array' will be default # initialized # This is a silly "warning" that basically just alerts you that the @@ -965,10 +967,10 @@ "/wd4459", ] - cflags_cc += [ - # Allow "noexcept" annotations even though we compile with exceptions - # disabled. - "/wd4577", + cflags += [ + # C4312 is a VS 2015 64-bit warning for integer to larger pointer. + # TODO(brucedawson): fix warnings, crbug.com/554200 + "/wd4312", ] if (current_cpu == "x86") {
diff --git a/build/secondary/third_party/crashpad/crashpad/minidump/BUILD.gn b/build/secondary/third_party/crashpad/crashpad/minidump/BUILD.gn index d18fd71c..ebc8f3b 100644 --- a/build/secondary/third_party/crashpad/crashpad/minidump/BUILD.gn +++ b/build/secondary/third_party/crashpad/crashpad/minidump/BUILD.gn
@@ -59,6 +59,8 @@ "minidump_thread_writer.h", "minidump_unloaded_module_writer.cc", "minidump_unloaded_module_writer.h", + "minidump_user_extension_stream_data_source.cc", + "minidump_user_extension_stream_data_source.h", "minidump_user_stream_writer.cc", "minidump_user_stream_writer.h", "minidump_writable.cc",
diff --git a/build/secondary/third_party/crashpad/crashpad/util/BUILD.gn b/build/secondary/third_party/crashpad/crashpad/util/BUILD.gn index 75be549..feaf97e25 100644 --- a/build/secondary/third_party/crashpad/crashpad/util/BUILD.gn +++ b/build/secondary/third_party/crashpad/crashpad/util/BUILD.gn
@@ -49,6 +49,8 @@ static_library("util") { sources = [ + "file/delimited_file_reader.cc", + "file/delimited_file_reader.h", "file/file_io.cc", "file/file_io.h", "file/file_io_posix.cc",
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index ca386aa..ac4e8b1d 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -853,6 +853,7 @@ # Setup. "test/cc_test_suite.cc", + "test/cc_test_suite.h", "test/run_all_unittests.cc", ] @@ -911,6 +912,7 @@ "raster/texture_compressor_perftest.cc", "surfaces/surface_aggregator_perftest.cc", "test/cc_test_suite.cc", + "test/cc_test_suite.h", "test/run_all_perftests.cc", "tiles/software_image_decode_cache_perftest.cc", "tiles/tile_manager_perftest.cc",
diff --git a/cc/blink/BUILD.gn b/cc/blink/BUILD.gn index a1053c5..27fd6c5 100644 --- a/cc/blink/BUILD.gn +++ b/cc/blink/BUILD.gn
@@ -53,6 +53,7 @@ # Setup. "test/cc_blink_test_suite.cc", + "test/cc_blink_test_suite.h", "test/run_all_unittests.cc", ]
diff --git a/cc/input/scrollbar_animation_controller.cc b/cc/input/scrollbar_animation_controller.cc index 52f83e5..b5a85d7 100644 --- a/cc/input/scrollbar_animation_controller.cc +++ b/cc/input/scrollbar_animation_controller.cc
@@ -50,9 +50,10 @@ is_animating_(false), scroll_layer_id_(scroll_layer_id), currently_scrolling_(false), - scroll_gesture_has_scrolled_(false), + show_in_fast_scroll_(false), opacity_(0.0f), fade_out_duration_(fade_out_duration), + show_scrollbars_on_scroll_gesture_(false), need_thinning_animation_(false), weak_factory_(this) { ApplyOpacityToScrollbars(0.0f); @@ -74,9 +75,10 @@ is_animating_(false), scroll_layer_id_(scroll_layer_id), currently_scrolling_(false), - scroll_gesture_has_scrolled_(false), + show_in_fast_scroll_(false), opacity_(0.0f), fade_out_duration_(fade_out_duration), + show_scrollbars_on_scroll_gesture_(true), need_thinning_animation_(true), weak_factory_(this) { vertical_controller_ = SingleScrollbarAnimationControllerThinning::Create( @@ -120,6 +122,7 @@ void ScrollbarAnimationController::PostDelayedShow() { DCHECK(delayed_scrollbar_fade_out_.IsCancelled()); + delayed_scrollbar_show_.Cancel(); delayed_scrollbar_show_.Reset(base::Bind(&ScrollbarAnimationController::Show, weak_factory_.GetWeakPtr())); client_->PostDelayedScrollbarAnimationTask(delayed_scrollbar_show_.callback(), @@ -129,6 +132,7 @@ void ScrollbarAnimationController::PostDelayedFadeOut(bool on_resize) { DCHECK(delayed_scrollbar_show_.IsCancelled()); base::TimeDelta delay = on_resize ? fade_out_resize_delay_ : fade_out_delay_; + delayed_scrollbar_fade_out_.Cancel(); delayed_scrollbar_fade_out_.Reset( base::Bind(&ScrollbarAnimationController::StartAnimation, weak_factory_.GetWeakPtr())); @@ -166,17 +170,32 @@ return std::max(std::min(progress, 1.f), 0.f); } -void ScrollbarAnimationController::DidScrollBegin() { - currently_scrolling_ = true; -} - void ScrollbarAnimationController::RunAnimationFrame(float progress) { ApplyOpacityToScrollbars(1.f - progress); if (progress == 1.f) StopAnimation(); } -void ScrollbarAnimationController::DidScrollUpdate(bool on_resize) { +void ScrollbarAnimationController::DidScrollBegin() { + currently_scrolling_ = true; +} + +void ScrollbarAnimationController::DidScrollEnd() { + bool has_scrolled = show_in_fast_scroll_; + show_in_fast_scroll_ = false; + + currently_scrolling_ = false; + + // We don't fade out scrollbar if they need thinning animation and mouse is + // near. + if (need_thinning_animation_ && MouseIsNearAnyScrollbar()) + return; + + if (has_scrolled) + PostDelayedFadeOut(false); +} + +void ScrollbarAnimationController::DidScrollUpdate() { if (need_thinning_animation_ && Captured()) return; @@ -188,9 +207,9 @@ // We don't fade out scrollbar if they need thinning animation and mouse is // near. if (!need_thinning_animation_ || !MouseIsNearAnyScrollbar()) - PostDelayedFadeOut(on_resize); + PostDelayedFadeOut(false); } else { - scroll_gesture_has_scrolled_ = true; + show_in_fast_scroll_ = true; } Show(); @@ -201,19 +220,22 @@ } } -void ScrollbarAnimationController::DidScrollEnd() { - bool has_scrolled = scroll_gesture_has_scrolled_; - scroll_gesture_has_scrolled_ = false; +void ScrollbarAnimationController::WillUpdateScroll() { + if (show_scrollbars_on_scroll_gesture_) + DidScrollUpdate(); +} - currently_scrolling_ = false; +void ScrollbarAnimationController::DidResize() { + StopAnimation(); + Show(); - // We don't fade out scrollbar if they need thinning animation and mouse is - // near. - if (need_thinning_animation_ && MouseIsNearAnyScrollbar()) - return; - - if (has_scrolled) - PostDelayedFadeOut(false); + // As an optimization, we avoid spamming fade delay tasks during active fast + // scrolls. + if (!currently_scrolling_) { + PostDelayedFadeOut(true); + } else { + show_in_fast_scroll_ = true; + } } void ScrollbarAnimationController::DidMouseDown() { @@ -243,6 +265,7 @@ horizontal_controller_->DidMouseLeave(); delayed_scrollbar_show_.Cancel(); + need_trigger_scrollbar_show_ = false; if (ScrollbarsHidden() || Captured()) return;
diff --git a/cc/input/scrollbar_animation_controller.h b/cc/input/scrollbar_animation_controller.h index e00d6ac..e06f594 100644 --- a/cc/input/scrollbar_animation_controller.h +++ b/cc/input/scrollbar_animation_controller.h
@@ -65,8 +65,19 @@ bool Animate(base::TimeTicks now); + // WillUpdateScroll expects to be called even if the scroll position won't + // change as a result of the scroll. Only effect Aura Overlay Scrollbar. + void WillUpdateScroll(); + + // DidScrollUpdate expects to be called only if the scroll position change. + // Effect both Android and Aura Overlay Scrollbar. + void DidScrollUpdate(); + + // DidResize expects to be called when clip layer size changed or scroll layer + // size changed. + void DidResize(); + void DidScrollBegin(); - void DidScrollUpdate(bool on_resize); void DidScrollEnd(); void DidMouseDown(); @@ -135,7 +146,7 @@ const int scroll_layer_id_; bool currently_scrolling_; - bool scroll_gesture_has_scrolled_; + bool show_in_fast_scroll_; base::CancelableClosure delayed_scrollbar_show_; base::CancelableClosure delayed_scrollbar_fade_out_; @@ -143,6 +154,7 @@ float opacity_; base::TimeDelta fade_out_duration_; + const bool show_scrollbars_on_scroll_gesture_; const bool need_thinning_animation_; std::unique_ptr<SingleScrollbarAnimationControllerThinning> vertical_controller_;
diff --git a/cc/input/scrollbar_animation_controller_unittest.cc b/cc/input/scrollbar_animation_controller_unittest.cc index 3d0855e..241aa90 100644 --- a/cc/input/scrollbar_animation_controller_unittest.cc +++ b/cc/input/scrollbar_animation_controller_unittest.cc
@@ -145,18 +145,18 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); ExpectScrollbarsOpacity(1); // Make the Layer non-scrollable, scrollbar disappears. clip_layer_->SetBounds(gfx::Size(200, 200)); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); ExpectScrollbarsOpacity(0); // Make the layer scrollable, scrollbar appears again. clip_layer_->SetBounds(gfx::Size(100, 100)); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); ExpectScrollbarsOpacity(1); } @@ -175,7 +175,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(1, h_scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -187,7 +187,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(0.0f, h_scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -207,7 +207,7 @@ ExpectScrollbarsOpacity(0); EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); ExpectScrollbarsOpacity(1); EXPECT_FALSE(scrollbar_controller_->ScrollbarsHidden()); @@ -229,6 +229,35 @@ EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); } +// Confirm the scrollbar appears by WillUpdateScroll and fade out. +TEST_F(ScrollbarAnimationControllerAuraOverlayTest, + BasicAppearByWillUpdateScrollThenFadeOut) { + base::TimeTicks time; + time += base::TimeDelta::FromSeconds(1); + + // Scrollbar should be invisible. + ExpectScrollbarsOpacity(0); + EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); + + // Scrollbar should appear when scroll will update. + scrollbar_controller_->WillUpdateScroll(); + ExpectScrollbarsOpacity(1); + EXPECT_FALSE(scrollbar_controller_->ScrollbarsHidden()); + + // An fade out animation should have been enqueued. + EXPECT_EQ(kFadeOutDelay, client_.delay()); + EXPECT_FALSE(client_.start_fade().is_null()); + client_.start_fade().Run(); + + // Scrollbar should fade out over kFadeOutDuration. + scrollbar_controller_->Animate(time); + time += kFadeOutDuration; + scrollbar_controller_->Animate(time); + + ExpectScrollbarsOpacity(0); + EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); +} + // Scroll content. Move the mouse near the scrollbar and confirm it becomes // thick. Ensure it remains visible as long as the mouse is near the scrollbar. TEST_F(ScrollbarAnimationControllerAuraOverlayTest, MoveNearAndDontFadeOut) { @@ -236,7 +265,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -277,7 +306,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -319,7 +348,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -347,7 +376,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -383,7 +412,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -420,7 +449,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -471,7 +500,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // An fade out animation should have been enqueued. @@ -510,7 +539,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // A fade out animation should have been enqueued. Start it. @@ -550,7 +579,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); EXPECT_EQ(kFadeOutDelay, client_.delay()); @@ -614,7 +643,7 @@ h_scrollbar_layer_->thumb_thickness_scale_factor()); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); // Now that we've received a scroll, we should be thick without an animation. ExpectScrollbarsOpacity(1); @@ -649,7 +678,7 @@ // A ScrollUpdate without a ScrollBegin indicates a main thread scroll update // so we should schedule a fade out animation without waiting for a ScrollEnd // (which will never come). - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(client_.start_fade().is_null()); EXPECT_EQ(kFadeOutDelay, client_.delay()); @@ -658,7 +687,7 @@ // If we got a ScrollBegin, we shouldn't schedule the fade out animation until // we get a corresponding ScrollEnd. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_TRUE(client_.start_fade().is_null()); scrollbar_controller_->DidScrollEnd(); EXPECT_FALSE(client_.start_fade().is_null()); @@ -670,16 +699,16 @@ TEST_F(ScrollbarAnimationControllerAuraOverlayTest, ResizeFadeDuration) { ASSERT_TRUE(client_.delay().is_zero()); - scrollbar_controller_->DidScrollUpdate(true); + scrollbar_controller_->DidResize(); EXPECT_FALSE(client_.start_fade().is_null()); EXPECT_EQ(kResizeFadeOutDelay, client_.delay()); client_.delay() = base::TimeDelta(); // We should use the gesture delay rather than the resize delay if we're in a - // gesture scroll, even if the resize param is set. + // gesture scroll, even if it is resizing. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(true); + scrollbar_controller_->DidResize(); scrollbar_controller_->DidScrollEnd(); EXPECT_FALSE(client_.start_fade().is_null()); @@ -693,7 +722,7 @@ // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // Appearance is instant. @@ -725,7 +754,7 @@ EXPECT_CALL(client_, DidChangeScrollbarVisibility()).Times(1); // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(scrollbar_controller_->ScrollbarsHidden()); Mock::VerifyAndClearExpectations(&client_); @@ -760,7 +789,7 @@ // Calling DidScrollUpdate without a begin (i.e. update from commit) should // also notify. EXPECT_CALL(client_, DidChangeScrollbarVisibility()).Times(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(scrollbar_controller_->ScrollbarsHidden()); Mock::VerifyAndClearExpectations(&client_); } @@ -773,7 +802,7 @@ // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // Near vertical scrollbar @@ -866,7 +895,7 @@ // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // Near both Scrollbar @@ -896,7 +925,7 @@ // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // Near vertical scrollbar. @@ -962,7 +991,7 @@ // Scroll to make the scrollbars visible. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); // Should not have delay fadeout animation. @@ -1044,7 +1073,7 @@ // Scrollbars should cancel delay show when mouse hover hidden scrollbar then // move out of window. TEST_F(ScrollbarAnimationControllerAuraOverlayTest, - MouseHoverThenLeaveShouldCancelShow) { + MouseHoverThenLeaveShouldCancelShowThenEnterShouldShow) { base::TimeTicks time; time += base::TimeDelta::FromSeconds(1); @@ -1060,6 +1089,19 @@ scrollbar_controller_->DidMouseLeave(); EXPECT_TRUE(client_.start_fade().is_null() || client_.start_fade().IsCancelled()); + + // Move mouse over scrollbar. + scrollbar_controller_->DidMouseMoveNear(VERTICAL, 0); + + // An show animation should have been enqueued. + EXPECT_FALSE(client_.start_fade().is_null()); + EXPECT_FALSE(client_.start_fade().IsCancelled()); + EXPECT_EQ(kShowDelay, client_.delay()); + + // Play the delay animation. + client_.start_fade().Run(); + EXPECT_TRUE(client_.start_fade().IsCancelled()); + EXPECT_FALSE(scrollbar_controller_->ScrollbarsHidden()); } class ScrollbarAnimationControllerAndroidTest @@ -1148,8 +1190,10 @@ ->effect_tree.OnOpacityAnimated(0.0f, scrollbar_layer_->effect_tree_index(), scrollbar_layer_->layer_tree_impl()); + // We should use the gesture delay rather than the resize delay if we're in a + // gesture scroll, even if it is resizing. scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(true); + scrollbar_controller_->DidResize(); scrollbar_controller_->DidScrollEnd(); // Normal Animation delay of 2 seconds. EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); @@ -1160,7 +1204,7 @@ ->effect_tree.OnOpacityAnimated(0.0f, scrollbar_layer_->effect_tree_index(), scrollbar_layer_->layer_tree_impl()); - scrollbar_controller_->DidScrollUpdate(true); + scrollbar_controller_->DidResize(); // Delay animation on resize to 5 seconds. EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); EXPECT_EQ(delay_, base::TimeDelta::FromSeconds(5)); @@ -1198,6 +1242,25 @@ EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); } +// Confirm the scrollbar does not appear on WillUpdateScroll on Android. +TEST_F(ScrollbarAnimationControllerAndroidTest, + WillUpdateScrollNotAppearScrollbar) { + base::TimeTicks time; + time += base::TimeDelta::FromSeconds(1); + + // Scrollbar should be invisible. + EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); + EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); + + // Scrollbar should appear when scroll will update. + scrollbar_controller_->WillUpdateScroll(); + EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); + EXPECT_TRUE(scrollbar_controller_->ScrollbarsHidden()); + + // No fade out animation should have been enqueued. + EXPECT_TRUE(start_fade_.Equals(base::Closure())); +} + TEST_F(ScrollbarAnimationControllerAndroidTest, HideOnResize) { LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1); ASSERT_TRUE(scroll_layer); @@ -1211,7 +1274,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1223,7 +1286,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1242,7 +1305,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1253,7 +1316,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1268,7 +1331,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1283,7 +1346,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1299,7 +1362,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1315,7 +1378,7 @@ scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); scrollbar_controller_->DidScrollEnd(); @@ -1327,7 +1390,7 @@ scrollbar_controller_->DidScrollBegin(); EXPECT_FALSE(did_request_animate_); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(did_request_animate_); EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->Opacity()); @@ -1365,7 +1428,7 @@ time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->DidScrollBegin(); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); scrollbar_controller_->DidScrollEnd(); start_fade_.Run(); @@ -1399,7 +1462,7 @@ TEST_F(ScrollbarAnimationControllerAndroidTest, AwakenByProgrammaticScroll) { base::TimeTicks time; time += base::TimeDelta::FromSeconds(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(did_request_animate_); start_fade_.Run(); @@ -1415,7 +1478,7 @@ EXPECT_TRUE(did_request_animate_); did_request_animate_ = false; EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->Opacity()); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(did_request_animate_); start_fade_.Run(); @@ -1440,7 +1503,7 @@ EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->Opacity()); time += base::TimeDelta::FromSeconds(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); start_fade_.Run(); time += base::TimeDelta::FromSeconds(1); scrollbar_controller_->Animate(time); @@ -1470,7 +1533,7 @@ AnimationPreservedByNonScrollingGesture) { base::TimeTicks time; time += base::TimeDelta::FromSeconds(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); start_fade_.Run(); EXPECT_TRUE(did_request_animate_); did_request_animate_ = false; @@ -1509,7 +1572,7 @@ AnimationOverriddenByScrollingGesture) { base::TimeTicks time; time += base::TimeDelta::FromSeconds(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(did_request_animate_); start_fade_.Run(); EXPECT_TRUE(did_request_animate_); @@ -1535,7 +1598,7 @@ EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->Opacity()); time += base::TimeDelta::FromSeconds(1); - scrollbar_controller_->DidScrollUpdate(false); + scrollbar_controller_->DidScrollUpdate(); EXPECT_FALSE(did_request_animate_); EXPECT_FLOAT_EQ(1, scrollbar_layer_->Opacity());
diff --git a/cc/ipc/cc_serialization_perftest.cc b/cc/ipc/cc_serialization_perftest.cc index 6bf7180..7b415b7 100644 --- a/cc/ipc/cc_serialization_perftest.cc +++ b/cc/ipc/cc_serialization_perftest.cc
@@ -270,38 +270,6 @@ UseSingleSharedQuadState::NO); } -// Test for compositor frames with one render pass and 100000 quads. -TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyQuads_1_100000) { - // Case 1: One shared quad state for all quads in one render pass. - RunCompositorFrameTest("DelegatedFrame_ManyQuads_1_100000", 100000, 1, - UseSingleSharedQuadState::YES); - // Case 2: One shared quad state for each quad. - RunCompositorFrameTest("DelegatedFrame_ManyQuads_1_100000", 100000, 1, - UseSingleSharedQuadState::NO); -} - -// Test for compositor frames with 100 render pass and each with 4000 quads. -TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyQuads_100_4000) { - // One shared quad state for all quads in one render pass. - RunCompositorFrameTest("DelegatedFrame_ManyQuads_100_4000", 4000, 100, - UseSingleSharedQuadState::YES); -} - -// Done for https://crbug.com/691730. Test is too slow as is. -#if defined(OS_ANDROID) -#define MAYBE_DelegatedFrame_ManyQuads_10_100000 \ - DISABLED_DelegatedFrame_ManyQuads_10_100000 -#else -#define MAYBE_DelegatedFrame_ManyQuads_10_100000 \ - DelegatedFrame_ManyQuads_10_100000 -#endif -// Test for compositor frames with 10 render pass and each with 100000 quads. -TEST_F(CCSerializationPerfTest, MAYBE_DelegatedFrame_ManyQuads_10_100000) { - // One shared quad state for all quads in one render pass. - RunCompositorFrameTest("DelegatedFrame_ManyQuads_10_100000", 100000, 10, - UseSingleSharedQuadState::YES); -} - // Test for compositor frames with 5 render pass and each with 100 quads. TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyRenderPasses_5_100) { // Case 1: One shared quad state for all quads in one render pass. @@ -322,15 +290,5 @@ UseSingleSharedQuadState::NO); } -// Test for compositor frames with 1000 render pass and each with 100 quads. -TEST_F(CCSerializationPerfTest, DelegatedFrame_ManyRenderPasses_1000_100) { - // Case 1: One shared quad state for all quads in one render pass. - RunCompositorFrameTest("DelegatedFrame_ManyRenderPasses_1000_100", 100, 1000, - UseSingleSharedQuadState::YES); - // Case 2: One shared quad state for each quad. - RunCompositorFrameTest("DelegatedFrame_ManyRenderPasses_1000_100", 100, 1000, - UseSingleSharedQuadState::NO); -} - } // namespace } // namespace cc
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 0b76c70..c423115 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -386,23 +386,23 @@ result->SetInteger("LayerId", id()); result->SetString("LayerType", LayerTypeAsString()); - base::ListValue* list = new base::ListValue; + auto list = base::MakeUnique<base::ListValue>(); list->AppendInteger(bounds().width()); list->AppendInteger(bounds().height()); - result->Set("Bounds", list); + result->Set("Bounds", std::move(list)); - list = new base::ListValue; + list = base::MakeUnique<base::ListValue>(); list->AppendDouble(position_.x()); list->AppendDouble(position_.y()); - result->Set("Position", list); + result->Set("Position", std::move(list)); const gfx::Transform& gfx_transform = test_properties()->transform; double transform[16]; gfx_transform.matrix().asColMajord(transform); - list = new base::ListValue; + list = base::MakeUnique<base::ListValue>(); for (int i = 0; i < 16; ++i) list->AppendDouble(transform[i]); - result->Set("Transform", list); + result->Set("Transform", std::move(list)); result->SetBoolean("DrawsContent", draws_content_); result->SetBoolean("Is3dSorted", Is3dSorted()); @@ -414,13 +414,13 @@ if (!touch_event_handler_region_.IsEmpty()) { std::unique_ptr<base::Value> region = touch_event_handler_region_.AsValue(); - result->Set("TouchRegion", region.release()); + result->Set("TouchRegion", std::move(region)); } - list = new base::ListValue; + list = base::MakeUnique<base::ListValue>(); for (size_t i = 0; i < test_properties()->children.size(); ++i) list->Append(test_properties()->children[i]->LayerTreeAsJson()); - result->Set("Children", list); + result->Set("Children", std::move(list)); return result; }
diff --git a/cc/layers/ui_resource_layer_impl.cc b/cc/layers/ui_resource_layer_impl.cc index 50d0321..dd2441b 100644 --- a/cc/layers/ui_resource_layer_impl.cc +++ b/cc/layers/ui_resource_layer_impl.cc
@@ -143,17 +143,17 @@ std::unique_ptr<base::DictionaryValue> UIResourceLayerImpl::LayerTreeAsJson() { std::unique_ptr<base::DictionaryValue> result = LayerImpl::LayerTreeAsJson(); - result->Set("ImageBounds", MathUtil::AsValue(image_bounds_).release()); + result->Set("ImageBounds", MathUtil::AsValue(image_bounds_)); - base::ListValue* list = new base::ListValue; + auto list = base::MakeUnique<base::ListValue>(); list->AppendDouble(vertex_opacity_[0]); list->AppendDouble(vertex_opacity_[1]); list->AppendDouble(vertex_opacity_[2]); list->AppendDouble(vertex_opacity_[3]); - result->Set("VertexOpacity", list); + result->Set("VertexOpacity", std::move(list)); - result->Set("UVTopLeft", MathUtil::AsValue(uv_top_left_).release()); - result->Set("UVBottomRight", MathUtil::AsValue(uv_bottom_right_).release()); + result->Set("UVTopLeft", MathUtil::AsValue(uv_top_left_)); + result->Set("UVBottomRight", MathUtil::AsValue(uv_bottom_right_)); return result; }
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc index 4745dce..830b3fb 100644 --- a/cc/paint/display_item_list.cc +++ b/cc/paint/display_item_list.cc
@@ -102,12 +102,7 @@ // SkPicture always does a wrapping save/restore on the canvas, so it is // not necessary here. - if (callback) { - item.picture->playback(canvas, callback); - } else { - // TODO(enne): switch this to playback once PaintRecord is real. - canvas->drawPicture(ToSkPicture(item.picture.get())); - } + item.picture->playback(canvas, callback); break; } case DisplayItem::FLOAT_CLIP: { @@ -407,7 +402,7 @@ state->EndArray(); std::string b64_picture; - PictureDebugUtil::SerializeAsBase64(ToSkPicture(item.picture.get()), + PictureDebugUtil::SerializeAsBase64(ToSkPicture(item.picture).get(), &b64_picture); state->SetString("skp64", b64_picture); state->EndDictionary();
diff --git a/cc/paint/paint_canvas.h b/cc/paint/paint_canvas.h index cd00cdc6..778841f6 100644 --- a/cc/paint/paint_canvas.h +++ b/cc/paint/paint_canvas.h
@@ -170,12 +170,7 @@ virtual void drawDisplayItemList( scoped_refptr<DisplayItemList> display_item_list) = 0; - virtual void drawPicture(sk_sp<const PaintRecord> record, - const SkMatrix* matrix, - const PaintFlags* flags) = 0; - void drawPicture(sk_sp<const PaintRecord> record) { - drawPicture(record, nullptr, nullptr); - } + virtual void drawPicture(sk_sp<const PaintRecord> record) = 0; virtual bool isClipEmpty() const = 0; virtual bool isClipRect() const = 0;
diff --git a/cc/paint/paint_record.h b/cc/paint/paint_record.h index 92c7503b..8506606b 100644 --- a/cc/paint/paint_record.h +++ b/cc/paint/paint_record.h
@@ -11,14 +11,6 @@ using PaintRecord = SkPicture; -inline const SkPicture* ToSkPicture(const PaintRecord* record) { - return record; -} - -inline SkPicture* ToSkPicture(PaintRecord* record) { - return record; -} - inline sk_sp<SkPicture> ToSkPicture(sk_sp<PaintRecord> record) { return record; }
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc index 0421d89..a4ab9c19 100644 --- a/cc/paint/skia_paint_canvas.cc +++ b/cc/paint/skia_paint_canvas.cc
@@ -268,10 +268,8 @@ display_item_list->Raster(canvas_, nullptr); } -void SkiaPaintCanvas::drawPicture(sk_sp<const PaintRecord> record, - const SkMatrix* matrix, - const PaintFlags* flags) { - canvas_->drawPicture(ToSkPicture(record.get()), matrix, ToSkPaint(flags)); +void SkiaPaintCanvas::drawPicture(sk_sp<const PaintRecord> record) { + record->playback(canvas_); } bool SkiaPaintCanvas::isClipEmpty() const {
diff --git a/cc/paint/skia_paint_canvas.h b/cc/paint/skia_paint_canvas.h index 979efdf..f751f77 100644 --- a/cc/paint/skia_paint_canvas.h +++ b/cc/paint/skia_paint_canvas.h
@@ -135,9 +135,7 @@ void drawDisplayItemList( scoped_refptr<DisplayItemList> display_item_list) override; - void drawPicture(sk_sp<const PaintRecord> record, - const SkMatrix* matrix, - const PaintFlags* flags) override; + void drawPicture(sk_sp<const PaintRecord> record) override; bool isClipEmpty() const override; bool isClipRect() const override;
diff --git a/cc/quads/nine_patch_generator.cc b/cc/quads/nine_patch_generator.cc index ea722ad..4edde067 100644 --- a/cc/quads/nine_patch_generator.cc +++ b/cc/quads/nine_patch_generator.cc
@@ -369,28 +369,28 @@ } void NinePatchGenerator::AsJson(base::DictionaryValue* dictionary) const { - base::ListValue* list = new base::ListValue; + auto list = base::MakeUnique<base::ListValue>(); list->AppendInteger(image_aperture_.origin().x()); list->AppendInteger(image_aperture_.origin().y()); list->AppendInteger(image_aperture_.size().width()); list->AppendInteger(image_aperture_.size().height()); - dictionary->Set("ImageAperture", list); + dictionary->Set("ImageAperture", std::move(list)); - list = new base::ListValue; + list = base::MakeUnique<base::ListValue>(); list->AppendInteger(image_bounds_.width()); list->AppendInteger(image_bounds_.height()); - dictionary->Set("ImageBounds", list); + dictionary->Set("ImageBounds", std::move(list)); - dictionary->Set("Border", MathUtil::AsValue(border_).release()); + dictionary->Set("Border", MathUtil::AsValue(border_)); dictionary->SetBoolean("FillCenter", fill_center_); - list = new base::ListValue; + list = base::MakeUnique<base::ListValue>(); list->AppendInteger(output_occlusion_.x()); list->AppendInteger(output_occlusion_.y()); list->AppendInteger(output_occlusion_.width()); list->AppendInteger(output_occlusion_.height()); - dictionary->Set("OutputOcclusion", list); + dictionary->Set("OutputOcclusion", std::move(list)); } } // namespace cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 8b0976d..3cb2718 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -655,6 +655,16 @@ if (hud_layer_) { hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, device_scale_factor_); + // The HUD layer is managed outside the layer list sent to LayerTreeHost + // and needs to have its property tree state set. + if (settings_.use_layer_lists && 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()); + } } gfx::Transform identity_transform;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index d9f1a22..b6c6d60b 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2904,7 +2904,15 @@ MainThreadScrollingReason::kNotScrollingOnMain; ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); + if (scroll_node) { + // Flash the overlay scrollbar even if the scroll dalta is 0. + ScrollbarAnimationController* animation_controller = + ScrollbarAnimationControllerForId(scroll_node->owning_layer_id); + + if (animation_controller) + animation_controller->WillUpdateScroll(); + gfx::Vector2dF delta = scroll_delta; if (!scroll_node->user_scrollable_horizontal) delta.set_x(0); @@ -2943,6 +2951,13 @@ viewport()->MainScrollLayer() && viewport()->MainScrollLayer()->scroll_tree_index() == scroll_node->id; if (scrolls_main_viewport_scroll_layer) { + // Flash the overlay scrollbar even if the scroll dalta is 0. + ScrollbarAnimationController* animation_controller = + ScrollbarAnimationControllerForId(scroll_node->owning_layer_id); + + if (animation_controller) + animation_controller->WillUpdateScroll(); + gfx::Vector2dF scrolled = viewport()->ScrollAnimated(pending_delta, delayed_by); // Viewport::ScrollAnimated returns pending_delta as long as it starts @@ -3187,9 +3202,18 @@ DCHECK(scroll_state); TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); - if (!CurrentlyScrollingNode()) + ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; + ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); + + if (!scroll_node) return InputHandlerScrollResult(); + ScrollbarAnimationController* animation_controller = + ScrollbarAnimationControllerForId(scroll_node->owning_layer_id); + + if (animation_controller) + animation_controller->WillUpdateScroll(); + float initial_top_controls_offset = browser_controls_offset_manager_->ControlsTopOffset();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index afdcd0f9..7b00974 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -2813,6 +2813,8 @@ settings.scrollbar_animator = animator; settings.scrollbar_show_delay = base::TimeDelta::FromMilliseconds(20); settings.scrollbar_fade_out_delay = base::TimeDelta::FromMilliseconds(20); + settings.scrollbar_fade_out_resize_delay = + base::TimeDelta::FromMilliseconds(20); settings.scrollbar_fade_out_duration = base::TimeDelta::FromMilliseconds(20); @@ -2846,6 +2848,25 @@ EXPECT_EQ(base::TimeDelta(), requested_animation_delay_); EXPECT_TRUE(animation_task_.Equals(base::Closure())); + // For Aura Overlay Scrollbar, if no scroll happened during a scroll + // gesture, shows scrollbars and schedules a delay fade out. + host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), + InputHandler::WHEEL); + host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2dF(0, 0)).get()); + host_impl_->ScrollEnd(EndState().get()); + EXPECT_FALSE(did_request_next_frame_); + EXPECT_FALSE(did_request_redraw_); + if (animator == LayerTreeSettings::AURA_OVERLAY) { + EXPECT_EQ(base::TimeDelta::FromMilliseconds(20), + requested_animation_delay_); + EXPECT_FALSE(animation_task_.Equals(base::Closure())); + requested_animation_delay_ = base::TimeDelta(); + animation_task_ = base::Closure(); + } else { + EXPECT_EQ(base::TimeDelta(), requested_animation_delay_); + EXPECT_TRUE(animation_task_.Equals(base::Closure())); + } + // Before the scrollbar animation exists, we should not get redraws. BeginFrameArgs begin_frame_args = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 2, fake_now); @@ -2953,7 +2974,9 @@ host_impl_->DidFinishImplFrame(); } - // Scrollbar animation is not triggered unnecessarily. + // For Andrdoid, scrollbar animation is not triggered unnecessarily. + // For Aura Overlay Scrollbar, scrollbar appears even if scroll offset did + // not change. host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), InputHandler::WHEEL); host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2dF(5, 0)).get()); @@ -2966,8 +2989,16 @@ host_impl_->ScrollEnd(EndState().get()); EXPECT_FALSE(did_request_next_frame_); EXPECT_FALSE(did_request_redraw_); - EXPECT_EQ(base::TimeDelta(), requested_animation_delay_); - EXPECT_TRUE(animation_task_.Equals(base::Closure())); + if (animator == LayerTreeSettings::AURA_OVERLAY) { + EXPECT_EQ(base::TimeDelta::FromMilliseconds(20), + requested_animation_delay_); + EXPECT_FALSE(animation_task_.Equals(base::Closure())); + requested_animation_delay_ = base::TimeDelta(); + animation_task_ = base::Closure(); + } else { + EXPECT_EQ(base::TimeDelta(), requested_animation_delay_); + EXPECT_TRUE(animation_task_.Equals(base::Closure())); + } // Changing page scale triggers scrollbar animation. host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 4.f);
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 176f7ba..a1ab8ad 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -19,6 +19,7 @@ #include "cc/animation/timing_function.h" #include "cc/input/scroll_elasticity_helper.h" #include "cc/layers/content_layer_client.h" +#include "cc/layers/heads_up_display_layer.h" #include "cc/layers/layer_impl.h" #include "cc/layers/painted_scrollbar_layer.h" #include "cc/layers/picture_layer.h" @@ -7198,5 +7199,41 @@ SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestQueueImageDecodeNonLazy); +class LayerTreeHostTestHudLayerWithLayerLists : public LayerTreeHostTest { + public: + void InitializeSettings(LayerTreeSettings* settings) override { + settings->initial_debug_state.show_paint_rects = true; + settings->use_layer_lists = true; + } + + void SetupTree() override { + LayerTreeHostTest::SetupTree(); + + // Build the property trees for the root layer. + layer_tree_host()->BuildPropertyTreesForTesting(); + + // The HUD layer should not have been setup by the property tree building. + DCHECK_EQ(layer_tree_host()->hud_layer(), nullptr); + } + + void BeginTest() override { PostSetNeedsCommitToMainThread(); } + + void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { EndTest(); } + + void DidCommit() override { + auto* hud = layer_tree_host()->hud_layer(); + DCHECK(hud); + auto* root_layer = layer_tree_host()->root_layer(); + DCHECK_EQ(hud->transform_tree_index(), root_layer->transform_tree_index()); + DCHECK_EQ(hud->clip_tree_index(), root_layer->clip_tree_index()); + DCHECK_EQ(hud->effect_tree_index(), root_layer->effect_tree_index()); + DCHECK_EQ(hud->scroll_tree_index(), root_layer->scroll_tree_index()); + } + + void AfterTest() override {} +}; + +SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestHudLayerWithLayerLists); + } // namespace } // namespace cc
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 26884a55..96bc7330 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -243,27 +243,31 @@ } bool scrollbar_needs_animation = false; + bool clip_layer_size_did_change = false; bool scroll_layer_size_did_change = false; bool y_offset_did_change = false; for (ScrollbarLayerImplBase* scrollbar : ScrollbarsFor(scroll_layer_id)) { if (scrollbar->orientation() == HORIZONTAL) { scrollbar_needs_animation |= scrollbar->SetCurrentPos(current_offset.x()); - scrollbar_needs_animation |= + clip_layer_size_did_change |= scrollbar->SetClipLayerLength(clip_size.width()); - scrollbar_needs_animation |= scroll_layer_size_did_change |= + scroll_layer_size_did_change |= scrollbar->SetScrollLayerLength(scroll_size.width()); } else { scrollbar_needs_animation |= y_offset_did_change |= scrollbar->SetCurrentPos(current_offset.y()); - scrollbar_needs_animation |= + clip_layer_size_did_change |= scrollbar->SetClipLayerLength(clip_size.height()); - scrollbar_needs_animation |= scroll_layer_size_did_change |= + scroll_layer_size_did_change |= scrollbar->SetScrollLayerLength(scroll_size.height()); } scrollbar_needs_animation |= scrollbar->SetVerticalAdjust(clip_layer->bounds_delta().y()); } + scrollbar_needs_animation |= + (clip_layer_size_did_change || scroll_layer_size_did_change); + if (y_offset_did_change && IsViewportLayerId(scroll_layer_id)) TRACE_COUNTER_ID1("cc", "scroll_offset_y", scroll_layer->id(), current_offset.y()); @@ -272,8 +276,16 @@ ScrollbarAnimationController* controller = layer_tree_host_impl_->ScrollbarAnimationControllerForId( scroll_layer_id); - if (controller) - controller->DidScrollUpdate(scroll_layer_size_did_change); + if (!controller) + return; + + // TODO(chaopeng) clip_layer_size_did_change should call DidResize after + // crbug.com/701810 got fixed. + if (scroll_layer_size_did_change) { + controller->DidResize(); + } else { + controller->DidScrollUpdate(); + } } }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index c14a75d..e5159952 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -193,6 +193,7 @@ "//content:sandbox_helper_win", "//content/public/common:static_switches", "//crypto", + "//gpu/config:crash_keys", "//sandbox", ] data_deps = [
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 00a7a89..a478f44 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -454,6 +454,7 @@ "//third_party/WebKit/public:android_mojo_bindings_java", "//third_party/WebKit/public:blink_headers_java", "//third_party/WebKit/public:mojo_bindings_java", + "//third_party/android_support_test_runner:rules_java", "//third_party/android_support_test_runner:runner_java", "//third_party/android_tools:android_support_design_java", "//third_party/android_tools:android_support_transition_java", @@ -463,6 +464,7 @@ "//third_party/cacheinvalidation:cacheinvalidation_javalib", "//third_party/custom_tabs_client:custom_tabs_support_java", "//third_party/jsr-305:jsr_305_javalib", + "//third_party/junit", "//ui/android:ui_java", "//ui/android:ui_javatests", google_play_services_library,
diff --git a/chrome/android/java/res/drawable-hdpi/bookmark_logo_large.png b/chrome/android/java/res/drawable-hdpi/bookmark_logo_large.png deleted file mode 100644 index e2f98c9..0000000 --- a/chrome/android/java/res/drawable-hdpi/bookmark_logo_large.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/bookmark_logo_large.png b/chrome/android/java/res/drawable-mdpi/bookmark_logo_large.png deleted file mode 100644 index 38d7be4..0000000 --- a/chrome/android/java/res/drawable-mdpi/bookmark_logo_large.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/bookmark_logo_large.png b/chrome/android/java/res/drawable-xhdpi/bookmark_logo_large.png deleted file mode 100644 index 8b5f3a6..0000000 --- a/chrome/android/java/res/drawable-xhdpi/bookmark_logo_large.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/bookmark_logo_large.png b/chrome/android/java/res/drawable-xxhdpi/bookmark_logo_large.png deleted file mode 100644 index 599eff8f..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/bookmark_logo_large.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/bookmark_logo_large.png b/chrome/android/java/res/drawable-xxxhdpi/bookmark_logo_large.png deleted file mode 100644 index 42b889f..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/bookmark_logo_large.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable/bookmark_big.xml b/chrome/android/java/res/drawable/bookmark_big.xml new file mode 100644 index 0000000..87812f7 --- /dev/null +++ b/chrome/android/java/res/drawable/bookmark_big.xml
@@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2017 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:targetApi="21" + android:height="64dp" + android:width="64dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" > + <path + android:fillColor="@color/google_grey_500" + android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" /> +</vector>
diff --git a/chrome/android/java/res/drawable/downloads_big.xml b/chrome/android/java/res/drawable/downloads_big.xml index 344c390..f1ddf19b 100644 --- a/chrome/android/java/res/drawable/downloads_big.xml +++ b/chrome/android/java/res/drawable/downloads_big.xml
@@ -4,11 +4,11 @@ found in the LICENSE file. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="60dp" - android:height="60dp" + android:width="64dp" + android:height="64dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z" - android:fillColor="#5A5A5A"/> + android:fillColor="@color/google_grey_500"/> </vector>
diff --git a/chrome/android/java/res/layout-sw720dp/bookmark_main.xml b/chrome/android/java/res/layout-sw720dp/bookmark_main.xml index cf0d3ff..255d3c4 100644 --- a/chrome/android/java/res/layout-sw720dp/bookmark_main.xml +++ b/chrome/android/java/res/layout-sw720dp/bookmark_main.xml
@@ -18,20 +18,10 @@ android:divider="@null" android:dividerHeight="0dp" /> - <ViewSwitcher - android:id="@+id/bookmark_view_switcher" + <org.chromium.chrome.browser.widget.selection.SelectableListLayout + android:id="@+id/selectable_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:inAnimation="@android:anim/fade_in" - android:outAnimation="@android:anim/fade_out" > - - <org.chromium.chrome.browser.widget.selection.SelectableListLayout - android:id="@+id/selectable_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@android:color/white" /> - - <include layout="@layout/bookmark_search" /> - </ViewSwitcher> + android:background="@android:color/white" /> </LinearLayout> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/bookmark_folder_row.xml b/chrome/android/java/res/layout/bookmark_folder_row.xml index c05013dc..674a7f0 100644 --- a/chrome/android/java/res/layout/bookmark_folder_row.xml +++ b/chrome/android/java/res/layout/bookmark_folder_row.xml
@@ -7,7 +7,7 @@ <view class="org.chromium.chrome.browser.bookmarks.BookmarkFolderRow" xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" > <include layout="@layout/bookmark_row_content" />
diff --git a/chrome/android/java/res/layout/bookmark_item_row.xml b/chrome/android/java/res/layout/bookmark_item_row.xml index cfc5756..40a8890 100644 --- a/chrome/android/java/res/layout/bookmark_item_row.xml +++ b/chrome/android/java/res/layout/bookmark_item_row.xml
@@ -7,7 +7,7 @@ <view class="org.chromium.chrome.browser.bookmarks.BookmarkItemRow" xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" > <include layout="@layout/bookmark_row_content" />
diff --git a/chrome/android/java/res/layout/bookmark_main.xml b/chrome/android/java/res/layout/bookmark_main.xml index bd9525b5..685c8b0 100644 --- a/chrome/android/java/res/layout/bookmark_main.xml +++ b/chrome/android/java/res/layout/bookmark_main.xml
@@ -3,35 +3,25 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/bookmark_view_switcher" +<android.support.v4.widget.DrawerLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/bookmark_drawer_layout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:inAnimation="@android:anim/fade_in" - android:outAnimation="@android:anim/fade_out" > + android:layout_height="match_parent" > - <android.support.v4.widget.DrawerLayout - android:id="@+id/bookmark_drawer_layout" + <org.chromium.chrome.browser.widget.selection.SelectableListLayout + android:id="@+id/selectable_list" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="match_parent" + android:background="@color/default_primary_color" /> - <org.chromium.chrome.browser.widget.selection.SelectableListLayout - android:id="@+id/selectable_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/default_primary_color" /> - - <org.chromium.chrome.browser.bookmarks.BookmarkDrawerListView - android:id="@+id/bookmark_drawer_list" - android:layout_width="@dimen/drawer_width" - android:layout_height="match_parent" - android:layout_gravity="start" - android:background="@android:color/white" - android:choiceMode="singleChoice" - android:divider="@null" - android:dividerHeight="0dp" /> - </android.support.v4.widget.DrawerLayout> - - <include layout="@layout/bookmark_search"/> - -</ViewSwitcher> + <org.chromium.chrome.browser.bookmarks.BookmarkDrawerListView + android:id="@+id/bookmark_drawer_list" + android:layout_width="@dimen/drawer_width" + android:layout_height="match_parent" + android:layout_gravity="start" + android:background="@android:color/white" + android:choiceMode="singleChoice" + android:divider="@null" + android:dividerHeight="0dp" /> +</android.support.v4.widget.DrawerLayout>
diff --git a/chrome/android/java/res/layout/bookmark_search.xml b/chrome/android/java/res/layout/bookmark_search.xml deleted file mode 100644 index 22790683..0000000 --- a/chrome/android/java/res/layout/bookmark_search.xml +++ /dev/null
@@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. --> - -<org.chromium.chrome.browser.bookmarks.BookmarkSearchView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/bookmark_search_view" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@android:color/white" - android:orientation="vertical" > - - <include layout="@layout/bookmark_search_core" /> - -</org.chromium.chrome.browser.bookmarks.BookmarkSearchView> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/bookmark_search_core.xml b/chrome/android/java/res/layout/bookmark_search_core.xml deleted file mode 100644 index 86d5247..0000000 --- a/chrome/android/java/res/layout/bookmark_search_core.xml +++ /dev/null
@@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. --> - -<merge xmlns:android="http://schemas.android.com/apk/res/android"> - - <android.support.v7.widget.Toolbar - android:id="@+id/search_bar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" > - - <EditText - android:id="@+id/bookmark_search_text" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@null" - android:gravity="center_vertical" - android:hint="@string/bookmark_action_bar_search" - android:imeOptions="flagNoExtractUi|actionSearch" - android:inputType="textNoSuggestions" - android:singleLine="true" - android:textColor="#343434" - android:textSize="20sp" /> - </android.support.v7.widget.Toolbar> - - <View - android:layout_width="match_parent" - android:layout_height="1dp" - android:background="#E1E1E1" /> - - <view class="org.chromium.chrome.browser.bookmarks.BookmarkSearchView$HistoryResultSwitcher" - android:id="@+id/history_result_switcher" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:inAnimation="@android:anim/fade_in" - android:outAnimation="@android:anim/fade_out" > - - <ListView - android:id="@+id/bookmark_history_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:divider="@null" - android:dividerHeight="0dp" /> - - <ViewSwitcher - android:id="@+id/result_empty_switcher" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:inAnimation="@android:anim/fade_in" - android:outAnimation="@android:anim/fade_out" > - - <ListView - android:id="@+id/bookmark_result_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:divider="@null" - android:dividerHeight="0dp" /> - - <TextView - android:id="@+id/bookmark_search_empty_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:drawablePadding="3dp" - android:drawableTop="@drawable/bookmark_logo_large" - android:gravity="center" - android:padding="16dp" - android:text="@string/bookmark_no_result" - android:textColor="#5B5B5B" - android:textSize="16sp" /> - </ViewSwitcher> - </view> - -</merge> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/bookmark_search_row.xml b/chrome/android/java/res/layout/bookmark_search_row.xml deleted file mode 100644 index be2cd16..0000000 --- a/chrome/android/java/res/layout/bookmark_search_row.xml +++ /dev/null
@@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - 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. ---> - -<view class="org.chromium.chrome.browser.bookmarks.BookmarkSearchRow" - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:minHeight="48dp" - android:paddingEnd="20dp" > - - <include layout="@layout/bookmark_row_content" /> -</view>
diff --git a/chrome/android/java/res/layout/download_item_view.xml b/chrome/android/java/res/layout/download_item_view.xml index 110ad02b..64447c3 100644 --- a/chrome/android/java/res/layout/download_item_view.xml +++ b/chrome/android/java/res/layout/download_item_view.xml
@@ -7,7 +7,7 @@ <view class="org.chromium.chrome.browser.download.ui.DownloadItemView" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:chrome="http://schemas.android.com/apk/res-auto" - android:layout_width="wrap_content" + android:layout_width="match_parent" android:layout_height="wrap_content" > <!-- The end margin is not assigned because the cancel button overlaps it. -->
diff --git a/chrome/android/java/res/layout/history_header.xml b/chrome/android/java/res/layout/history_header.xml index 5de821e..64bebb3 100644 --- a/chrome/android/java/res/layout/history_header.xml +++ b/chrome/android/java/res/layout/history_header.xml
@@ -15,7 +15,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginTop="8dp" - android:layout_marginBottom="12dp" > + android:layout_marginBottom="16dp" > <org.chromium.ui.widget.TextViewWithClickableSpans android:id="@+id/signed_in_not_synced" @@ -34,7 +34,6 @@ <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="4dp" android:background="@drawable/list_item_single" > <!-- TODO(twellington): change start/end padding back to 16dp
diff --git a/chrome/android/java/res/layout/selectable_list_layout.xml b/chrome/android/java/res/layout/selectable_list_layout.xml index 85507de..0cde789 100644 --- a/chrome/android/java/res/layout/selectable_list_layout.xml +++ b/chrome/android/java/res/layout/selectable_list_layout.xml
@@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:drawablePadding="3dp" - android:textColor="@color/google_grey_700" + android:textColor="@color/google_grey_500" android:textSize="16sp" android:visibility="gone" />
diff --git a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml index ac3db18..c137e43a 100644 --- a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml +++ b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
@@ -16,7 +16,7 @@ <item android:id="@+id/search_menu_id" android:icon="@drawable/ic_search" - android:title="@null" + android:title="@string/search" android:visible="false" chrome:showAsAction="ifRoom"/> <item
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index c310353e..31e7f69 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -25,7 +25,6 @@ <color name="google_grey_400">#bdbdbd</color> <color name="google_grey_500">#9E9E9E</color> <color name="google_grey_600">#757575</color> - <color name="google_grey_700">#616161</color> <color name="toolbar_shadow_color">#1d000000</color> <color name="white_alpha_50">#80ffffff</color> <color name="black_alpha_40">#66000000</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index 07eaf696..8bc7fc1 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -436,4 +436,5 @@ <dimen name="list_item_corner_radius">3dp</dimen> <dimen name="list_item_lateral_padding">1dp</dimen> <dimen name="history_default_text_margin">16dp</dimen> + <dimen name="chrome_home_empty_view_top_padding">16dp</dimen> </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java index f21feb0b..f5e21dd9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java
@@ -301,23 +301,23 @@ } case ADAPTER_OFF_HELP: { nativeShowBluetoothAdapterOffLink(mNativeBluetoothChooserDialogPtr); - closeDialog(); break; } case REQUEST_LOCATION_PERMISSION: { + mItemChooserDialog.setIgnorePendingWindowFocusChangeForClose(true); mWindowAndroid.requestPermissions( new String[] {Manifest.permission.ACCESS_COARSE_LOCATION}, BluetoothChooserDialog.this); break; } case REQUEST_LOCATION_SERVICES: { + mItemChooserDialog.setIgnorePendingWindowFocusChangeForClose(true); mContext.startActivity( LocationUtils.getInstance().getSystemLocationSettingsIntent()); break; } case NEED_LOCATION_PERMISSION_HELP: { nativeShowNeedLocationPermissionLink(mNativeBluetoothChooserDialogPtr); - closeDialog(); break; } case RESTART_SEARCH: {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index b69847b..700c19f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -877,6 +877,8 @@ @Override public void onNewIntentWithNative(Intent intent) { + VideoPersister.getInstance().cleanup(this); + super.onNewIntentWithNative(intent); if (mIntentHandler.shouldIgnoreIntent(intent)) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java index 3ddfb79..170bbec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
@@ -366,6 +366,10 @@ // The maximum height of the listview in the dialog (in dp). private static final int MAX_HEIGHT_DP = (int) (LIST_ROW_HEIGHT_DP * 8.5); + // If this variable is false, the window should be closed when it loses focus; + // Otherwise, the window should not be closed when it loses focus. + private boolean mIgnorePendingWindowFocusChangeForClose; + /** * Creates the ItemChooserPopup and displays it (and starts waiting for data). * @@ -425,9 +429,22 @@ getListHeight(mActivity.getWindow().getDecorView().getHeight(), mActivity.getResources().getDisplayMetrics().density))); + mIgnorePendingWindowFocusChangeForClose = false; + showDialogForView(dialogContainer); } + /** + * Sets whether the window should be closed when it loses focus. + * + * @param ignorePendingWindowFocusChangeForClose Whether the window should be closed when it + * loses focus. + */ + public void setIgnorePendingWindowFocusChangeForClose( + boolean ignorePendingWindowFocusChangeForClose) { + mIgnorePendingWindowFocusChangeForClose = ignorePendingWindowFocusChangeForClose; + } + // Computes the height of the device list, bound to half-multiples of the // row height so that it's obvious if there are more elements to scroll to. @VisibleForTesting @@ -444,7 +461,8 @@ @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); - if (!hasFocus) super.dismiss(); + if (!mIgnorePendingWindowFocusChangeForClose && !hasFocus) super.dismiss(); + setIgnorePendingWindowFocusChangeForClose(false); } }; mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java index 6d112660..06dad087 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
@@ -47,7 +47,6 @@ inflateMenu(R.menu.bookmark_action_bar_menu); setOnMenuItemClickListener(this); - getMenu().findItem(R.id.search_menu_id).setTitle(R.string.bookmark_action_bar_search); getMenu().findItem(R.id.selection_mode_edit_menu_id).setTitle(R.string.edit_bookmark); getMenu().findItem(R.id.selection_mode_move_menu_id) .setTitle(R.string.bookmark_action_bar_move); @@ -57,11 +56,18 @@ @Override public void onNavigationBack() { + if (mIsSearching) { + super.onNavigationBack(); + return; + } + mDelegate.openFolder(mCurrentFolder.getParentId()); } @Override public boolean onMenuItemClick(MenuItem menuItem) { + hideOverflowMenu(); + SelectionDelegate<BookmarkId> selectionDelegate = mDelegate.getSelectionDelegate(); if (menuItem.getItemId() == R.id.edit_menu_id) { BookmarkAddEditFolderActivity.startEditFolderActivity(getContext(), @@ -156,6 +162,9 @@ } @Override + public void onSearchStateSet() {} + + @Override public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) { super.onSelectionStateChange(selectedBookmarks);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java index 417c43a..28a7421 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -481,10 +481,10 @@ * Synchronously gets a list of bookmarks that match the specified search query. * @param query Keyword used for searching bookmarks. * @param maxNumberOfResult Maximum number of result to fetch. - * @return List of bookmarks that are related to the given query. + * @return List of bookmark IDs that are related to the given query. */ - public List<BookmarkMatch> searchBookmarks(String query, int maxNumberOfResult) { - List<BookmarkMatch> bookmarkMatches = new ArrayList<BookmarkMatch>(); + public List<BookmarkId> searchBookmarks(String query, int maxNumberOfResult) { + List<BookmarkId> bookmarkMatches = new ArrayList<BookmarkId>(); nativeSearchBookmarks(mNativeBookmarkBridge, bookmarkMatches, query, maxNumberOfResult); return bookmarkMatches; @@ -810,16 +810,6 @@ depthList.add(depth); } - @CalledByNative - private static void addToBookmarkMatchList(List<BookmarkMatch> bookmarkMatchList, - long id, int type, int[] titleMatchStartPositions, - int[] titleMatchEndPositions, int[] urlMatchStartPositions, - int[] urlMatchEndPositions) { - bookmarkMatchList.add(new BookmarkMatch(new BookmarkId(id, type), - createPairsList(titleMatchStartPositions, titleMatchEndPositions), - createPairsList(urlMatchStartPositions, urlMatchEndPositions))); - } - private static List<Pair<Integer, Integer>> createPairsList(int[] left, int[] right) { List<Pair<Integer, Integer>> pairList = new ArrayList<Pair<Integer, Integer>>(); for (int i = 0; i < left.length; i++) { @@ -911,7 +901,7 @@ private native void nativeEndGroupingUndos(long nativeBookmarkBridge); private native void nativeLoadEmptyPartnerBookmarkShimForTesting(long nativeBookmarkBridge); private native void nativeSearchBookmarks(long nativeBookmarkBridge, - List<BookmarkMatch> bookmarkMatches, String query, int maxNumber); + List<BookmarkId> bookmarkMatches, String query, int maxNumber); private native long nativeInit(Profile profile); private native boolean nativeIsDoingExtensiveChanges(long nativeBookmarkBridge); private native void nativeDestroy(long nativeBookmarkBridge);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDrawerListView.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDrawerListView.java index 6e20f34..eaa36c4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDrawerListView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDrawerListView.java
@@ -87,6 +87,8 @@ } @Override - public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) { - } + public void onSearchStateSet() {} + + @Override + public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java index 78f1d85c..0675e4ba 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -33,10 +34,14 @@ private static final int DIVIDER_VIEW = 2; private static final int BOOKMARK_VIEW = 3; + private static final int MAXIMUM_NUMBER_OF_SEARCH_RESULTS = 500; + private static final String EMPTY_QUERY = null; + private BookmarkDelegate mDelegate; private Context mContext; private BookmarkPromoHeader mPromoHeaderManager; private boolean mShouldShowDividers; + private String mSearchText; private List<List<? extends Object>> mSections; private List<Object> mPromoHeaderSection = new ArrayList<>(); @@ -74,6 +79,11 @@ public void bookmarkModelChanged() { assert mDelegate != null; mDelegate.notifyStateChange(BookmarkItemsAdapter.this); + + if (mDelegate.getCurrentState() == BookmarkUIState.STATE_SEARCHING + && !TextUtils.equals(mSearchText, EMPTY_QUERY)) { + search(mSearchText); + } } }; @@ -153,12 +163,7 @@ mBookmarkSection.clear(); mBookmarkSection.addAll(bookmarks); - updateHeader(); - updateDividerSections(); - - // TODO(kkimlabs): Animation is disabled due to a performance issue on bookmark undo. - // http://crbug.com/484174 - notifyDataSetChanged(); + updateHeaderAndNotify(); } private void updateDividerSections() { @@ -285,9 +290,7 @@ return; } - updateHeader(); - updateDividerSections(); - notifyDataSetChanged(); + updateHeaderAndNotify(); } // BookmarkUIObserver implementations. @@ -314,17 +317,41 @@ assert mDelegate != null; setBookmarks(mDelegate.getModel().getChildIDs(folder, true, false), mDelegate.getModel().getChildIDs(folder, false, true)); + + mSearchText = EMPTY_QUERY; + } + + @Override + public void onSearchStateSet() { + updateHeaderAndNotify(); } @Override public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) {} + /** + * Synchronously searches for the given query. + * @param query The query text to search for. + */ + void search(String query) { + mSearchText = query.toString().trim(); + List<BookmarkId> results = + mDelegate.getModel().searchBookmarks(mSearchText, MAXIMUM_NUMBER_OF_SEARCH_RESULTS); + setBookmarks(null, results); + } + private static class ItemViewHolder extends RecyclerView.ViewHolder { private ItemViewHolder(View view) { super(view); } } + private void updateHeaderAndNotify() { + updateHeader(); + updateDividerSections(); + notifyDataSetChanged(); + } + private void updateHeader() { if (mDelegate == null) return; @@ -332,6 +359,9 @@ if (currentUIState == BookmarkUIState.STATE_LOADING) return; mPromoHeaderSection.clear(); + + if (currentUIState == BookmarkUIState.STATE_SEARCHING) return; + assert currentUIState == BookmarkUIState.STATE_FOLDER : "Unexpected UI state"; if (mPromoHeaderManager.shouldShow()) { mPromoHeaderSection.add(null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java index 2ac93fb..c729387 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -7,16 +7,15 @@ import android.app.Activity; import android.app.ActivityManager; import android.content.Context; +import android.support.graphics.drawable.VectorDrawableCompat; +import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; -import android.view.Gravity; import android.view.View; import android.view.ViewGroup; -import android.widget.ViewSwitcher; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ContextUtils; import org.chromium.base.ObserverList; import org.chromium.base.metrics.RecordUserAction; @@ -29,6 +28,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; import org.chromium.chrome.browser.widget.selection.SelectableListLayout; +import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate; import org.chromium.chrome.browser.widget.selection.SelectionDelegate; import org.chromium.components.bookmarks.BookmarkId; @@ -39,9 +39,15 @@ * views and shared logics between tablet and phone. For tablet/phone specific logics, see * {@link BookmarkActivity} (phone) and {@link BookmarkPage} (tablet). */ -public class BookmarkManager implements BookmarkDelegate { +public class BookmarkManager implements BookmarkDelegate, SearchDelegate { private static final int FAVICON_MAX_CACHE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB + /** + * This shared preference used to be used to save a list of recent searches. That feature + * has been removed, so this string is now used solely to clear the shared preference. + */ + private static final String PREF_SEARCH_HISTORY = "bookmark_search_history"; + private Activity mActivity; private ViewGroup mMainView; private BookmarkModel mBookmarkModel; @@ -53,8 +59,6 @@ private RecyclerView mRecyclerView; private BookmarkItemsAdapter mAdapter; private BookmarkActionBar mToolbar; - private BookmarkSearchView mSearchView; - private ViewSwitcher mViewSwitcher; private DrawerLayout mDrawer; private BookmarkDrawerListView mDrawerListView; private SelectionDelegate<BookmarkId> mSelectionDelegate; @@ -102,7 +106,6 @@ private final Runnable mModelLoadedRunnable = new Runnable() { @Override public void run() { - mSearchView.onBookmarkDelegateInitialized(BookmarkManager.this); mDrawerListView.onBookmarkDelegateInitialized(BookmarkManager.this); mAdapter.onBookmarkDelegateInitialized(BookmarkManager.this); mToolbar.onBookmarkDelegateInitialized(BookmarkManager.this); @@ -142,10 +145,9 @@ (SelectableListLayout<BookmarkId>) mMainView.findViewById(R.id.selectable_list); mSelectableListLayout = selectableList; mSelectableListLayout.initializeEmptyView( - ApiCompatibilityUtils.getDrawable( - mActivity.getResources(), R.drawable.bookmark_logo_large), - R.string.bookmarks_folder_empty, - 0 /* Bookmarks search is not yet controlled by the SelectableListLayout. */); + VectorDrawableCompat.create( + mActivity.getResources(), R.drawable.bookmark_big, mActivity.getTheme()), + R.string.bookmarks_folder_empty, R.string.bookmark_no_result); mAdapter = new BookmarkItemsAdapter(activity); @@ -154,11 +156,11 @@ mToolbar = (BookmarkActionBar) mSelectableListLayout.initializeToolbar( R.layout.bookmark_action_bar, mSelectionDelegate, 0, mDrawer, R.id.normal_menu_group, R.id.selection_mode_menu_group, null, true, null); + mToolbar.initializeSearchView( + this, R.string.bookmark_action_bar_search, R.id.search_menu_id); - mViewSwitcher = (ViewSwitcher) mMainView.findViewById(R.id.bookmark_view_switcher); mUndoController = new BookmarkUndoController(activity, mBookmarkModel, ((SnackbarManageable) activity).getSnackbarManager()); - mSearchView = (BookmarkSearchView) getView().findViewById(R.id.bookmark_search_view); mBookmarkModel.addObserver(mBookmarkModelObserver); initializeToLoadingState(); mBookmarkModel.runAfterBookmarkModelLoaded(mModelLoadedRunnable); @@ -179,12 +181,18 @@ if (!isDialogUi) { RecordUserAction.record("MobileBookmarkManagerPageOpen"); } + + // TODO(twellington): Remove this when Chrome version 59 is a distant memory and users + // are unlikely to have the old PREF_SEARCH_HISTORY in shared preferences. + ContextUtils.getAppSharedPreferences().edit().remove(PREF_SEARCH_HISTORY).apply(); } /** * Destroys and cleans up itself. This must be called after done using this class. */ public void destroy() { + mSelectableListLayout.onDestroyed(); + for (BookmarkUIObserver observer : mUIObservers) { observer.onDestroy(); } @@ -207,8 +215,8 @@ */ public boolean onBackPressed() { if (doesDrawerExist()) { - if (mDrawer.isDrawerVisible(Gravity.START)) { - mDrawer.closeDrawer(Gravity.START); + if (mDrawer.isDrawerVisible(GravityCompat.START)) { + mDrawer.closeDrawer(GravityCompat.START); return true; } } @@ -347,7 +355,7 @@ @Override public void openFolder(BookmarkId folder) { - closeSearchUI(); + mToolbar.hideSearchView(); setState(BookmarkUIState.createFolderState(folder, mBookmarkModel)); mRecyclerView.scrollToPosition(0); } @@ -369,6 +377,9 @@ // UIObservers, which means that there will be no observers at the time. Do nothing. assert mUIObservers.isEmpty(); break; + case BookmarkUIState.STATE_SEARCHING: + observer.onSearchStateSet(); + break; default: assert false : "State not valid"; break; @@ -384,7 +395,7 @@ public void closeDrawer() { if (!doesDrawerExist()) return; - mDrawer.closeDrawer(Gravity.START); + mDrawer.closeDrawer(GravityCompat.START); } @Override @@ -403,14 +414,22 @@ @Override public void openSearchUI() { - // Give search view focus, because it needs to handle back key event. - mViewSwitcher.showNext(); + mSelectableListLayout.onStartSearch(); + mToolbar.showSearchView(); + setState(BookmarkUIState.createSearchState()); } @Override public void closeSearchUI() { - if (mSearchView.getVisibility() != View.VISIBLE) return; - mViewSwitcher.showPrevious(); + mSelectableListLayout.onEndSearch(); + + // Pop the search state off the stack. + mStateStack.pop(); + + // Set the state back to the folder that was previously being viewed. Listeners, including + // the BookmarkItemsAdapter, will be notified of the change and the list of bookmarks will + // be updated. + setState(mStateStack.pop()); } @Override @@ -438,4 +457,16 @@ public LargeIconBridge getLargeIconBridge() { return mLargeIconBridge; } + + // SearchDelegate overrides + + @Override + public void onSearchTextChanged(String query) { + mAdapter.search(query); + } + + @Override + public void onEndSearch() { + closeSearchUI(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMatch.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMatch.java deleted file mode 100644 index d33e5f17..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkMatch.java +++ /dev/null
@@ -1,65 +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. - -package org.chromium.chrome.browser.bookmarks; - -import android.util.Pair; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.components.bookmarks.BookmarkId; - -import java.util.List; - -/** - * Object that associates a BookmarkId with search term matches found in the bookmark's title and - * url. - */ -public class BookmarkMatch { - - private final BookmarkId mBookmarkId; - private final List<Pair<Integer, Integer>> mTitleMatchPositions; - private final List<Pair<Integer, Integer>> mUrlMatchPositions; - - /** - * @param bookmarkId The BookmarkId fassociated with this match. - * @param titleMatchPositions A list of [begin, end) positions for matches in the title; - * may be null. - * @param urlMatchPositions A list of [begin, end) positions for matches in the url; - * may be null. - */ - public BookmarkMatch(BookmarkId bookmarkId, List<Pair<Integer, Integer>> titleMatchPositions, - List<Pair<Integer, Integer>> urlMatchPositions) { - mBookmarkId = bookmarkId; - mTitleMatchPositions = titleMatchPositions; - mUrlMatchPositions = urlMatchPositions; - } - - /** - * @return The BookmarkId associated with this match. - */ - public BookmarkId getBookmarkId() { - return mBookmarkId; - } - - /** - * @return A list of [begin, end) positions for matches in the title; may return null. - */ - public List<Pair<Integer, Integer>> getTitleMatchPositions() { - return mTitleMatchPositions; - } - - /** - * @return A list of [begin, end) positions for matches in the url; may return null. - */ - public List<Pair<Integer, Integer>> getUrlMatchPositions() { - return mUrlMatchPositions; - } - - @CalledByNative - private static BookmarkMatch createBookmarkMatch(BookmarkId bookmarkId, - List<Pair<Integer, Integer>> titleMatchPositions, - List<Pair<Integer, Integer>> urlMatchPositions) { - return new BookmarkMatch(bookmarkId, titleMatchPositions, urlMatchPositions); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java index 5cb69e78..40e949a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -11,6 +11,7 @@ import android.view.ViewGroup; import org.chromium.base.ContextUtils; +import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninAndSyncView; @@ -43,6 +44,8 @@ // TODO(kkimlabs): Figure out the optimal number based on UMA data. private static final int MAX_SIGNIN_PROMO_SHOW_COUNT = 5; + private static boolean sShouldShowForTests; + private Context mContext; private SigninManager mSignInManager; private boolean mShouldShow; @@ -86,7 +89,7 @@ * @return Whether it should be showing. */ boolean shouldShow() { - return mShouldShow; + return mShouldShow || sShouldShowForTests; } /** @@ -154,4 +157,12 @@ public void onSignedOut() { updateShouldShow(true); } + + /** + * Forces the promo to show for testing purposes. + */ + @VisibleForTesting + public static void setShouldShowForTests() { + sShouldShowForTests = true; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java index d49f2c2e..eadfccef 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java
@@ -190,10 +190,8 @@ } // TODO(twellington): remove this after the bookmarks 720dp layout is restyled - // to match the < 720dp style and BookmarkSearchView is refactored. - // Currently BookmarkSearchRow extends BookmarkRow but is not selectable. - mShouldUseListItemBackground = - isSelectable() && !DeviceFormFactor.isLargeTablet(getContext()); + // to match the < 720dp style. + mShouldUseListItemBackground = !DeviceFormFactor.isLargeTablet(getContext()); // TODO(twellington): Replace this with a MarginResizer after the bookmarks layout is width // constrained to 600dp. @@ -263,8 +261,10 @@ } @Override - public void onFolderStateSet(BookmarkId folder) { - } + public void onFolderStateSet(BookmarkId folder) {} + + @Override + public void onSearchStateSet() {} @Override public void setBackgroundResourceForGroupPosition(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchRow.java deleted file mode 100644 index c81ddd7..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchRow.java +++ /dev/null
@@ -1,67 +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. - -package org.chromium.chrome.browser.bookmarks; - -import android.content.Context; -import android.util.AttributeSet; - -import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; -import org.chromium.components.bookmarks.BookmarkId; - -/** - * A view representing each row shown in {@link BookmarkSearchRow}. Note this type of row is - * not selectable for now. - */ -public class BookmarkSearchRow extends BookmarkItemRow { - - /** - * A listener that is triggered when a search result is selected. - */ - interface SearchHistoryDelegate { - /** - * Save the current search term to search history. This is called when a search result has - * been clicked. - */ - public void saveSearchHistory(); - } - - private SearchHistoryDelegate mHistoryDelegate; - - /** - * Constructor for xml inflation. - */ - public BookmarkSearchRow(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - } - - @Override - BookmarkItem setBookmarkId(BookmarkId bookmarkId) { - BookmarkItem item = super.setBookmarkId(bookmarkId); - return item; - } - - @Override - protected boolean isSelectable() { - return false; - } - - @Override - public void onClick() { - mDelegate.openBookmark(mBookmarkId, BookmarkLaunchLocation.SEARCH); - mHistoryDelegate.saveSearchHistory(); - } - - /** - * Sets the delegate that handles saving search history. - */ - void setSearchHistoryDelegate(SearchHistoryDelegate delegate) { - mHistoryDelegate = delegate; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java deleted file mode 100644 index 61176f3..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java +++ /dev/null
@@ -1,409 +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. - -package org.chromium.chrome.browser.bookmarks; - -import android.content.Context; -import android.os.Parcelable; -import android.support.v7.widget.Toolbar; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.EditorInfo; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.BaseAdapter; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; -import android.widget.ViewSwitcher; - -import org.json.JSONArray; -import org.json.JSONException; - -import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.ContextUtils; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem; -import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver; -import org.chromium.chrome.browser.bookmarks.BookmarkSearchRow.SearchHistoryDelegate; -import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.ui.UiUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * Activity for searching bookmarks. Search results will be updated when user is typing. Before - * typing, a list of search history is shown. - */ -public class BookmarkSearchView extends LinearLayout implements OnItemClickListener, - OnEditorActionListener, BookmarkUIObserver, SearchHistoryDelegate { - /** - * A custom {@link ViewSwitcher} that wraps another {@link ViewSwitcher} inside. - */ - public static class HistoryResultSwitcher extends ViewSwitcher { - ViewSwitcher mResultEmptySwitcher; - - /** - * Constructor for xml inflation. - */ - public HistoryResultSwitcher(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mResultEmptySwitcher = (ViewSwitcher) findViewById(R.id.result_empty_switcher); - } - - void showHistory() { - if (getCurrentView().getId() == R.id.bookmark_history_list) return; - showNext(); - } - - void showResult() { - if (getCurrentView().getId() == R.id.bookmark_history_list) showNext(); - if (mResultEmptySwitcher.getCurrentView().getId() == R.id.bookmark_search_empty_view) { - mResultEmptySwitcher.showNext(); - } - } - - void showEmpty() { - if (getCurrentView().getId() == R.id.bookmark_history_list) showNext(); - if (mResultEmptySwitcher.getCurrentView().getId() == R.id.bookmark_result_list) { - mResultEmptySwitcher.showNext(); - } - } - } - - private static enum UIState {HISTORY, RESULT, EMPTY} - - private static final String PREF_SEARCH_HISTORY = "bookmark_search_history"; - private static final int SEARCH_HISTORY_MAX_ENTRIES = 10; - private static final int HISTORY_ITEM_PADDING_START_DP = 72; - private static final int MAXIMUM_NUMBER_OF_RESULTS = 500; - - private BookmarkModel mBookmarkModel; - private BookmarkDelegate mDelegate; - private EditText mSearchText; - private ListView mResultList; - private ListView mHistoryList; - private HistoryResultSwitcher mHistoryResultSwitcher; - private UIState mCurrentUIState; - - private BookmarkModelObserver mModelObserver = new BookmarkModelObserver() { - @Override - public void bookmarkModelChanged() { - if (mCurrentUIState == UIState.RESULT || mCurrentUIState == UIState.EMPTY) { - sendSearchQuery(); - } - } - - @Override - public void bookmarkNodeRemoved(BookmarkItem parent, int oldIndex, BookmarkItem node, - boolean isDoingExtensiveChanges) { - // If isDoingExtensiveChanges is false, it will fall back to bookmarkModelChange() - if (isDoingExtensiveChanges && mCurrentUIState == UIState.RESULT) { - sendSearchQuery(); - } - } - }; - - /** - * Constructor for inflating from XML. - */ - public BookmarkSearchView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mSearchText = (EditText) findViewById(R.id.bookmark_search_text); - mResultList = (ListView) findViewById(R.id.bookmark_result_list); - mHistoryList = (ListView) findViewById(R.id.bookmark_history_list); - mHistoryResultSwitcher = (HistoryResultSwitcher) findViewById(R.id.history_result_switcher); - - Toolbar searchBar = (Toolbar) findViewById(R.id.search_bar); - searchBar.setNavigationIcon(R.drawable.back_normal); - searchBar.setNavigationContentDescription(R.string.accessibility_toolbar_btn_back); - searchBar.setNavigationOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); - - mHistoryList.setOnItemClickListener(this); - mSearchText.setOnEditorActionListener(this); - mSearchText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - if (TextUtils.isEmpty(s.toString().trim())) { - resetUI(); - } else { - sendSearchQuery(); - } - } - }); - mCurrentUIState = UIState.HISTORY; - } - - private void updateHistoryList() { - mHistoryList.setAdapter(new ArrayAdapter<String>(getContext(), - android.R.layout.simple_list_item_1, android.R.id.text1, - readHistoryList()) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View textView = super.getView(position, convertView, parent); - // Set padding start to specific size. - int paddingStart = (int) (HISTORY_ITEM_PADDING_START_DP - * getResources().getDisplayMetrics().density); - ApiCompatibilityUtils.setPaddingRelative(textView, paddingStart, - textView.getPaddingTop(), textView.getPaddingRight(), - textView.getPaddingBottom()); - return textView; - } - }); - } - - private void resetUI() { - setUIState(UIState.HISTORY); - mResultList.setAdapter(null); - if (!TextUtils.isEmpty(mSearchText.getText())) mSearchText.setText(""); - } - - private void sendSearchQuery() { - String currentText = mSearchText.getText().toString().trim(); - if (TextUtils.isEmpty(currentText)) return; - - List<BookmarkMatch> results = mBookmarkModel.searchBookmarks(currentText, - MAXIMUM_NUMBER_OF_RESULTS); - populateResultListView(results); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - // To intercept hardware key, a view must have focus. - if (mDelegate == null) return super.dispatchKeyEvent(event); - - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - state.startTracking(event, this); - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() - && state.isTracking(event)) { - onBackPressed(); - return true; - } - } - } - - return super.dispatchKeyEvent(event); - } - - @Override - protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) { - // No-op because state saving/restoring is intentionally omitted in this View. This is - // to fix a crash in Android M that TextView's old text is sometimes restored even if - // setText("") is called in onVisibilityChange(). crbug.com/596783 - } - - /** - * Make result list visible and popuplate the list with given list of bookmarks. - */ - private void populateResultListView(List<BookmarkMatch> ids) { - if (ids.isEmpty()) { - setUIState(UIState.EMPTY); - } else { - setUIState(UIState.RESULT); - mResultList.setAdapter(new ResultListAdapter(ids, mDelegate)); - } - } - - private void setUIState(UIState state) { - if (mCurrentUIState == state) return; - mCurrentUIState = state; - if (state == UIState.HISTORY) { - mHistoryResultSwitcher.showHistory(); - updateHistoryList(); - } else if (state == UIState.RESULT) { - mHistoryResultSwitcher.showResult(); - } else if (state == UIState.EMPTY) { - mHistoryResultSwitcher.showEmpty(); - } - } - - @Override - protected void onVisibilityChanged(View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - // This method might be called very early. Null check on bookmark model here. - if (mBookmarkModel == null) return; - - if (visibility == View.VISIBLE) { - mBookmarkModel.addObserver(mModelObserver); - updateHistoryList(); - mSearchText.requestFocus(); - UiUtils.showKeyboard(mSearchText); - } else { - UiUtils.hideKeyboard(mSearchText); - mBookmarkModel.removeObserver(mModelObserver); - resetUI(); - clearFocus(); - } - } - - private void onBackPressed() { - if (mCurrentUIState == UIState.HISTORY) { - mDelegate.closeSearchUI(); - } else { - resetUI(); - } - } - - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - assert parent == mHistoryList : "Only history list should have onItemClickListener."; - mSearchText.setText((String) parent.getAdapter().getItem(position)); - } - - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_SEARCH) { - UiUtils.hideKeyboard(v); - - // History is saved either when the user clicks search button or a search result is - // clicked. - saveSearchHistory(); - } - return false; - } - - private void saveHistoryList(List<String> history) { - JSONArray jsonArray = new JSONArray(history); - ContextUtils.getAppSharedPreferences().edit() - .putString(PREF_SEARCH_HISTORY, jsonArray.toString()).apply(); - } - - private List<String> readHistoryList() { - try { - String unformatted = ContextUtils.getAppSharedPreferences() - .getString(PREF_SEARCH_HISTORY, "[]"); - JSONArray jsonArray = new JSONArray(unformatted); - ArrayList<String> result = new ArrayList<String>(); - for (int i = 0; i < jsonArray.length(); i++) { - result.add(jsonArray.getString(i)); - } - return result; - } catch (JSONException e) { - return new ArrayList<String>(); - } - } - - /** - * Adds the current search text as top entry of the list. - */ - private List<String> addCurrentTextToHistoryList(List<String> history) { - String text = mSearchText.getText().toString().trim(); - if (TextUtils.isEmpty(text)) return history; - - history.remove(text); - history.add(0, text); - if (history.size() > SEARCH_HISTORY_MAX_ENTRIES) { - history.remove(history.size() - 1); - } - return history; - } - - // SearchHistoryDelegate implementation - - @Override - public void saveSearchHistory() { - saveHistoryList((addCurrentTextToHistoryList(readHistoryList()))); - } - - // BookmarkUIObserver implementation - - @Override - public void onBookmarkDelegateInitialized(BookmarkDelegate delegate) { - mDelegate = delegate; - mDelegate.addUIObserver(this); - mBookmarkModel = mDelegate.getModel(); - } - - @Override - public void onDestroy() { - mBookmarkModel.removeObserver(mModelObserver); - mDelegate.removeUIObserver(this); - } - - @Override - public void onFolderStateSet(BookmarkId folder) { - } - - @Override - public void onSelectionStateChange(List<BookmarkId> selectedBookmarks) { - } - - private class ResultListAdapter extends BaseAdapter { - private BookmarkDelegate mDelegate; - private List<BookmarkMatch> mBookmarktList; - - public ResultListAdapter(List<BookmarkMatch> bookmarkMatches, - BookmarkDelegate delegate) { - mDelegate = delegate; - mBookmarktList = bookmarkMatches; - } - - @Override - public int getCount() { - return mBookmarktList.size(); - } - - @Override - public BookmarkMatch getItem(int position) { - return mBookmarktList.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final BookmarkMatch bookmarkMatch = getItem(position); - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()).inflate( - R.layout.bookmark_search_row, parent, false); - } - final BookmarkSearchRow row = (BookmarkSearchRow) convertView; - row.onBookmarkDelegateInitialized(mDelegate); - row.setBookmarkId(bookmarkMatch.getBookmarkId()); - row.setSearchHistoryDelegate(BookmarkSearchView.this); - return convertView; - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSheetContent.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSheetContent.java index 8502560..5cb1c677d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSheetContent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSheetContent.java
@@ -8,7 +8,6 @@ import android.view.View; import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.toolbar.BottomToolbarPhone; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet.BottomSheetContent; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContentController; @@ -26,7 +25,7 @@ */ public BookmarkSheetContent(ChromeActivity activity) { mBookmarkManager = new BookmarkManager(activity, false); - mBookmarkManager.updateForUrl(UrlConstants.BOOKMARKS_URL); + mBookmarkManager.updateForUrl(BookmarkUtils.getLastUsedUrl(activity)); mContentView = mBookmarkManager.getView(); mToolbarView = mBookmarkManager.detachToolbarView(); ((BottomToolbarPhone) activity.getToolbarManager().getToolbar())
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIObserver.java index 939267e..030988b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIObserver.java
@@ -24,4 +24,9 @@ * @see BookmarkDelegate#openFolder(BookmarkId) */ void onFolderStateSet(BookmarkId folder); + + /** + * Called when the UI state is set to {@link BookmarkUIState#STATE_SEARCHING}. + */ + void onSearchStateSet(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIState.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIState.java index d13ecd6..e9c07cb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIState.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIState.java
@@ -17,6 +17,7 @@ class BookmarkUIState { static final int STATE_LOADING = 1; static final int STATE_FOLDER = 2; + static final int STATE_SEARCHING = 3; private static final int STATE_INVALID = 0; /** @@ -33,6 +34,13 @@ return state; } + static BookmarkUIState createSearchState() { + BookmarkUIState state = new BookmarkUIState(); + state.mState = STATE_SEARCHING; + state.mUrl = ""; + return state; + } + static BookmarkUIState createFolderState(BookmarkId folder, BookmarkModel bookmarkModel) { return createStateFromUrl(createFolderUrl(folder), bookmarkModel);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java index baecee1..71e715a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -462,15 +462,6 @@ } /** - * Called when the SERP finishes loading, this records the duration of loading the SERP from - * the time the panel was opened until the present. - * @param wasPrefetch Whether the request was prefetch-enabled. - */ - public void onSearchResultsLoaded(boolean wasPrefetch) { - mPanelMetrics.onSearchResultsLoaded(wasPrefetch); - } - - /** * Called after the panel has navigated to prefetched Search Results. * If the user has the panel open then they will see the prefetched result starting to load. * Currently this just logs the time between the start of the search until the results start to
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java index 6040d00..7f6c79d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelMetrics.java
@@ -36,7 +36,6 @@ private boolean mHasExitedMaximized; private boolean mIsSerpNavigation; private boolean mWasActivatedByTap; - private boolean mIsSearchPanelFullyPreloaded; private boolean mWasIconSpriteAnimated; private boolean mWasPanelOpenedBeyondPeek; private boolean mWasSelectionPartOfUrl; @@ -56,10 +55,6 @@ // Time when the panel peeks into view (not reset by a chained search). // Used to log total time the panel is showing (not closed). private long mFirstPeekTimeNs; - // Time when the panel contents come into view (when the panel is opened). - // Used to log preload effectiveness info -- additional time needed to fully render the - // content in the overlay. - private long mContentFirstViewTimeNs; // Time when a search request was started. Reset by chained searches. // Used to log the time it takes for a Search Result to become available. private long mSearchRequestStartTimeNs; @@ -99,13 +94,9 @@ && !isSameState; boolean isFirstExitFromMaximized = fromState == PanelState.MAXIMIZED && !mHasExitedMaximized && !isSameState; - boolean isFirstSearchView = isFirstExitFromPeeking && toState != PanelState.CLOSED; boolean isContentVisible = toState == PanelState.MAXIMIZED || toState == PanelState.EXPANDED; boolean isExitingPanelOpenedBeyondPeeked = mWasPanelOpenedBeyondPeek && !isContentVisible; - // This variable is needed for logging and gets reset in an isStartingSearch block below, - // so a local copy is created before the reset. - boolean isSearchPanelFullyPreloaded = mIsSearchPanelFullyPreloaded; if (toState == PanelState.CLOSED && mPanelTriggerTimeFromTapNs != 0 && reason == StateChangeReason.BASE_PAGE_SCROLL) { @@ -196,8 +187,6 @@ if (isStartingSearch) { mFirstPeekTimeNs = System.nanoTime(); - mContentFirstViewTimeNs = 0; - mIsSearchPanelFullyPreloaded = false; mWasActivatedByTap = reason == StateChangeReason.TEXT_SELECT_TAP; mBlacklistReason = BlacklistReason.NONE; if (mWasActivatedByTap && mResultsSeenExperiments != null) { @@ -207,9 +196,6 @@ mWasAnyHeuristicSatisfiedOnPanelShow = false; } } - if (isFirstSearchView) { - onSearchPanelFirstView(); - } // Log state changes. We only log the first transition to a state within a contextual // search. Note that when a user clicks on a link on the search content view, this will @@ -252,9 +238,6 @@ } if (isEndingSearch) { - if (mHasMaximized || mHasExpanded) { - ContextualSearchUma.logSerpLoadedOnClose(isSearchPanelFullyPreloaded); - } mDidSearchInvolvePromo = false; mWasSearchContentViewSeen = false; mHasExpanded = false; @@ -396,23 +379,6 @@ } /** - * Records timing information when the search results have fully loaded. - * @param wasPrefetch Whether the request was prefetch-enabled. - */ - public void onSearchResultsLoaded(boolean wasPrefetch) { - if (mHasExpanded || mHasMaximized) { - // Already opened, log how long it took. - assert mContentFirstViewTimeNs != 0; - long durationMs = - (System.nanoTime() - mContentFirstViewTimeNs) / MILLISECONDS_TO_NANOSECONDS; - logSearchPanelLoadDuration(wasPrefetch, durationMs); - } - - // Not yet opened, wait till an open to log. - mIsSearchPanelFullyPreloaded = true; - } - - /** * Called after the panel has navigated to prefetched Search Results. * This is the point where the search result starts to render in the panel. */ @@ -440,19 +406,6 @@ } /** - * Records timing information when the search panel has been viewed for the first time. - */ - private void onSearchPanelFirstView() { - if (mIsSearchPanelFullyPreloaded) { - // Already fully pre-loaded, record a wait of 0 milliseconds. - logSearchPanelLoadDuration(true, 0); - } else { - // Start a loading timer. - mContentFirstViewTimeNs = System.nanoTime(); - } - } - - /** * Determine whether a new contextual search is starting. * @param toState The contextual search state that will be transitioned to. * @param reason The reason for the search state transition. @@ -484,14 +437,5 @@ private boolean isOngoingContextualSearch(PanelState fromState) { return fromState != PanelState.UNDEFINED && fromState != PanelState.CLOSED; } - - /** - * Logs the duration the user waited for the search panel to fully load, once it was opened. - * @param wasPrefetch Whether the load included prefetch. - * @param durationMs The duration to log. - */ - private void logSearchPanelLoadDuration(boolean wasPrefetch, long durationMs) { - ContextualSearchUma.logSearchPanelLoadDuration(wasPrefetch, durationMs); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index 0d44461..b08de6e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -143,7 +143,11 @@ static final int ACTION_CALL = 30; static final int ACTION_SEND_TEXT_MESSAGE = 31; static final int ACTION_COPY_PHONE_NUMBER = 32; - static final int NUM_ACTIONS = 33; + static final int ACTION_OPEN_IN_NEW_CHROME_TAB = 33; + static final int ACTION_OPEN_IN_CHROME_INCOGNITO_TAB = 34; + static final int ACTION_OPEN_IN_BROWSER = 35; + static final int ACTION_OPEN_IN_CHROME = 36; + static final int NUM_ACTIONS = 37; // Note: these values must match the ContextMenuSaveLinkType enum in histograms.xml. // Only add new values at the end, right before NUM_TYPES. We depend on these specific @@ -556,12 +560,16 @@ ContextMenuUma.record(params, ContextMenuUma.ACTION_SHARE_IMAGE); helper.shareImage(); } else if (itemId == R.id.menu_id_open_in_chrome) { + ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_CHROME); mDelegate.onOpenInChrome(params.getLinkUrl(), params.getPageUrl()); } else if (itemId == R.id.contextmenu_open_in_new_chrome_tab) { + ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_NEW_CHROME_TAB); mDelegate.onOpenInNewChromeTabFromCCT(getUrl(params), false); } else if (itemId == R.id.contextmenu_open_in_chrome_incognito_tab) { + ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_CHROME_INCOGNITO_TAB); mDelegate.onOpenInNewChromeTabFromCCT(getUrl(params), true); } else if (itemId == R.id.contextmenu_open_in_browser_id) { + ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_BROWSER); mDelegate.onOpenInDefaultBrowser(params.getLinkUrl()); } else { assert false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/PlatformContextMenuUi.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/PlatformContextMenuUi.java index b2d849c..cfbaa87 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/PlatformContextMenuUi.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/PlatformContextMenuUi.java
@@ -6,6 +6,7 @@ import android.app.Activity; import android.content.Context; +import android.text.TextUtils; import android.util.Pair; import android.view.ContextMenu; import android.view.MenuItem; @@ -29,7 +30,11 @@ public void displayMenu(Activity activity, ContextMenuParams params, List<Pair<Integer, List<ContextMenuItem>>> itemGroups, final Callback<Integer> listener) { - setHeaderText(activity, mMenu, ChromeContextMenuPopulator.createHeaderText(params)); + + String headerText = ChromeContextMenuPopulator.createHeaderText(params); + if (TextUtils.isEmpty(headerText)) { + setHeaderText(activity, mMenu, headerText); + } MenuItem.OnMenuItemClickListener menuListener = new MenuItem.OnMenuItemClickListener() { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 20f75a04..b1326829 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -753,7 +753,9 @@ } // Adjust the selection unless the user changed it since we initiated the search. - if (selectionStartAdjust != 0 || selectionEndAdjust != 0) { + if (selectionStartAdjust != 0 + || selectionEndAdjust != 0 + && mSelectionController.getSelectionType() == SelectionType.TAP) { String originalSelection = mContext == null ? null : mContext.getSelection(); if (originalSelection != null && originalSelection.equals(mSelectionController.getSelectedText())) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java index 409a459..ecbe405a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
@@ -727,30 +727,6 @@ } /** - * Log the duration of finishing loading the SERP after the panel is opened. - * @param wasPrefetch Whether the request was prefetch-enabled or not. - * @param durationMs The duration of loading the SERP till completely loaded, in milliseconds. - * Note that this value will be 0 when the SERP is prefetched and the user waits a - * while before opening the panel. - */ - public static void logSearchPanelLoadDuration(boolean wasPrefetch, long durationMs) { - if (wasPrefetch) { - RecordHistogram.recordMediumTimesHistogram("Search.ContextualSearchDurationPrefetched", - durationMs, TimeUnit.MILLISECONDS); - } else { - RecordHistogram.recordMediumTimesHistogram( - "Search.ContextualSearchDurationNonPrefetched", durationMs, - TimeUnit.MILLISECONDS); - } - - // Also record a summary histogram with counts for each possibility. - int code = !wasPrefetch ? NOT_PREFETCHED - : (durationMs == 0 ? PREFETCHED_FULLY_LOADED : PREFETCHED_PARIALLY_LOADED); - RecordHistogram.recordEnumeratedHistogram("Search.ContextualSearchPrefetchSummary", - code, PREFETCH_BOUNDARY); - } - - /** * Logs the duration from starting a search until the Search Term is resolved. * @param durationMs The duration to record. */ @@ -1031,15 +1007,6 @@ } /** - * Logs whether the SERP was fully loaded when an opened panel was closed. - * @param fullyLoaded Whether the SERP had finished loading before the panel was closed. - */ - public static void logSerpLoadedOnClose(boolean fullyLoaded) { - RecordHistogram.recordEnumeratedHistogram("Search.ContextualSearchSerpLoadedOnClose", - fullyLoaded ? FULLY_LOADED : PARTIALLY_LOADED, LOADED_BOUNDARY); - } - - /** * Log whether the UX was suppressed by a recent scroll. * @param wasSuppressed Whether showing the UX was suppressed by a recent scroll. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index bab7b58..f9dc229 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -44,6 +44,7 @@ import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.init.EmptyBrowserParts; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge; @@ -316,7 +317,7 @@ */ private static Notification buildSummaryNotificationWithIcon(Context context, int iconId) { ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, context.getString(R.string.notification_category_browser), @@ -1007,7 +1008,7 @@ extras.putInt(EXTRA_NOTIFICATION_BUNDLE_ICON_ID, iconId); ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, mContext.getString(R.string.notification_category_browser),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java index 42bc271..61bf103 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -127,9 +127,6 @@ VectorDrawableCompat.create( mActivity.getResources(), R.drawable.history_big, mActivity.getTheme()), R.string.history_manager_empty, R.string.history_manager_no_results); - // TODO(twellington): remove this after unifying bookmarks and downloads UI with history. - mEmptyView.setTextColor(ApiCompatibilityUtils.getColor(mActivity.getResources(), - R.color.google_grey_500)); // 6. Create large icon bridge. mLargeIconBridge = new LargeIconBridge(Profile.getLastUsedProfile().getOriginalProfile());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java index b56b9b6..2512774 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -10,8 +10,8 @@ import org.chromium.base.ContextUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; @@ -32,7 +32,7 @@ String title = context.getResources().getString(R.string.app_name); ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, context.getString(R.string.notification_category_browser),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java index 23fa323..284dfa7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -17,8 +17,8 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid; @@ -163,7 +163,7 @@ */ private void createNotification(int notificationId, int mediaType, String url) { ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, mContext.getString(R.string.notification_category_browser),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java index 01c791d..f8208a1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.content_public.common.MediaMetadata; @@ -661,10 +662,14 @@ return; } - if (mService == null && mediaNotificationInfo.isPaused) return; - mMediaNotificationInfo = mediaNotificationInfo; + // If there's no pending service start request, don't try to start service. If there is a + // pending service start request but the service haven't started yet, only update the + // |mMediaNotificationInfo|. The service will update the notification later once it's + // started. + if (mService == null && mediaNotificationInfo.isPaused) return; + if (mService == null) { updateMediaSession(); updateNotificationBuilder(); @@ -752,7 +757,7 @@ } private void updateNotificationBuilder() { - mNotificationBuilder = AppHooks.get().createChromeNotificationBuilder( + mNotificationBuilder = NotificationBuilderFactory.createChromeNotificationBuilder( true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, mContext.getString(org.chromium.chrome.R.string.notification_category_browser), NotificationConstants.CATEGORY_GROUP_ID_GENERAL,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java index cfcf612f..697e793 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
@@ -24,7 +24,6 @@ import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.ui.base.LocalizationUtils; import java.util.Date; @@ -141,12 +140,14 @@ // Note: under the hood this is not a NotificationCompat builder so be mindful of the // API level of methods you call on the builder. // TODO(crbug.com/697104) We should probably use a Compat builder. - ChromeNotificationBuilder builder = AppHooks.get().createChromeNotificationBuilder( - false /* preferCompat */, NotificationConstants.CATEGORY_ID_SITES, - mContext.getString(org.chromium.chrome.R.string.notification_category_sites), - NotificationConstants.CATEGORY_GROUP_ID_GENERAL, - mContext.getString( - org.chromium.chrome.R.string.notification_category_group_general)); + ChromeNotificationBuilder builder = + NotificationBuilderFactory.createChromeNotificationBuilder(false /* preferCompat */, + NotificationConstants.CATEGORY_ID_SITES, + mContext.getString( + org.chromium.chrome.R.string.notification_category_sites), + NotificationConstants.CATEGORY_GROUP_ID_GENERAL, + mContext.getString( + org.chromium.chrome.R.string.notification_category_group_general)); builder.setTicker(mTickerText); builder.setContentIntent(mContentIntent); builder.setDeleteIntent(mDeleteIntent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderFactory.java new file mode 100644 index 0000000..609be47 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderFactory.java
@@ -0,0 +1,45 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.notifications; + +import android.content.Context; + +import org.chromium.base.BuildInfo; +import org.chromium.base.ContextUtils; + +/** + * Factory which supplies the appropriate type of notification builder based on Android version. + * Should be used for all notifications we create, to ensure a notification channel is set on O. + */ +public class NotificationBuilderFactory { + /** + * Creates either a Notification.Builder or NotificationCompat.Builder under the hood, wrapped + * in our own common interface. + * + * TODO(crbug.com/704152) Remove this once we've updated to revision 26 of the support library. + * Then we can use NotificationCompat.Builder and set the channel directly everywhere. + * + * @param preferCompat true if a NotificationCompat.Builder is preferred. + * A Notification.Builder will be used regardless on Android O. + * @param channelId The ID of the channel the notification should be posted to. + * @param channelName The name of the channel the notification should be posted to. + * Used to create the channel if a channel with channelId does not exist. + * @param channelGroupId The ID of the channel group the channel belongs to. Used when creating + * the channel if a channel with channelId does not exist. + * @param channelGroupName The name of the channel group the channel belongs to. + * Used to create the channel group if a channel group with + * channelGroupId does not already exist. + */ + public static ChromeNotificationBuilder createChromeNotificationBuilder(boolean preferCompat, + String channelId, String channelName, String channelGroupId, String channelGroupName) { + Context context = ContextUtils.getApplicationContext(); + if (BuildInfo.isAtLeastO()) { + return new NotificationBuilderForO(ContextUtils.getApplicationContext(), channelId, + channelName, channelGroupId, channelGroupName); + } + return preferCompat ? new NotificationCompatBuilder(context) + : new NotificationBuilder(context); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java new file mode 100644 index 0000000..724dadd --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java
@@ -0,0 +1,99 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.notifications; + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; + +import org.chromium.base.BuildInfo; +import org.chromium.base.Log; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Builder to be used on Android O until we target O and these APIs are in the support library. + */ +@TargetApi(26 /* Build.VERSION_CODES.O */) +public class NotificationBuilderForO extends NotificationBuilder { + private static final String TAG = "NotifBuilderForO"; + + public NotificationBuilderForO(Context context, String channelId, String channelName, + String channelGroupId, String channelGroupName) { + super(context); + assert BuildInfo.isAtLeastO(); + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + /* + The code in the try-block uses reflection in order to compile as it calls APIs newer than + our target version of Android. The equivalent code without reflection is as follows: + + notificationManager.createNotificationChannelGroup( + new NotificationChannelGroup(channelGroupId, channelGroupName)); + NotificationChannel channel = new NotificationChannel( + channelId, channelName, importance); + channel.setGroup(channelGroupId); + channel.setShowBadge(false); + notificationManager.createNotificationChannel(channel); + notificationBuilder.setChannel(channelId); + + Note this whole class can be removed once we target O, and channels may be set + inline where notifications are created, using the pattern above. + + In the longer term we may wish to initialize our channels in response to BOOT_COMPLETED or + ACTION_PACKAGE_REPLACED, as per Android guidelines. + */ + try { + // Create channel group + Class<?> channelGroupClass = Class.forName("android.app.NotificationChannelGroup"); + Constructor<?> channelGroupConstructor = + channelGroupClass.getDeclaredConstructor(String.class, CharSequence.class); + Object channelGroup = + channelGroupConstructor.newInstance(channelGroupId, channelGroupName); + + // Register channel group + Method createNotificationChannelGroupMethod = notificationManager.getClass().getMethod( + "createNotificationChannelGroup", channelGroupClass); + createNotificationChannelGroupMethod.invoke(notificationManager, channelGroup); + + // Create channel + Class<?> channelClass = Class.forName("android.app.NotificationChannel"); + Constructor<?> channelConstructor = channelClass.getDeclaredConstructor( + String.class, CharSequence.class, int.class); + Object channel = channelConstructor.newInstance( + channelId, channelName, getChannelImportance(channelId)); + + // Set group on channel + Method setGroupMethod = channelClass.getMethod("setGroup", String.class); + setGroupMethod.invoke(channel, channelGroupId); + + // Set channel to not badge on app icon + Method setShowBadgeMethod = channelClass.getMethod("setShowBadge", boolean.class); + setShowBadgeMethod.invoke(channel, false); + + // Register channel + Method createNotificationChannelMethod = notificationManager.getClass().getMethod( + "createNotificationChannel", channelClass); + createNotificationChannelMethod.invoke(notificationManager, channel); + + // Set channel on builder + Method setChannelMethod = + Notification.Builder.class.getMethod("setChannel", String.class); + setChannelMethod.invoke(mBuilder, channelId); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException + | InstantiationException | InvocationTargetException e) { + Log.e(TAG, "Error initializing notification builder:", e); + } + } + + private static int getChannelImportance(String channelId) { + return NotificationConstants.CATEGORY_ID_SITES.equals(channelId) + ? NotificationManager.IMPORTANCE_DEFAULT + : NotificationManager.IMPORTANCE_LOW; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java index 84b5fff..39601f23 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java
@@ -86,6 +86,7 @@ // For example, 'Web:chromium.org' for a notification from chromium.org. static final String GROUP_WEB_PREFIX = "Web:"; + // Notification channel ids. public static final String CATEGORY_ID_BROWSER = "browser"; public static final String CATEGORY_ID_SITES = "sites"; public static final String CATEGORY_GROUP_ID_GENERAL = "general";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java index e4f5c29..025f167 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java
@@ -8,8 +8,6 @@ import android.content.Context; import android.os.Build; -import org.chromium.chrome.browser.AppHooks; - /** * Builds a notification using the standard Notification.BigTextStyle layout. */ @@ -26,12 +24,14 @@ // Note: this is not a NotificationCompat builder so be mindful of the // API level of methods you call on the builder. // TODO(crbug.com/697104) We should probably use a Compat builder. - ChromeNotificationBuilder builder = AppHooks.get().createChromeNotificationBuilder( - false /* preferCompat */, NotificationConstants.CATEGORY_ID_SITES, - mContext.getString(org.chromium.chrome.R.string.notification_category_sites), - NotificationConstants.CATEGORY_GROUP_ID_GENERAL, - mContext.getString( - org.chromium.chrome.R.string.notification_category_group_general)); + ChromeNotificationBuilder builder = + NotificationBuilderFactory.createChromeNotificationBuilder(false /* preferCompat */, + NotificationConstants.CATEGORY_ID_SITES, + mContext.getString( + org.chromium.chrome.R.string.notification_category_sites), + NotificationConstants.CATEGORY_GROUP_ID_GENERAL, + mContext.getString( + org.chromium.chrome.R.string.notification_category_group_general)); builder.setContentTitle(mTitle); builder.setContentText(mBody);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java index 0ce1c17..07c2db4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotificationHelper.java
@@ -21,11 +21,11 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsNotificationAction; @@ -151,7 +151,7 @@ .putExtra(NOTIFICATION_CATEGORY_EXTRA, category) .putExtra(NOTIFICATION_ID_WITHIN_CATEGORY_EXTRA, idWithinCategory); ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, context.getString(R.string.notification_category_browser),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundGcmScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundGcmScheduler.java index ae8126e3..c01c3fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundGcmScheduler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundGcmScheduler.java
@@ -50,6 +50,7 @@ ? Task.NETWORK_STATE_UNMETERED : Task.NETWORK_STATE_CONNECTED) .setRequiresCharging(triggerConditions.requirePowerConnected()) + .setPersisted(true) .setExtras(taskExtras) .build();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbyForegroundSubscription.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbyForegroundSubscription.java index abf8956c..99efb62 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbyForegroundSubscription.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbyForegroundSubscription.java
@@ -7,8 +7,11 @@ import android.app.Activity; import com.google.android.gms.nearby.Nearby; +import com.google.android.gms.nearby.messages.Distance; +import com.google.android.gms.nearby.messages.Message; import com.google.android.gms.nearby.messages.MessageListener; +import org.chromium.base.ThreadUtils; /** * This class represents a connection to Google Play Services that does foreground @@ -22,12 +25,28 @@ */ class NearbyForegroundSubscription extends NearbySubscription { private static final String TAG = "PhysicalWeb"; - private final MessageListener mMessageListener; + private static final MessageListener MESSAGE_LISTENER = new MessageListener() { + @Override + public void onFound(Message message) {} + + @Override + public void onDistanceChanged(Message message, final Distance distance) { + final String url = PhysicalWebBleClient.getInstance().getUrlFromMessage(message); + if (url == null) return; + + ThreadUtils.postOnUiThread(new Runnable() { + @Override + public void run() { + UrlManager.getInstance().addUrl( + new UrlInfo(url).setDistance(distance.getMeters())); + } + }); + } + }; private boolean mShouldSubscribe; NearbyForegroundSubscription(Activity activity) { super(activity); - mMessageListener = PhysicalWebBleClient.getInstance().createForegroundMessageListener(); mShouldSubscribe = false; } @@ -43,7 +62,7 @@ mShouldSubscribe = true; return; } - Nearby.Messages.subscribe(getGoogleApiClient(), mMessageListener, createSubscribeOptions()) + Nearby.Messages.subscribe(getGoogleApiClient(), MESSAGE_LISTENER, createSubscribeOptions()) .setResultCallback(new SimpleResultCallback("foreground subscribe")); } @@ -52,7 +71,7 @@ mShouldSubscribe = false; return; } - Nearby.Messages.unsubscribe(getGoogleApiClient(), mMessageListener) + Nearby.Messages.unsubscribe(getGoogleApiClient(), MESSAGE_LISTENER) .setResultCallback(new SimpleResultCallback("foreground unsubscribe")); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbySubscription.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbySubscription.java index 336b768..f4538f70 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbySubscription.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/NearbySubscription.java
@@ -13,7 +13,10 @@ import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; +import com.google.android.gms.nearby.Nearby; import com.google.android.gms.nearby.messages.MessageFilter; +import com.google.android.gms.nearby.messages.MessagesOptions; +import com.google.android.gms.nearby.messages.NearbyPermissions; import com.google.android.gms.nearby.messages.Strategy; import com.google.android.gms.nearby.messages.SubscribeOptions; @@ -48,8 +51,10 @@ } NearbySubscription(Context context) { - mGoogleApiClient = PhysicalWebBleClient.getInstance().modifyGoogleApiClientBuilder( - new GoogleApiClient.Builder(context)) + mGoogleApiClient = new GoogleApiClient.Builder(context) + .addApi(Nearby.MESSAGES_API, new MessagesOptions.Builder() + .setPermissions(NearbyPermissions.BLE) + .build()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java index 9516ea15..2405c574 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWeb.java
@@ -9,8 +9,8 @@ import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import org.chromium.base.ContextUtils; @@ -28,7 +28,6 @@ public class PhysicalWeb { public static final int OPTIN_NOTIFY_MAX_TRIES = 1; private static final String PHYSICAL_WEB_SHARING_PREFERENCE = "physical_web_sharing"; - private static final String PREF_PHYSICAL_WEB_NOTIFY_COUNT = "physical_web_notify_count"; private static final String FEATURE_NAME = "PhysicalWeb"; private static final String PHYSICAL_WEB_SHARING_FEATURE_NAME = "PhysicalWebSharing"; private static final int MIN_ANDROID_VERSION = 18; @@ -67,8 +66,8 @@ * @return boolean {@code true} if the feature is enabled */ public static boolean sharingIsOptedIn() { - SharedPreferences sharedPrefs = ContextUtils.getAppSharedPreferences(); - return sharedPrefs.getBoolean(PHYSICAL_WEB_SHARING_PREFERENCE, false); + return ContextUtils.getAppSharedPreferences() + .getBoolean(PHYSICAL_WEB_SHARING_PREFERENCE, false); } /** @@ -92,26 +91,6 @@ } /** - * Increments a value tracking how many times we've shown the Physical Web - * opt-in notification. - */ - public static void recordOptInNotification() { - SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); - int value = sharedPreferences.getInt(PREF_PHYSICAL_WEB_NOTIFY_COUNT, 0); - sharedPreferences.edit().putInt(PREF_PHYSICAL_WEB_NOTIFY_COUNT, value + 1).apply(); - } - - /** - * Gets the current count of how many times a high-priority opt-in notification - * has been shown. - * @return an integer representing the high-priority notifification display count. - */ - public static int getOptInNotifyCount() { - SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); - return sharedPreferences.getInt(PREF_PHYSICAL_WEB_NOTIFY_COUNT, 0); - } - - /** * Performs various Physical Web operations that should happen on startup. */ public static void onChromeStart() { @@ -131,6 +110,17 @@ // The PhysicalWebUma call in this method should be called only when the native library // is loaded. This is always the case on chrome startup. PhysicalWebUma.uploadDeferredMetrics(); + + // We can remove this block after M60. + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + ContextUtils.getAppSharedPreferences().edit() + .remove("physical_web_notify_count") + .apply(); + return null; + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBleClient.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBleClient.java index 71893b7..559bfdd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBleClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBleClient.java
@@ -7,8 +7,6 @@ import android.os.Handler; import android.os.Looper; -import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.nearby.Nearby; import com.google.android.gms.nearby.messages.Message; import com.google.android.gms.nearby.messages.MessageFilter; import com.google.android.gms.nearby.messages.MessageListener; @@ -17,7 +15,7 @@ /** * The Client that harvests URLs from BLE signals. - * This class is designed to scan URSs from Bluetooth Low Energy beacons. + * This class is designed to scan URLs from Bluetooth Low Energy beacons. * This class is currently an empty implementation and must be extended by a * subclass. */ @@ -25,13 +23,6 @@ private static PhysicalWebBleClient sInstance; private static final String TAG = "PhysicalWeb"; - // We don't actually listen to any of the onFound or onLost events in the foreground. - // The background listener will get these. - protected static class ForegroundMessageListener extends MessageListener { - @Override - public void onFound(Message message) {} - } - protected static class BackgroundMessageListener extends MessageListener { @Override public void onFound(Message message) { @@ -80,14 +71,6 @@ } /** - * Create a MessageListener that listens during a foreground scan. - * @return the MessageListener. - */ - MessageListener createForegroundMessageListener() { - return new ForegroundMessageListener(); - } - - /** * Get the URLs from a device within a message. * @param message The Nearby message. * @return The URL contained in the message. @@ -97,15 +80,6 @@ } /** - * Modify a GoogleApiClient.Builder as necessary for doing Physical Web scanning. - * @param builder The builder to be modified. - * @return The Builder. - */ - GoogleApiClient.Builder modifyGoogleApiClientBuilder(GoogleApiClient.Builder builder) { - return builder.addApi(Nearby.MESSAGES_API); - } - - /** * Modify a MessageFilter.Builder as necessary for doing Physical Web scanning. * @param builder The builder to be modified. * @return The Builder.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java index 1d88903..d267ba5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/physicalweb/PhysicalWebBroadcastService.java
@@ -20,8 +20,8 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationManagerProxy; import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl; @@ -149,7 +149,7 @@ NotificationManagerProxy notificationManager = new NotificationManagerProxyImpl( (NotificationManager) getSystemService(NOTIFICATION_SERVICE)); ChromeNotificationBuilder notificationBuilder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, context.getString(R.string.notification_category_browser),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java index a3efe33..643225f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -16,8 +16,8 @@ import org.chromium.base.ThreadUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder; +import org.chromium.chrome.browser.notifications.NotificationBuilderFactory; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationManagerProxy; import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl; @@ -102,7 +102,7 @@ // There is no need to provide a group summary notification because the NOTIFICATION_ID_SYNC // notification id ensures there's only one sync notification at a time. ChromeNotificationBuilder builder = - AppHooks.get() + NotificationBuilderFactory .createChromeNotificationBuilder(true /* preferCompat */, NotificationConstants.CATEGORY_ID_BROWSER, mApplicationContext.getString(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java index c8e9287..ce805cf8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -595,7 +595,7 @@ mTabCreatorManager.getTabCreator(isIncognito).createFrozenTab( tabState, tabToRestore.id, restoredIndex); } else { - if (NewTabPage.isNTPUrl(tabToRestore.url) && !setAsActive) { + if (NewTabPage.isNTPUrl(tabToRestore.url) && !setAsActive && !tabToRestore.fromMerge) { Log.i(TAG, "Skipping restore of non-selected NTP."); return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListLayout.java index 674350c..b2d8c80 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListLayout.java
@@ -20,14 +20,17 @@ import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar.OnMenuItemClickListener; import android.util.AttributeSet; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewStub; +import android.widget.FrameLayout; import android.widget.RelativeLayout; import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.widget.FadingShadow; import org.chromium.chrome.browser.widget.FadingShadowView; import org.chromium.chrome.browser.widget.LoadingView; @@ -92,6 +95,7 @@ private boolean mToolbarPermanentlyHidden; private int mEmptyStringResId; private int mSearchEmptyStringResId; + private int mChromeHomeEmptyAndLoadingViewTopPadding; private UiConfig mUiConfig; @@ -136,8 +140,15 @@ LayoutInflater.from(getContext()).inflate(R.layout.selectable_list_layout, this); + // TODO(twellington): Remove this fork in the code after UX decides on final design + // for empty and loading views. + mChromeHomeEmptyAndLoadingViewTopPadding = + getResources().getDimensionPixelSize(R.dimen.chrome_home_empty_view_top_padding); + mEmptyView = (TextView) findViewById(R.id.empty_view); + setEmptyOrLoadingViewStyle(mEmptyView); mLoadingView = (LoadingView) findViewById(R.id.loading_view); + setEmptyOrLoadingViewStyle(mLoadingView); mLoadingView.showLoadingUI(); mToolbarStub = (ViewStub) findViewById(R.id.action_bar_stub); @@ -248,6 +259,7 @@ mEmptyView.setCompoundDrawablesWithIntrinsicBounds(null, emptyDrawable, null, null); mEmptyView.setText(mEmptyStringResId); + return mEmptyView; } @@ -257,6 +269,7 @@ public void onDestroyed() { mAdapter.unregisterAdapterDataObserver(mAdapterObserver); mToolbar.getSelectionDelegate().removeObserver(this); + mToolbar.destroy(); } /** @@ -363,4 +376,13 @@ public View getToolbarShadowForTests() { return mToolbarShadow; } + + private void setEmptyOrLoadingViewStyle(View view) { + if (!FeatureUtilities.isChromeHomeEnabled()) return; + + ((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.CENTER_HORIZONTAL; + ApiCompatibilityUtils.setPaddingRelative(view, ApiCompatibilityUtils.getPaddingStart(view), + view.getPaddingTop() + mChromeHomeEmptyAndLoadingViewTopPadding, + ApiCompatibilityUtils.getPaddingEnd(view), view.getPaddingBottom()); + } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java index bf16bf7..03b64f10 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableListToolbar.java
@@ -8,6 +8,7 @@ import android.content.Context; import android.graphics.Color; import android.support.annotation.CallSuper; +import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; @@ -78,9 +79,9 @@ protected boolean mIsSelectionEnabled; protected SelectionDelegate<E> mSelectionDelegate; + protected boolean mIsSearching; private boolean mHasSearchView; - private boolean mIsSearching; private LinearLayout mSearchView; private EditText mSearchEditText; private TintedImageButton mClearTextButton; @@ -112,6 +113,8 @@ private int mOriginalContentInsetStartWithNavigation; private int mOriginalContentInsetEndWithActions; + private boolean mIsDestroyed; + /** * Constructor for inflating from XML. */ @@ -122,10 +125,9 @@ /** * Destroys and cleans up itself. */ - public void destroy() { - if (mSelectionDelegate != null) { - mSelectionDelegate.removeObserver(this); - } + void destroy() { + mIsDestroyed = true; + if (mSelectionDelegate != null) mSelectionDelegate.removeObserver(this); } /** @@ -313,7 +315,8 @@ if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); - mDrawerLayout.addDrawerListener(null); + mDrawerLayout.removeDrawerListener(mActionBarDrawerToggle); + mActionBarDrawerToggle = null; } setNavigationOnClickListener(this); @@ -392,6 +395,17 @@ return false; } + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + if (mIsDestroyed) return; + + mSelectionDelegate.clearSelection(); + if (mIsSearching) hideSearchView(); + if (mDrawerLayout != null) mDrawerLayout.closeDrawer(GravityCompat.START); + } + /** * When the toolbar has a wide display style, its contents will be width constrained to * {@link UiConfig#WIDE_DISPLAY_STYLE_MIN_WIDTH_DP}. If the current screen width is greater than
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 7bdbf72b..26d3e1a 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1525,7 +1525,7 @@ Open in new Chrome tab </message> <message name="IDS_CONTEXTMENU_OPEN_IN_CHROME_INCOGNITO_TAB" desc="Context sensitive menu item to open the selected link in a Chrome incognito tab from Chrome Custom Tab. [CHAR-LIMIT=30]"> - Open in Chrome incognito tab + Open in incognito tab </message> <!-- Swipe refresh --> <message name="IDS_ACCESSIBILITY_SWIPE_REFRESH" desc="Content description for the swipe refresh action."> @@ -1604,7 +1604,7 @@ <message name="IDS_MENU_OPEN_WEBAPK" desc="Menu item for opening the installed WebAPK associated with the current PWA. [CHAR-LIMIT=27]"> Open <ph name="WEBAPK_NAME">%1$s<ex>Telegram</ex></ph> </message> - <message name="IDS_OPEN_WEBAPK_FAILED" desc="Opening of a WebAPK failed. [CHAR-LIMIT=27]"> + <message name="IDS_OPEN_WEBAPK_FAILED" desc="Opening of a WebAPK failed."> Could not launch app </message> <message name="IDS_MENU_ADD_TO_HOMESCREEN_INSTALL" desc="Menu item for adding a shortcut to the Home screen. [CHAR-LIMIT=27]"> @@ -2222,7 +2222,7 @@ Close dialog </message> <message name="IDS_BOOKMARK_ACTION_BAR_SEARCH" desc="Button text for bookmark search action on the bookmark action bar [CHAR-LIMIT=32]"> - Search bookmarks + Search your bookmarks </message> <message name="IDS_BOOKMARK_NO_RESULT" desc="Text explaining that no bookmarks are found to match a search query"> No bookmarks found
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 1f04a5a6..5c75aca 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -109,13 +109,10 @@ "java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkLaunchLocation.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java", - "java/src/org/chromium/chrome/browser/bookmarks/BookmarkMatch.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkRow.java", - "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchRow.java", - "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchView.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkSheetContent.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIObserver.java", "java/src/org/chromium/chrome/browser/bookmarks/BookmarkUIState.java", @@ -562,6 +559,8 @@ "java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java", "java/src/org/chromium/chrome/browser/notifications/NotificationBuilder.java", "java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java", + "java/src/org/chromium/chrome/browser/notifications/NotificationBuilderFactory.java", + "java/src/org/chromium/chrome/browser/notifications/NotificationBuilderForO.java", "java/src/org/chromium/chrome/browser/notifications/NotificationCompatBuilder.java", "java/src/org/chromium/chrome/browser/notifications/NotificationConstants.java", "java/src/org/chromium/chrome/browser/notifications/NotificationManagerProxy.java",
diff --git a/chrome/android/javatests/AndroidManifest.xml b/chrome/android/javatests/AndroidManifest.xml index 57b5390..2d8c57b 100644 --- a/chrome/android/javatests/AndroidManifest.xml +++ b/chrome/android/javatests/AndroidManifest.xml
@@ -54,6 +54,10 @@ android:exported="true"/> </application> + <instrumentation android:name="org.chromium.base.test.BaseChromiumAndroidJUnitRunner" + android:targetPackage="{{manifest_package}}" + android:label="Tests for {{manifest_package}}" + chromium-junit4="true"/> <instrumentation android:name="org.chromium.chrome.test.ChromeInstrumentationTestRunner" android:targetPackage="{{manifest_package}}" android:label="Tests for {{manifest_package}}"/>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java index cc56e2f..43d7d793 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
@@ -306,16 +306,10 @@ } }); - // TODO(661862): Remove once the dialog no longer closes when the window loses - // focus. - assertTrue(mChooserDialog.mFinishedEventType != -1); - - // TODO(661862): Uncomment once the dialog no longer closes when the window - // loses focus. - // assertEquals(1, mChooserDialog.mRestartSearchCount); - // assertEquals(removeLinkTags(getActivity().getString(R.string.bluetooth_searching)), - // statusView.getText().toString()); - // mChooserDialog.closeDialog(); + assertEquals(1, mChooserDialog.mRestartSearchCount); + assertEquals(removeLinkTags(getActivity().getString(R.string.bluetooth_searching)), + statusView.getText().toString()); + mChooserDialog.closeDialog(); } @LargeTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java index 2f10b91..e496be4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.bookmarks; +import android.support.test.filters.MediumTest; import android.support.test.filters.SmallTest; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; @@ -32,6 +33,7 @@ import java.util.ArrayList; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; /** * Tests for the bookmark manager. @@ -43,19 +45,24 @@ super(ChromeActivity.class); } - private static final String TEST_PAGE = "/chrome/test/data/android/google.html"; - private static final String TEST_PAGE_TITLE = "The Google"; + private static final String TEST_PAGE_URL_GOOGLE = "/chrome/test/data/android/google.html"; + private static final String TEST_PAGE_TITLE_GOOGLE = "The Google"; + private static final String TEST_PAGE_TITLE_GOOGLE2 = "Google"; + private static final String TEST_PAGE_URL_FOO = "/chrome/test/data/android/test.html"; + private static final String TEST_PAGE_TITLE_FOO = "Foo"; private BookmarkModel mBookmarkModel; protected RecyclerView mItemsContainer; private String mTestPage; + private String mTestPageFoo; private EmbeddedTestServer mTestServer; @Override protected void setUp() throws Exception { super.setUp(); mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext()); - mTestPage = mTestServer.getURL(TEST_PAGE); + mTestPage = mTestServer.getURL(TEST_PAGE_URL_GOOGLE); + mTestPageFoo = mTestServer.getURL(TEST_PAGE_URL_FOO); } @Override @@ -125,31 +132,25 @@ BookmarkItem item = mBookmarkModel.getBookmarkById(id); assertEquals(mBookmarkModel.getDefaultFolder(), item.getParentId()); assertEquals(mTestPage, item.getUrl()); - assertEquals(TEST_PAGE_TITLE, item.getTitle()); + assertEquals(TEST_PAGE_TITLE_GOOGLE, item.getTitle()); } }); } @SmallTest - public void testOpenBookmark() throws InterruptedException { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - mBookmarkModel.addBookmark(mBookmarkModel.getDefaultFolder(), 0, TEST_PAGE_TITLE, - mTestPage); - } - }); + public void testOpenBookmark() throws InterruptedException, ExecutionException { + addBookmark(TEST_PAGE_TITLE_GOOGLE, mTestPage); openBookmarkManager(); assertTrue("Grid view does not contain added bookmark: ", - isItemPresentInBookmarkList(TEST_PAGE_TITLE)); - final View tile = getViewWithText(mItemsContainer, TEST_PAGE_TITLE); + isItemPresentInBookmarkList(TEST_PAGE_TITLE_GOOGLE)); + final View tile = getViewWithText(mItemsContainer, TEST_PAGE_TITLE_GOOGLE); ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), new Runnable() { @Override public void run() { TouchCommon.singleClickView(tile); } }); - assertEquals(TEST_PAGE_TITLE, getActivity().getActivityTab().getTitle()); + assertEquals(TEST_PAGE_TITLE_GOOGLE, getActivity().getActivityTab().getTitle()); } @SmallTest @@ -175,6 +176,57 @@ BookmarkUtils.getLastUsedUrl(getActivity())); } + @MediumTest + public void testSearchBookmarks() throws Exception { + BookmarkPromoHeader.setShouldShowForTests(); + addBookmark(TEST_PAGE_TITLE_GOOGLE, mTestPage); + addBookmark(TEST_PAGE_TITLE_FOO, mTestPageFoo); + openBookmarkManager(); + + BookmarkItemsAdapter adapter = ((BookmarkItemsAdapter) mItemsContainer.getAdapter()); + final BookmarkDelegate delegate = adapter.getDelegateForTesting(); + + assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); + assertEquals("Wrong number of items before starting search.", 3, adapter.getItemCount()); + + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + delegate.openSearchUI(); + } + }); + + assertEquals(BookmarkUIState.STATE_SEARCHING, delegate.getCurrentState()); + assertEquals("Wrong number of items after showing search UI. The promo should be hidden.", + 2, adapter.getItemCount()); + + searchBookmarks("Google"); + assertEquals("Wrong number of items after searching.", 1, + mItemsContainer.getAdapter().getItemCount()); + + BookmarkId newBookmark = addBookmark(TEST_PAGE_TITLE_GOOGLE2, mTestPage); + assertEquals("Wrong number of items after bookmark added while searching.", 2, + mItemsContainer.getAdapter().getItemCount()); + + removeBookmark(newBookmark); + assertEquals("Wrong number of items after bookmark removed while searching.", 1, + mItemsContainer.getAdapter().getItemCount()); + + searchBookmarks("Non-existent page"); + assertEquals("Wrong number of items after searching for non-existent item.", 0, + mItemsContainer.getAdapter().getItemCount()); + + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + delegate.closeSearchUI(); + } + }); + assertEquals("Wrong number of items after closing search UI.", 3, + mItemsContainer.getAdapter().getItemCount()); + assertEquals(BookmarkUIState.STATE_FOLDER, delegate.getCurrentState()); + } + /** * Returns the View that has the given text. * @@ -201,4 +253,31 @@ } }); } + + private BookmarkId addBookmark(final String title, final String url) throws ExecutionException { + return ThreadUtils.runOnUiThreadBlocking(new Callable<BookmarkId>() { + @Override + public BookmarkId call() throws Exception { + return mBookmarkModel.addBookmark(mBookmarkModel.getDefaultFolder(), 0, title, url); + } + }); + } + + private void removeBookmark(final BookmarkId bookmarkId) { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + mBookmarkModel.deleteBookmark(bookmarkId); + } + }); + } + + private void searchBookmarks(final String query) { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + ((BookmarkItemsAdapter) mItemsContainer.getAdapter()).search(query); + } + }); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java index 7cd35201..7a4dc194 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java
@@ -5,17 +5,26 @@ package org.chromium.chrome.browser.compositor.bottombar; import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; -import android.test.InstrumentationTestCase; +import android.support.test.rule.UiThreadTestRule; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; /** * Tests logic in the OverlayPanelBase. */ -public class OverlayPanelBaseTest extends InstrumentationTestCase { - +@RunWith(ChromeJUnit4ClassRunner.class) +public class OverlayPanelBaseTest { private static final float UPWARD_VELOCITY = -1.0f; private static final float DOWNWARD_VELOCITY = 1.0f; @@ -23,6 +32,9 @@ private static final float MOCK_EXPANDED_HEIGHT = 400.0f; private static final float MOCK_MAXIMIZED_HEIGHT = 600.0f; + @Rule + public UiThreadTestRule mRule = new UiThreadTestRule(); + MockOverlayPanel mNoExpandPanel; MockOverlayPanel mExpandPanel; @@ -80,13 +92,13 @@ } } - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { OverlayPanelManager panelManager = new OverlayPanelManager(); - mExpandPanel = new MockOverlayPanel(getInstrumentation().getTargetContext(), panelManager); - mNoExpandPanel = new NoExpandMockOverlayPanel(getInstrumentation().getTargetContext(), - panelManager); + mExpandPanel = new MockOverlayPanel( + InstrumentationRegistry.getInstrumentation().getTargetContext(), panelManager); + mNoExpandPanel = new NoExpandMockOverlayPanel( + InstrumentationRegistry.getInstrumentation().getTargetContext(), panelManager); } // Start OverlayPanelBase test suite. @@ -95,8 +107,10 @@ * Tests that a panel with the EXPANDED state disabled and a lower movement threshold will move * to the correct state based on current position and swipe velocity. */ + @Test @SmallTest @Feature({"OverlayPanelBase"}) + @UiThreadTest public void testNonExpandingPanelMovesToCorrectState() { final float threshold = mNoExpandPanel.getThresholdToNextState(); final float height = MOCK_MAXIMIZED_HEIGHT - MOCK_PEEKED_HEIGHT; @@ -106,30 +120,32 @@ // Between PEEKING and MAXIMIZED past the threshold in the up direction. PanelState nextState = mNoExpandPanel.findNearestPanelStateFromHeight( peekToMaxBound + 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); // Between PEEKING and MAXIMIZED before the threshold in the up direction. nextState = mNoExpandPanel.findNearestPanelStateFromHeight( peekToMaxBound - 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.PEEKED); + Assert.assertTrue(nextState == PanelState.PEEKED); // Between PEEKING and MAXIMIZED before the threshold in the down direction. nextState = mNoExpandPanel.findNearestPanelStateFromHeight( maxToPeekBound + 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); // Between PEEKING and MAXIMIZED past the threshold in the down direction. nextState = mNoExpandPanel.findNearestPanelStateFromHeight( maxToPeekBound - 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.PEEKED); + Assert.assertTrue(nextState == PanelState.PEEKED); } /** * Tests that a panel will move to the correct state based on current position and swipe * velocity. */ + @Test @SmallTest @Feature({"OverlayPanelBase"}) + @UiThreadTest public void testExpandingPanelMovesToCorrectState() { final float threshold = mExpandPanel.getThresholdToNextState(); final float peekToExpHeight = MOCK_EXPANDED_HEIGHT - MOCK_PEEKED_HEIGHT; @@ -150,87 +166,91 @@ // Between PEEKING and EXPANDED past the threshold in the up direction. PanelState nextState = mExpandPanel.findNearestPanelStateFromHeight( peekToExpBound + 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.EXPANDED); + Assert.assertTrue(nextState == PanelState.EXPANDED); // Between PEEKING and EXPANDED before the threshold in the up direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( peekToExpBound - 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.PEEKED); + Assert.assertTrue(nextState == PanelState.PEEKED); // Between PEEKING and EXPANDED before the threshold in the down direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( expToPeekBound + 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.EXPANDED); + Assert.assertTrue(nextState == PanelState.EXPANDED); // Between PEEKING and EXPANDED past the threshold in the down direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( expToPeekBound - 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.PEEKED); + Assert.assertTrue(nextState == PanelState.PEEKED); // Between EXPANDED and MAXIMIZED past the threshold in the up direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( expToMaxBound + 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); // Between EXPANDED and MAXIMIZED before the threshold in the up direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( expToMaxBound - 1, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.EXPANDED); + Assert.assertTrue(nextState == PanelState.EXPANDED); // Between EXPANDED and MAXIMIZED past the threshold in the down direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( maxToExpBound - 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.EXPANDED); + Assert.assertTrue(nextState == PanelState.EXPANDED); // Between EXPANDED and MAXIMIZED before the threshold in the down direction. nextState = mExpandPanel.findNearestPanelStateFromHeight( maxToExpBound + 1, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); } /** * Tests that a panel will be closed if the desired height is negative. */ + @Test @SmallTest @Feature({"OverlayPanelBase"}) + @UiThreadTest public void testNegativeHeightClosesPanel() { final float belowPeek = MOCK_PEEKED_HEIGHT - 1000; PanelState nextState = mExpandPanel.findNearestPanelStateFromHeight(belowPeek, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.CLOSED); + Assert.assertTrue(nextState == PanelState.CLOSED); nextState = mNoExpandPanel.findNearestPanelStateFromHeight(belowPeek, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.CLOSED); + Assert.assertTrue(nextState == PanelState.CLOSED); // Make sure nothing bad happens if velocity is upward (this should never happen). nextState = mExpandPanel.findNearestPanelStateFromHeight(belowPeek, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.CLOSED); + Assert.assertTrue(nextState == PanelState.CLOSED); nextState = mNoExpandPanel.findNearestPanelStateFromHeight(belowPeek, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.CLOSED); + Assert.assertTrue(nextState == PanelState.CLOSED); } /** * Tests that a panel is only maximized when desired height is far above the max. */ + @Test @SmallTest @Feature({"OverlayPanelBase"}) + @UiThreadTest public void testLargeDesiredHeightIsMaximized() { final float aboveMax = MOCK_MAXIMIZED_HEIGHT + 1000; PanelState nextState = mExpandPanel.findNearestPanelStateFromHeight(aboveMax, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); nextState = mNoExpandPanel.findNearestPanelStateFromHeight(aboveMax, UPWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); // Make sure nothing bad happens if velocity is downward (this should never happen). nextState = mExpandPanel.findNearestPanelStateFromHeight(aboveMax, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); nextState = mNoExpandPanel.findNearestPanelStateFromHeight(aboveMax, DOWNWARD_VELOCITY); - assertTrue(nextState == PanelState.MAXIMIZED); + Assert.assertTrue(nextState == PanelState.MAXIMIZED); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java index f5d61fb..d4fcb4c4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java
@@ -5,22 +5,31 @@ package org.chromium.chrome.browser.compositor.bottombar; import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; -import android.test.InstrumentationTestCase; +import android.support.test.rule.UiThreadTestRule; import android.view.MotionEvent; import android.view.ViewConfiguration; import android.view.ViewGroup; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost; import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEventFilter; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content.browser.ContentViewCore; /** * Class responsible for testing the OverlayPanelEventFilter. */ -public class OverlayPanelEventFilterTest extends InstrumentationTestCase { - +@RunWith(ChromeJUnit4ClassRunner.class) +public class OverlayPanelEventFilterTest { private static final float PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP = 50.f; private static final float BAR_HEIGHT_DP = 100.f; @@ -53,6 +62,9 @@ // OverlayPanelEventFilterWrapper // -------------------------------------------------------------------------------------------- + @Rule + public UiThreadTestRule mRule = new UiThreadTestRule(); + /** * Wrapper around OverlayPanelEventFilter used by tests. */ @@ -100,7 +112,7 @@ @Override public ViewGroup getContainerView() { - return new ViewGroup(getContext()) { + return new ViewGroup(InstrumentationRegistry.getContext()) { @Override public boolean dispatchTouchEvent(MotionEvent e) { if (e.getActionMasked() != MotionEvent.ACTION_CANCEL) { @@ -111,7 +123,7 @@ if (!mShouldLockHorizontalMotionInContent) { float propagatedEventY = mEventPropagatedToContent.getY(); float offsetY = mPanel.getContentY() * mDpToPx; - assertEquals(propagatedEventY - offsetY, e.getY(), EPSILON); + Assert.assertEquals(propagatedEventY - offsetY, e.getY(), EPSILON); } } else { mWasScrollDetectedOnContent = false; @@ -208,11 +220,9 @@ // Test Suite // -------------------------------------------------------------------------------------------- - @Override - protected void setUp() throws Exception { - super.setUp(); - - Context context = getInstrumentation().getTargetContext(); + @Before + public void setUp() throws Exception { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); mDpToPx = context.getResources().getDisplayMetrics().density; mTouchSlopDp = ViewConfiguration.get(context).getScaledTouchSlop() / mDpToPx; @@ -240,8 +250,10 @@ mShouldLockHorizontalMotionInContent = false; } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testTapContentView() { positionPanelInAlmostMaximizedState(); @@ -249,15 +261,17 @@ simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f); simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f); - assertFalse(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertTrue(mWasTapDetectedOnContent); - assertFalse(mWasScrollDetectedOnContent); + Assert.assertTrue(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testScrollingContentViewDragsPanel() { positionPanelInAlmostMaximizedState(); @@ -266,15 +280,17 @@ simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp); simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp); - assertTrue(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertTrue(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertFalse(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testScrollUpContentView() { positionPanelInMaximizedState(); @@ -283,15 +299,17 @@ simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp); simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp); - assertFalse(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertTrue(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertTrue(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testScrollDownContentView() { positionPanelInMaximizedState(); @@ -304,15 +322,17 @@ simulateActionMoveEvent(0.f, mAlmostMaximizedContentOffsetYDp); simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp); - assertFalse(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertTrue(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertTrue(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testDragByOverscrollingContentView() { positionPanelInMaximizedState(); @@ -325,15 +345,17 @@ simulateActionMoveEvent(0.f, mAlmostMaximizedContentOffsetYDp); simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp); - assertTrue(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertTrue(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertFalse(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testUnwantedScrollDoesNotHappenInContentView() { positionPanelInAlmostMaximizedState(); @@ -346,7 +368,7 @@ positionPanelInMaximizedState(); // Confirm that the Panel got a scroll event. - assertTrue(mPanel.getWasScrollDetected()); + Assert.assertTrue(mPanel.getWasScrollDetected()); // Continue the swipe up for one more dp. From now on, the events might be forwarded // to the ContentView. @@ -358,16 +380,18 @@ // of the touch gesture is greater than the touch slop. float contentViewOffsetDelta = contentViewOffsetYStart - contentViewOffsetYEnd; - assertTrue(Math.abs(contentViewOffsetDelta) > mTouchSlopDp); + Assert.assertTrue(Math.abs(contentViewOffsetDelta) > mTouchSlopDp); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertFalse(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testDragPanelThenContinuouslyScrollContentView() { positionPanelInAlmostMaximizedState(); @@ -377,7 +401,7 @@ positionPanelInMaximizedState(); // Confirm that the Panel got a scroll event. - assertTrue(mPanel.getWasScrollDetected()); + Assert.assertTrue(mPanel.getWasScrollDetected()); // Continue the swipe up for one more dp. From now on, the events might be forwarded // to the ContentView. @@ -388,14 +412,16 @@ simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp - 2 * mTouchSlopDp); simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp - 2 * mTouchSlopDp); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertTrue(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertTrue(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testTapPanel() { positionPanelInAlmostMaximizedState(); @@ -403,15 +429,17 @@ simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp - 1.f); simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp - 1.f); - assertFalse(mPanel.getWasScrollDetected()); - assertTrue(mPanel.getWasTapDetected()); + Assert.assertFalse(mPanel.getWasScrollDetected()); + Assert.assertTrue(mPanel.getWasTapDetected()); - assertFalse(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testScrollPanel() { positionPanelInAlmostMaximizedState(); @@ -420,11 +448,11 @@ simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp); simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp); - assertTrue(mPanel.getWasScrollDetected()); - assertFalse(mPanel.getWasTapDetected()); + Assert.assertTrue(mPanel.getWasScrollDetected()); + Assert.assertFalse(mPanel.getWasTapDetected()); - assertFalse(mWasScrollDetectedOnContent); - assertFalse(mWasTapDetectedOnContent); + Assert.assertFalse(mWasScrollDetectedOnContent); + Assert.assertFalse(mWasTapDetectedOnContent); } // --------------------------------------------------------------------------------------------
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java index d2e8e8a..6b1b720 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
@@ -5,21 +5,32 @@ package org.chromium.chrome.browser.compositor.bottombar; import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; -import android.test.InstrumentationTestCase; +import android.support.test.rule.UiThreadTestRule; import android.view.ViewGroup; import android.widget.LinearLayout; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; /** * Class responsible for testing the OverlayPanelManager. */ -public class OverlayPanelManagerTest extends InstrumentationTestCase { +@RunWith(ChromeJUnit4ClassRunner.class) +public class OverlayPanelManagerTest { + @Rule + public UiThreadTestRule mRule = new UiThreadTestRule(); // -------------------------------------------------------------------------------------------- // MockOverlayPanel @@ -101,10 +112,12 @@ // Test Suite // -------------------------------------------------------------------------------------------- + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testPanelRequestingShow() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel panel = @@ -112,13 +125,15 @@ panel.requestPanelShow(StateChangeReason.UNKNOWN); - assertTrue(panelManager.getActivePanel() == panel); + Assert.assertTrue(panelManager.getActivePanel() == panel); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testPanelClosed() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel panel = @@ -127,13 +142,15 @@ panel.requestPanelShow(StateChangeReason.UNKNOWN); panel.closePanel(StateChangeReason.UNKNOWN, false); - assertTrue(panelManager.getActivePanel() == null); + Assert.assertTrue(panelManager.getActivePanel() == null); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testHighPrioritySuppressingLowPriority() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -144,13 +161,15 @@ lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); - assertTrue(panelManager.getActivePanel() == highPriorityPanel); + Assert.assertTrue(panelManager.getActivePanel() == highPriorityPanel); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testSuppressedPanelRestored() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -162,13 +181,15 @@ highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); - assertTrue(panelManager.getActivePanel() == lowPriorityPanel); + Assert.assertTrue(panelManager.getActivePanel() == lowPriorityPanel); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testUnsuppressiblePanelNotRestored() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -180,13 +201,15 @@ highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); - assertTrue(panelManager.getActivePanel() == null); + Assert.assertTrue(panelManager.getActivePanel() == null); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testSuppressedPanelClosedBeforeRestore() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -199,14 +222,16 @@ lowPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); - assertEquals(null, panelManager.getActivePanel()); - assertEquals(0, panelManager.getSuppressedQueueSize()); + Assert.assertEquals(null, panelManager.getActivePanel()); + Assert.assertEquals(0, panelManager.getSuppressedQueueSize()); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testSuppressedPanelPriority() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -218,36 +243,38 @@ // Only one panel is showing, should be medium priority. mediumPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); - assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); // High priority should have taken preciedence. highPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); - assertEquals(panelManager.getActivePanel(), highPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), highPriorityPanel); // Low priority will be suppressed; high priority should still be showing. lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); - assertEquals(panelManager.getActivePanel(), highPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), highPriorityPanel); // Start closing panels. highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // After high priority is closed, the medium priority panel should be visible. - assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); mediumPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // Finally the low priority panel should be showing. - assertEquals(panelManager.getActivePanel(), lowPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), lowPriorityPanel); lowPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // All panels are closed now. - assertEquals(null, panelManager.getActivePanel()); - assertEquals(0, panelManager.getSuppressedQueueSize()); + Assert.assertEquals(null, panelManager.getActivePanel()); + Assert.assertEquals(0, panelManager.getSuppressedQueueSize()); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testSuppressedPanelOrder() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); OverlayPanel lowPriorityPanel = @@ -262,41 +289,45 @@ lowPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); mediumPriorityPanel.requestPanelShow(StateChangeReason.UNKNOWN); - assertEquals(2, panelManager.getSuppressedQueueSize()); + Assert.assertEquals(2, panelManager.getSuppressedQueueSize()); // Start closing panels. highPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // After high priority is closed, the medium priority panel should be visible. - assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), mediumPriorityPanel); mediumPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // Finally the low priority panel should be showing. - assertEquals(panelManager.getActivePanel(), lowPriorityPanel); + Assert.assertEquals(panelManager.getActivePanel(), lowPriorityPanel); lowPriorityPanel.closePanel(StateChangeReason.UNKNOWN, false); // All panels are closed now. - assertTrue(panelManager.getActivePanel() == null); - assertEquals(0, panelManager.getSuppressedQueueSize()); + Assert.assertTrue(panelManager.getActivePanel() == null); + Assert.assertEquals(0, panelManager.getSuppressedQueueSize()); } + @Test @SmallTest @Feature({"OverlayPanel"}) + @UiThreadTest public void testLatePanelGetsNecessaryVars() { - Context context = getInstrumentation().getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); OverlayPanelManager panelManager = new OverlayPanelManager(); MockOverlayPanel earlyPanel = new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, true); // Set necessary vars before any other panels are registered in the manager. - panelManager.setContainerView(new LinearLayout(getInstrumentation().getTargetContext())); + panelManager.setContainerView( + new LinearLayout(InstrumentationRegistry.getInstrumentation().getTargetContext())); panelManager.setDynamicResourceLoader(new DynamicResourceLoader(0, null)); MockOverlayPanel latePanel = new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, true); - assertTrue(earlyPanel.getContainerView() == latePanel.getContainerView()); - assertTrue(earlyPanel.getDynamicResourceLoader() == latePanel.getDynamicResourceLoader()); + Assert.assertTrue(earlyPanel.getContainerView() == latePanel.getContainerView()); + Assert.assertTrue( + earlyPanel.getDynamicResourceLoader() == latePanel.getDynamicResourceLoader()); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java index 6a4c303..1633244 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
@@ -8,17 +8,21 @@ import android.os.SystemClock; import android.support.test.filters.SmallTest; -import android.test.InstrumentationTestCase; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; /** * Unit tests for {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation}. */ -public class ChromeAnimationTest extends InstrumentationTestCase - implements Animatable<ChromeAnimationTest.Property> { - +@RunWith(ChromeJUnit4ClassRunner.class) +public class ChromeAnimationTest implements Animatable<ChromeAnimationTest.Property> { protected enum Property { FAST_ANIMATION, SLOW_ANIMATION @@ -32,10 +36,8 @@ private boolean mHasFinishedFastAnimation; private boolean mHasFinishedSlowAnimation; - @Override - protected void setUp() throws Exception { - super.setUp(); - + @Before + public void setUp() throws Exception { mHasFinishedFastAnimation = false; mHasFinishedSlowAnimation = false; } @@ -86,6 +88,7 @@ mAnimations.add(component); } + @Test @SmallTest @Feature({"ContextualSearch"}) public void testConcurrentAnimationsFinishSeparately() { @@ -99,12 +102,12 @@ // Advances time to check that the fast animation will finish first. mAnimations.update(now + FAST_DURATION); - assertTrue(mHasFinishedFastAnimation); - assertFalse(mHasFinishedSlowAnimation); + Assert.assertTrue(mHasFinishedFastAnimation); + Assert.assertFalse(mHasFinishedSlowAnimation); // Advances time to check that all animations are finished. mAnimations.update(now + SLOW_DURATION); - assertTrue(mHasFinishedFastAnimation); - assertTrue(mHasFinishedSlowAnimation); + Assert.assertTrue(mHasFinishedFastAnimation); + Assert.assertTrue(mHasFinishedSlowAnimation); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index 2d6e57f..344f0475 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -8,14 +8,22 @@ import android.content.Context; import android.graphics.PointF; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; -import android.test.InstrumentationTestCase; +import android.support.test.rule.UiThreadTestRule; import android.util.Log; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; import android.widget.FrameLayout; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import org.chromium.base.ThreadUtils; import org.chromium.base.library_loader.ProcessInitException; import org.chromium.base.test.util.Feature; @@ -32,6 +40,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.util.MathUtils; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeRestriction; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel.MockTabModelDelegate; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; @@ -39,8 +48,8 @@ /** * Unit tests for {@link org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome} */ -public class LayoutManagerTest extends InstrumentationTestCase - implements MockTabModelDelegate { +@RunWith(ChromeJUnit4ClassRunner.class) +public class LayoutManagerTest implements MockTabModelDelegate { private static final String TAG = "LayoutManagerTest"; private long mLastDownTime = 0; @@ -74,6 +83,9 @@ mPointerCoords[1].size = 1; } + @Rule + public UiThreadTestRule mRule = new UiThreadTestRule(); + /** * Simulates time so the animation updates. * @param layoutManager The {@link LayoutManagerChrome} to update. @@ -101,7 +113,8 @@ private void initializeLayoutManagerPhone(int standardTabCount, int incognitoTabCount, int standardIndexSelected, int incognitoIndexSelected, boolean incognitoSelected) { - Context context = new MockContextForLayout(getInstrumentation().getContext()); + Context context = + new MockContextForLayout(InstrumentationRegistry.getInstrumentation().getContext()); mDpToPx = context.getResources().getDisplayMetrics().density; @@ -134,46 +147,50 @@ MotionEvent event = MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_DOWN, 1, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); - assertTrue("Down event not intercepted", mManager.onInterceptTouchEvent(event, false)); - assertTrue("Down event not handled", mManager.onTouchEvent(event)); + Assert.assertTrue( + "Down event not intercepted", mManager.onInterceptTouchEvent(event, false)); + Assert.assertTrue("Down event not handled", mManager.onTouchEvent(event)); } private void eventDown1(long time, PointF p) { mPointerCoords[1].x = p.x * mDpToPx; mPointerCoords[1].y = p.y * mDpToPx; - assertTrue("Down_1 event not handled", mManager.onTouchEvent( - MotionEvent.obtain(mLastDownTime, time, - MotionEvent.ACTION_POINTER_DOWN | (0x1 << MotionEvent.ACTION_POINTER_INDEX_SHIFT), - 2, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); + Assert.assertTrue("Down_1 event not handled", + mManager.onTouchEvent(MotionEvent.obtain(mLastDownTime, time, + MotionEvent.ACTION_POINTER_DOWN + | (0x1 << MotionEvent.ACTION_POINTER_INDEX_SHIFT), + 2, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); } private void eventMove(long time, PointF p) { mPointerCoords[0].x = p.x * mDpToPx; mPointerCoords[0].y = p.y * mDpToPx; - assertTrue("Move event not handled", mManager.onTouchEvent( - MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_MOVE, - 1, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); + Assert.assertTrue("Move event not handled", + mManager.onTouchEvent( + MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_MOVE, 1, + mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); } private void eventUp(long time, PointF p) { mPointerCoords[0].x = p.x * mDpToPx; mPointerCoords[0].y = p.y * mDpToPx; - assertTrue("Up event not handled", mManager.onTouchEvent( - MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_UP, - 1, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); + Assert.assertTrue("Up event not handled", + mManager.onTouchEvent(MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_UP, + 1, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); } private void eventUp1(long time, PointF p) { mPointerCoords[1].x = p.x * mDpToPx; mPointerCoords[1].y = p.y * mDpToPx; - assertTrue("Up_1 event not handled", mManager.onTouchEvent( - MotionEvent.obtain(mLastDownTime, time, - MotionEvent.ACTION_POINTER_UP | (0x1 << MotionEvent.ACTION_POINTER_INDEX_SHIFT), - 2, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); + Assert.assertTrue("Up_1 event not handled", + mManager.onTouchEvent(MotionEvent.obtain(mLastDownTime, time, + MotionEvent.ACTION_POINTER_UP + | (0x1 << MotionEvent.ACTION_POINTER_INDEX_SHIFT), + 2, mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); } private void eventMoveBoth(long time, PointF p0, PointF p1) { @@ -182,38 +199,47 @@ mPointerCoords[1].x = p1.x * mDpToPx; mPointerCoords[1].y = p1.y * mDpToPx; - assertTrue("Move event not handled", mManager.onTouchEvent( - MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_MOVE, 2, - mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); + Assert.assertTrue("Move event not handled", + mManager.onTouchEvent( + MotionEvent.obtain(mLastDownTime, time, MotionEvent.ACTION_MOVE, 2, + mProperties, mPointerCoords, 0, 0, 1, 1, 0, 0, 0, 0))); } + @Test @SmallTest @Feature({"Android-TabSwitcher"}) + @UiThreadTest @Restriction({ChromeRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) public void testCreation() { initializeLayoutManagerPhone(0, 0); } + @Test @SmallTest @Feature({"Android-TabSwitcher"}) + @UiThreadTest @Restriction({ChromeRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) public void testStack() throws Exception { initializeLayoutManagerPhone(3, 0); mManagerPhone.showOverview(true); - assertTrue("layoutManager is way too long to end motion", simulateTime(mManager, 1000)); - assertTrue("The activate layout type is expected to be StackLayout", + Assert.assertTrue( + "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); + Assert.assertTrue("The activate layout type is expected to be StackLayout", mManager.getActiveLayout() instanceof StackLayout); mManagerPhone.hideOverview(true); - assertTrue("layoutManager is way too long to end motion", simulateTime(mManager, 1000)); + Assert.assertTrue( + "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); } + @Test @SmallTest @Feature({"Android-TabSwitcher"}) + @UiThreadTest @Restriction({ChromeRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) public void testStackNoAnimation() throws Exception { initializeLayoutManagerPhone(1, 0); mManagerPhone.showOverview(false); - assertTrue("The activate layout type is expected to be StackLayout", + Assert.assertTrue("The activate layout type is expected to be StackLayout", mManager.getActiveLayout() instanceof StackLayout); mManagerPhone.hideOverview(false); } @@ -222,8 +248,10 @@ * Tests the tab pinching behavior with two finger. * This test is still under development. */ + @Test @SmallTest @Feature({"Android-TabSwitcher"}) + @UiThreadTest @Restriction({ChromeRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) public void testStackPinch() throws Exception { initializeLayoutManagerPhone(5, 0); @@ -234,7 +262,7 @@ mManagerPhone.showOverview(false); // Basic verifications - assertTrue("The activate layout type is expected to be StackLayout", + Assert.assertTrue("The activate layout type is expected to be StackLayout", mManager.getActiveLayout() instanceof StackLayout); StackLayout layout = (StackLayout) mManager.getActiveLayout(); @@ -284,8 +312,8 @@ time++; final float delta = 0.001f; - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); float expectedTab3X = tab3.getX(); float expectedTab3Y = tab3.getY(); @@ -297,10 +325,10 @@ mManager.onUpdate(time, 16); time++; - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); - assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); - assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); // Move finger 0: Y and X finger0.y += scrollOffset1; @@ -311,10 +339,10 @@ mManager.onUpdate(time, 16); time++; - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); - assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); - assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); // Move finger 1: Y and X final float scrollOffset3 = (tab3.getY() - layout.getHeight()) / 8.0f; @@ -326,10 +354,10 @@ mManager.onUpdate(time, 16); time++; - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); - assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); - assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); // Move finger 0 and 1: Y and X finger0.y += scrollOffset1; @@ -343,128 +371,148 @@ mManager.onUpdate(time, 16); time++; - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); - assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); - assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); // Done eventUp1(time, finger1); eventUp(time, finger0); - assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); - assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); - assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); - assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 1", expectedTab1X, tab1.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 1", expectedTab1Y, tab1.getY(), delta); + Assert.assertEquals("Wrong x offset for tab 3", expectedTab3X, tab3.getX(), delta); + Assert.assertEquals("Wrong y offset for tab 3", expectedTab3Y, tab3.getY(), delta); mManagerPhone.hideOverview(false); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeOnlyTab() throws Exception { initializeLayoutManagerPhone(1, 0, 0, TabModel.INVALID_TAB_INDEX, false); - assertEquals(mTabModelSelector.getModel(false).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(false).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeOnlyTabIncognito() throws Exception { initializeLayoutManagerPhone(0, 1, TabModel.INVALID_TAB_INDEX, 0, true); - assertEquals(mTabModelSelector.getModel(true).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(true).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeNextTab() throws Exception { initializeLayoutManagerPhone(2, 0, 0, TabModel.INVALID_TAB_INDEX, false); - assertEquals(mTabModelSelector.getModel(false).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(false).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 1); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipePrevTab() throws Exception { initializeLayoutManagerPhone(2, 0, 1, TabModel.INVALID_TAB_INDEX, false); - assertEquals(mTabModelSelector.getModel(false).index(), 1); + Assert.assertEquals(mTabModelSelector.getModel(false).index(), 1); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeNextTabNone() throws Exception { initializeLayoutManagerPhone(2, 0, 1, TabModel.INVALID_TAB_INDEX, false); - assertEquals(mTabModelSelector.getModel(false).index(), 1); + Assert.assertEquals(mTabModelSelector.getModel(false).index(), 1); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 1); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipePrevTabNone() throws Exception { initializeLayoutManagerPhone(2, 0, 0, TabModel.INVALID_TAB_INDEX, false); - assertEquals(mTabModelSelector.getModel(false).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(false).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeNextTabIncognito() throws Exception { initializeLayoutManagerPhone(0, 2, TabModel.INVALID_TAB_INDEX, 0, true); - assertEquals(mTabModelSelector.getModel(true).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(true).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 1); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipePrevTabIncognito() throws Exception { initializeLayoutManagerPhone(0, 2, TabModel.INVALID_TAB_INDEX, 1, true); - assertEquals(mTabModelSelector.getModel(true).index(), 1); + Assert.assertEquals(mTabModelSelector.getModel(true).index(), 1); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipeNextTabNoneIncognito() throws Exception { initializeLayoutManagerPhone(0, 2, TabModel.INVALID_TAB_INDEX, 1, true); - assertEquals(mTabModelSelector.getModel(true).index(), 1); + Assert.assertEquals(mTabModelSelector.getModel(true).index(), 1); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.LEFT, 1); } + @Test @SmallTest @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @Feature({"Android-TabSwitcher"}) + @UiThreadTest public void testToolbarSideSwipePrevTabNoneIncognito() throws Exception { initializeLayoutManagerPhone(0, 2, TabModel.INVALID_TAB_INDEX, 0, true); - assertEquals(mTabModelSelector.getModel(true).index(), 0); + Assert.assertEquals(mTabModelSelector.getModel(true).index(), 0); runToolbarSideSwipeTestOnCurrentModel(ScrollDirection.RIGHT, 0); } - @Override - protected void setUp() throws Exception { - super.setUp(); - + @Before + public void setUp() throws Exception { // Load the browser process. ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { try { - ChromeBrowserInitializer.getInstance( - getInstrumentation().getTargetContext()).handleSynchronousStartup(); + ChromeBrowserInitializer + .getInstance( + InstrumentationRegistry.getInstrumentation().getTargetContext()) + .handleSynchronousStartup(); } catch (ProcessInitException e) { - fail("Failed to load browser"); + Assert.fail("Failed to load browser"); } } }); @@ -476,24 +524,25 @@ performToolbarSideSwipe(direction); - assertEquals("Unexpected model change after side swipe", model.isIncognito(), + Assert.assertEquals("Unexpected model change after side swipe", model.isIncognito(), mTabModelSelector.isIncognitoSelected()); - assertEquals("Wrong index after side swipe", finalIndex, model.index()); - assertEquals("Wrong current tab id", finalId, TabModelUtils.getCurrentTab(model).getId()); - assertTrue("LayoutManager#getActiveLayout() should be StaticLayout", + Assert.assertEquals("Wrong index after side swipe", finalIndex, model.index()); + Assert.assertEquals( + "Wrong current tab id", finalId, TabModelUtils.getCurrentTab(model).getId()); + Assert.assertTrue("LayoutManager#getActiveLayout() should be StaticLayout", mManager.getActiveLayout() instanceof StaticLayout); } private void performToolbarSideSwipe(ScrollDirection direction) { - assertTrue("Unexpected direction for side swipe " + direction, + Assert.assertTrue("Unexpected direction for side swipe " + direction, direction == ScrollDirection.LEFT || direction == ScrollDirection.RIGHT); final Layout layout = mManager.getActiveLayout(); final EdgeSwipeHandler eventHandler = mManager.getTopSwipeHandler(); - assertNotNull("LayoutManager#getTopSwipeHandler() returned null", eventHandler); - assertNotNull("LayoutManager#getActiveLayout() returned null", layout); + Assert.assertNotNull("LayoutManager#getTopSwipeHandler() returned null", eventHandler); + Assert.assertNotNull("LayoutManager#getActiveLayout() returned null", layout); final float layoutWidth = layout.getWidth(); final boolean scrollLeft = direction == ScrollDirection.LEFT; @@ -503,9 +552,9 @@ eventHandler.swipeUpdated(deltaX, 0.f, deltaX, 0.f, deltaX, 0.f); eventHandler.swipeFinished(); - assertTrue("LayoutManager#getActiveLayout() should be ToolbarSwipeLayout", + Assert.assertTrue("LayoutManager#getActiveLayout() should be ToolbarSwipeLayout", mManager.getActiveLayout() instanceof ToolbarSwipeLayout); - assertTrue("LayoutManager took too long to finish the animations", + Assert.assertTrue("LayoutManager took too long to finish the animations", simulateTime(mManager, 1000)); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java index e58dcbc..12ad847 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java
@@ -186,6 +186,31 @@ @Test @Feature("TabPersistentStore") + public void testNtpFromMergeWithNoStateNotIgnoredDuringMerge() { + when(mTabModelSelector.isIncognitoSelected()).thenReturn(false); + when(mTabModelSelector.getCurrentModel()).thenReturn(mNormalTabModel); + + mPersistentStore = new TabPersistentStore( + mPersistencePolicy, mTabModelSelector, mTabCreatorManager, mObserver); + mPersistentStore.initializeRestoreVars(false); + + LoadUrlParamsUrlMatcher paramsMatcher = new LoadUrlParamsUrlMatcher(UrlConstants.NTP_URL); + Tab emptyNtp = mock(Tab.class); + when(mNormalTabCreator.createNewTab( + argThat(paramsMatcher), eq(TabLaunchType.FROM_RESTORE), (Tab) isNull())) + .thenReturn(emptyNtp); + + TabRestoreDetails emptyNtpDetails = + new TabRestoreDetails(1, 0, false, UrlConstants.NTP_URL, true); + mPersistentStore.restoreTab(emptyNtpDetails, null, false); + + verify(mNormalTabCreator) + .createNewTab(argThat(new LoadUrlParamsUrlMatcher(UrlConstants.NTP_URL)), + eq(TabLaunchType.FROM_RESTORE), (Tab) isNull()); + } + + @Test + @Feature("TabPersistentStore") public void testNtpWithStateNotIgnoredDuringRestore() { mPersistentStore = new TabPersistentStore( mPersistencePolicy, mTabModelSelector, mTabCreatorManager, mObserver);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index c609132..ab8fff1 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5557,6 +5557,12 @@ <message name="IDS_FLAGS_WEBRTC_HW_H264_ENCODING_DESCRIPTION" desc="Description of chrome:flags option to turn on WebRTC hardware h264 video encoding support." translateable="false"> Support in WebRTC for encoding h264 video streams using platform hardware. </message> + <message name="IDS_FLAGS_WEBRTC_SRTP_AES_GCM_NAME" desc="Name of chrome:flags option to enable GCM cipher suites for WebRTC" translateable="false"> + Negotiation with GCM cipher suites for SRTP in WebRTC + </message> + <message name="IDS_FLAGS_WEBRTC_SRTP_AES_GCM_DESCRIPTION" desc="Description of chrome:flags option to enable GCM cipher suites for WebRTC" translateable="false"> + When enabled, WebRTC will try to negotiate GCM cipher suites for SRTP. + </message> <message name="IDS_FLAGS_WEBRTC_STUN_ORIGIN_NAME" desc="Name of chrome:flags option to turn on Origin header for WebRTC STUN messages" translateable="false"> WebRTC Stun origin header </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b90920f5..0940bb7 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -56,9 +56,9 @@ # require many files from it. This makes linking more efficient. split_static_library("browser") { # Split into multiple static libraries on Windows builds. We have hit size - # on Windows official builds and on goma builds symbol_level = 2 is selected. - # Always splitting on Windows builds is simpler than trying to perfectly - # calculate the scenarios where it is required. + # limits on Windows official builds and on goma builds when symbol_level = 2 + # is selected. Always splitting on Windows builds is simpler than trying to + # perfectly calculate the scenarios where it is required. if (is_win) { split_count = 5 } else { @@ -1279,8 +1279,12 @@ "sync/glue/sync_start_util.h", "sync/profile_sync_service_factory.cc", "sync/profile_sync_service_factory.h", - "sync/sessions/notification_service_sessions_router.cc", - "sync/sessions/notification_service_sessions_router.h", + "sync/sessions/sync_sessions_router_tab_helper.cc", + "sync/sessions/sync_sessions_router_tab_helper.h", + "sync/sessions/sync_sessions_web_contents_router.cc", + "sync/sessions/sync_sessions_web_contents_router.h", + "sync/sessions/sync_sessions_web_contents_router_factory.cc", + "sync/sessions/sync_sessions_web_contents_router_factory.h", "sync/supervised_user_signin_manager_wrapper.cc", "sync/supervised_user_signin_manager_wrapper.h", "sync/sync_startup_tracker.cc", @@ -1366,6 +1370,8 @@ "win/jumplist.h", "win/jumplist_factory.cc", "win/jumplist_factory.h", + "win/jumplist_file_util.cc", + "win/jumplist_file_util.h", "win/jumplist_updater.cc", "win/jumplist_updater.h", "win/settings_app_monitor.cc", @@ -1640,6 +1646,10 @@ "//net:net", "//ui/vector_icons", ] + sources += [ + "sync/sessions/browser_list_router_helper.cc", + "sync/sessions/browser_list_router_helper.h", + ] } if (is_chromeos && use_cras) { @@ -2125,7 +2135,9 @@ "safe_browsing/incident_reporting/binary_integrity_analyzer.cc", "safe_browsing/incident_reporting/binary_integrity_analyzer.h", "safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc", + "safe_browsing/incident_reporting/binary_integrity_analyzer_mac.h", "safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc", + "safe_browsing/incident_reporting/binary_integrity_analyzer_win.h", "safe_browsing/incident_reporting/binary_integrity_incident.cc", "safe_browsing/incident_reporting/binary_integrity_incident.h", "safe_browsing/incident_reporting/blacklist_load_analyzer.cc", @@ -2597,6 +2609,7 @@ "android/chrome_backup_agent.cc", "android/chrome_backup_agent.h", "android/chrome_backup_watcher.cc", + "android/chrome_backup_watcher.h", "android/chrome_context_util.cc", "android/chrome_context_util.h", "android/chrome_feature_list.cc", @@ -2691,6 +2704,7 @@ "android/devtools_server.cc", "android/devtools_server.h", "android/document/document_web_contents_delegate.cc", + "android/document/document_web_contents_delegate.h", "android/dom_distiller/distiller_ui_handle_android.cc", "android/dom_distiller/distiller_ui_handle_android.h", "android/download/android_download_manager_duplicate_infobar_delegate.cc", @@ -4299,8 +4313,8 @@ "browsing_data/mock_browsing_data_media_license_helper.h", "browsing_data/mock_browsing_data_quota_helper.cc", "browsing_data/mock_browsing_data_quota_helper.h", - "browsing_data/mock_browsing_data_remover.cc", - "browsing_data/mock_browsing_data_remover.h", + "browsing_data/mock_browsing_data_remover_delegate.cc", + "browsing_data/mock_browsing_data_remover_delegate.h", "browsing_data/mock_browsing_data_service_worker_helper.cc", "browsing_data/mock_browsing_data_service_worker_helper.h", "download/download_test_file_activity_observer.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index ed8dad0..52bea44 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -578,16 +578,9 @@ #endif // OS_ANDROID #if defined(OS_ANDROID) -const FeatureEntry::FeatureParam - kContentSuggestionsNotificationsFeatureVariationAlways[] = { - {params::ntp_snippets::kNotificationsAlwaysNotifyParam, "true"}}; - const FeatureEntry::FeatureVariation kContentSuggestionsNotificationsFeatureVariations[] = { - {"(notify always)", - kContentSuggestionsNotificationsFeatureVariationAlways, - arraysize(kContentSuggestionsNotificationsFeatureVariationAlways), - nullptr}}; + {"(notify always)", nullptr, 0, "3313312"}}; #endif // OS_ANDROID #if defined(OS_ANDROID) @@ -829,6 +822,9 @@ {"enable-webrtc-hw-h264-encoding", IDS_FLAGS_WEBRTC_HW_H264_ENCODING_NAME, IDS_FLAGS_WEBRTC_HW_H264_ENCODING_DESCRIPTION, kOsAndroid | kOsCrOS, FEATURE_VALUE_TYPE(features::kWebRtcHWH264Encoding)}, + {"enable-webrtc-srtp-aes-gcm", IDS_FLAGS_WEBRTC_SRTP_AES_GCM_NAME, + IDS_FLAGS_WEBRTC_SRTP_AES_GCM_DESCRIPTION, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableWebRtcSrtpAesGcm)}, {"enable-webrtc-stun-origin", IDS_FLAGS_WEBRTC_STUN_ORIGIN_NAME, IDS_FLAGS_WEBRTC_STUN_ORIGIN_DESCRIPTION, kOsAll, SINGLE_VALUE_TYPE(switches::kEnableWebRtcStunOrigin)}, @@ -1374,12 +1370,10 @@ IDS_FLAGS_FIRST_RUN_UI_TRANSITIONS_DESCRIPTION, kOsCrOS, SINGLE_VALUE_TYPE(chromeos::switches::kEnableFirstRunUITransitions)}, #endif // OS_CHROMEOS - {"disable-new-bookmark-apps", IDS_FLAGS_NEW_BOOKMARK_APPS_NAME, - IDS_FLAGS_NEW_BOOKMARK_APPS_DESCRIPTION, - kOsWin | kOsCrOS | kOsLinux | kOsMac, - ENABLE_DISABLE_VALUE_TYPE(switches::kEnableNewBookmarkApps, - switches::kDisableNewBookmarkApps)}, #if defined(OS_MACOSX) + {"bookmark-apps", IDS_FLAGS_NEW_BOOKMARK_APPS_NAME, + IDS_FLAGS_NEW_BOOKMARK_APPS_DESCRIPTION, kOsMac, + FEATURE_VALUE_TYPE(features::kBookmarkApps)}, {"disable-hosted-apps-in-windows", IDS_FLAGS_HOSTED_APPS_IN_WINDOWS_NAME, IDS_FLAGS_HOSTED_APPS_IN_WINDOWS_DESCRIPTION, kOsMac, ENABLE_DISABLE_VALUE_TYPE(switches::kEnableHostedAppsInWindows,
diff --git a/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc b/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc index 795a1b1c..a6898544 100644 --- a/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc +++ b/chrome/browser/android/banners/app_banner_infobar_delegate_android.cc
@@ -55,16 +55,11 @@ int event_request_id, webapk::InstallSource webapk_install_source) { bool is_webapk = ChromeWebApkHost::CanInstallWebApk(); - std::string webapk_package_name = ""; - const GURL& url = shortcut_info->url; - if (is_webapk) - webapk_package_name = ShortcutHelper::QueryWebApkPackage(url); - bool is_webapk_already_installed = !webapk_package_name.empty(); + const GURL url = shortcut_info->url; auto infobar_delegate = base::WrapUnique(new banners::AppBannerInfoBarDelegateAndroid( weak_manager, app_title, std::move(shortcut_info), std::move(icon), - event_request_id, is_webapk, is_webapk_already_installed, - webapk_install_source)); + event_request_id, is_webapk, webapk_install_source)); auto* raw_delegate = infobar_delegate.get(); auto infobar = base::MakeUnique<AppBannerInfoBarAndroid>( std::move(infobar_delegate), url, is_webapk); @@ -76,10 +71,7 @@ if (webapk_install_source == webapk::INSTALL_SOURCE_MENU) { webapk::TrackInstallInfoBarShown( webapk::WEBAPK_INFOBAR_SHOWN_FROM_MENU); - if (is_webapk_already_installed) - raw_delegate->UpdateStateForInstalledWebAPK(webapk_package_name); - else - raw_delegate->Accept(); + raw_delegate->Accept(); } else { webapk::TrackInstallInfoBarShown( webapk::WEBAPK_INFOBAR_SHOWN_FROM_BANNER); @@ -219,7 +211,6 @@ std::unique_ptr<SkBitmap> icon, int event_request_id, bool is_webapk, - bool is_webapk_already_installed, webapk::InstallSource webapk_install_source) : weak_manager_(weak_manager), app_title_(app_title), @@ -228,7 +219,6 @@ event_request_id_(event_request_id), has_user_interaction_(false), is_webapk_(is_webapk), - is_webapk_already_installed_(is_webapk_already_installed), install_state_(INSTALL_NOT_STARTED), webapk_install_source_(webapk_install_source), weak_ptr_factory_(this) { @@ -312,10 +302,7 @@ // WebAPK. if (install_state_ == INSTALLED) { Java_AppBannerInfoBarDelegateAndroid_openWebApk(env, java_delegate_); - if (is_webapk_already_installed_) - webapk::TrackUserAction(webapk::USER_ACTION_OPEN); - else - webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN); + webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN); SendBannerAccepted(); return true; } @@ -417,10 +404,7 @@ } else if (install_state == INSTALLED) { // If WebAPK is installed from this banner, TrackInstallEvent() is called in // OnWebApkInstallFinished(). - if (is_webapk_already_installed_) - webapk::TrackUserAction(webapk::USER_ACTION_OPEN_DISMISS); - else - webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN_DISMISS); + webapk::TrackUserAction(webapk::USER_ACTION_INSTALLED_OPEN_DISMISS); } }
diff --git a/chrome/browser/android/banners/app_banner_infobar_delegate_android.h b/chrome/browser/android/banners/app_banner_infobar_delegate_android.h index 7320119a..6083d2b 100644 --- a/chrome/browser/android/banners/app_banner_infobar_delegate_android.h +++ b/chrome/browser/android/banners/app_banner_infobar_delegate_android.h
@@ -101,7 +101,6 @@ std::unique_ptr<SkBitmap> icon, int event_request_id, bool is_webapk, - bool is_webapk_already_installed, webapk::InstallSource webapk_install_source); // Delegate for promoting an Android app. @@ -161,7 +160,6 @@ bool has_user_interaction_; bool is_webapk_; - bool is_webapk_already_installed_; // Indicates the current state of a WebAPK installation. InstallState install_state_;
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc index dab16324..c7485920 100644 --- a/chrome/browser/android/bookmarks/bookmark_bridge.cc +++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -595,26 +595,8 @@ for (const bookmarks::TitledUrlMatch& match : results) { const BookmarkNode* node = static_cast<const BookmarkNode*>(match.node); - std::vector<int> title_match_start_positions; - std::vector<int> title_match_end_positions; - for (auto position : match.title_match_positions) { - title_match_start_positions.push_back(position.first); - title_match_end_positions.push_back(position.second); - } - - std::vector<int> url_match_start_positions; - std::vector<int> url_match_end_positions; - for (auto position : match.url_match_positions) { - url_match_start_positions.push_back(position.first); - url_match_end_positions.push_back(position.second); - } - - Java_BookmarkBridge_addToBookmarkMatchList( - env, j_list, node->id(), node->type(), - ToJavaIntArray(env, title_match_start_positions), - ToJavaIntArray(env, title_match_end_positions), - ToJavaIntArray(env, url_match_start_positions), - ToJavaIntArray(env, url_match_end_positions)); + Java_BookmarkBridge_addToBookmarkIdList(env, j_list, node->id(), + node->type()); } }
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index 4b477892..6ead9b1 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -106,10 +106,8 @@ base::Bind(&ContextualSearchDelegate::OnTextSurroundingSelectionAvailable, AsWeakPtr()); context_ = contextual_search_context; - if (context_ == nullptr) { - callback.Run(base::string16(), 0, 0); + if (context_ == nullptr) return; - } context_->SetBasePageEncoding(web_contents->GetEncoding()); int surroundingTextSize = context_->CanResolve() @@ -177,6 +175,9 @@ void ContextualSearchDelegate::OnURLFetchComplete( const net::URLFetcher* source) { + if (context_ == nullptr) + return; + DCHECK(source == search_term_fetcher_.get()); int response_code = source->GetResponseCode();
diff --git a/chrome/browser/android/download/download_controller.cc b/chrome/browser/android/download/download_controller.cc index ce839db9..2ae418d 100644 --- a/chrome/browser/android/download/download_controller.cc +++ b/chrome/browser/android/download/download_controller.cc
@@ -198,8 +198,12 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(web_contents); - ui::ViewAndroid* view_android = - ViewAndroidHelper::FromWebContents(web_contents)->GetViewAndroid(); + ViewAndroidHelper* view_helper = + ViewAndroidHelper::FromWebContents(web_contents); + if (!view_helper) + return; + + ui::ViewAndroid* view_android = view_helper->GetViewAndroid(); if (!view_android) { // ViewAndroid may have been gone away. BrowserThread::PostTask(
diff --git a/chrome/browser/android/ntp/content_suggestions_notifier_service.cc b/chrome/browser/android/ntp/content_suggestions_notifier_service.cc index 8e42f09..a7367ab 100644 --- a/chrome/browser/android/ntp/content_suggestions_notifier_service.cc +++ b/chrome/browser/android/ntp/content_suggestions_notifier_service.cc
@@ -29,7 +29,6 @@ using ntp_snippets::ContentSuggestionsNotificationHelper; using ntp_snippets::ContentSuggestionsService; using ntp_snippets::KnownCategories; -using params::ntp_snippets::kNotificationsAlwaysNotifyParam; using params::ntp_snippets::kNotificationsDailyLimit; using params::ntp_snippets::kNotificationsDefaultDailyLimit; using params::ntp_snippets::kNotificationsDefaultPriority; @@ -177,16 +176,6 @@ private: const ContentSuggestion* GetSuggestionToNotifyAbout(Category category) { const auto& suggestions = service_->GetSuggestionsForCategory(category); - // TODO(sfiera): replace with AlwaysNotifyAboutContentSuggestions(). - if (variations::GetVariationParamByFeatureAsBool( - kNotificationsFeature, kNotificationsAlwaysNotifyParam, false)) { - if (category.IsKnownCategory(KnownCategories::ARTICLES) && - !suggestions.empty()) { - return &suggestions[0]; - } - return nullptr; - } - for (const ContentSuggestion& suggestion : suggestions) { if (suggestion.notification_extra()) { return &suggestion;
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc index 9cd60c6..6ccd766b 100644 --- a/chrome/browser/android/offline_pages/background_loader_offliner.cc +++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc
@@ -245,6 +245,8 @@ void BackgroundLoaderOffliner::DidFinishNavigation( content::NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInMainFrame()) + return; // If there was an error of any kind (certificate, client, DNS, etc), // Mark as error page. Resetting here causes RecordNavigationMetrics to crash. if (navigation_handle->IsErrorPage()) { @@ -285,7 +287,7 @@ } } - // If the document is not the same, invalidate any pending save tasks. + // If the document is not the same invalidate any pending save tasks. // // Downloads or 204/205 response codes do not commit (no new navigation) // Same-Document (committed) navigations are:
diff --git a/chrome/browser/android/webapk/webapk_metrics.h b/chrome/browser/android/webapk/webapk_metrics.h index 5c5b990..5cf63c2 100644 --- a/chrome/browser/android/webapk/webapk_metrics.h +++ b/chrome/browser/android/webapk/webapk_metrics.h
@@ -46,12 +46,10 @@ // User actions after a WebAPK is installed. enum UserAction { - // TODO(hanxi|zpeng): Records the first two user actions after - // crbug.com/638614 is fixed. // Launch a previously installed WebAPK since the WebAPK has been installed on // the device before. - USER_ACTION_OPEN, - USER_ACTION_OPEN_DISMISS, + USER_ACTION_OPEN, // Obsolete + USER_ACTION_OPEN_DISMISS, // Obsolete // Open a newly installed WebAPK via a successful installation. USER_ACTION_INSTALLED_OPEN, USER_ACTION_INSTALLED_OPEN_DISMISS,
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 84165c5d9..55bc84f3 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -89,7 +89,6 @@ #include "components/prefs/pref_service.h" #include "components/sessions/core/tab_restore_service.h" #include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_manager.h" #include "content/public/browser/notification_service.h" @@ -183,10 +182,6 @@ } bool IsProfileSignedOut(Profile* profile) { - // The signed out status only makes sense at the moment in the context of the - // --new-profile-management flag. - if (!switches::IsNewProfileManagement()) - return false; ProfileAttributesEntry* entry; bool has_entry = g_browser_process->profile_manager()->GetProfileAttributesStorage().
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index 1cd7d028..c0b4161b 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -43,7 +43,6 @@ #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/prefs/pref_service.h" -#include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test_utils.h" @@ -233,10 +232,6 @@ AppControllerNewProfileManagementBrowserTest() : active_browser_list_(BrowserList::GetInstance()) {} - void SetUpCommandLine(base::CommandLine* command_line) override { - switches::EnableNewProfileManagementForTesting(command_line); - } - const BrowserList* active_browser_list_; };
diff --git a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm index 951fda2..6575b6d 100644 --- a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm +++ b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
@@ -16,6 +16,7 @@ #include "base/path_service.h" #include "base/process/launch.h" #include "base/strings/sys_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "base/test/test_timeouts.h" #include "build/build_config.h" #include "chrome/browser/apps/app_browsertest_util.h" @@ -28,8 +29,8 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/web_applications/web_app_mac.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" -#include "chrome/common/chrome_switches.h" #include "chrome/common/mac/app_mode_common.h" #include "content/public/test/test_utils.h" #include "extensions/browser/app_window/native_app_window.h" @@ -49,22 +50,24 @@ AppShimInteractiveTest() : auto_reset_(&g_app_shims_allow_update_and_launch_in_tests, true) {} + // testing::Test: + void SetUp() override { + PlatformAppBrowserTest::SetUp(); + scoped_feature_list_.InitAndEnableFeature(features::kBookmarkApps); + } + // Install a test app of |type| and reliably wait for its app shim to be // created on disk. Sets |shim_path_|. const extensions::Extension* InstallAppWithShim(AppType type, const char* name); - void SetUpCommandLine(base::CommandLine* command_line) override { - PlatformAppBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(switches::kEnableNewBookmarkApps); - } - protected: base::FilePath shim_path_; private: // Temporarily enable app shims. base::AutoReset<bool> auto_reset_; + base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(AppShimInteractiveTest); };
diff --git a/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc b/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc index 1dec842..9d60c17 100644 --- a/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc +++ b/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc
@@ -43,8 +43,9 @@ prefs_ = profile_.GetTestingPrefService(); ASSERT_FALSE(prefs_->HasPrefPath(bookmarks::prefs::kManagedBookmarks)); + // TODO(crbug.com/697817): Convert SetManagedPrefs to take a unique_ptr. prefs_->SetManagedPref(bookmarks::prefs::kManagedBookmarks, - CreateTestTree()); + CreateTestTree().release()); ResetModel(); // The managed node always exists. @@ -76,22 +77,21 @@ static std::unique_ptr<base::DictionaryValue> CreateFolder( const std::string& title, - base::ListValue* children) { + std::unique_ptr<base::ListValue> children) { auto dict = base::MakeUnique<base::DictionaryValue>(); dict->SetString("name", title); - dict->Set("children", children); + dict->Set("children", std::move(children)); return dict; } - static base::ListValue* CreateTestTree() { - base::ListValue* folder = new base::ListValue(); - base::ListValue* empty = new base::ListValue(); - folder->Append(CreateFolder("Empty", empty)); + static std::unique_ptr<base::ListValue> CreateTestTree() { + auto folder = base::MakeUnique<base::ListValue>(); + folder->Append(CreateFolder("Empty", base::MakeUnique<base::ListValue>())); folder->Append(CreateBookmark("Youtube", "http://youtube.com/")); - base::ListValue* list = new base::ListValue(); + auto list = base::MakeUnique<base::ListValue>(); list->Append(CreateBookmark("Google", "http://google.com/")); - list->Append(CreateFolder("Folder", folder)); + list->Append(CreateFolder("Folder", std::move(folder))); return list; } @@ -183,7 +183,7 @@ // Verify the final tree. std::unique_ptr<base::DictionaryValue> expected( - CreateFolder(GetManagedFolderTitle(), updated.release())); + CreateFolder(GetManagedFolderTitle(), std::move(updated))); EXPECT_TRUE(NodeMatchesValue(managed_->managed_node(), expected.get())); } @@ -200,7 +200,7 @@ // Verify the final tree. std::unique_ptr<base::DictionaryValue> expected( - CreateFolder(GetManagedFolderTitle(), updated.release())); + CreateFolder(GetManagedFolderTitle(), std::move(updated))); EXPECT_TRUE(NodeMatchesValue(managed_->managed_node(), expected.get())); } @@ -220,7 +220,7 @@ // Verify the final tree. std::unique_ptr<base::DictionaryValue> expected( - CreateFolder(GetManagedFolderTitle(), updated.release())); + CreateFolder(GetManagedFolderTitle(), std::move(updated))); EXPECT_TRUE(NodeMatchesValue(managed_->managed_node(), expected.get())); }
diff --git a/chrome/browser/browsing_data/browsing_data_remover_delegate.h b/chrome/browser/browsing_data/browsing_data_remover_delegate.h index 0d0cdd9..69600a8 100644 --- a/chrome/browser/browsing_data/browsing_data_remover_delegate.h +++ b/chrome/browser/browsing_data/browsing_data_remover_delegate.h
@@ -5,8 +5,14 @@ #ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_DELEGATE_H_ #define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_DELEGATE_H_ +#include "base/callback_forward.h" + class GURL; +namespace base { +class Time; +} + namespace content { class BrowsingDataFilterBuilder; }
diff --git a/chrome/browser/browsing_data/mock_browsing_data_remover.cc b/chrome/browser/browsing_data/mock_browsing_data_remover.cc deleted file mode 100644 index 239c8141..0000000 --- a/chrome/browser/browsing_data/mock_browsing_data_remover.cc +++ /dev/null
@@ -1,186 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/browsing_data/mock_browsing_data_remover.h" - -#include "content/public/browser/browsing_data_filter_builder.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -base::Time some_time; -} - -MockBrowsingDataRemover::MockBrowsingDataRemover( - content::BrowserContext* context) {} - -MockBrowsingDataRemover::~MockBrowsingDataRemover() { - DCHECK(!expected_calls_.size()) << "Expectations were set but not verified."; -} - -void MockBrowsingDataRemover::Shutdown() {} - -void MockBrowsingDataRemover::Remove(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask) { - RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder>(), - nullptr); -} - -void MockBrowsingDataRemover::RemoveAndReply(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - Observer* observer) { - DCHECK(observer); - RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder>(), - observer); -} - -bool MockBrowsingDataRemover::DoesOriginMatchMask( - int origin_type_mask, - const GURL& origin, - storage::SpecialStoragePolicy* special_storage_policy) const { - return true; -} - -void MockBrowsingDataRemover::RemoveWithFilter( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder) { - DCHECK(filter_builder); - RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, - std::move(filter_builder), nullptr); -} - -void MockBrowsingDataRemover::RemoveWithFilterAndReply( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - Observer* observer) { - DCHECK(filter_builder); - DCHECK(observer); - RemoveInternal(delete_begin, delete_end, remove_mask, origin_type_mask, - std::move(filter_builder), observer); -} - -void MockBrowsingDataRemover::RemoveInternal( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - BrowsingDataRemover::Observer* observer) { - actual_calls_.emplace_back(delete_begin, delete_end, remove_mask, - origin_type_mask, std::move(filter_builder), - true /* should_compare_filter */); - - // |observer| is not recorded in |actual_calls_| to be compared with - // expectations, because it's created internally in ClearSiteData() and - // it's unknown to this. However, it is tested implicitly, because we use - // it for the completion callback, so an incorrect |observer| will fail - // the test by waiting for the callback forever. - DCHECK(observer); - observer->OnBrowsingDataRemoverDone(); -} - -void MockBrowsingDataRemover::AddObserver(Observer* observer) {} - -void MockBrowsingDataRemover::RemoveObserver(Observer* observer) {} - -const base::Time& MockBrowsingDataRemover::GetLastUsedBeginTime() { - NOTIMPLEMENTED(); - return some_time; -} - -const base::Time& MockBrowsingDataRemover::GetLastUsedEndTime() { - NOTIMPLEMENTED(); - return some_time; -} - -int MockBrowsingDataRemover::GetLastUsedRemovalMask() { - NOTIMPLEMENTED(); - return -1; -} - -int MockBrowsingDataRemover::GetLastUsedOriginTypeMask() { - NOTIMPLEMENTED(); - return -1; -} - -void MockBrowsingDataRemover::SetEmbedderDelegate( - std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) { - NOTIMPLEMENTED(); -} - -BrowsingDataRemoverDelegate* MockBrowsingDataRemover::GetEmbedderDelegate() - const { - NOTIMPLEMENTED(); - return nullptr; -} - -void MockBrowsingDataRemover::ExpectCall( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder) { - expected_calls_.emplace_back(delete_begin, delete_end, remove_mask, - origin_type_mask, std::move(filter_builder), - true /* should_compare_filter */); -} - -void MockBrowsingDataRemover::ExpectCallDontCareAboutFilterBuilder( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask) { - expected_calls_.emplace_back( - delete_begin, delete_end, remove_mask, origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder>(), - false /* should_compare_filter */); -} - -void MockBrowsingDataRemover::VerifyAndClearExpectations() { - EXPECT_EQ(expected_calls_, actual_calls_); - expected_calls_.clear(); - actual_calls_.clear(); -} - -MockBrowsingDataRemover::CallParameters::CallParameters( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - bool should_compare_filter) - : delete_begin_(delete_begin), - delete_end_(delete_end), - remove_mask_(remove_mask), - origin_type_mask_(origin_type_mask), - filter_builder_(std::move(filter_builder)), - should_compare_filter_(should_compare_filter) {} -MockBrowsingDataRemover::CallParameters::~CallParameters() {} - -bool MockBrowsingDataRemover::CallParameters::operator==( - const CallParameters& other) const { - const CallParameters& a = *this; - const CallParameters& b = other; - - if (a.delete_begin_ != b.delete_begin_ || a.delete_end_ != b.delete_end_ || - a.remove_mask_ != b.remove_mask_ || - a.origin_type_mask_ != b.origin_type_mask_) { - return false; - } - - if (!a.should_compare_filter_ || !b.should_compare_filter_) - return true; - return *a.filter_builder_ == *b.filter_builder_; -}
diff --git a/chrome/browser/browsing_data/mock_browsing_data_remover.h b/chrome/browser/browsing_data/mock_browsing_data_remover.h deleted file mode 100644 index 2bee7c2..0000000 --- a/chrome/browser/browsing_data/mock_browsing_data_remover.h +++ /dev/null
@@ -1,119 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_H_ -#define CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_H_ - -#include <list> - -#include "chrome/browser/browsing_data/browsing_data_remover.h" - -namespace content { -class BrowserContext; -} - -// A BrowsingDataRemover that only records Remove*() calls. -// Some of the other methods are NOTIMPLEMENTED() as they are not needed for -// existing testcases. -class MockBrowsingDataRemover : public BrowsingDataRemover { - public: - explicit MockBrowsingDataRemover(content::BrowserContext* context); - - ~MockBrowsingDataRemover() override; - - // KeyedService: - void Shutdown() override; - - // BrowsingDataRemover: - // Determines whether |origin| matches the |origin_type_mask| according to - // the |special_storage_policy|. - bool DoesOriginMatchMask( - int origin_type_mask, - const GURL& origin, - storage::SpecialStoragePolicy* special_storage_policy) const override; - void Remove(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask) override; - void RemoveAndReply(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - Observer* observer) override; - void RemoveWithFilter(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> - filter_builder) override; - void RemoveWithFilterAndReply( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - Observer* observer) override; - void AddObserver(Observer* observer) override; - void RemoveObserver(Observer* observer) override; - const base::Time& GetLastUsedBeginTime() override; - const base::Time& GetLastUsedEndTime() override; - int GetLastUsedRemovalMask() override; - int GetLastUsedOriginTypeMask() override; - void SetEmbedderDelegate( - std::unique_ptr<BrowsingDataRemoverDelegate> embedder_delegate) override; - BrowsingDataRemoverDelegate* GetEmbedderDelegate() const override; - - // Add an expected call for testing. - void ExpectCall( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder); - - // Add an expected call that doesn't have to match the filter_builder. - void ExpectCallDontCareAboutFilterBuilder(const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask); - - // Verify that expected and actual calls match. - void VerifyAndClearExpectations(); - - private: - class CallParameters { - public: - CallParameters( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - bool should_compare_filter); - ~CallParameters(); - - bool operator==(const CallParameters& other) const; - - private: - base::Time delete_begin_; - base::Time delete_end_; - int remove_mask_; - int origin_type_mask_; - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder_; - bool should_compare_filter_; - }; - - void RemoveInternal( - const base::Time& delete_begin, - const base::Time& delete_end, - int remove_mask, - int origin_type_mask, - std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, - Observer* observer); - - std::list<CallParameters> actual_calls_; - std::list<CallParameters> expected_calls_; -}; - -#endif // CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_H_
diff --git a/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.cc new file mode 100644 index 0000000..e38e3653 --- /dev/null +++ b/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.cc
@@ -0,0 +1,96 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h" + +#include "base/callback.h" +#include "content/public/browser/browsing_data_filter_builder.h" +#include "testing/gtest/include/gtest/gtest.h" + +MockBrowsingDataRemoverDelegate::MockBrowsingDataRemoverDelegate() {} + +MockBrowsingDataRemoverDelegate::~MockBrowsingDataRemoverDelegate() { + DCHECK(!expected_calls_.size()) << "Expectations were set but not verified."; +} + +bool MockBrowsingDataRemoverDelegate::DoesOriginMatchEmbedderMask( + int origin_type_mask, + const GURL& origin, + storage::SpecialStoragePolicy* special_storage_policy) const { + return false; +} + +void MockBrowsingDataRemoverDelegate::RemoveEmbedderData( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + const content::BrowsingDataFilterBuilder& filter_builder, + int origin_type_mask, + const base::Closure& callback) { + actual_calls_.emplace_back(delete_begin, delete_end, remove_mask, + origin_type_mask, filter_builder.Copy(), + true /* should_compare_filter */); + callback.Run(); +} + +void MockBrowsingDataRemoverDelegate::ExpectCall( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask, + const content::BrowsingDataFilterBuilder& filter_builder) { + expected_calls_.emplace_back(delete_begin, delete_end, remove_mask, + origin_type_mask, filter_builder.Copy(), + true /* should_compare_filter */); +} + +void MockBrowsingDataRemoverDelegate::ExpectCallDontCareAboutFilterBuilder( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask) { + expected_calls_.emplace_back( + delete_begin, delete_end, remove_mask, origin_type_mask, + content::BrowsingDataFilterBuilder::Create( + content::BrowsingDataFilterBuilder::BLACKLIST), + false /* should_compare_filter */); +} + +void MockBrowsingDataRemoverDelegate::VerifyAndClearExpectations() { + EXPECT_EQ(expected_calls_, actual_calls_); + expected_calls_.clear(); + actual_calls_.clear(); +} + +MockBrowsingDataRemoverDelegate::CallParameters::CallParameters( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask, + std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, + bool should_compare_filter) + : delete_begin_(delete_begin), + delete_end_(delete_end), + remove_mask_(remove_mask), + origin_type_mask_(origin_type_mask), + filter_builder_(std::move(filter_builder)), + should_compare_filter_(should_compare_filter) {} + +MockBrowsingDataRemoverDelegate::CallParameters::~CallParameters() {} + +bool MockBrowsingDataRemoverDelegate::CallParameters::operator==( + const CallParameters& other) const { + const CallParameters& a = *this; + const CallParameters& b = other; + + if (a.delete_begin_ != b.delete_begin_ || a.delete_end_ != b.delete_end_ || + a.remove_mask_ != b.remove_mask_ || + a.origin_type_mask_ != b.origin_type_mask_) { + return false; + } + + if (!a.should_compare_filter_ || !b.should_compare_filter_) + return true; + return *a.filter_builder_ == *b.filter_builder_; +}
diff --git a/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h b/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h new file mode 100644 index 0000000..ad7cb916 --- /dev/null +++ b/chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h
@@ -0,0 +1,77 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_DELEGATE_H_ +#define CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_DELEGATE_H_ + +#include <list> +#include <memory> + +#include "base/time/time.h" +#include "chrome/browser/browsing_data/browsing_data_remover_delegate.h" +#include "content/public/browser/browsing_data_filter_builder.h" + +// A BrowsingDataRemoverDelegate that only records RemoveEmbedderData() calls. +class MockBrowsingDataRemoverDelegate : public BrowsingDataRemoverDelegate { + public: + MockBrowsingDataRemoverDelegate(); + ~MockBrowsingDataRemoverDelegate() override; + + // BrowsingDataRemoverDelegate: + bool DoesOriginMatchEmbedderMask( + int origin_type_mask, + const GURL& origin, + storage::SpecialStoragePolicy* special_storage_policy) const override; + void RemoveEmbedderData( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + const content::BrowsingDataFilterBuilder& filter_builder, + int origin_type_mask, + const base::Closure& callback) override; + + // Add an expected call for testing. + void ExpectCall(const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask, + const content::BrowsingDataFilterBuilder& filter_builder); + + // Add an expected call that doesn't have to match the filter_builder. + void ExpectCallDontCareAboutFilterBuilder(const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask); + + // Verify that expected and actual calls match. + void VerifyAndClearExpectations(); + + private: + class CallParameters { + public: + CallParameters( + const base::Time& delete_begin, + const base::Time& delete_end, + int remove_mask, + int origin_type_mask, + std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder, + bool should_compare_filter); + ~CallParameters(); + + bool operator==(const CallParameters& other) const; + + private: + base::Time delete_begin_; + base::Time delete_end_; + int remove_mask_; + int origin_type_mask_; + std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder_; + bool should_compare_filter_; + }; + + std::list<CallParameters> actual_calls_; + std::list<CallParameters> expected_calls_; +}; + +#endif // CHROME_BROWSER_BROWSING_DATA_MOCK_BROWSING_DATA_REMOVER_DELEGATE_H_
diff --git a/chrome/browser/browsing_data/origin_filter_builder_unittest.cc b/chrome/browser/browsing_data/origin_filter_builder_unittest.cc deleted file mode 100644 index 543c8e4d..0000000 --- a/chrome/browser/browsing_data/origin_filter_builder_unittest.cc +++ /dev/null
@@ -1,111 +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. - -#include "chrome/browser/browsing_data/origin_filter_builder.h" - -#include <algorithm> -#include <string> -#include <vector> - -#include "base/callback.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" -#include "url/origin.h" - -namespace url { - -namespace { - -struct TestCase { - std::string url; - bool should_match; -}; - -void RunTestCase( - TestCase test_case, const base::Callback<bool(const GURL&)>& filter) { - if (test_case.should_match) - EXPECT_TRUE(filter.Run(GURL(test_case.url))); - else - EXPECT_FALSE(filter.Run(GURL(test_case.url))); -} - -} // namespace - -TEST(OriginFilterBuilderTest, Noop) { - // An no-op filter matches everything. - base::Callback<bool(const GURL&)> filter = - OriginFilterBuilder::BuildNoopFilter(); - - TestCase test_cases[] = { - { "https://www.google.com", true }, - { "https://www.chrome.com", true }, - { "invalid url spec", true } - }; - - for (TestCase test_case : test_cases) - RunTestCase(test_case, filter); -} - -TEST(OriginFilterBuilderTest, Whitelist) { - OriginFilterBuilder builder(OriginFilterBuilder::WHITELIST); - builder.AddOrigin(Origin(GURL("https://www.google.com"))); - builder.AddOrigin(Origin(GURL("http://www.example.com"))); - base::Callback<bool(const GURL&)> filter = builder.BuildGeneralFilter(); - - TestCase test_cases[] = { - // Whitelist matches any URL on the specified origins. - { "https://www.google.com", true }, - { "https://www.google.com/?q=test", true }, - { "http://www.example.com", true }, - { "http://www.example.com/index.html", true }, - { "http://www.example.com/foo/bar", true }, - - // Subdomains are different origins. - { "https://test.www.google.com", false }, - - // Different scheme or port is a different origin. - { "https://www.google.com:8000", false }, - { "https://www.example.com/index.html", false }, - - // Different host is a different origin. - { "https://www.youtube.com", false }, - { "https://www.chromium.org", false }, - }; - - for (TestCase test_case : test_cases) - RunTestCase(test_case, filter); -} - -TEST(OriginFilterBuilderTest, Blacklist) { - OriginFilterBuilder builder(OriginFilterBuilder::BLACKLIST); - builder.AddOrigin(Origin(GURL("https://www.google.com"))); - builder.AddOrigin(Origin(GURL("http://www.example.com"))); - base::Callback<bool(const GURL&)> filter = builder.BuildGeneralFilter(); - - TestCase test_cases[] = { - // URLS on explicitly specified origins are not matched. - { "https://www.google.com", false }, - { "https://www.google.com/?q=test", false }, - { "http://www.example.com", false }, - { "http://www.example.com/index.html", false }, - { "http://www.example.com/foo/bar", false }, - - // Subdomains are different origins. - { "https://test.www.google.com", true }, - - // The same hosts but with different schemes and ports - // are not blacklisted. - { "https://www.google.com:8000", true }, - { "https://www.example.com/index.html", true }, - - // Different hosts are not blacklisted. - { "https://www.chrome.com", true }, - { "https://www.youtube.com", true }, - }; - - for (TestCase test_case : test_cases) - RunTestCase(test_case, filter); -} - -} // namespace url
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index a526809..bce9863 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1873,7 +1873,6 @@ switches::kDisableBundledPpapiFlash, switches::kDisableCastStreamingHWEncoding, switches::kDisableJavaScriptHarmonyShipping, - switches::kDisableNewBookmarkApps, switches::kEnableBenchmarking, switches::kEnableDistillabilityService, switches::kEnableNaCl, @@ -1882,7 +1881,6 @@ switches::kEnableNaClNonSfiMode, #endif switches::kEnableNetBenchmarking, - switches::kEnableNewBookmarkApps, #if !defined(DISABLE_NACL) switches::kForcePNaClSubzero, #endif
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc index 8c58ceee..e09b076f 100644 --- a/chrome/browser/chrome_content_browser_client_unittest.cc +++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -14,13 +14,14 @@ #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/metrics/field_trial.h" +#include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/browsing_data/browsing_data_helper.h" #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" -#include "chrome/browser/browsing_data/mock_browsing_data_remover.h" +#include "chrome/browser/browsing_data/mock_browsing_data_remover_delegate.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/test/base/testing_profile.h" #include "components/content_settings/core/browser/host_content_settings_map.h" @@ -31,6 +32,7 @@ #include "content/public/browser/browsing_data_filter_builder.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -348,30 +350,31 @@ class ChromeContentBrowserClientClearSiteDataTest : public testing::Test { public: void SetUp() override { - BrowsingDataRemoverFactory::GetInstance()->SetTestingFactoryAndUse( - &profile_, &ChromeContentBrowserClientClearSiteDataTest::GetRemover); + BrowsingDataRemoverFactory::GetForBrowserContext(profile()) + ->SetEmbedderDelegate( + base::MakeUnique<MockBrowsingDataRemoverDelegate>()); + run_loop_.reset(new base::RunLoop()); } content::BrowserContext* profile() { return &profile_; } - MockBrowsingDataRemover* remover() { - return static_cast<MockBrowsingDataRemover*>( - BrowsingDataRemoverFactory::GetForBrowserContext(&profile_)); + MockBrowsingDataRemoverDelegate* delegate() { + return static_cast<MockBrowsingDataRemoverDelegate*>( + BrowsingDataRemoverFactory::GetForBrowserContext(profile()) + ->GetEmbedderDelegate()); } - void SetClearingFinished(bool finished) { finished_ = finished; } + void OnClearingFinished() { run_loop_->Quit(); } - bool IsClearingFinished() { return finished_; } + void WaitForClearingFinished() { + run_loop_->Run(); + run_loop_.reset(new base::RunLoop()); + } private: - static std::unique_ptr<KeyedService> GetRemover( - content::BrowserContext* context) { - return base::WrapUnique(new MockBrowsingDataRemover(context)); - } - + std::unique_ptr<base::RunLoop> run_loop_; content::TestBrowserThreadBundle thread_bundle_; TestingProfile profile_; - bool finished_; }; // Tests that the parameters to ClearBrowsingData() are translated to @@ -434,27 +437,26 @@ int origin_deletion_mask = test_case.mask & ~domain_scoped_types; if (registrable_domain_deletion_mask) { - remover()->ExpectCallDontCareAboutFilterBuilder( - base::Time(), base::Time::Max(), - registrable_domain_deletion_mask, all_origin_types); + delegate()->ExpectCallDontCareAboutFilterBuilder( + base::Time(), base::Time::Max(), registrable_domain_deletion_mask, + all_origin_types); } if (origin_deletion_mask) { - remover()->ExpectCallDontCareAboutFilterBuilder( - base::Time(), base::Time::Max(), - origin_deletion_mask, all_origin_types); + delegate()->ExpectCallDontCareAboutFilterBuilder( + base::Time(), base::Time::Max(), origin_deletion_mask, + all_origin_types); } - SetClearingFinished(false); client.ClearSiteData( profile(), url::Origin(GURL("https://www.example.com")), test_case.cookies, test_case.storage, test_case.cache, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); - remover()->VerifyAndClearExpectations(); + delegate()->VerifyAndClearExpectations(); } } @@ -509,34 +511,33 @@ BrowsingDataFilterBuilder::WHITELIST)); registrable_domain_filter_builder->AddRegisterableDomain(test_case.domain); - remover()->ExpectCall( + delegate()->ExpectCall( base::Time(), base::Time::Max(), BrowsingDataRemover::DATA_TYPE_COOKIES | BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS | ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA, ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, - std::move(registrable_domain_filter_builder)); + *registrable_domain_filter_builder); std::unique_ptr<BrowsingDataFilterBuilder> origin_filter_builder( BrowsingDataFilterBuilder::Create( BrowsingDataFilterBuilder::WHITELIST)); origin_filter_builder->AddOrigin(url::Origin(GURL(test_case.origin))); - remover()->ExpectCall(base::Time(), base::Time::Max(), - BrowsingDataRemover::DATA_TYPE_CACHE, - ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, - std::move(origin_filter_builder)); + delegate()->ExpectCall(base::Time(), base::Time::Max(), + BrowsingDataRemover::DATA_TYPE_CACHE, + ChromeBrowsingDataRemoverDelegate::ALL_ORIGIN_TYPES, + *origin_filter_builder); - SetClearingFinished(false); client.ClearSiteData( profile(), url::Origin(GURL(test_case.origin)), true /* cookies */, false /* storage */, true /* cache */, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); - remover()->VerifyAndClearExpectations(); + delegate()->VerifyAndClearExpectations(); } } @@ -547,44 +548,40 @@ url::Origin origin(GURL("https://www.example.com")); // No removal tasks. - SetClearingFinished(false); client.ClearSiteData( profile(), origin, false /* cookies */, false /* storage */, false /* cache */, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); // One removal task: deleting cookies with a domain filter. - SetClearingFinished(false); client.ClearSiteData( profile(), origin, true /* cookies */, false /* storage */, false /* cache */, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); // One removal task: deleting cache with a domain filter. - SetClearingFinished(false); client.ClearSiteData( profile(), origin, false /* cookies */, false /* storage */, true /* cache */, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); // Two removal tasks, with domain and origin filters respectively. - SetClearingFinished(false); client.ClearSiteData( profile(), origin, true /* cookies */, false /* storage */, true /* cache */, base::Bind( - &ChromeContentBrowserClientClearSiteDataTest::SetClearingFinished, - base::Unretained(this), true)); - EXPECT_TRUE(IsClearingFinished()); + &ChromeContentBrowserClientClearSiteDataTest::OnClearingFinished, + base::Unretained(this))); + WaitForClearingFinished(); } } // namespace
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 1b48cb0..b4d47f95 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1137,6 +1137,8 @@ "policy/recommendation_restorer_factory.h", "policy/remote_commands/affiliated_remote_commands_invalidator.cc", "policy/remote_commands/affiliated_remote_commands_invalidator.h", + "policy/remote_commands/device_command_fetch_status_job.cc", + "policy/remote_commands/device_command_fetch_status_job.h", "policy/remote_commands/device_command_reboot_job.cc", "policy/remote_commands/device_command_reboot_job.h", "policy/remote_commands/device_command_screenshot_job.cc",
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc index 2c11928e..a4bba2a 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -639,8 +639,7 @@ const base::DictionaryValue* extension = nullptr; if (external_cache_->cached_extensions()->GetDictionary(id, &extension)) { std::unique_ptr<base::DictionaryValue> prefs(new base::DictionaryValue); - base::DictionaryValue* extension_copy = extension->DeepCopy(); - prefs->Set(id, extension_copy); + prefs->Set(id, extension->CreateDeepCopy()); external_loader_->SetCurrentAppExtensions(std::move(prefs)); } else { LOG(ERROR) << "Can't find app in the cached externsions" @@ -887,7 +886,7 @@ extension_urls::GetWebstoreUpdateUrl().spec()); } - prefs->Set(apps_[i]->app_id(), entry.release()); + prefs->Set(apps_[i]->app_id(), std::move(entry)); } external_cache_->UpdateExtensionsList(std::move(prefs)); }
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc index 05c9c45..dafab9a 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
@@ -325,7 +325,7 @@ PrefService* local_state = g_browser_process->local_state(); DictionaryPrefUpdate dict_update(local_state, KioskAppManager::kKioskDictionaryName); - dict_update->Set(KioskAppManager::kKeyApps, apps_dict.release()); + dict_update->Set(KioskAppManager::kKeyApps, std::move(apps_dict)); // Make the app appear in device settings. base::ListValue device_local_accounts;
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 5d5ee847..7864344 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -107,7 +107,6 @@ #include "chromeos/cert_loader.h" #include "chromeos/chromeos_paths.h" #include "chromeos/chromeos_switches.h" -#include "chromeos/components/tether/initializer.h" #include "chromeos/cryptohome/async_method_caller.h" #include "chromeos/cryptohome/cryptohome_parameters.h" #include "chromeos/cryptohome/homedir_methods.h" @@ -740,10 +739,6 @@ if (!user_manager::UserManager::Get()->IsLoggedInAsGuest()) low_disk_notification_ = base::MakeUnique<LowDiskNotification>(); - if (parsed_command_line().HasSwitch(chromeos::switches::kEnableTether)) { - chromeos::tether::Initializer::Initialize(); - } - ChromeBrowserMainPartsLinux::PostProfileInit(); }
diff --git a/chrome/browser/chromeos/display/display_preferences.cc b/chrome/browser/chromeos/display/display_preferences.cc index 80d5b29..914b7ac 100644 --- a/chrome/browser/chromeos/display/display_preferences.cc +++ b/chrome/browser/chromeos/display/display_preferences.cc
@@ -315,7 +315,7 @@ layout_value.reset(value->DeepCopy()); } if (display::DisplayLayoutToJson(display_layout, layout_value.get())) - pref_data->Set(name, layout_value.release()); + pref_data->Set(name, std::move(layout_value)); } void StoreCurrentDisplayLayoutPrefs() { @@ -373,7 +373,7 @@ } if (info.has_touch_calibration_data()) TouchDataToValue(info.GetTouchCalibrationData(), property_value.get()); - pref_data->Set(base::Int64ToString(id), property_value.release()); + pref_data->Set(base::Int64ToString(id), std::move(property_value)); } }
diff --git a/chrome/browser/chromeos/display/display_preferences_unittest.cc b/chrome/browser/chromeos/display/display_preferences_unittest.cc index c2da9688..68dee38 100644 --- a/chrome/browser/chromeos/display/display_preferences_unittest.cc +++ b/chrome/browser/chromeos/display/display_preferences_unittest.cc
@@ -128,7 +128,7 @@ layout_value.reset(value->DeepCopy()); } if (display::DisplayLayoutToJson(display_layout, layout_value.get())) - pref_data->Set(name, layout_value.release()); + pref_data->Set(name, std::move(layout_value)); } void StoreDisplayPropertyForList(const display::DisplayIdList& list, @@ -149,7 +149,7 @@ std::unique_ptr<base::DictionaryValue> layout_value( new base::DictionaryValue()); layout_value->SetBoolean(key, value != nullptr); - pref_data->Set(name, layout_value.release()); + pref_data->Set(name, std::move(layout_value)); } } @@ -171,12 +171,12 @@ const std::string name = base::Int64ToString(id); base::DictionaryValue* pref_data = update.Get(); - base::DictionaryValue* insets_value = new base::DictionaryValue(); + auto insets_value = base::MakeUnique<base::DictionaryValue>(); insets_value->SetInteger("insets_top", insets.top()); insets_value->SetInteger("insets_left", insets.left()); insets_value->SetInteger("insets_bottom", insets.bottom()); insets_value->SetInteger("insets_right", insets.right()); - pref_data->Set(name, insets_value); + pref_data->Set(name, std::move(insets_value)); } void StoreColorProfile(int64_t id, const std::string& profile) { @@ -184,9 +184,9 @@ const std::string name = base::Int64ToString(id); base::DictionaryValue* pref_data = update.Get(); - base::DictionaryValue* property = new base::DictionaryValue(); + auto property = base::MakeUnique<base::DictionaryValue>(); property->SetString("color_profile_name", profile); - pref_data->Set(name, property); + pref_data->Set(name, std::move(property)); } void StoreDisplayRotationPrefsForTest(bool rotation_lock, @@ -1000,8 +1000,9 @@ display::Screen::GetScreen()->GetPrimaryDisplay().id()); ASSERT_FALSE(local_state()->HasPrefPath(prefs::kDisplayRotationLock)); - ash::Shell::GetInstance()->screen_orientation_controller()->SetRotationLocked( - true); + ash::Shell::GetInstance() + ->screen_orientation_controller() + ->ToggleUserRotationLock(); EXPECT_TRUE(local_state()->HasPrefPath(prefs::kDisplayRotationLock));
diff --git a/chrome/browser/chromeos/extensions/accessibility_features_apitest.cc b/chrome/browser/chromeos/extensions/accessibility_features_apitest.cc index 0241652..d9a5871 100644 --- a/chrome/browser/chromeos/extensions/accessibility_features_apitest.cc +++ b/chrome/browser/chromeos/extensions/accessibility_features_apitest.cc
@@ -152,12 +152,12 @@ std::unique_ptr<base::ListValue> enabled_list(new base::ListValue); for (size_t i = 0; i < enabled_features.size(); ++i) enabled_list->AppendString(enabled_features[i]); - test_arg.Set(kEnabledFeaturesKey, enabled_list.release()); + test_arg.Set(kEnabledFeaturesKey, std::move(enabled_list)); std::unique_ptr<base::ListValue> disabled_list(new base::ListValue); for (size_t i = 0; i < disabled_features.size(); ++i) disabled_list->AppendString(disabled_features[i]); - test_arg.Set(kDisabledFeaturesKey, disabled_list.release()); + test_arg.Set(kDisabledFeaturesKey, std::move(disabled_list)); return base::JSONWriter::Write(test_arg, result); }
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc index e7ce0e33..c864360 100644 --- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc +++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider_unittest.cc
@@ -58,8 +58,10 @@ scoped_refptr<const extensions::Extension> CreateHostedApp() { base::DictionaryValue values; - values.Set(extensions::manifest_keys::kApp, new base::DictionaryValue); - values.Set(extensions::manifest_keys::kWebURLs, new base::ListValue); + values.Set(extensions::manifest_keys::kApp, + base::MakeUnique<base::DictionaryValue>()); + values.Set(extensions::manifest_keys::kWebURLs, + base::MakeUnique<base::ListValue>()); return CreateExtensionFromValues(std::string(), extensions::Manifest::INTERNAL, &values, @@ -174,15 +176,15 @@ base::DictionaryValue values; values.SetString(extensions::manifest_keys::kDescription, "something"); values.SetString(extensions::manifest_keys::kShortName, "something else"); - base::ListValue* permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("alarms"); permissions->AppendString("background"); - values.Set(extensions::manifest_keys::kPermissions, permissions); - base::ListValue* optional_permissions = new base::ListValue(); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); + auto optional_permissions = base::MakeUnique<base::ListValue>(); optional_permissions->AppendString("alarms"); optional_permissions->AppendString("background"); values.Set(extensions::manifest_keys::kOptionalPermissions, - optional_permissions); + std::move(optional_permissions)); extension = CreatePlatformAppWithExtraValues( &values, extensions::Manifest::EXTERNAL_POLICY, @@ -216,7 +218,8 @@ // individually. { base::DictionaryValue values; - values.Set("chrome_settings_overrides", new base::DictionaryValue()); + values.Set("chrome_settings_overrides", + base::MakeUnique<base::DictionaryValue>()); extension = CreatePlatformAppWithExtraValues( &values, extensions::Manifest::EXTERNAL_POLICY, @@ -264,8 +267,10 @@ // installed. { base::DictionaryValue values; - values.Set(extensions::manifest_keys::kApp, new base::DictionaryValue); - values.Set(extensions::manifest_keys::kWebURLs, new base::ListValue); + values.Set(extensions::manifest_keys::kApp, + base::MakeUnique<base::DictionaryValue>()); + values.Set(extensions::manifest_keys::kWebURLs, + base::MakeUnique<base::ListValue>()); values.SetString("app.content_security_policy", "something2"); extension = CreateExtensionFromValues( std::string(), @@ -283,7 +288,7 @@ // installed. { base::DictionaryValue values; - values.Set("theme", new base::DictionaryValue()); + values.Set("theme", base::MakeUnique<base::DictionaryValue>()); values.SetString("app.content_security_policy", "something2"); extension = CreateExtensionFromValues( std::string(), @@ -300,10 +305,10 @@ // Verify that a platform app with an unknown permission entry cannot be // installed. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("not_whitelisted_permission"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -320,10 +325,10 @@ // installed. Since the program logic is based entirely on whitelists, there // is no significant advantage in testing all unsafe permissions individually. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("experimental"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -339,10 +344,11 @@ // Verify that a platform app with an unsafe optional permission entry cannot // be installed. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("experimental"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kOptionalPermissions, permissions); + values.Set(extensions::manifest_keys::kOptionalPermissions, + std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -358,10 +364,10 @@ // Verify that a platform app with an url_handlers manifest entry and which is // not installed through the web store cannot be installed. { - base::ListValue* const matches = new base::ListValue(); + auto matches = base::MakeUnique<base::ListValue>(); matches->AppendString("https://example.com/*"); base::DictionaryValue values; - values.Set("url_handlers.example_com.matches", matches); + values.Set("url_handlers.example_com.matches", std::move(matches)); values.SetString("url_handlers.example_com.title", "example title"); extension = CreatePlatformAppWithExtraValues( @@ -378,10 +384,10 @@ // Verify that a platform app with a url_handlers manifest entry and which is // installed through the web store can be installed. { - base::ListValue* const matches = new base::ListValue(); + auto matches = base::MakeUnique<base::ListValue>(); matches->AppendString("https://example.com/*"); base::DictionaryValue values; - values.Set("url_handlers.example_com.matches", matches); + values.Set("url_handlers.example_com.matches", std::move(matches)); values.SetString("url_handlers.example_com.title", "example title"); extension = CreatePlatformAppWithExtraValues( @@ -397,12 +403,12 @@ // Verify that a platform app with remote URL permissions can be installed. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("https://example.com/"); permissions->AppendString("http://example.com/"); permissions->AppendString("ftp://example.com/"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -417,12 +423,12 @@ // Verify that an extension with remote URL permissions cannot be installed. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("https://example.com/"); permissions->AppendString("http://example.com/"); permissions->AppendString("ftp://example.com/"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreateExtensionFromValues( std::string(), @@ -438,10 +444,10 @@ // Verify that a platform app with a local URL permission cannot be installed. { - base::ListValue* const permissions = new base::ListValue(); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->AppendString("file:///some/where"); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -458,13 +464,13 @@ // installed. { auto socket = base::MakeUnique<base::DictionaryValue>(); - base::ListValue* const tcp_list = new base::ListValue(); + auto tcp_list = base::MakeUnique<base::ListValue>(); tcp_list->AppendString("tcp-connect"); - socket->Set("socket", tcp_list); - base::ListValue* const permissions = new base::ListValue(); + socket->Set("socket", std::move(tcp_list)); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->Append(std::move(socket)); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -481,13 +487,13 @@ // installed. { auto socket = base::MakeUnique<base::DictionaryValue>(); - base::ListValue* const tcp_list = new base::ListValue(); + auto tcp_list = base::MakeUnique<base::ListValue>(); tcp_list->AppendString("unknown_value"); - socket->Set("unknown_key", tcp_list); - base::ListValue* const permissions = new base::ListValue(); + socket->Set("unknown_key", std::move(tcp_list)); + auto permissions = base::MakeUnique<base::ListValue>(); permissions->Append(std::move(socket)); base::DictionaryValue values; - values.Set(extensions::manifest_keys::kPermissions, permissions); + values.Set(extensions::manifest_keys::kPermissions, std::move(permissions)); extension = CreatePlatformAppWithExtraValues( &values, @@ -518,7 +524,7 @@ // Verify that a shared_module can be installed. { base::DictionaryValue values; - values.Set("export.whitelist", new base::ListValue()); + values.Set("export.whitelist", base::MakeUnique<base::ListValue>()); extension = CreateExtensionFromValues( std::string(), extensions::Manifest::EXTERNAL_POLICY, @@ -534,7 +540,7 @@ // Verify that a theme can be installed. { base::DictionaryValue values; - values.Set("theme", new base::DictionaryValue()); + values.Set("theme", base::MakeUnique<base::DictionaryValue>()); extension = CreateExtensionFromValues( std::string(), extensions::Manifest::EXTERNAL_POLICY,
diff --git a/chrome/browser/chromeos/extensions/external_cache.cc b/chrome/browser/chromeos/extensions/external_cache.cc index dabb3b6..52455ea 100644 --- a/chrome/browser/chromeos/extensions/external_cache.cc +++ b/chrome/browser/chromeos/extensions/external_cache.cc
@@ -265,7 +265,8 @@ std::string hash; if (local_cache_.GetExtension(it.key(), hash, &file_path, &version)) { // Copy entry to don't modify it inside extensions_. - base::DictionaryValue* entry_copy = entry->DeepCopy(); + std::unique_ptr<base::DictionaryValue> entry_copy = + entry->CreateDeepCopy(); if (extension_urls::IsWebstoreUpdateUrl(GURL(external_update_url))) { entry_copy->SetBoolean( @@ -277,7 +278,7 @@ version); entry_copy->SetString(extensions::ExternalProviderImpl::kExternalCrx, file_path.value()); - cached_extensions_->Set(it.key(), entry_copy); + cached_extensions_->Set(it.key(), std::move(entry_copy)); } else { bool has_external_crx = entry->HasKey( extensions::ExternalProviderImpl::kExternalCrx); @@ -285,7 +286,7 @@ !delegate_->GetInstalledExtensionVersion(it.key()).empty(); if (keep_if_present || has_external_crx || is_already_installed) { // Copy entry to don't modify it inside extensions_. - cached_extensions_->Set(it.key(), entry->DeepCopy()); + cached_extensions_->Set(it.key(), entry->CreateDeepCopy()); } } } @@ -310,14 +311,15 @@ VLOG(1) << "ExternalCache installed a new extension in the cache " << id; - base::DictionaryValue* entry = NULL; - if (!extensions_->GetDictionary(id, &entry)) { + base::DictionaryValue* original_entry = NULL; + if (!extensions_->GetDictionary(id, &original_entry)) { LOG(ERROR) << "ExternalCache cannot find entry for extension " << id; return; } - // Copy entry to don't modify it inside extensions_. - entry = entry->DeepCopy(); + // Copy original_entry to avoid modifying it inside extensions_. + std::unique_ptr<base::DictionaryValue> entry = + original_entry->CreateDeepCopy(); std::string version; std::string hash; @@ -343,7 +345,7 @@ entry->SetString(extensions::ExternalProviderImpl::kExternalCrx, file_path.value()); - cached_extensions_->Set(id, entry); + cached_extensions_->Set(id, std::move(entry)); if (delegate_) delegate_->OnExtensionLoadedInCache(id); UpdateExtensionLoader();
diff --git a/chrome/browser/chromeos/extensions/external_cache_unittest.cc b/chrome/browser/chromeos/extensions/external_cache_unittest.cc index 04f5e6df..b95037ba 100644 --- a/chrome/browser/chromeos/extensions/external_cache_unittest.cc +++ b/chrome/browser/chromeos/extensions/external_cache_unittest.cc
@@ -116,8 +116,9 @@ return dir.Append(id + "-" + version + ".crx"); } - base::DictionaryValue* CreateEntryWithUpdateUrl(bool from_webstore) { - base::DictionaryValue* entry = new base::DictionaryValue; + std::unique_ptr<base::DictionaryValue> CreateEntryWithUpdateUrl( + bool from_webstore) { + auto entry = base::MakeUnique<base::DictionaryValue>(); entry->SetString(extensions::ExternalProviderImpl::kExternalUpdateUrl, from_webstore ? extension_urls::GetWebstoreUpdateUrl().spec() : kNonWebstoreUpdateUrl); @@ -162,11 +163,9 @@ background_task_runner(), this, true, false); std::unique_ptr<base::DictionaryValue> prefs(new base::DictionaryValue); - base::DictionaryValue* dict = CreateEntryWithUpdateUrl(true); - prefs->Set(kTestExtensionId1, dict); + prefs->Set(kTestExtensionId1, CreateEntryWithUpdateUrl(true)); CreateExtensionFile(cache_dir, kTestExtensionId1, "1"); - dict = CreateEntryWithUpdateUrl(true); - prefs->Set(kTestExtensionId2, dict); + prefs->Set(kTestExtensionId2, CreateEntryWithUpdateUrl(true)); prefs->Set(kTestExtensionId3, CreateEntryWithUpdateUrl(false)); CreateExtensionFile(cache_dir, kTestExtensionId3, "3"); prefs->Set(kTestExtensionId4, CreateEntryWithUpdateUrl(false));
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 b20157e..76f1f02 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -760,7 +760,7 @@ std::unique_ptr<SearchResultInfoList> search_result_info_list, std::unique_ptr<EntryDefinitionList> entry_definition_list) { DCHECK_EQ(search_result_info_list->size(), entry_definition_list->size()); - base::ListValue* entries = new base::ListValue(); + auto entries = base::MakeUnique<base::ListValue>(); // Convert Drive files to something File API stack can understand. for (EntryDefinitionList::const_iterator it = entry_definition_list->begin(); @@ -775,7 +775,7 @@ } std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->Set("entries", entries); + result->Set("entries", std::move(entries)); result->SetString("nextFeed", next_link.spec()); SetResult(std::move(result)); @@ -869,7 +869,7 @@ auto result_dict = base::MakeUnique<base::DictionaryValue>(); // FileEntry fields. - base::DictionaryValue* entry = new base::DictionaryValue(); + auto entry = base::MakeUnique<base::DictionaryValue>(); entry->SetString( "fileSystemName", entry_definition_list->at(i).file_system_name); entry->SetString( @@ -880,7 +880,7 @@ entry->SetBoolean("fileIsDirectory", entry_definition_list->at(i).is_directory); - result_dict->Set("entry", entry); + result_dict->Set("entry", std::move(entry)); result_dict->SetString( "highlightedBaseName", search_result_info_list->at(i).highlighted_base_name);
diff --git a/chrome/browser/chromeos/extensions/info_private_api.cc b/chrome/browser/chromeos/extensions/info_private_api.cc index 28aa50f..29bd74e2 100644 --- a/chrome/browser/chromeos/extensions/info_private_api.cc +++ b/chrome/browser/chromeos/extensions/info_private_api.cc
@@ -8,6 +8,7 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "base/sys_info.h" #include "base/values.h" #include "chrome/browser/app_mode/app_mode_utils.h" @@ -228,23 +229,23 @@ for (size_t i = 0; i < list->GetSize(); ++i) { std::string property_name; EXTENSION_FUNCTION_VALIDATE(list->GetString(i, &property_name)); - base::Value* value = GetValue(property_name); + std::unique_ptr<base::Value> value = GetValue(property_name); if (value) - result->Set(property_name, value); + result->Set(property_name, std::move(value)); } SetResult(std::move(result)); SendResponse(true); return true; } -base::Value* ChromeosInfoPrivateGetFunction::GetValue( +std::unique_ptr<base::Value> ChromeosInfoPrivateGetFunction::GetValue( const std::string& property_name) { if (property_name == kPropertyHWID) { std::string hwid; chromeos::system::StatisticsProvider* provider = chromeos::system::StatisticsProvider::GetInstance(); provider->GetMachineStatistic(chromeos::system::kHardwareClassKey, &hwid); - return new base::Value(hwid); + return base::MakeUnique<base::Value>(hwid); } if (property_name == kPropertyCustomizationID) { @@ -253,7 +254,7 @@ chromeos::system::StatisticsProvider::GetInstance(); provider->GetMachineStatistic(chromeos::system::kCustomizationIdKey, &customization_id); - return new base::Value(customization_id); + return base::MakeUnique<base::Value>(customization_id); } if (property_name == kPropertyHomeProvider) { @@ -263,86 +264,91 @@ std::string home_provider_id; if (cellular_device) home_provider_id = cellular_device->home_provider_id(); - return new base::Value(home_provider_id); + return base::MakeUnique<base::Value>(home_provider_id); } if (property_name == kPropertyInitialLocale) { - return new base::Value(chromeos::StartupUtils::GetInitialLocale()); + return base::MakeUnique<base::Value>( + chromeos::StartupUtils::GetInitialLocale()); } if (property_name == kPropertyBoard) { - return new base::Value(base::SysInfo::GetLsbReleaseBoard()); + return base::MakeUnique<base::Value>(base::SysInfo::GetLsbReleaseBoard()); } if (property_name == kPropertyOwner) { - return new base::Value( + return base::MakeUnique<base::Value>( user_manager::UserManager::Get()->IsCurrentUserOwner()); } if (property_name == kPropertySessionType) { if (ExtensionsBrowserClient::Get()->IsRunningInForcedAppMode()) - return new base::Value(kSessionTypeKiosk); + return base::MakeUnique<base::Value>(kSessionTypeKiosk); if (ExtensionsBrowserClient::Get()->IsLoggedInAsPublicAccount()) - return new base::Value(kSessionTypePublicSession); - return new base::Value(kSessionTypeNormal); + return base::MakeUnique<base::Value>(kSessionTypePublicSession); + return base::MakeUnique<base::Value>(kSessionTypeNormal); } if (property_name == kPropertyPlayStoreStatus) { if (arc::IsArcAllowedForProfile(Profile::FromBrowserContext(context_))) - return new base::Value(kPlayStoreStatusEnabled); + return base::MakeUnique<base::Value>(kPlayStoreStatusEnabled); if (arc::IsArcAvailable()) - return new base::Value(kPlayStoreStatusAvailable); - return new base::Value(kPlayStoreStatusNotAvailable); + return base::MakeUnique<base::Value>(kPlayStoreStatusAvailable); + return base::MakeUnique<base::Value>(kPlayStoreStatusNotAvailable); } if (property_name == kPropertyManagedDeviceStatus) { policy::BrowserPolicyConnectorChromeOS* connector = g_browser_process->platform_part()->browser_policy_connector_chromeos(); if (connector->IsEnterpriseManaged()) { - return new base::Value(kManagedDeviceStatusManaged); + return base::MakeUnique<base::Value>(kManagedDeviceStatusManaged); } - return new base::Value(kManagedDeviceStatusNotManaged); + return base::MakeUnique<base::Value>(kManagedDeviceStatusNotManaged); } if (property_name == kPropertyDeviceType) { switch (chromeos::GetDeviceType()) { case chromeos::DeviceType::kChromebox: - return new base::Value(kDeviceTypeChromebox); + return base::MakeUnique<base::Value>(kDeviceTypeChromebox); case chromeos::DeviceType::kChromebase: - return new base::Value(kDeviceTypeChromebase); + return base::MakeUnique<base::Value>(kDeviceTypeChromebase); case chromeos::DeviceType::kChromebit: - return new base::Value(kDeviceTypeChromebit); + return base::MakeUnique<base::Value>(kDeviceTypeChromebit); case chromeos::DeviceType::kChromebook: - return new base::Value(kDeviceTypeChromebook); + return base::MakeUnique<base::Value>(kDeviceTypeChromebook); default: - return new base::Value(kDeviceTypeChromedevice); + return base::MakeUnique<base::Value>(kDeviceTypeChromedevice); } } if (property_name == kPropertyClientId) { - return new base::Value(GetClientId()); + return base::MakeUnique<base::Value>(GetClientId()); } if (property_name == kPropertyTimezone) { - return chromeos::CrosSettings::Get()->GetPref( - chromeos::kSystemTimezone)->DeepCopy(); + // TODO(crbug.com/697817): Convert CrosSettings::Get to take a unique_ptr. + return base::WrapUnique<base::Value>( + chromeos::CrosSettings::Get() + ->GetPref(chromeos::kSystemTimezone) + ->DeepCopy()); } if (property_name == kPropertySupportedTimezones) { std::unique_ptr<base::ListValue> values = chromeos::system::GetTimezoneList(); - return values.release(); + // TODO(crbug.com/703565): remove std::move() once Xcode 9.0+ is required. + return std::move(values); } const char* pref_name = GetBoolPrefNameForApiProperty(property_name.c_str()); if (pref_name) { - return new base::Value( + return base::MakeUnique<base::Value>( Profile::FromBrowserContext(context_)->GetPrefs()->GetBoolean( pref_name)); } DLOG(ERROR) << "Unknown property request: " << property_name; - return NULL; + return nullptr; } ChromeosInfoPrivateSetFunction::ChromeosInfoPrivateSetFunction() {
diff --git a/chrome/browser/chromeos/extensions/info_private_api.h b/chrome/browser/chromeos/extensions/info_private_api.h index c7e497a..9ea71b5 100644 --- a/chrome/browser/chromeos/extensions/info_private_api.h +++ b/chrome/browser/chromeos/extensions/info_private_api.h
@@ -27,7 +27,7 @@ private: // Returns a newly allocate value, or null. - base::Value* GetValue(const std::string& property_name); + std::unique_ptr<base::Value> GetValue(const std::string& property_name); // Gets boolean |pref| value from PrefService. bool GetBooleanPrefValue(const char* pref);
diff --git a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc index 7ed9f34..5c3da03 100644 --- a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc +++ b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc
@@ -392,9 +392,7 @@ auto details = base::MakeUnique<base::DictionaryValue>(); // Get file definitions. These will be replaced with Entry instances by // dispatchEvent() method from event_binding.js. - base::ListValue* file_entries = new base::ListValue(); - details->Set("entries", file_entries); - event_args->Append(std::move(details)); + auto file_entries = base::MakeUnique<base::ListValue>(); for (EntryDefinitionList::const_iterator iter = entry_definition_list->begin(); @@ -409,6 +407,8 @@ file_entries->Append(std::move(file_def)); } + details->Set("entries", std::move(file_entries)); + event_args->Append(std::move(details)); std::unique_ptr<extensions::Event> event(new extensions::Event( extensions::events::FILE_BROWSER_HANDLER_ON_EXECUTE, "fileBrowserHandler.onExecute", std::move(event_args)));
diff --git a/chrome/browser/chromeos/file_manager/url_util.cc b/chrome/browser/chromeos/file_manager/url_util.cc index 035b469..8303a32 100644 --- a/chrome/browser/chromeos/file_manager/url_util.cc +++ b/chrome/browser/chromeos/file_manager/url_util.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include "base/json/json_writer.h" +#include "base/memory/ptr_util.h" #include "base/values.h" #include "chrome/browser/chromeos/file_manager/app_id.h" #include "net/base/escape.h" @@ -85,15 +86,15 @@ arg_value.SetString("defaultExtension", default_extension); if (file_types) { - base::ListValue* types_list = new base::ListValue(); + auto types_list = base::MakeUnique<base::ListValue>(); for (size_t i = 0; i < file_types->extensions.size(); ++i) { base::ListValue* extensions_list = new base::ListValue(); for (size_t j = 0; j < file_types->extensions[i].size(); ++j) { extensions_list->AppendString(file_types->extensions[i][j]); } - base::DictionaryValue* dict = new base::DictionaryValue(); - dict->Set("extensions", extensions_list); + auto dict = base::MakeUnique<base::DictionaryValue>(); + dict->Set("extensions", std::move(extensions_list)); if (i < file_types->extension_description_overrides.size()) { base::string16 desc = file_types->extension_description_overrides[i]; @@ -104,9 +105,9 @@ dict->SetBoolean("selected", (static_cast<size_t>(file_type_index) == (i + 1))); - types_list->Set(i, dict); + types_list->Set(i, std::move(dict)); } - arg_value.Set("typeList", types_list); + arg_value.Set("typeList", std::move(types_list)); arg_value.SetBoolean("includeAllFiles", file_types->include_all_files); }
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc index 5e05e085..f2f7d36 100644 --- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc +++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc
@@ -118,7 +118,7 @@ dict->SetString(kKeyPsk, data.psk); std::unique_ptr<base::DictionaryValue> permit_record( new base::DictionaryValue); - dict->Set(kKeyPermitRecord, permit_record.release()); + dict->Set(kKeyPermitRecord, std::move(permit_record)); dict->SetString(kKeyPermitId, data.public_key); dict->SetString(kKeyPermitData, data.public_key); dict->SetString(kKeyPermitType, kPermitTypeLicence);
diff --git a/chrome/browser/chromeos/login/helper.cc b/chrome/browser/chromeos/login/helper.cc index d8d5a60a..18baedf2 100644 --- a/chrome/browser/chromeos/login/helper.cc +++ b/chrome/browser/chromeos/login/helper.cc
@@ -170,11 +170,11 @@ std::unique_ptr<base::DictionaryValue> copied_onc( new base::DictionaryValue()); copied_onc->Set(onc::toplevel_config::kType, - new base::Value(onc::network_type::kWiFi)); + base::MakeUnique<base::Value>(onc::network_type::kWiFi)); copied_onc->Set(onc::network_config::WifiProperty(onc::wifi::kHexSSID), - new base::Value(hex_ssid)); + base::MakeUnique<base::Value>(hex_ssid)); copied_onc->Set(onc::network_config::WifiProperty(onc::wifi::kSecurity), - new base::Value(security)); + base::MakeUnique<base::Value>(security)); base::JSONWriter::Write(*copied_onc.get(), out_onc_spec); }
diff --git a/chrome/browser/chromeos/login/screens/host_pairing_screen.cc b/chrome/browser/chromeos/login/screens/host_pairing_screen.cc index 62444282..454a123 100644 --- a/chrome/browser/chromeos/login/screens/host_pairing_screen.cc +++ b/chrome/browser/chromeos/login/screens/host_pairing_screen.cc
@@ -106,6 +106,7 @@ // TODO(xdai): Maybe return to the Network Setup page? remora_controller_->RemoveObserver(this); desired_page = kPageEnrollmentError; + context_.SetString(kContextKeyEnrollmentError, enrollment_error_string_); break; } default: @@ -157,15 +158,18 @@ } void HostPairingScreen::OnAuthError(const GoogleServiceAuthError& error) { + enrollment_error_string_ = view_->GetErrorStringFromAuthError(error); OnAnyEnrollmentError(); } void HostPairingScreen::OnEnrollmentError(policy::EnrollmentStatus status) { + enrollment_error_string_ = view_->GetErrorStringFromEnrollmentError(status); OnAnyEnrollmentError(); } void HostPairingScreen::OnOtherError( EnterpriseEnrollmentHelper::OtherError error) { + enrollment_error_string_ = view_->GetErrorStringFromOtherError(error); OnAnyEnrollmentError(); }
diff --git a/chrome/browser/chromeos/login/screens/host_pairing_screen.h b/chrome/browser/chromeos/login/screens/host_pairing_screen.h index 996efcc..4e2c5e7 100644 --- a/chrome/browser/chromeos/login/screens/host_pairing_screen.h +++ b/chrome/browser/chromeos/login/screens/host_pairing_screen.h
@@ -85,6 +85,7 @@ pairing_chromeos::HostPairingController* remora_controller_ = nullptr; std::unique_ptr<EnterpriseEnrollmentHelper> enrollment_helper_; + std::string enrollment_error_string_; // Current stage of pairing process. Stage current_stage_ = pairing_chromeos::HostPairingController::STAGE_NONE;
diff --git a/chrome/browser/chromeos/login/screens/host_pairing_screen_view.cc b/chrome/browser/chromeos/login/screens/host_pairing_screen_view.cc index daed366..c9e8014 100644 --- a/chrome/browser/chromeos/login/screens/host_pairing_screen_view.cc +++ b/chrome/browser/chromeos/login/screens/host_pairing_screen_view.cc
@@ -9,12 +9,13 @@ namespace host_pairing { // Keep these constants synced with corresponding constants defined in -// oobe_screen_host_pairing.js. +// host-pairing-screen.js. const char kContextKeyPage[] = "page"; const char kContextKeyDeviceName[] = "deviceName"; const char kContextKeyConfirmationCode[] = "code"; const char kContextKeyEnrollmentDomain[] = "enrollmentDomain"; const char kContextKeyUpdateProgress[] = "updateProgress"; +const char kContextKeyEnrollmentError[] = "enrollmentError"; const char kPageWelcome[] = "welcome"; const char kPageIntializationError[] = "initialization-error";
diff --git a/chrome/browser/chromeos/login/screens/host_pairing_screen_view.h b/chrome/browser/chromeos/login/screens/host_pairing_screen_view.h index 2958bba3..99a4dec 100644 --- a/chrome/browser/chromeos/login/screens/host_pairing_screen_view.h +++ b/chrome/browser/chromeos/login/screens/host_pairing_screen_view.h
@@ -6,12 +6,19 @@ #define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_HOST_PAIRING_SCREEN_VIEW_H_ #include "base/macros.h" +#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h" #include "chrome/browser/chromeos/login/oobe_screen.h" namespace base { class DictionaryValue; } +class GoogleServiceAuthError; + +namespace policy { +class EnrollmentStatus; +} + namespace chromeos { namespace host_pairing { @@ -24,6 +31,7 @@ extern const char kContextKeyConfirmationCode[]; extern const char kContextKeyEnrollmentDomain[]; extern const char kContextKeyUpdateProgress[]; +extern const char kContextKeyEnrollmentError[]; // Pages names. extern const char kPageWelcome[]; @@ -58,6 +66,13 @@ virtual void SetDelegate(Delegate* delegate) = 0; virtual void OnContextChanged(const base::DictionaryValue& diff) = 0; + virtual std::string GetErrorStringFromAuthError( + const GoogleServiceAuthError& error) = 0; + virtual std::string GetErrorStringFromEnrollmentError( + policy::EnrollmentStatus status) = 0; + virtual std::string GetErrorStringFromOtherError( + EnterpriseEnrollmentHelper::OtherError error) = 0; + private: DISALLOW_COPY_AND_ASSIGN(HostPairingScreenView); };
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc index cb423590..33d6629f 100644 --- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc +++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
@@ -99,7 +99,7 @@ g_browser_process->GetApplicationLocale()); // Set |kKeyInitialLocales| to the list of available locales. - user_dict->Set(kKeyInitialLocales, available_locales.release()); + user_dict->Set(kKeyInitialLocales, std::move(available_locales)); // Set |kKeyInitialLocale| to the initially selected locale. user_dict->SetString(kKeyInitialLocale, selected_locale); @@ -115,8 +115,7 @@ // Set |kKeyInitialKeyboardLayout| to the current keyboard layout. This // value will be used temporarily only because the UI immediately requests a // list of keyboard layouts suitable for the currently selected locale. - user_dict->Set(kKeyInitialKeyboardLayout, - GetCurrentKeyboardLayout().release()); + user_dict->Set(kKeyInitialKeyboardLayout, GetCurrentKeyboardLayout()); } // Returns true if the PIN keyboard should be displayed for the given |user|.
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index 582e3185..7f14ffd 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -61,6 +61,7 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/component_updater/ev_whitelist_component_installer.h" #include "chrome/browser/component_updater/sth_set_component_installer.h" +#include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/google/google_brand_chromeos.h" #include "chrome/browser/lifetime/application_lifetime.h" @@ -82,6 +83,7 @@ #include "chrome/common/pref_names.h" #include "chromeos/cert_loader.h" #include "chromeos/chromeos_switches.h" +#include "chromeos/components/tether/initializer.h" #include "chromeos/cryptohome/cryptohome_parameters.h" #include "chromeos/cryptohome/cryptohome_util.h" #include "chromeos/dbus/cryptohome_client.h" @@ -1226,6 +1228,12 @@ InitializeCertificateTransparencyComponents(user); arc::ArcServiceLauncher::Get()->OnPrimaryUserProfilePrepared(profile); + + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + chromeos::switches::kEnableTether)) { + chromeos::tether::Initializer::Initialize( + ChromeCryptAuthServiceFactory::GetForBrowserContext(profile)); + } } UpdateEasyUnlockKeys(user_context_);
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc index aabc0ae..40f554f 100644 --- a/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc +++ b/chrome/browser/chromeos/login/supervised/supervised_user_creation_screen.cc
@@ -529,9 +529,10 @@ existing_users_.reset(new base::DictionaryValue()); for (base::DictionaryValue::Iterator it(*users); !it.IsAtEnd(); it.Advance()) { + const base::DictionaryValue* value = nullptr; + it.value().GetAsDictionary(&value); // Copy that would be stored in this class. - base::DictionaryValue* local_copy = - static_cast<base::DictionaryValue*>(it.value().DeepCopy()); + std::unique_ptr<base::DictionaryValue> local_copy = value->CreateDeepCopy(); // Copy that would be passed to WebUI. It has some extra values for // displaying, but does not contain sensitive data, such as master password. auto ui_copy = base::MakeUnique<base::DictionaryValue>(); @@ -584,7 +585,7 @@ ui_copy->SetBoolean(kUserNeedPassword, !has_password); ui_copy->SetString("id", it.key()); - existing_users_->Set(it.key(), local_copy); + existing_users_->Set(it.key(), std::move(local_copy)); ui_users->Append(std::move(ui_copy)); } view_->ShowExistingSupervisedUsers(ui_users.get());
diff --git a/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc index e5e4cd2..9c740c70 100644 --- a/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc +++ b/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc
@@ -544,10 +544,12 @@ return; std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue); - entry->Set(kImagePathNodeName, new base::Value(image_path_.value())); - entry->Set(kImageIndexNodeName, new base::Value(image_index_)); + entry->Set(kImagePathNodeName, + base::MakeUnique<base::Value>(image_path_.value())); + entry->Set(kImageIndexNodeName, base::MakeUnique<base::Value>(image_index_)); if (!image_url_.is_empty()) - entry->Set(kImageURLNodeName, new base::Value(image_url_.spec())); + entry->Set(kImageURLNodeName, + base::MakeUnique<base::Value>(image_url_.spec())); DictionaryPrefUpdate update(g_browser_process->local_state(), kUserImageProperties); update->SetWithoutPathExpansion(user_id(), entry.release());
diff --git a/chrome/browser/chromeos/options/network_property_ui_data_unittest.cc b/chrome/browser/chromeos/options/network_property_ui_data_unittest.cc index adb18852..0cc2d79 100644 --- a/chrome/browser/chromeos/options/network_property_ui_data_unittest.cc +++ b/chrome/browser/chromeos/options/network_property_ui_data_unittest.cc
@@ -46,16 +46,16 @@ base::Value val_a_a("a_a"); base::Value val_a_b("a_b"); - onc.Set("a", val_a.DeepCopy()); - onc.Set("b", val_b.DeepCopy()); - onc.Set("a.a", val_a_a.DeepCopy()); - onc.Set("a.b", val_a_b.DeepCopy()); + onc.Set("a", val_a.CreateDeepCopy()); + onc.Set("b", val_b.CreateDeepCopy()); + onc.Set("a.a", val_a_a.CreateDeepCopy()); + onc.Set("a.b", val_a_b.CreateDeepCopy()); base::ListValue recommended; recommended.AppendString("b"); recommended.AppendString("c"); recommended.AppendString("a.a"); - onc.Set("Recommended", recommended.DeepCopy()); - onc.Set("a.Recommended", recommended.DeepCopy()); + onc.Set("Recommended", recommended.CreateDeepCopy()); + onc.Set("a.Recommended", recommended.CreateDeepCopy()); NetworkPropertyUIData prop;
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client.cc b/chrome/browser/chromeos/policy/auto_enrollment_client.cc index 2a54a10f..43aeb0b 100644 --- a/chrome/browser/chromeos/policy/auto_enrollment_client.cc +++ b/chrome/browser/chromeos/policy/auto_enrollment_client.cc
@@ -55,10 +55,9 @@ void UpdateDict(base::DictionaryValue* dict, const char* pref_path, bool set_or_clear, - base::Value* value) { - std::unique_ptr<base::Value> scoped_value(value); + std::unique_ptr<base::Value> value) { if (set_or_clear) - dict->Set(pref_path, scoped_value.release()); + dict->Set(pref_path, std::move(value)); else dict->Remove(pref_path, NULL); } @@ -376,18 +375,20 @@ response.device_state_retrieval_response(); { DictionaryPrefUpdate dict(local_state_, prefs::kServerBackedDeviceState); - UpdateDict(dict.Get(), kDeviceStateManagementDomain, - state_response.has_management_domain(), - new base::Value(state_response.management_domain())); + UpdateDict( + dict.Get(), kDeviceStateManagementDomain, + state_response.has_management_domain(), + base::MakeUnique<base::Value>(state_response.management_domain())); std::string restore_mode = ConvertRestoreMode(state_response.restore_mode()); UpdateDict(dict.Get(), kDeviceStateRestoreMode, !restore_mode.empty(), - new base::Value(restore_mode)); + base::MakeUnique<base::Value>(restore_mode)); UpdateDict(dict.Get(), kDeviceStateDisabledMessage, state_response.has_disabled_state(), - new base::Value(state_response.disabled_state().message())); + base::MakeUnique<base::Value>( + state_response.disabled_state().message())); // Logging as "WARNING" to make sure it's preserved in the logs. LOG(WARNING) << "Restore mode: " << restore_mode;
diff --git a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos_unittest.cc b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos_unittest.cc index 3639151..60aa952 100644 --- a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos_unittest.cc +++ b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos_unittest.cc
@@ -319,7 +319,8 @@ base::Value entry1("abcdefghijklmnopabcdefghijklmnop"); auto entry1_dict = base::MakeUnique<base::DictionaryValue>(); - entry1_dict->Set(ash::launcher::kPinnedAppsPrefAppIDPath, entry1.DeepCopy()); + entry1_dict->Set(ash::launcher::kPinnedAppsPrefAppIDPath, + entry1.CreateDeepCopy()); expected_pinned_apps.Append(std::move(entry1_dict)); list.Append(entry1.CreateDeepCopy()); policy_map.Set(key::kPinnedLauncherApps, POLICY_LEVEL_MANDATORY,
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h index 6d3b351..e383c6d0 100644 --- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h +++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
@@ -116,6 +116,12 @@ // policy server. StatusUploader* GetStatusUploader() const { return status_uploader_.get(); } + // Return the SystemLogUploader used to upload device logs to the policy + // server. + SystemLogUploader* GetSystemLogUploader() const { + return syslog_uploader_.get(); + } + // Passes the pointer to the schema registry that corresponds to the signin // profile. //
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc new file mode 100644 index 0000000..909175c8d --- /dev/null +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc
@@ -0,0 +1,73 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h" + +#include <memory> +#include <utility> + +#include "base/bind.h" +#include "base/syslog_logging.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" +#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" +#include "chrome/browser/chromeos/policy/status_uploader.h" +#include "chrome/browser/chromeos/policy/system_log_uploader.h" +#include "components/policy/proto/device_management_backend.pb.h" + +namespace policy { + +namespace { + +// Determines the time, measured from the time of issue, after which the command +// queue will consider this command expired if the command has not been started. +const int kCommandExpirationTimeInMinutes = 10; + +} // namespace + +DeviceCommandFetchStatusJob::DeviceCommandFetchStatusJob() {} + +DeviceCommandFetchStatusJob::~DeviceCommandFetchStatusJob() {} + +enterprise_management::RemoteCommand_Type +DeviceCommandFetchStatusJob::GetType() const { + return enterprise_management::RemoteCommand_Type_DEVICE_FETCH_STATUS; +} + +base::TimeDelta DeviceCommandFetchStatusJob::GetCommmandTimeout() const { + return base::TimeDelta::FromMinutes(kCommandExpirationTimeInMinutes); +} + +bool DeviceCommandFetchStatusJob::IsExpired(base::TimeTicks now) { + return now > issued_time() + GetCommmandTimeout(); +} + +void DeviceCommandFetchStatusJob::RunImpl( + const CallbackWithResult& succeeded_callback, + const CallbackWithResult& failed_callback) { + SYSLOG(INFO) << "Fetching device status"; + BrowserPolicyConnectorChromeOS* connector = + g_browser_process->platform_part()->browser_policy_connector_chromeos(); + DeviceCloudPolicyManagerChromeOS* manager = + connector->GetDeviceCloudPolicyManager(); + // DeviceCloudPolicyManagerChromeOS, StatusUploader and SystemLogUploader can + // be null during shutdown (and unit tests). StatusUploader and + // SystemLogUploader objects have the same lifetime - they are created + // together and they are destroyed together (which is why this code doesn't + // do separate checks for them before using them). + if (manager && manager->GetStatusUploader() && + manager->GetSystemLogUploader()) { + manager->GetStatusUploader()->ScheduleNextStatusUploadImmediately(); + manager->GetSystemLogUploader()->ScheduleNextSystemLogUploadImmediately(); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(succeeded_callback, nullptr)); + return; + } + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(failed_callback, nullptr)); +} + +} // namespace policy
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h new file mode 100644 index 0000000..6bcea0fb --- /dev/null +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h
@@ -0,0 +1,36 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_ +#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_ + +#include <string> + +#include "base/macros.h" +#include "components/policy/core/common/remote_commands/remote_command_job.h" + +namespace policy { + +class DeviceCommandFetchStatusJob : public RemoteCommandJob { + public: + DeviceCommandFetchStatusJob(); + ~DeviceCommandFetchStatusJob() override; + + // RemoteCommandJob: + enterprise_management::RemoteCommand_Type GetType() const override; + base::TimeDelta GetCommmandTimeout() const override; + + protected: + // RemoteCommandJob: + bool IsExpired(base::TimeTicks now) override; + void RunImpl(const CallbackWithResult& succeeded_callback, + const CallbackWithResult& failed_callback) override; + + private: + DISALLOW_COPY_AND_ASSIGN(DeviceCommandFetchStatusJob); +}; + +} // namespace policy + +#endif // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc index db444aee..574f538 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc
@@ -247,7 +247,7 @@ std::string payload; base::DictionaryValue root_dict; if (result_code != DeviceCommandScreenshotJob::SUCCESS) - root_dict.Set(kResultFieldName, new base::Value(result_code)); + root_dict.Set(kResultFieldName, base::MakeUnique<base::Value>(result_code)); base::JSONWriter::Write(root_dict, &payload); return payload; }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc b/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc index 9614e80..de461e56 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc
@@ -8,6 +8,7 @@ #include "base/memory/ptr_util.h" #include "base/threading/sequenced_worker_pool.h" +#include "chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h" #include "chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h" #include "chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h" #include "chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h" @@ -42,6 +43,9 @@ case em::RemoteCommand_Type_DEVICE_SET_VOLUME: return base::WrapUnique<RemoteCommandJob>( new DeviceCommandSetVolumeJob()); + case em::RemoteCommand_Type_DEVICE_FETCH_STATUS: + return base::WrapUnique<RemoteCommandJob>( + new DeviceCommandFetchStatusJob()); default: return nullptr; }
diff --git a/chrome/browser/chromeos/policy/status_uploader.cc b/chrome/browser/chromeos/policy/status_uploader.cc index 0c42579..0b61357 100644 --- a/chrome/browser/chromeos/policy/status_uploader.cc +++ b/chrome/browser/chromeos/policy/status_uploader.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/policy/status_uploader.h" #include <algorithm> +#include <string> #include <utility> #include "base/bind.h" @@ -84,12 +85,24 @@ MediaCaptureDevicesDispatcher::GetInstance()->RemoveObserver(this); } -void StatusUploader::ScheduleNextStatusUpload() { +void StatusUploader::ScheduleNextStatusUpload(bool immediately) { + // Don't schedule a new status upload if there's a status upload in progress + // (it will be scheduled once the current one completes). + if (status_upload_in_progress_) { + SYSLOG(INFO) << "In the middle of a status upload, not scheduling the next " + << "one until this one finishes."; + return; + } + // Calculate when to fire off the next update (if it should have already // happened, this yields a TimeDelta of kMinUploadScheduleDelayMs). base::TimeDelta delay = std::max( (last_upload_ + upload_frequency_) - base::Time::NowFromSystemTime(), base::TimeDelta::FromMilliseconds(kMinUploadScheduleDelayMs)); + // If we want an immediate status upload, set delay to 0. + if (immediately) + delay = base::TimeDelta(); + upload_callback_.Reset(base::Bind(&StatusUploader::UploadStatus, base::Unretained(this))); task_runner_->PostDelayedTask(FROM_HERE, upload_callback_.callback(), delay); @@ -172,7 +185,12 @@ } } +void StatusUploader::ScheduleNextStatusUploadImmediately() { + ScheduleNextStatusUpload(true); +} + void StatusUploader::UploadStatus() { + status_upload_in_progress_ = true; // Gather status in the background. collector_->GetDeviceAndSessionStatusAsync(base::Bind( &StatusUploader::OnStatusReceived, weak_factory_.GetWeakPtr())); @@ -187,6 +205,7 @@ SYSLOG(INFO) << "Skipping status upload because no data to upload"; // Don't have any status to upload - just set our timer for next time. last_upload_ = base::Time::NowFromSystemTime(); + status_upload_in_progress_ = false; ScheduleNextStatusUpload(); return; } @@ -209,6 +228,7 @@ SYSLOG(ERROR) << "Error uploading status: " << client_->status(); } last_upload_ = base::Time::NowFromSystemTime(); + status_upload_in_progress_ = false; // If the upload was successful, tell the collector so it can clear its cache // of pending items.
diff --git a/chrome/browser/chromeos/policy/status_uploader.h b/chrome/browser/chromeos/policy/status_uploader.h index 9cbefce..af976519 100644 --- a/chrome/browser/chromeos/policy/status_uploader.h +++ b/chrome/browser/chromeos/policy/status_uploader.h
@@ -59,6 +59,8 @@ content::MediaStreamType stream_type, const content::MediaRequestState state) override; + void ScheduleNextStatusUploadImmediately(); + private: // Callback invoked periodically to upload the device status from the // DeviceStatusCollector. @@ -76,7 +78,7 @@ // Helper method that figures out when the next status upload should // be scheduled. - void ScheduleNextStatusUpload(); + void ScheduleNextStatusUpload(bool immediately = false); // Updates the upload frequency from settings and schedules a new upload // if appropriate. @@ -107,6 +109,10 @@ // True if there has been any captured media in this session. bool has_captured_media_; + // Used to prevent a race condition where two status uploads are being + // executed in parallel. + bool status_upload_in_progress_ = false; + // Note: This should remain the last member so it'll be destroyed and // invalidate the weak pointers before any other members are destroyed. base::WeakPtrFactory<StatusUploader> weak_factory_;
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc index fce6ed1..38a7df2 100644 --- a/chrome/browser/chromeos/policy/system_log_uploader.cc +++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/chromeos/policy/system_log_uploader.h" + +#include <map> #include <utility> #include "base/bind.h" @@ -22,7 +25,6 @@ #include "components/feedback/anonymizer_tool.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "net/http/http_request_headers.h" -#include "system_log_uploader.h" namespace { // The maximum number of successive retries. @@ -200,6 +202,7 @@ SYSLOG(INFO) << "Upload successful."; upload_job_.reset(); last_upload_attempt_ = base::Time::NowFromSystemTime(); + log_upload_in_progress_ = false; retry_count_ = 0; // On successful log upload schedule the next log upload after @@ -210,6 +213,7 @@ void SystemLogUploader::OnFailure(UploadJob::ErrorCode error_code) { upload_job_.reset(); last_upload_attempt_ = base::Time::NowFromSystemTime(); + log_upload_in_progress_ = false; // If we have hit the maximum number of retries, terminate this upload // attempt and schedule the next one using the normal delay. Otherwise, retry @@ -235,6 +239,10 @@ return anonymizer->Anonymize(data); } +void SystemLogUploader::ScheduleNextSystemLogUploadImmediately() { + ScheduleNextSystemLogUpload(base::TimeDelta()); +} + void SystemLogUploader::RefreshUploadSettings() { // Attempt to fetch the current value of the reporting settings. // If trusted values are not available, register this function to be called @@ -289,10 +297,12 @@ if (upload_enabled_) { SYSLOG(INFO) << "Starting system log upload."; + log_upload_in_progress_ = true; syslog_delegate_->LoadSystemLogs(base::Bind( &SystemLogUploader::UploadSystemLogs, weak_factory_.GetWeakPtr())); } else { // If upload is disabled, schedule the next attempt after 12h. + SYSLOG(INFO) << "System log upload is disabled, rescheduling."; retry_count_ = 0; last_upload_attempt_ = base::Time::NowFromSystemTime(); ScheduleNextSystemLogUpload(upload_frequency_); @@ -300,12 +310,21 @@ } void SystemLogUploader::ScheduleNextSystemLogUpload(base::TimeDelta frequency) { + // Don't schedule a new system log upload if there's a log upload in progress + // (it will be scheduled once the current one completes). + if (log_upload_in_progress_) { + SYSLOG(INFO) << "In the middle of a system log upload, not scheduling the " + << "next one until this one finishes."; + return; + } + // Calculate when to fire off the next update. base::TimeDelta delay = std::max( (last_upload_attempt_ + frequency) - base::Time::NowFromSystemTime(), base::TimeDelta()); SYSLOG(INFO) << "Scheduling next system log upload " << delay << " from now."; - // Ensure that we never have more than one pending delayed task. + // Ensure that we never have more than one pending delayed task + // (InvalidateWeakPtrs() will cancel any pending log uploads). weak_factory_.InvalidateWeakPtrs(); task_runner_->PostDelayedTask(FROM_HERE, base::Bind(&SystemLogUploader::StartLogUpload,
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.h b/chrome/browser/chromeos/policy/system_log_uploader.h index 8d6b032..bd20f14 100644 --- a/chrome/browser/chromeos/policy/system_log_uploader.h +++ b/chrome/browser/chromeos/policy/system_log_uploader.h
@@ -8,6 +8,9 @@ #include <stdint.h> #include <memory> +#include <string> +#include <utility> +#include <vector> #include "base/macros.h" #include "base/memory/ref_counted.h" @@ -89,6 +92,8 @@ feedback::AnonymizerTool* const anonymizer, const std::string& data); + void ScheduleNextSystemLogUploadImmediately(); + private: // Updates the system log upload enabled field from settings. void RefreshUploadSettings(); @@ -133,6 +138,10 @@ base::ThreadChecker thread_checker_; + // Used to prevent a race condition where two log uploads are being executed + // in parallel. + bool log_upload_in_progress_ = false; + // Note: This should remain the last member so it'll be destroyed and // invalidate the weak pointers before any other members are destroyed. base::WeakPtrFactory<SystemLogUploader> weak_factory_;
diff --git a/chrome/browser/chromeos/profiles/profile_list_chromeos.cc b/chrome/browser/chromeos/profiles/profile_list_chromeos.cc index 1a7d6be..35b46bf 100644 --- a/chrome/browser/chromeos/profiles/profile_list_chromeos.cc +++ b/chrome/browser/chromeos/profiles/profile_list_chromeos.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/chrome_switches.h" -#include "components/signin/core/common/profile_management_switches.h" #include "components/user_manager/user_manager.h" // static @@ -69,11 +68,6 @@ user_manager::User* user = users[user_index_it->second]; gfx::Image icon = gfx::Image(user->GetImage()); - if (!switches::IsNewProfileManagement() && !icon.IsEmpty()) { - // old avatar menu uses resized-small images - icon = profiles::GetAvatarIconForMenu(icon, true); - } - std::unique_ptr<AvatarMenu::Item> item( new AvatarMenu::Item(items_.size(), entry->GetPath(), icon)); item->name = user->GetDisplayName();
diff --git a/chrome/browser/chromeos/proxy_cros_settings_parser.cc b/chrome/browser/chromeos/proxy_cros_settings_parser.cc index 72dd496..be6d08fe 100644 --- a/chrome/browser/chromeos/proxy_cros_settings_parser.cc +++ b/chrome/browser/chromeos/proxy_cros_settings_parser.cc
@@ -7,6 +7,7 @@ #include <stdint.h> #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "base/strings/string_util.h" #include "base/values.h" #include "chromeos/network/proxy/ui_proxy_config.h" @@ -16,16 +17,18 @@ namespace { -base::Value* CreateServerHostValue(const UIProxyConfig::ManualProxy& proxy) { - return proxy.server.is_valid() - ? new base::Value(proxy.server.host_port_pair().host()) - : NULL; +std::unique_ptr<base::Value> CreateServerHostValue( + const UIProxyConfig::ManualProxy& proxy) { + return proxy.server.is_valid() ? base::MakeUnique<base::Value>( + proxy.server.host_port_pair().host()) + : nullptr; } -base::Value* CreateServerPortValue(const UIProxyConfig::ManualProxy& proxy) { - return proxy.server.is_valid() - ? new base::Value(proxy.server.host_port_pair().port()) - : NULL; +std::unique_ptr<base::Value> CreateServerPortValue( + const UIProxyConfig::ManualProxy& proxy) { + return proxy.server.is_valid() ? base::MakeUnique<base::Value>( + proxy.server.host_port_pair().port()) + : nullptr; } net::ProxyServer CreateProxyServer(std::string host, @@ -279,12 +282,14 @@ config_service->SetProxyConfig(network_guid, config); } +// TODO(crbug.com/697817): Change |out_value| to be +// std::unique_ptr<base::Value>*. bool GetProxyPrefValue(const std::string& network_guid, const std::string& path, UIProxyConfigService* config_service, base::Value** out_value) { std::string controlled_by; - base::Value* data = NULL; + std::unique_ptr<base::Value> data; UIProxyConfig config; config_service->GetProxyConfig(network_guid, &config); @@ -292,7 +297,8 @@ // Only show pacurl for pac-script mode. if (config.mode == UIProxyConfig::MODE_PAC_SCRIPT && config.automatic_proxy.pac_url.is_valid()) { - data = new base::Value(config.automatic_proxy.pac_url.spec()); + data = + base::MakeUnique<base::Value>(config.automatic_proxy.pac_url.spec()); } } else if (path == kProxySingleHttp) { data = CreateServerHostValue(config.single_proxy); @@ -305,12 +311,12 @@ } else if (path == kProxyType) { if (config.mode == UIProxyConfig::MODE_AUTO_DETECT || config.mode == UIProxyConfig::MODE_PAC_SCRIPT) { - data = new base::Value(3); + data = base::MakeUnique<base::Value>(3); } else if (config.mode == UIProxyConfig::MODE_SINGLE_PROXY || config.mode == UIProxyConfig::MODE_PROXY_PER_SCHEME) { - data = new base::Value(2); + data = base::MakeUnique<base::Value>(2); } else { - data = new base::Value(1); + data = base::MakeUnique<base::Value>(1); } switch (config.state) { case ProxyPrefs::CONFIG_POLICY: @@ -328,9 +334,11 @@ break; } } else if (path == kProxySingle) { - data = new base::Value(config.mode == UIProxyConfig::MODE_SINGLE_PROXY); + data = base::MakeUnique<base::Value>(config.mode == + UIProxyConfig::MODE_SINGLE_PROXY); } else if (path == kProxyUsePacUrl) { - data = new base::Value(config.mode == UIProxyConfig::MODE_PAC_SCRIPT); + data = base::MakeUnique<base::Value>(config.mode == + UIProxyConfig::MODE_PAC_SCRIPT); } else if (path == kProxyFtpUrl) { data = CreateServerHostValue(config.ftp_proxy); } else if (path == kProxySocks) { @@ -344,11 +352,11 @@ } else if (path == kProxySocksPort) { data = CreateServerPortValue(config.socks_proxy); } else if (path == kProxyIgnoreList) { - base::ListValue* list = new base::ListValue(); + auto list = base::MakeUnique<base::ListValue>(); const auto& bypass_rules = config.bypass_rules.rules(); for (const auto& rule : bypass_rules) list->AppendString(rule->ToString()); - data = list; + data = std::move(list); } else { *out_value = NULL; return false; @@ -357,8 +365,8 @@ // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does. base::DictionaryValue* dict = new base::DictionaryValue; if (!data) - data = new base::Value(""); - dict->Set("value", data); + data = base::MakeUnique<base::Value>(base::Value::Type::STRING); + dict->Set("value", std::move(data)); if (path == kProxyType) { if (!controlled_by.empty()) dict->SetString("controlledBy", controlled_by);
diff --git a/chrome/browser/chromeos/system/timezone_util.cc b/chrome/browser/chromeos/system/timezone_util.cc index 6c41a05..d01f60e 100644 --- a/chrome/browser/chromeos/system/timezone_util.cc +++ b/chrome/browser/chromeos/system/timezone_util.cc
@@ -11,6 +11,7 @@ #include <utility> #include "base/i18n/rtl.h" +#include "base/i18n/unicodestring.h" #include "base/lazy_instance.h" #include "base/memory/ptr_util.h" #include "base/strings/string_util.h" @@ -77,7 +78,7 @@ if (!U_FAILURE(status)) { city = icu::ures_getUnicodeStringByKey(zone_item.get(), "ec", &status); if (U_SUCCESS(status)) - return base::string16(city.getBuffer(), city.length()); + return base::i18n::UnicodeStringToString16(city); } // Fallback case in case of failure. @@ -135,8 +136,7 @@ } base::string16 result(l10n_util::GetStringFUTF16( IDS_OPTIONS_SETTINGS_TIMEZONE_DISPLAY_TEMPLATE, - base::ASCIIToUTF16(offset_str), - base::string16(name.getBuffer(), name.length()), + base::ASCIIToUTF16(offset_str), base::i18n::UnicodeStringToString16(name), GetExemplarCity(timezone))); base::i18n::AdjustStringForLocaleDirection(&result); return result;
diff --git a/chrome/browser/cryptauth/chrome_cryptauth_service.cc b/chrome/browser/cryptauth/chrome_cryptauth_service.cc index 2af6938..3b26c9c 100644 --- a/chrome/browser/cryptauth/chrome_cryptauth_service.cc +++ b/chrome/browser/cryptauth/chrome_cryptauth_service.cc
@@ -29,6 +29,7 @@ #include "components/cryptauth/secure_message_delegate.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/prefs/pref_service.h" +#include "components/proximity_auth/logging/logging.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager.h" #include "components/translate/core/browser/translate_download_manager.h" @@ -48,8 +49,6 @@ return g_browser_process ? g_browser_process->local_state() : nullptr; } -// TODO(khorimoto): Refactor this and combine it with EasyUnlockService's -// static function. std::string GetDeviceId() { PrefService* local_state = GetLocalState(); if (!local_state) @@ -63,7 +62,7 @@ return device_id; } -cryptauth::DeviceClassifier GetDeviceClassifierInternal() { +cryptauth::DeviceClassifier GetDeviceClassifierImpl() { cryptauth::DeviceClassifier device_classifier; #if defined(OS_CHROMEOS) @@ -133,7 +132,7 @@ return device_info; } -std::string GetAccountId(Profile* profile) { +std::string GetAccountIdImpl(Profile* profile) { #if defined(OS_CHROMEOS) SigninManagerBase* manager = SigninManagerFactory::GetForProfile(profile); #else @@ -142,16 +141,16 @@ return manager ? manager->GetAuthenticatedAccountId() : std::string(); } -std::unique_ptr<cryptauth::CryptAuthClientFactory> CreateCryptAuthClientFactory( - Profile* profile) { +std::unique_ptr<cryptauth::CryptAuthClientFactory> +CreateCryptAuthClientFactoryImpl(Profile* profile) { return base::MakeUnique<cryptauth::CryptAuthClientFactoryImpl>( ProfileOAuth2TokenServiceFactory::GetForProfile(profile), - GetAccountId(profile), profile->GetRequestContext(), - GetDeviceClassifierInternal()); + GetAccountIdImpl(profile), profile->GetRequestContext(), + GetDeviceClassifierImpl()); } std::unique_ptr<cryptauth::SecureMessageDelegate> -CreateSecureMessageDelegate() { +CreateSecureMessageDelegateImpl() { #if defined(OS_CHROMEOS) return base::MakeUnique<chromeos::SecureMessageDelegateChromeOS>(); #else @@ -159,9 +158,6 @@ #endif } -// TODO(khorimoto): When integrating ChromeCryptAuthService into EasyUnlock -// code, delete this class and refactor -// proximity_auth::CryptAuthEnrollerFactory. class CryptAuthEnrollerFactoryImpl : public cryptauth::CryptAuthEnrollerFactory { public: @@ -169,7 +165,8 @@ std::unique_ptr<cryptauth::CryptAuthEnroller> CreateInstance() override { return base::MakeUnique<cryptauth::CryptAuthEnrollerImpl>( - CreateCryptAuthClientFactory(profile_), CreateSecureMessageDelegate()); + CreateCryptAuthClientFactoryImpl(profile_), + CreateSecureMessageDelegateImpl()); } private: @@ -189,33 +186,60 @@ std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager = base::MakeUnique<cryptauth::CryptAuthDeviceManager>( base::MakeUnique<base::DefaultClock>(), - CreateCryptAuthClientFactory(profile), gcm_manager.get(), + CreateCryptAuthClientFactoryImpl(profile), gcm_manager.get(), profile->GetPrefs()); std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager = base::MakeUnique<cryptauth::CryptAuthEnrollmentManager>( base::MakeUnique<base::DefaultClock>(), base::MakeUnique<CryptAuthEnrollerFactoryImpl>(profile), - CreateSecureMessageDelegate(), GetGcmDeviceInfo(), gcm_manager.get(), - profile->GetPrefs()); + CreateSecureMessageDelegateImpl(), GetGcmDeviceInfo(), + gcm_manager.get(), profile->GetPrefs()); + + // Note: ChromeCryptAuthServiceFactory DependsOn(OAuth2TokenServiceFactory), + // so |token_service| is guaranteed to outlast this service. + ProfileOAuth2TokenService* token_service = + ProfileOAuth2TokenServiceFactory::GetForProfile(profile); return base::WrapUnique(new ChromeCryptAuthService( std::move(gcm_manager), std::move(device_manager), - std::move(enrollment_manager))); + std::move(enrollment_manager), profile, token_service)); } ChromeCryptAuthService::ChromeCryptAuthService( std::unique_ptr<cryptauth::CryptAuthGCMManager> gcm_manager, std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager, - std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager) + std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager, + Profile* profile, + OAuth2TokenService* token_service) : KeyedService(), cryptauth::CryptAuthService(), gcm_manager_(std::move(gcm_manager)), enrollment_manager_(std::move(enrollment_manager)), - device_manager_(std::move(device_manager)) {} + device_manager_(std::move(device_manager)), + profile_(profile), + token_service_(token_service) { + gcm_manager_->StartListening(); + + if (!token_service_->RefreshTokenIsAvailable(GetAccountId())) { + PA_LOG(INFO) << "Refresh token not yet available; " + << "waiting before starting CryptAuth managers."; + token_service_->AddObserver(this); + } else { + enrollment_manager_->Start(); + device_manager_->Start(); + } +} ChromeCryptAuthService::~ChromeCryptAuthService() {} +void ChromeCryptAuthService::Shutdown() { + token_service_->RemoveObserver(this); + enrollment_manager_.reset(); + device_manager_.reset(); + gcm_manager_.reset(); +} + cryptauth::CryptAuthDeviceManager* ChromeCryptAuthService::GetCryptAuthDeviceManager() { return device_manager_.get(); @@ -227,5 +251,28 @@ } cryptauth::DeviceClassifier ChromeCryptAuthService::GetDeviceClassifier() { - return GetDeviceClassifierInternal(); + return GetDeviceClassifierImpl(); +} + +std::string ChromeCryptAuthService::GetAccountId() { + return GetAccountIdImpl(profile_); +} + +std::unique_ptr<cryptauth::SecureMessageDelegate> +ChromeCryptAuthService::CreateSecureMessageDelegate() { + return CreateSecureMessageDelegateImpl(); +} + +std::unique_ptr<cryptauth::CryptAuthClientFactory> +ChromeCryptAuthService::CreateCryptAuthClientFactory() { + return CreateCryptAuthClientFactoryImpl(profile_); +} + +void ChromeCryptAuthService::OnRefreshTokenAvailable( + const std::string& account_id) { + if (account_id == GetAccountId()) { + token_service_->RemoveObserver(this); + enrollment_manager_->Start(); + device_manager_->Start(); + } }
diff --git a/chrome/browser/cryptauth/chrome_cryptauth_service.h b/chrome/browser/cryptauth/chrome_cryptauth_service.h index 7c6fd485..21f8f700 100644 --- a/chrome/browser/cryptauth/chrome_cryptauth_service.h +++ b/chrome/browser/cryptauth/chrome_cryptauth_service.h
@@ -11,6 +11,7 @@ #include "components/cryptauth/cryptauth_service.h" #include "components/cryptauth/proto/cryptauth_api.pb.h" #include "components/keyed_service/core/keyed_service.h" +#include "google_apis/gaia/oauth2_token_service.h" class Profile; @@ -20,28 +21,45 @@ // Implementation of cryptauth::CryptAuthService. class ChromeCryptAuthService : public KeyedService, - public cryptauth::CryptAuthService { + public cryptauth::CryptAuthService, + public OAuth2TokenService::Observer { public: static std::unique_ptr<ChromeCryptAuthService> Create(Profile* profile); ~ChromeCryptAuthService() override; + // KeyedService: + void Shutdown() override; + // cryptauth::CryptAuthService: cryptauth::CryptAuthDeviceManager* GetCryptAuthDeviceManager() override; cryptauth::CryptAuthEnrollmentManager* GetCryptAuthEnrollmentManager() override; cryptauth::DeviceClassifier GetDeviceClassifier() override; + std::string GetAccountId() override; + std::unique_ptr<cryptauth::SecureMessageDelegate> + CreateSecureMessageDelegate() override; + std::unique_ptr<cryptauth::CryptAuthClientFactory> + CreateCryptAuthClientFactory() override; protected: + // Note: ChromeCryptAuthServiceFactory DependsOn(OAuth2TokenServiceFactory), + // so |token_service| is guaranteed to outlast this service. ChromeCryptAuthService( std::unique_ptr<cryptauth::CryptAuthGCMManager> gcm_manager, std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager, - std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> - enrollment_manager); + std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager, + Profile* profile, + OAuth2TokenService* token_service); private: + // OAuth2TokenService::Observer: + void OnRefreshTokenAvailable(const std::string& account_id) override; + std::unique_ptr<cryptauth::CryptAuthGCMManager> gcm_manager_; std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> enrollment_manager_; std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager_; + Profile* profile_; + OAuth2TokenService* token_service_; DISALLOW_COPY_AND_ASSIGN(ChromeCryptAuthService); };
diff --git a/chrome/browser/cryptauth/chrome_cryptauth_service_factory.cc b/chrome/browser/cryptauth/chrome_cryptauth_service_factory.cc index 2471226..b7b1fbe 100644 --- a/chrome/browser/cryptauth/chrome_cryptauth_service_factory.cc +++ b/chrome/browser/cryptauth/chrome_cryptauth_service_factory.cc
@@ -5,29 +5,37 @@ #include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/cryptauth/chrome_cryptauth_service.h" +#include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" +#include "chrome/browser/signin/signin_manager_factory.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" // static -cryptauth::CryptAuthService* CryptAuthServiceFactory::GetForBrowserContext( +cryptauth::CryptAuthService* +ChromeCryptAuthServiceFactory::GetForBrowserContext( content::BrowserContext* context) { return static_cast<ChromeCryptAuthService*>( GetInstance()->GetServiceForBrowserContext(context, true)); } // static -CryptAuthServiceFactory* CryptAuthServiceFactory::GetInstance() { - return base::Singleton<CryptAuthServiceFactory>::get(); +ChromeCryptAuthServiceFactory* ChromeCryptAuthServiceFactory::GetInstance() { + return base::Singleton<ChromeCryptAuthServiceFactory>::get(); } -CryptAuthServiceFactory::CryptAuthServiceFactory() +ChromeCryptAuthServiceFactory::ChromeCryptAuthServiceFactory() : BrowserContextKeyedServiceFactory( "CryptAuthService", - BrowserContextDependencyManager::GetInstance()) {} + BrowserContextDependencyManager::GetInstance()) { + DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); + DependsOn(SigninManagerFactory::GetInstance()); + DependsOn(gcm::GCMProfileServiceFactory::GetInstance()); +} -CryptAuthServiceFactory::~CryptAuthServiceFactory() {} +ChromeCryptAuthServiceFactory::~ChromeCryptAuthServiceFactory() {} -KeyedService* CryptAuthServiceFactory::BuildServiceInstanceFor( +KeyedService* ChromeCryptAuthServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); return ChromeCryptAuthService::Create(profile).release();
diff --git a/chrome/browser/cryptauth/chrome_cryptauth_service_factory.h b/chrome/browser/cryptauth/chrome_cryptauth_service_factory.h index d71319c..0218e6b 100644 --- a/chrome/browser/cryptauth/chrome_cryptauth_service_factory.h +++ b/chrome/browser/cryptauth/chrome_cryptauth_service_factory.h
@@ -11,24 +11,24 @@ #include "components/keyed_service/content/browser_context_keyed_service_factory.h" // Factory which is used to access the CryptAuthService singleton. -class CryptAuthServiceFactory : public BrowserContextKeyedServiceFactory { +class ChromeCryptAuthServiceFactory : public BrowserContextKeyedServiceFactory { public: static cryptauth::CryptAuthService* GetForBrowserContext( content::BrowserContext* context); - static CryptAuthServiceFactory* GetInstance(); + static ChromeCryptAuthServiceFactory* GetInstance(); private: - friend struct base::DefaultSingletonTraits<CryptAuthServiceFactory>; + friend struct base::DefaultSingletonTraits<ChromeCryptAuthServiceFactory>; - CryptAuthServiceFactory(); - ~CryptAuthServiceFactory() override; + ChromeCryptAuthServiceFactory(); + ~ChromeCryptAuthServiceFactory() override; // BrowserContextKeyedServiceFactory KeyedService* BuildServiceInstanceFor( content::BrowserContext* context) const override; - DISALLOW_COPY_AND_ASSIGN(CryptAuthServiceFactory); + DISALLOW_COPY_AND_ASSIGN(ChromeCryptAuthServiceFactory); }; #endif // CHROME_BROWSER_CRYPTAUTH_CHROME_CRYPTAUTH_SERVICE_FACTORY_H_
diff --git a/chrome/browser/doodle/doodle_service_factory.cc b/chrome/browser/doodle/doodle_service_factory.cc index f3ca182..8551423 100644 --- a/chrome/browser/doodle/doodle_service_factory.cc +++ b/chrome/browser/doodle/doodle_service_factory.cc
@@ -20,6 +20,10 @@ #include "components/prefs/pref_service.h" #include "components/safe_json/safe_json_parser.h" +#if defined(OS_ANDROID) +#include "chrome/browser/android/chrome_feature_list.h" +#endif + // static DoodleServiceFactory* DoodleServiceFactory::GetInstance() { return base::Singleton<DoodleServiceFactory>::get(); @@ -46,10 +50,15 @@ // We don't show doodles in incognito profiles (for now?). DCHECK(!profile->IsOffTheRecord()); + bool use_gray_background = false; +#if defined(OS_ANDROID) + use_gray_background = + !base::FeatureList::IsEnabled(chrome::android::kChromeHomeFeature); +#endif auto fetcher = base::MakeUnique<doodle::DoodleFetcherImpl>( profile->GetRequestContext(), GoogleURLTrackerFactory::GetForProfile(profile), - base::Bind(&safe_json::SafeJsonParser::Parse)); + base::Bind(&safe_json::SafeJsonParser::Parse), use_gray_background); return new doodle::DoodleService(profile->GetPrefs(), std::move(fetcher), base::MakeUnique<base::OneShotTimer>(), base::MakeUnique<base::DefaultClock>(),
diff --git a/chrome/browser/download/download_target_determiner_unittest.cc b/chrome/browser/download/download_target_determiner_unittest.cc index 72e18273..6755620 100644 --- a/chrome/browser/download/download_target_determiner_unittest.cc +++ b/chrome/browser/download/download_target_determiner_unittest.cc
@@ -365,8 +365,9 @@ void DownloadTargetDeterminerTest::SetManagedDownloadPath( const base::FilePath& path) { profile()->GetTestingPrefService()-> + // TODO(crbug.com/697817): Convert SetManagedPrefs to take a unique_ptr. SetManagedPref(prefs::kDownloadDefaultDirectory, - base::CreateFilePathValue(path)); + base::CreateFilePathValue(path).release()); } void DownloadTargetDeterminerTest::SetPromptForDownload(bool prompt) {
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 0ffd8e3..9193a50 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -175,18 +175,10 @@ "api/developer_private/inspectable_views_finder.h", "api/developer_private/show_permissions_dialog_helper.cc", "api/developer_private/show_permissions_dialog_helper.h", - "api/dial/device_description_fetcher.cc", - "api/dial/device_description_fetcher.h ", "api/dial/dial_api.cc", "api/dial/dial_api.h", "api/dial/dial_api_factory.cc", "api/dial/dial_api_factory.h", - "api/dial/dial_device_data.cc", - "api/dial/dial_device_data.h", - "api/dial/dial_registry.cc", - "api/dial/dial_registry.h", - "api/dial/dial_service.cc", - "api/dial/dial_service.h", "api/downloads/downloads_api.cc", "api/downloads/downloads_api.h", "api/downloads_internal/downloads_internal_api.cc", @@ -318,8 +310,6 @@ "api/networking_private/networking_private_ui_delegate_chromeos.h", "api/networking_private/networking_private_ui_delegate_factory_impl.cc", "api/networking_private/networking_private_ui_delegate_factory_impl.h", - "api/networking_private/networking_private_verify_delegate_factory_impl.cc", - "api/networking_private/networking_private_verify_delegate_factory_impl.h", "api/notifications/notifications_api.cc", "api/notifications/notifications_api.h", "api/omnibox/omnibox_api.cc", @@ -831,6 +821,7 @@ "//chrome/app/theme:theme_resources", "//chrome/app/vector_icons", "//chrome/browser/devtools", + "//chrome/browser/media/router/discovery", "//chrome/common", "//chrome/common/extensions/api:api_registration", "//chrome/common/extensions/api:extensions_features", @@ -973,8 +964,6 @@ "api/networking_cast_private/chrome_networking_cast_private_delegate.h", "api/networking_cast_private/networking_cast_private_api.cc", "api/networking_cast_private/networking_cast_private_api.h", - "api/networking_private/crypto_verify_impl.cc", - "api/networking_private/crypto_verify_impl.h", "api/platform_keys/platform_keys_api.cc", "api/platform_keys/platform_keys_api.h", "api/platform_keys/verify_trust_api.cc", @@ -1082,8 +1071,6 @@ "api/networking_cast_private/chrome_networking_cast_private_delegate.h", "api/networking_cast_private/networking_cast_private_api.cc", "api/networking_cast_private/networking_cast_private_api.h", - "api/networking_private/crypto_verify_impl.cc", - "api/networking_private/crypto_verify_impl.h", "api/networking_private/networking_private_credentials_getter.h", "api/networking_private/networking_private_credentials_getter_mac.cc", "api/networking_private/networking_private_credentials_getter_win.cc",
diff --git a/chrome/browser/extensions/api/dial/dial_api.cc b/chrome/browser/extensions/api/dial/dial_api.cc index e97f90fa..415ae15 100644 --- a/chrome/browser/extensions/api/dial/dial_api.cc +++ b/chrome/browser/extensions/api/dial/dial_api.cc
@@ -11,8 +11,8 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/time/time.h" -#include "chrome/browser/extensions/api/dial/device_description_fetcher.h" #include "chrome/browser/extensions/api/dial/dial_api_factory.h" +#include "chrome/browser/media/router/discovery/dial/device_description_fetcher.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/dial.h" #include "content/public/browser/browser_thread.h" @@ -22,10 +22,10 @@ using base::TimeDelta; using content::BrowserThread; -using extensions::api::dial::DeviceDescriptionFetcher; -using extensions::api::dial::DialDeviceData; -using extensions::api::dial::DialDeviceDescriptionData; -using extensions::api::dial::DialRegistry; +using media_router::DeviceDescriptionFetcher; +using media_router::DialDeviceData; +using media_router::DialDeviceDescriptionData; +using media_router::DialRegistry; namespace extensions { @@ -92,6 +92,17 @@ dial_registry()->OnListenerRemoved(); } +void DialAPI::FillDialDevice(const media_router::DialDeviceData& device_data, + api::dial::DialDevice* device) const { + DCHECK(!device_data.device_id().empty()); + DCHECK(media_router::DialDeviceData::IsDeviceDescriptionUrl( + device_data.device_description_url())); + device->device_label = device_data.label(); + device->device_description_url = device_data.device_description_url().spec(); + if (device_data.has_config_id()) + device->config_id.reset(new int(device_data.config_id())); +} + void DialAPI::OnDialDeviceEvent(const DialRegistry::DeviceList& devices) { DCHECK_CURRENTLY_ON(BrowserThread::IO); BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, @@ -110,7 +121,7 @@ std::vector<api::dial::DialDevice> args; for (const DialDeviceData& device : devices) { api::dial::DialDevice api_device; - device.FillDialDevice(&api_device); + FillDialDevice(device, &api_device); args.push_back(std::move(api_device)); } std::unique_ptr<base::ListValue> results = @@ -157,8 +168,8 @@ void DialAPI::ShutdownOnUIThread() {} void DialAPI::SetDeviceForTest( - const api::dial::DialDeviceData& device_data, - const api::dial::DialDeviceDescriptionData& device_description) { + const media_router::DialDeviceData& device_data, + const media_router::DialDeviceDescriptionData& device_description) { test_device_data_ = base::MakeUnique<DialDeviceData>(device_data); test_device_description_ = base::MakeUnique<DialDeviceDescriptionData>(device_description); @@ -240,7 +251,7 @@ } void DialFetchDeviceDescriptionFunction::OnFetchComplete( - const api::dial::DialDeviceDescriptionData& result) { + const media_router::DialDeviceDescriptionData& result) { // Destroy the DeviceDescriptionFetcher since it still contains a reference // to |this| in its un-invoked callback. device_description_fetcher_.reset();
diff --git a/chrome/browser/extensions/api/dial/dial_api.h b/chrome/browser/extensions/api/dial/dial_api.h index 1aba1c7..7ee0d14e 100644 --- a/chrome/browser/extensions/api/dial/dial_api.h +++ b/chrome/browser/extensions/api/dial/dial_api.h
@@ -8,20 +8,18 @@ #include <memory> #include "base/macros.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" -#include "chrome/browser/extensions/api/dial/dial_registry.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_registry.h" #include "chrome/common/extensions/api/dial.h" #include "components/keyed_service/core/refcounted_keyed_service.h" #include "extensions/browser/api/async_api_function.h" #include "extensions/browser/event_router.h" -namespace extensions { - -namespace api { -namespace dial { +namespace media_router { class DeviceDescriptionFetcher; -} // namespace dial -} // namespace api +} // namespace media_router + +namespace extensions { class DialFetchDeviceDescriptionFunction; @@ -46,23 +44,25 @@ // real DialRegsitry. class DialAPI : public RefcountedKeyedService, public EventRouter::Observer, - public api::dial::DialRegistry::Observer { + public media_router::DialRegistry::Observer { public: explicit DialAPI(Profile* profile); // The DialRegistry for the API. This must always be used only from the IO // thread. - api::dial::DialRegistry* dial_registry(); + media_router::DialRegistry* dial_registry(); // Called by the DialRegistry on the IO thread so that the DialAPI dispatches // the event to listeners on the UI thread. - void SendEventOnUIThread(const api::dial::DialRegistry::DeviceList& devices); - void SendErrorOnUIThread(const api::dial::DialRegistry::DialErrorCode type); + void SendEventOnUIThread( + const media_router::DialRegistry::DeviceList& devices); + void SendErrorOnUIThread( + const media_router::DialRegistry::DialErrorCode type); // Sets test device data. void SetDeviceForTest( - const api::dial::DialDeviceData& device_data, - const api::dial::DialDeviceDescriptionData& device_description); + const media_router::DialDeviceData& device_data, + const media_router::DialDeviceDescriptionData& device_description); private: ~DialAPI() override; @@ -78,22 +78,26 @@ // DialRegistry::Observer: void OnDialDeviceEvent( - const api::dial::DialRegistry::DeviceList& devices) override; - void OnDialError(api::dial::DialRegistry::DialErrorCode type) override; + const media_router::DialRegistry::DeviceList& devices) override; + void OnDialError(media_router::DialRegistry::DialErrorCode type) override; // Methods to notify the DialRegistry on the correct thread of new/removed // listeners. void NotifyListenerAddedOnIOThread(); void NotifyListenerRemovedOnIOThread(); + // Fills the |device| API struct from |device_data|. + void FillDialDevice(const media_router::DialDeviceData& device_data, + api::dial::DialDevice* device) const; + Profile* profile_; // Created lazily on first access on the IO thread. - std::unique_ptr<api::dial::DialRegistry> dial_registry_; + std::unique_ptr<media_router::DialRegistry> dial_registry_; // Device data for testing. - std::unique_ptr<api::dial::DialDeviceData> test_device_data_; - std::unique_ptr<api::dial::DialDeviceDescriptionData> + std::unique_ptr<media_router::DialDeviceData> test_device_data_; + std::unique_ptr<media_router::DialDeviceDescriptionData> test_device_description_; DISALLOW_COPY_AND_ASSIGN(DialAPI); @@ -145,11 +149,11 @@ void GetDeviceDescriptionUrlOnIOThread(const std::string& label); void MaybeStartFetch(const GURL& url); - void OnFetchComplete(const api::dial::DialDeviceDescriptionData& result); + void OnFetchComplete(const media_router::DialDeviceDescriptionData& result); void OnFetchError(const std::string& result); std::unique_ptr<api::dial::FetchDeviceDescription::Params> params_; - std::unique_ptr<api::dial::DeviceDescriptionFetcher> + std::unique_ptr<media_router::DeviceDescriptionFetcher> device_description_fetcher_; DialAPI* dial_;
diff --git a/chrome/browser/extensions/api/dial/dial_apitest.cc b/chrome/browser/extensions/api/dial/dial_apitest.cc index c3698c5..67049da 100644 --- a/chrome/browser/extensions/api/dial/dial_apitest.cc +++ b/chrome/browser/extensions/api/dial/dial_apitest.cc
@@ -6,9 +6,9 @@ #include "build/build_config.h" #include "chrome/browser/extensions/api/dial/dial_api.h" #include "chrome/browser/extensions/api/dial/dial_api_factory.h" -#include "chrome/browser/extensions/api/dial/dial_registry.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/media/router/discovery/dial/dial_registry.h" #include "extensions/common/switches.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" @@ -17,9 +17,9 @@ using extensions::Extension; using extensions::ResultCatcher; -using extensions::api::dial::DialDeviceData; -using extensions::api::dial::DialDeviceDescriptionData; -using extensions::api::dial::DialRegistry; +using media_router::DialDeviceData; +using media_router::DialDeviceDescriptionData; +using media_router::DialRegistry; namespace {
diff --git a/chrome/browser/extensions/api/file_system/file_system_api.cc b/chrome/browser/extensions/api/file_system/file_system_api.cc index ca8fe51..4e66778 100644 --- a/chrome/browser/extensions/api/file_system/file_system_api.cc +++ b/chrome/browser/extensions/api/file_system/file_system_api.cc
@@ -294,7 +294,7 @@ const std::string& extension_id, const base::FilePath& path) { prefs->UpdateExtensionPref(extension_id, kLastChooseEntryDirectory, - base::WrapUnique(base::CreateFilePathValue(path))); + base::CreateFilePathValue(path)); } #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc index f6fb067..cd8eb80 100644 --- a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc +++ b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc
@@ -4,17 +4,169 @@ #include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h" +#include <stdint.h> + +#include "base/base64.h" +#include "base/bind.h" +#include "base/bind_helpers.h" #include "base/callback.h" -#include "chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h" -#include "extensions/common/api/networking_private.h" +#include "base/memory/ptr_util.h" +#include "base/sequenced_task_runner.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/task_scheduler/post_task.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" +#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" +#include "content/public/browser/browser_thread.h" namespace extensions { namespace { +const char kErrorEncryptionError[] = "Error.EncryptionError"; + ChromeNetworkingCastPrivateDelegate::FactoryCallback* g_factory_callback = nullptr; +enum class VerificationResult { SUCCESS, VERIFY_FAILURE, DECODE_FAILURE }; + +// Called from a blocking pool task runner. Tries to decode and verify the +// provided credentials. +VerificationResult DecodeAndVerifyCredentials( + const NetworkingCastPrivateDelegate::Credentials& credentials) { + std::string decoded_signed_data; + if (!base::Base64Decode(credentials.signed_data(), &decoded_signed_data)) { + LOG(ERROR) << "Failed to decode signed data"; + return VerificationResult::DECODE_FAILURE; + } + + if (networking_private_crypto::VerifyCredentials( + credentials.certificate(), credentials.intermediate_certificates(), + decoded_signed_data, credentials.unsigned_data(), + credentials.device_bssid())) { + return VerificationResult::SUCCESS; + } + + return VerificationResult::VERIFY_FAILURE; +} + +VerificationResult RunDecodeAndVerifyCredentials( + std::unique_ptr<NetworkingCastPrivateDelegate::Credentials> credentials) { + return DecodeAndVerifyCredentials(*credentials); +} + +void VerifyDestinationCompleted( + const NetworkingCastPrivateDelegate::VerifiedCallback& success_callback, + const NetworkingCastPrivateDelegate::FailureCallback& failure_callback, + VerificationResult result) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + if (result == VerificationResult::DECODE_FAILURE) { + failure_callback.Run(kErrorEncryptionError); + return; + } + + success_callback.Run(result == VerificationResult::SUCCESS); +} + +// Called from a blocking pool task runner. Returns |data| encoded using +// |credentials| on success, or an empty string on failure. +std::string RunVerifyAndEncryptData( + const std::string& data, + std::unique_ptr<NetworkingCastPrivateDelegate::Credentials> credentials) { + if (DecodeAndVerifyCredentials(*credentials) != VerificationResult::SUCCESS) + return std::string(); + + std::string decoded_public_key; + if (!base::Base64Decode(credentials->public_key(), &decoded_public_key)) { + LOG(ERROR) << "Failed to decode public key"; + return std::string(); + } + + std::vector<uint8_t> public_key_data(decoded_public_key.begin(), + decoded_public_key.end()); + std::vector<uint8_t> ciphertext; + if (!networking_private_crypto::EncryptByteString(public_key_data, data, + &ciphertext)) { + LOG(ERROR) << "Failed to encrypt data"; + return std::string(); + } + + std::string base64_encoded_ciphertext; + base::Base64Encode( + base::StringPiece(reinterpret_cast<const char*>(ciphertext.data()), + ciphertext.size()), + &base64_encoded_ciphertext); + return base64_encoded_ciphertext; +} + +void VerifyAndEncryptDataCompleted( + const NetworkingCastPrivateDelegate::DataCallback& success_callback, + const NetworkingCastPrivateDelegate::FailureCallback& failure_callback, + const std::string& encrypted_data) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + if (encrypted_data.empty()) + failure_callback.Run(kErrorEncryptionError); + else + success_callback.Run(encrypted_data); +} + +// Called when NetworkingPrivateCredentialsGetter completes (from an arbitrary +// thread). Posts the result to the UI thread. +void CredentialsGetterCompleted( + const NetworkingCastPrivateDelegate::DataCallback& success_callback, + const NetworkingCastPrivateDelegate::FailureCallback& failure_callback, + const std::string& key_data, + const std::string& error) { + if (!error.empty()) { + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(failure_callback, error)); + } else { + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(success_callback, key_data)); + } +} + +// Called from a blocking pool task runner. Returns true if +// NetworkingPrivateCredentialsGetter is successfully started (which will +// invoke the appropriate callback when completed), or false if unable +// to start the getter (credentials or public key decode failed). +bool RunVerifyAndEncryptCredentials( + const std::string& guid, + std::unique_ptr<NetworkingCastPrivateDelegate::Credentials> credentials, + const NetworkingCastPrivateDelegate::DataCallback& success_callback, + const NetworkingCastPrivateDelegate::FailureCallback& failure_callback) { + if (DecodeAndVerifyCredentials(*credentials) != VerificationResult::SUCCESS) + return false; + + std::string decoded_public_key; + if (!base::Base64Decode(credentials->public_key(), &decoded_public_key)) { + LOG(ERROR) << "Failed to decode public key"; + return false; + } + + // Start getting credentials. CredentialsGetterCompleted will be called on + // completion. On Windows it will be called from a different thread after + // |credentials_getter| is deleted. + std::unique_ptr<NetworkingPrivateCredentialsGetter> credentials_getter( + NetworkingPrivateCredentialsGetter::Create()); + credentials_getter->Start(guid, decoded_public_key, + base::Bind(&CredentialsGetterCompleted, + success_callback, failure_callback)); + return true; +} + +void VerifyAndEncryptCredentialsCompleted( + const NetworkingCastPrivateDelegate::FailureCallback& failure_callback, + bool succeeded) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + // If VerifyAndEncryptCredentials succeeded, then the appropriate callback + // will be triggered from CredentialsGetterCompleted. + if (succeeded) + return; + failure_callback.Run(kErrorEncryptionError); +} + } // namespace std::unique_ptr<ChromeNetworkingCastPrivateDelegate> @@ -22,8 +174,7 @@ if (g_factory_callback) return g_factory_callback->Run(); return std::unique_ptr<ChromeNetworkingCastPrivateDelegate>( - new ChromeNetworkingCastPrivateDelegate( - NetworkingPrivateVerifyDelegateFactoryImpl().CreateDelegate())); + new ChromeNetworkingCastPrivateDelegate); } void ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest( @@ -31,36 +182,50 @@ g_factory_callback = factory_callback; } -ChromeNetworkingCastPrivateDelegate::ChromeNetworkingCastPrivateDelegate( - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> crypto_verify) - : crypto_verify_(std::move(crypto_verify)) {} +ChromeNetworkingCastPrivateDelegate::ChromeNetworkingCastPrivateDelegate() {} ChromeNetworkingCastPrivateDelegate::~ChromeNetworkingCastPrivateDelegate() {} void ChromeNetworkingCastPrivateDelegate::VerifyDestination( - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const VerifiedCallback& success_callback, const FailureCallback& failure_callback) { - crypto_verify_->VerifyDestination(properties, success_callback, - failure_callback); + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + base::TaskTraits().MayBlock().WithPriority( + base::TaskPriority::USER_VISIBLE), + base::Bind(&RunDecodeAndVerifyCredentials, base::Passed(&credentials)), + base::Bind(&VerifyDestinationCompleted, success_callback, + failure_callback)); } void ChromeNetworkingCastPrivateDelegate::VerifyAndEncryptCredentials( const std::string& guid, - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const DataCallback& success_callback, const FailureCallback& failure_callback) { - crypto_verify_->VerifyAndEncryptCredentials( - guid, properties, success_callback, failure_callback); + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + base::TaskTraits().MayBlock().WithPriority( + base::TaskPriority::USER_VISIBLE), + base::Bind(&RunVerifyAndEncryptCredentials, guid, + base::Passed(&credentials), success_callback, + failure_callback), + base::Bind(&VerifyAndEncryptCredentialsCompleted, failure_callback)); } void ChromeNetworkingCastPrivateDelegate::VerifyAndEncryptData( const std::string& data, - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const DataCallback& success_callback, const FailureCallback& failure_callback) { - crypto_verify_->VerifyAndEncryptData(properties, data, success_callback, - failure_callback); + base::PostTaskWithTraitsAndReplyWithResult( + FROM_HERE, + base::TaskTraits().MayBlock().WithPriority( + base::TaskPriority::USER_VISIBLE), + base::Bind(&RunVerifyAndEncryptData, data, base::Passed(&credentials)), + base::Bind(&VerifyAndEncryptDataCompleted, success_callback, + failure_callback)); } } // namespace extensions
diff --git a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h index 618e4ca..1207b5c 100644 --- a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h +++ b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h
@@ -11,7 +11,6 @@ #include "base/callback.h" #include "base/macros.h" #include "extensions/browser/api/networking_private/networking_cast_private_delegate.h" -#include "extensions/browser/api/networking_private/networking_private_delegate.h" namespace extensions { @@ -28,36 +27,23 @@ ~ChromeNetworkingCastPrivateDelegate() override; // NetworkingCastPrivateDelegate overrides: - void VerifyDestination( - const api::networking_private::VerificationProperties& properties, - const VerifiedCallback& success_callback, - const FailureCallback& failure_callback) override; + void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, + const FailureCallback& failure_callback) override; void VerifyAndEncryptCredentials( const std::string& guid, - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const DataCallback& success_callback, const FailureCallback& failure_callback) override; - void VerifyAndEncryptData( - const std::string& data, - const api::networking_private::VerificationProperties& properties, - const DataCallback& success_callback, - const FailureCallback& failure_callback) override; + void VerifyAndEncryptData(const std::string& data, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, + const FailureCallback& failure_callback) override; + + protected: + ChromeNetworkingCastPrivateDelegate(); private: - // Friend the test so it can inject stub VerifyDelegate implementation. - // TODO(tbarzic): Remove this when NetworkingCastPrivateDelegate stops - // depending on - // NetworkingPrivateDelegate::VerifyDelegate. - friend class NetworkingCastPrivateApiTest; - - explicit ChromeNetworkingCastPrivateDelegate( - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> - verify_delegate); - - // NetworkingPrivates API's crypto utility to which verification requests - // will be routed. - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> crypto_verify_; - DISALLOW_COPY_AND_ASSIGN(ChromeNetworkingCastPrivateDelegate); };
diff --git a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.cc b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.cc index cd81046..3fe6234 100644 --- a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.cc +++ b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/memory/ptr_util.h" #include "chrome/common/extensions/api/networking_cast_private.h" #include "extensions/browser/api/extensions_api_client.h" #include "extensions/browser/api/networking_private/networking_cast_private_delegate.h" @@ -44,13 +45,15 @@ } #endif -std::unique_ptr<private_api::VerificationProperties> -AsPrivateApiVerificaitonProperties( - const cast_api::VerificationProperties& properties) { - std::unique_ptr<base::DictionaryValue> cast_properties_dict = - properties.ToValue(); - CHECK(cast_properties_dict); - return private_api::VerificationProperties::FromValue(*cast_properties_dict); +std::unique_ptr<NetworkingCastPrivateDelegate::Credentials> AsCastCredentials( + api::networking_cast_private::VerificationProperties& properties) { + return base::MakeUnique<NetworkingCastPrivateDelegate::Credentials>( + properties.certificate, + properties.intermediate_certificates + ? *properties.intermediate_certificates + : std::vector<std::string>(), + properties.signed_data, properties.device_ssid, properties.device_serial, + properties.device_bssid, properties.public_key, properties.nonce); } } // namespace @@ -66,10 +69,8 @@ NetworkingCastPrivateDelegate* delegate = ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); - std::unique_ptr<private_api::VerificationProperties> private_api_properties = - AsPrivateApiVerificaitonProperties(params->properties); delegate->VerifyDestination( - *private_api_properties, + AsCastCredentials(params->properties), base::Bind(&NetworkingCastPrivateVerifyDestinationFunction::Success, this), base::Bind(&NetworkingCastPrivateVerifyDestinationFunction::Failure, @@ -99,10 +100,8 @@ NetworkingCastPrivateDelegate* delegate = ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); - std::unique_ptr<private_api::VerificationProperties> private_api_properties = - AsPrivateApiVerificaitonProperties(params->properties); delegate->VerifyAndEncryptCredentials( - params->network_guid, *private_api_properties, + params->network_guid, AsCastCredentials(params->properties), base::Bind( &NetworkingCastPrivateVerifyAndEncryptCredentialsFunction::Success, this), @@ -136,10 +135,8 @@ NetworkingCastPrivateDelegate* delegate = ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); - std::unique_ptr<private_api::VerificationProperties> private_api_properties = - AsPrivateApiVerificaitonProperties(params->properties); delegate->VerifyAndEncryptData( - params->data, *private_api_properties, + params->data, AsCastCredentials(params->properties), base::Bind(&NetworkingCastPrivateVerifyAndEncryptDataFunction::Success, this), base::Bind(&NetworkingCastPrivateVerifyAndEncryptDataFunction::Failure,
diff --git a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc index bdfc502..7eed80d 100644 --- a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc +++ b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc
@@ -11,12 +11,12 @@ #include "base/command_line.h" #include "base/macros.h" #include "base/memory/ptr_util.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h" #include "chrome/browser/extensions/extension_apitest.h" -#include "extensions/browser/api/networking_private/networking_private_delegate.h" -#include "extensions/common/api/networking_private.h" +#include "extensions/browser/api/networking_private/networking_cast_private_delegate.h" #include "extensions/common/switches.h" #if defined(OS_CHROMEOS) @@ -30,34 +30,50 @@ namespace { -class TestVerifyDelegate : public NetworkingPrivateDelegate::VerifyDelegate { +class TestNetworkingCastPrivateDelegate + : public ChromeNetworkingCastPrivateDelegate { public: - TestVerifyDelegate() = default; - ~TestVerifyDelegate() override = default; + TestNetworkingCastPrivateDelegate() {} + ~TestNetworkingCastPrivateDelegate() override {} - void VerifyDestination(const VerificationProperties& properties, - const BoolCallback& success_callback, + void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run(true); } void VerifyAndEncryptCredentials( const std::string& guid, - const VerificationProperties& properties, - const StringCallback& success_callback, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_credentials"); } - void VerifyAndEncryptData(const VerificationProperties& properties, - const std::string& data, - const StringCallback& success_callback, + void VerifyAndEncryptData(const std::string& data, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_data"); } private: - DISALLOW_COPY_AND_ASSIGN(TestVerifyDelegate); + void AssertCredentials(const Credentials& credentials) { + ASSERT_EQ("certificate", credentials.certificate()); + ASSERT_EQ("ica1,ica2,ica3", + base::JoinString(credentials.intermediate_certificates(), ",")); + ASSERT_EQ("cHVibGljX2tleQ==", credentials.public_key()); + ASSERT_EQ("00:01:02:03:04:05", credentials.device_bssid()); + ASSERT_EQ("c2lnbmVkX2RhdGE=", credentials.signed_data()); + ASSERT_EQ( + "Device 0123,device_serial,00:01:02:03:04:05,cHVibGljX2tleQ==,nonce", + credentials.unsigned_data()); + } + + DISALLOW_COPY_AND_ASSIGN(TestNetworkingCastPrivateDelegate); }; } // namespace @@ -123,9 +139,7 @@ private: std::unique_ptr<ChromeNetworkingCastPrivateDelegate> CreateNetworkingCastPrivateDelegate() { - return std::unique_ptr<ChromeNetworkingCastPrivateDelegate>( - new ChromeNetworkingCastPrivateDelegate( - base::MakeUnique<TestVerifyDelegate>())); + return base::MakeUnique<TestNetworkingCastPrivateDelegate>(); } ChromeNetworkingCastPrivateDelegate::FactoryCallback
diff --git a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc deleted file mode 100644 index 1fc8b48d..0000000 --- a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc +++ /dev/null
@@ -1,243 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/api/networking_private/crypto_verify_impl.h" - -#include <stdint.h> - -#include "base/base64.h" -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/sequenced_task_runner.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_util.h" -#include "base/threading/sequenced_worker_pool.h" -#include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" -#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" -#include "content/public/browser/browser_thread.h" -#include "extensions/browser/api/networking_private/networking_private_api.h" -#include "extensions/browser/api/networking_private/networking_private_service_client.h" -#include "extensions/common/api/networking_private.h" - -namespace extensions { - -namespace { - -const char kCryptoVerifySequenceTokenName[] = "CryptoVerify"; - -// Called from a blocking pool task runner. Returns true and sets |verified| if -// able to decode the credentials, otherwise sets |verified| to false and -// returns false. -bool DecodeAndVerifyCredentials( - const CryptoVerifyImpl::Credentials& credentials, - bool* verified) { - std::string decoded_signed_data; - if (!base::Base64Decode(credentials.signed_data, &decoded_signed_data)) { - LOG(ERROR) << "Failed to decode signed data"; - *verified = false; - return false; - } - *verified = networking_private_crypto::VerifyCredentials( - credentials.certificate, credentials.intermediate_certificates, - decoded_signed_data, credentials.unsigned_data, credentials.device_bssid); - return true; -} - -void VerifyDestinationCompleted( - const CryptoVerifyImpl::BoolCallback& success_callback, - const CryptoVerifyImpl::FailureCallback& failure_callback, - bool* verified, - bool success) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!success) - failure_callback.Run(networking_private::kErrorEncryptionError); - else - success_callback.Run(*verified); -} - -// Called from a blocking pool task runner. Returns |data| encoded using -// |credentials| on success, or an empty string on failure. -std::string DoVerifyAndEncryptData( - const CryptoVerifyImpl::Credentials& credentials, - const std::string& data) { - bool verified; - if (!DecodeAndVerifyCredentials(credentials, &verified) || !verified) - return std::string(); - - std::string decoded_public_key; - if (!base::Base64Decode(credentials.public_key, &decoded_public_key)) { - LOG(ERROR) << "Failed to decode public key"; - return std::string(); - } - - std::vector<uint8_t> public_key_data(decoded_public_key.begin(), - decoded_public_key.end()); - std::vector<uint8_t> ciphertext; - if (!networking_private_crypto::EncryptByteString(public_key_data, data, - &ciphertext)) { - LOG(ERROR) << "Failed to encrypt data"; - return std::string(); - } - - std::string base64_encoded_ciphertext; - base::Base64Encode( - base::StringPiece(reinterpret_cast<const char*>(ciphertext.data()), - ciphertext.size()), - &base64_encoded_ciphertext); - return base64_encoded_ciphertext; -} - -void VerifyAndEncryptDataCompleted( - const CryptoVerifyImpl::StringCallback& success_callback, - const CryptoVerifyImpl::FailureCallback& failure_callback, - const std::string& encrypted_data) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (encrypted_data.empty()) - failure_callback.Run(networking_private::kErrorEncryptionError); - else - success_callback.Run(encrypted_data); -} - -// Called when NetworkingPrivateCredentialsGetter completes (from an arbitrary -// thread). Posts the result to the UI thread. -void CredentialsGetterCompleted( - const CryptoVerifyImpl::StringCallback& success_callback, - const CryptoVerifyImpl::FailureCallback& failure_callback, - const std::string& key_data, - const std::string& error) { - if (!error.empty()) { - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, - base::Bind(failure_callback, error)); - } else { - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, - base::Bind(success_callback, key_data)); - } -} - -// Called from a blocking pool task runner. Returns true if -// NetworkingPrivateCredentialsGetter is successfully started (which will -// invoke the appropriate callback when completed), or false if unable -// to start the getter (credentials or public key decode failed). -bool DoVerifyAndEncryptCredentials( - const std::string& guid, - const CryptoVerifyImpl::Credentials& credentials, - const CryptoVerifyImpl::StringCallback& success_callback, - const CryptoVerifyImpl::FailureCallback& failure_callback) { - bool verified; - if (!DecodeAndVerifyCredentials(credentials, &verified) || !verified) - return false; - - std::string decoded_public_key; - if (!base::Base64Decode(credentials.public_key, &decoded_public_key)) { - LOG(ERROR) << "Failed to decode public key"; - return false; - } - - // Start getting credentials. CredentialsGetterCompleted will be called on - // completion. On Windows it will be called from a different thread after - // |credentials_getter| is deleted. - std::unique_ptr<NetworkingPrivateCredentialsGetter> credentials_getter( - NetworkingPrivateCredentialsGetter::Create()); - credentials_getter->Start(guid, decoded_public_key, - base::Bind(&CredentialsGetterCompleted, - success_callback, failure_callback)); - return true; -} - -void VerifyAndEncryptCredentialsCompleted( - const CryptoVerifyImpl::FailureCallback& failure_callback, - bool succeeded) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // If VerifyAndEncryptCredentials succeeded, then the appropriate callback - // will be triggered from CredentialsGetterCompleted. - if (succeeded) - return; - failure_callback.Run(networking_private::kErrorEncryptionError); -} - -} // namespace - -CryptoVerifyImpl::Credentials::Credentials( - const VerificationProperties& properties) { - certificate = properties.certificate; - if (properties.intermediate_certificates.get()) - intermediate_certificates = *properties.intermediate_certificates; - signed_data = properties.signed_data; - - std::vector<std::string> data_parts; - data_parts.push_back(properties.device_ssid); - data_parts.push_back(properties.device_serial); - data_parts.push_back(properties.device_bssid); - data_parts.push_back(properties.public_key); - data_parts.push_back(properties.nonce); - unsigned_data = base::JoinString(data_parts, ","); - - device_bssid = properties.device_bssid; - public_key = properties.public_key; -} - -CryptoVerifyImpl::Credentials::Credentials(const Credentials& other) = default; - -CryptoVerifyImpl::Credentials::~Credentials() { -} - -CryptoVerifyImpl::CryptoVerifyImpl() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::SequencedWorkerPool::SequenceToken sequence_token = - content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken( - kCryptoVerifySequenceTokenName); - blocking_pool_task_runner_ = - content::BrowserThread::GetBlockingPool() - ->GetSequencedTaskRunnerWithShutdownBehavior( - sequence_token, base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); -} - -CryptoVerifyImpl::~CryptoVerifyImpl() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); -} - -void CryptoVerifyImpl::VerifyDestination( - const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - Credentials credentials(verification_properties); - bool* verified = new bool; - base::PostTaskAndReplyWithResult( - blocking_pool_task_runner_.get(), FROM_HERE, - base::Bind(&DecodeAndVerifyCredentials, credentials, verified), - base::Bind(&VerifyDestinationCompleted, success_callback, - failure_callback, base::Owned(verified))); -} - -void CryptoVerifyImpl::VerifyAndEncryptCredentials( - const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, - const FailureCallback& failure_callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - Credentials credentials(verification_properties); - base::PostTaskAndReplyWithResult( - blocking_pool_task_runner_.get(), FROM_HERE, - base::Bind(&DoVerifyAndEncryptCredentials, guid, credentials, - success_callback, failure_callback), - base::Bind(&VerifyAndEncryptCredentialsCompleted, failure_callback)); -} - -void CryptoVerifyImpl::VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - Credentials credentials(verification_properties); - base::PostTaskAndReplyWithResult( - blocking_pool_task_runner_.get(), FROM_HERE, - base::Bind(&DoVerifyAndEncryptData, credentials, data), - base::Bind(&VerifyAndEncryptDataCompleted, success_callback, - failure_callback)); -} - -} // namespace extensions
diff --git a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.h b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.h deleted file mode 100644 index fe8ed7d..0000000 --- a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.h +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_CRYPTO_VERIFY_IMPL_H_ -#define CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_CRYPTO_VERIFY_IMPL_H_ - -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "extensions/browser/api/networking_private/networking_private_delegate.h" - -namespace base { -class SequencedTaskRunner; -} - -namespace extensions { - -// Implementation of NetworkingPrivateDelegate::VerifyDelegate using -// networking_private_crypto. -class CryptoVerifyImpl : public NetworkingPrivateDelegate::VerifyDelegate { - public: - CryptoVerifyImpl(); - ~CryptoVerifyImpl() override; - - struct Credentials { - // VerificationProperties are not copyable so define a struct that can be - // passed to tasks on the worker thread. - explicit Credentials(const VerificationProperties& properties); - Credentials(const Credentials& other); - ~Credentials(); - - std::string certificate; - std::vector<std::string> intermediate_certificates; - std::string signed_data; - std::string unsigned_data; - std::string device_bssid; - std::string public_key; - }; - - // NetworkingPrivateDelegate::VerifyDelegate - void VerifyDestination(const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) override; - void VerifyAndEncryptCredentials( - const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, - const FailureCallback& failure_callback) override; - void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) override; - - private: - // Task runner for blocking tasks. - scoped_refptr<base::SequencedTaskRunner> blocking_pool_task_runner_; - - DISALLOW_COPY_AND_ASSIGN(CryptoVerifyImpl); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_CRYPTO_VERIFY_IMPL_H_
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc index f06b425e..77b6959 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
@@ -9,11 +9,14 @@ #include <utility> #include <vector> +#include "base/bind.h" +#include "base/callback.h" #include "base/command_line.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "build/build_config.h" +#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h" #include "chrome/browser/extensions/extension_apitest.h" #include "components/keyed_service/core/keyed_service.h" #include "components/onc/onc_constants.h" @@ -38,12 +41,12 @@ const char kSuccess[] = "Success"; const char kGuid[] = "SOME_GUID"; -class TestDelegate : public NetworkingPrivateDelegate { +class TestNetworkingPrivateDelegate : public NetworkingPrivateDelegate { public: - explicit TestDelegate(std::unique_ptr<VerifyDelegate> verify_delegate) - : NetworkingPrivateDelegate(std::move(verify_delegate)), fail_(false) {} + explicit TestNetworkingPrivateDelegate(bool test_failure) + : fail_(test_failure) {} - ~TestDelegate() override {} + ~TestNetworkingPrivateDelegate() override {} // Asynchronous methods void GetProperties(const std::string& guid, @@ -255,60 +258,83 @@ std::map<std::string, bool> disabled_; std::vector<bool> scan_requested_; - DISALLOW_COPY_AND_ASSIGN(TestDelegate); + DISALLOW_COPY_AND_ASSIGN(TestNetworkingPrivateDelegate); }; -class TestVerifyDelegate : public NetworkingPrivateDelegate::VerifyDelegate { +class TestNetworkingCastPrivateDelegate + : public ChromeNetworkingCastPrivateDelegate { public: - TestVerifyDelegate() : owner_(NULL) {} + explicit TestNetworkingCastPrivateDelegate(bool test_failure) + : fail_(test_failure) {} - ~TestVerifyDelegate() override {} + ~TestNetworkingCastPrivateDelegate() override {} - void VerifyDestination( - const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) override { - owner_->BoolResult(success_callback, failure_callback); + void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, + const FailureCallback& failure_callback) override { + if (fail_) { + failure_callback.Run(kFailure); + } else { + success_callback.Run(true); + } } + void VerifyAndEncryptCredentials( const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, const FailureCallback& failure_callback) override { - owner_->StringResult(success_callback, failure_callback); + if (fail_) { + failure_callback.Run(kFailure); + } else { + success_callback.Run("encrypted_credentials"); + } } - void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) override { - owner_->StringResult(success_callback, failure_callback); + void VerifyAndEncryptData(const std::string& data, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, + const FailureCallback& failure_callback) override { + if (fail_) { + failure_callback.Run(kFailure); + } else { + success_callback.Run("encrypted_data"); + } } - void set_owner(TestDelegate* owner) { owner_ = owner; } - private: - TestDelegate* owner_; + bool fail_; - DISALLOW_COPY_AND_ASSIGN(TestVerifyDelegate); + DISALLOW_COPY_AND_ASSIGN(TestNetworkingCastPrivateDelegate); }; class NetworkingPrivateApiTest : public ExtensionApiTest { public: - NetworkingPrivateApiTest() { - if (!s_test_delegate_) { - TestVerifyDelegate* verify_delegate = new TestVerifyDelegate; - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> - verify_delegate_ptr(verify_delegate); - s_test_delegate_ = new TestDelegate(std::move(verify_delegate_ptr)); - verify_delegate->set_owner(s_test_delegate_); - } - } + using TestNetworkingPrivateDelegateFactory = + base::Callback<std::unique_ptr<KeyedService>()>; static std::unique_ptr<KeyedService> GetNetworkingPrivateDelegate( content::BrowserContext* profile) { - CHECK(s_test_delegate_); - return base::WrapUnique(s_test_delegate_); + CHECK(s_networking_private_delegate_factory_ptr); + return s_networking_private_delegate_factory_ptr->Run(); + } + + NetworkingPrivateApiTest() = default; + ~NetworkingPrivateApiTest() override = default; + + void SetUp() override { + networking_cast_delegate_factory_ = base::Bind( + &NetworkingPrivateApiTest::CreateTestNetworkingCastPrivateDelegate, + base::Unretained(this), test_failure_); + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest( + &networking_cast_delegate_factory_); + + networking_private_delegate_factory_ = base::Bind( + &NetworkingPrivateApiTest::CreateTestNetworkingPrivateDelegate, + base::Unretained(this), test_failure_); + s_networking_private_delegate_factory_ptr = + &networking_private_delegate_factory_; + + ExtensionApiTest::SetUp(); } void SetUpCommandLine(base::CommandLine* command_line) override { @@ -323,19 +349,27 @@ ExtensionApiTest::SetUpOnMainThread(); NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory( profile(), &NetworkingPrivateApiTest::GetNetworkingPrivateDelegate); - content::RunAllPendingInMessageLoop(); + } + + void TearDown() override { + ExtensionApiTest::TearDown(); + + s_networking_private_delegate_factory_ptr = nullptr; + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest(nullptr); + + networking_private_delegate_ = nullptr; } bool GetEnabled(const std::string& type) { - return s_test_delegate_->GetEnabled(type); + return networking_private_delegate_->GetEnabled(type); } bool GetDisabled(const std::string& type) { - return s_test_delegate_->GetDisabled(type); + return networking_private_delegate_->GetDisabled(type); } size_t GetScanRequested() { - return s_test_delegate_->GetScanRequested(); + return networking_private_delegate_->GetScanRequested(); } protected: @@ -345,15 +379,44 @@ kFlagEnableFileAccess | kFlagLoadAsComponent); } - // Static pointer to the TestDelegate so that it can be accessed in - // GetNetworkingPrivateDelegate() passed to SetTestingFactory(). - static TestDelegate* s_test_delegate_; + private: + std::unique_ptr<ChromeNetworkingCastPrivateDelegate> + CreateTestNetworkingCastPrivateDelegate(bool test_failure) { + return base::MakeUnique<TestNetworkingCastPrivateDelegate>(test_failure); + } + + std::unique_ptr<KeyedService> CreateTestNetworkingPrivateDelegate( + bool test_failure) { + CHECK(!networking_private_delegate_); + auto delegate = + base::MakeUnique<TestNetworkingPrivateDelegate>(test_failure); + networking_private_delegate_ = delegate.get(); + return delegate; + } + + protected: + bool test_failure_ = false; + + private: + // Pointer to a networking private delegate created by the test factory + // callback. + TestNetworkingPrivateDelegate* networking_private_delegate_ = nullptr; + + TestNetworkingPrivateDelegateFactory networking_private_delegate_factory_; + // Static pointer to |test_delegate_factory_|, so it can be used from + // |CreateNetwokringPrivateDelegate|. + static TestNetworkingPrivateDelegateFactory* + s_networking_private_delegate_factory_ptr; + + ChromeNetworkingCastPrivateDelegate::FactoryCallback + networking_cast_delegate_factory_; DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateApiTest); }; -// static -TestDelegate* NetworkingPrivateApiTest::s_test_delegate_ = NULL; +NetworkingPrivateApiTest::TestNetworkingPrivateDelegateFactory* + NetworkingPrivateApiTest::s_networking_private_delegate_factory_ptr = + nullptr; } // namespace @@ -475,7 +538,9 @@ class NetworkingPrivateApiTestFail : public NetworkingPrivateApiTest { public: - NetworkingPrivateApiTestFail() { s_test_delegate_->set_fail(true); } + NetworkingPrivateApiTestFail() { test_failure_ = true; } + + ~NetworkingPrivateApiTestFail() override = default; protected: DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateApiTestFail);
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc index ae542c1..94bb812d 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h" +#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h" #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h" #include "chrome/browser/extensions/extension_apitest.h" @@ -73,6 +74,7 @@ using chromeos::ShillProfileClient; using chromeos::ShillServiceClient; +using extensions::ChromeNetworkingCastPrivateDelegate; using extensions::NetworkingPrivateDelegate; using extensions::NetworkingPrivateDelegateFactory; using extensions::NetworkingPrivateChromeOS; @@ -91,30 +93,51 @@ // Stub Verify* methods implementation to satisfy expectations of // networking_private_apitest. -class CryptoVerifyStub : public NetworkingPrivateDelegate::VerifyDelegate { - private: +class TestNetworkingCastPrivateDelegate + : public ChromeNetworkingCastPrivateDelegate { + public: + TestNetworkingCastPrivateDelegate() = default; + ~TestNetworkingCastPrivateDelegate() override = default; + // VerifyDelegate - void VerifyDestination(const VerificationProperties& verification_properties, - const BoolCallback& success_callback, + void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run(true); } void VerifyAndEncryptCredentials( const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_credentials"); } - void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) override { + void VerifyAndEncryptData(const std::string& data, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, + const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_data"); } + + private: + void AssertCredentials(const Credentials& credentials) { + ASSERT_EQ("certificate", credentials.certificate()); + ASSERT_EQ("ica1,ica2,ica3", + base::JoinString(credentials.intermediate_certificates(), ",")); + ASSERT_EQ("cHVibGljX2tleQ==", credentials.public_key()); + ASSERT_EQ("00:01:02:03:04:05", credentials.device_bssid()); + ASSERT_EQ("c2lnbmVkX2RhdGE=", credentials.signed_data()); + ASSERT_EQ( + "Device 0123,device_serial,00:01:02:03:04:05,cHVibGljX2tleQ==,nonce", + credentials.unsigned_data()); + } + + DISALLOW_COPY_AND_ASSIGN(TestNetworkingCastPrivateDelegate); }; class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate { @@ -272,13 +295,22 @@ static std::unique_ptr<KeyedService> CreateNetworkingPrivateServiceClient( content::BrowserContext* context) { - std::unique_ptr<CryptoVerifyStub> crypto_verify(new CryptoVerifyStub); std::unique_ptr<NetworkingPrivateDelegate> result( - new NetworkingPrivateChromeOS(context, std::move(crypto_verify))); + new NetworkingPrivateChromeOS(context)); std::unique_ptr<NetworkingPrivateDelegate::UIDelegate> ui_delegate( new UIDelegateStub); result->set_ui_delegate(std::move(ui_delegate)); - return std::move(result); + return result; + } + + void SetUp() override { + networking_cast_delegate_factory_ = base::Bind( + &NetworkingPrivateChromeOSApiTest::CreateNetworkingCastPrivateDelegate, + base::Unretained(this)); + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest( + &networking_cast_delegate_factory_); + + ExtensionApiTest::SetUp(); } void SetUpOnMainThread() override { @@ -419,6 +451,17 @@ content::RunAllPendingInMessageLoop(); } + void TearDown() override { + ExtensionApiTest::TearDown(); + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest(nullptr); + } + + private: + std::unique_ptr<ChromeNetworkingCastPrivateDelegate> + CreateNetworkingCastPrivateDelegate() { + return base::MakeUnique<TestNetworkingCastPrivateDelegate>(); + } + protected: NetworkPortalDetectorTestImpl* detector() { return detector_; } @@ -429,6 +472,12 @@ ShillDeviceClient::TestInterface* device_test_; policy::MockConfigurationPolicyProvider provider_; std::string userhash_; + + private: + ChromeNetworkingCastPrivateDelegate::FactoryCallback + networking_cast_delegate_factory_; + + DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateChromeOSApiTest); }; // Place each subtest into a separate browser test so that the stub networking
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc index e7abad92..a50e5718 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_service_client_apitest.cc
@@ -9,7 +9,9 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/macros.h" +#include "base/memory/ptr_util.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.h" #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" #include "chrome/browser/extensions/extension_apitest.h" #include "components/user_manager/user.h" @@ -33,6 +35,7 @@ using testing::Return; using testing::_; +using extensions::ChromeNetworkingCastPrivateDelegate; using extensions::NetworkingPrivateDelegate; using extensions::NetworkingPrivateDelegateFactory; using extensions::NetworkingPrivateEventRouter; @@ -43,29 +46,50 @@ // Stub Verify* methods implementation to satisfy expectations of // networking_private_apitest. -class CryptoVerifyStub : public NetworkingPrivateDelegate::VerifyDelegate { - void VerifyDestination( - const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) override { +class TestNetworkingCastPrivateDelegate + : public ChromeNetworkingCastPrivateDelegate { + public: + TestNetworkingCastPrivateDelegate() = default; + ~TestNetworkingCastPrivateDelegate() override = default; + + void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, + const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run(true); } void VerifyAndEncryptCredentials( const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_credentials"); } - void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) override { + void VerifyAndEncryptData(const std::string& data, + std::unique_ptr<Credentials> credentials, + const DataCallback& success_callback, + const FailureCallback& failure_callback) override { + AssertCredentials(*credentials); success_callback.Run("encrypted_data"); } + + private: + void AssertCredentials(const Credentials& credentials) { + ASSERT_EQ("certificate", credentials.certificate()); + ASSERT_EQ("ica1,ica2,ica3", + base::JoinString(credentials.intermediate_certificates(), ",")); + ASSERT_EQ("cHVibGljX2tleQ==", credentials.public_key()); + ASSERT_EQ("00:01:02:03:04:05", credentials.device_bssid()); + ASSERT_EQ("c2lnbmVkX2RhdGE=", credentials.signed_data()); + ASSERT_EQ( + "Device 0123,device_serial,00:01:02:03:04:05,cHVibGljX2tleQ==,nonce", + credentials.unsigned_data()); + } + + DISALLOW_COPY_AND_ASSIGN(TestNetworkingCastPrivateDelegate); }; class NetworkingPrivateServiceClientApiTest : public ExtensionApiTest { @@ -90,9 +114,18 @@ content::BrowserContext* context) { std::unique_ptr<wifi::FakeWiFiService> wifi_service( new wifi::FakeWiFiService()); - std::unique_ptr<CryptoVerifyStub> crypto_verify(new CryptoVerifyStub); - return std::unique_ptr<KeyedService>(new NetworkingPrivateServiceClient( - std::move(wifi_service), std::move(crypto_verify))); + return std::unique_ptr<KeyedService>( + new NetworkingPrivateServiceClient(std::move(wifi_service))); + } + + void SetUp() override { + networking_cast_delegate_factory_ = + base::Bind(&NetworkingPrivateServiceClientApiTest:: + CreateNetworkingCastPrivateDelegate, + base::Unretained(this)); + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest( + &networking_cast_delegate_factory_); + ExtensionApiTest::SetUp(); } void SetUpOnMainThread() override { @@ -107,7 +140,20 @@ ExtensionApiTest::TearDownOnMainThread(); } - protected: + void TearDown() override { + ExtensionApiTest::TearDown(); + ChromeNetworkingCastPrivateDelegate::SetFactoryCallbackForTest(nullptr); + } + + private: + std::unique_ptr<ChromeNetworkingCastPrivateDelegate> + CreateNetworkingCastPrivateDelegate() { + return base::MakeUnique<TestNetworkingCastPrivateDelegate>(); + } + + ChromeNetworkingCastPrivateDelegate::FactoryCallback + networking_cast_delegate_factory_; + DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateServiceClientApiTest); };
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.cc b/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.cc deleted file mode 100644 index 036b5d2..0000000 --- a/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.cc +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h" - -#include "base/memory/ptr_util.h" -#include "build/build_config.h" -#include "chrome/browser/extensions/api/networking_private/crypto_verify_impl.h" - -namespace extensions { - -NetworkingPrivateVerifyDelegateFactoryImpl:: - NetworkingPrivateVerifyDelegateFactoryImpl() { -} - -NetworkingPrivateVerifyDelegateFactoryImpl:: - ~NetworkingPrivateVerifyDelegateFactoryImpl() { -} - -std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> -NetworkingPrivateVerifyDelegateFactoryImpl::CreateDelegate() { -#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_MACOSX) - return base::MakeUnique<CryptoVerifyImpl>(); -#else - return nullptr; -#endif -} - -} // namespace extensions
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h b/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h deleted file mode 100644 index 78029bf5..0000000 --- a/chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_VERIFY_DELEGATE_FACTORY_IMPL_H_ -#define CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_VERIFY_DELEGATE_FACTORY_IMPL_H_ - -#include "base/macros.h" -#include "extensions/browser/api/networking_private/networking_private_delegate_factory.h" - -namespace extensions { - -class NetworkingPrivateVerifyDelegateFactoryImpl - : public NetworkingPrivateDelegateFactory::VerifyDelegateFactory { - public: - NetworkingPrivateVerifyDelegateFactoryImpl(); - ~NetworkingPrivateVerifyDelegateFactoryImpl() override; - - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> CreateDelegate() - override; - - private: - DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateVerifyDelegateFactoryImpl); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_VERIFY_DELEGATE_FACTORY_IMPL_H_
diff --git a/chrome/browser/extensions/api/screenlock_private/screenlock_private_apitest.cc b/chrome/browser/extensions/api/screenlock_private/screenlock_private_apitest.cc index d16751b2..48db51d 100644 --- a/chrome/browser/extensions/api/screenlock_private/screenlock_private_apitest.cc +++ b/chrome/browser/extensions/api/screenlock_private/screenlock_private_apitest.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "components/proximity_auth/screenlock_bridge.h" #include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/notification_service.h" #include "extensions/browser/api/test/test_api.h" #include "extensions/browser/notification_types.h" @@ -48,10 +47,6 @@ command_line->AppendSwitchASCII( extensions::switches::kWhitelistedExtensionID, kTestExtensionId); -#if !defined(OS_CHROMEOS) - // New profile management needs to be on for non-ChromeOS lock. - ::switches::EnableNewProfileManagementForTesting(command_line); -#endif } void SetUpOnMainThread() override {
diff --git a/chrome/browser/extensions/chrome_process_manager_delegate.cc b/chrome/browser/extensions/chrome_process_manager_delegate.cc index e5804aab..0fa3935c 100644 --- a/chrome/browser/extensions/chrome_process_manager_delegate.cc +++ b/chrome/browser/extensions/chrome_process_manager_delegate.cc
@@ -9,6 +9,7 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/extensions/extension_management.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" @@ -19,8 +20,13 @@ #include "extensions/browser/extension_system.h" #include "extensions/browser/process_manager.h" #include "extensions/browser/process_manager_factory.h" +#include "extensions/common/extension.h" #include "extensions/common/one_shot_event.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#endif + namespace extensions { ChromeProcessManagerDelegate::ChromeProcessManagerDelegate() { @@ -38,16 +44,12 @@ ChromeProcessManagerDelegate::~ChromeProcessManagerDelegate() { } -bool ChromeProcessManagerDelegate::IsBackgroundPageAllowed( +bool ChromeProcessManagerDelegate::AreBackgroundPagesAllowedForContext( content::BrowserContext* context) const { - Profile* profile = static_cast<Profile*>(context); + Profile* profile = Profile::FromBrowserContext(context); bool is_normal_session = !profile->IsGuestSession() && !profile->IsSystemProfile(); -#if defined(OS_CHROMEOS) - is_normal_session = is_normal_session && - user_manager::UserManager::Get()->IsUserLoggedIn(); -#endif // Disallow if the current session is a Guest mode session or login screen but // the current browser context is *not* off-the-record. Such context is @@ -56,9 +58,40 @@ return is_normal_session || profile->IsOffTheRecord(); } +bool ChromeProcessManagerDelegate::IsExtensionBackgroundPageAllowed( + content::BrowserContext* context, + const Extension& extension) const { +#if defined(OS_CHROMEOS) + Profile* profile = Profile::FromBrowserContext(context); + + const bool is_signin_profile = + chromeos::ProfileHelper::IsSigninProfile(profile) && + !profile->IsOffTheRecord(); + + if (is_signin_profile) { + // Check for flag. + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableLoginScreenApps)) { + return false; + } + + // Get login screen apps installed by policy. + std::unique_ptr<base::DictionaryValue> login_screen_apps_list = + ExtensionManagementFactory::GetForBrowserContext(context) + ->GetForceInstallList(); + + // For the ChromeOS login profile, only allow apps installed by device + // policy. + return login_screen_apps_list->HasKey(extension.id()); + } +#endif + + return AreBackgroundPagesAllowedForContext(context); +} + bool ChromeProcessManagerDelegate::DeferCreatingStartupBackgroundHosts( content::BrowserContext* context) const { - Profile* profile = static_cast<Profile*>(context); + Profile* profile = Profile::FromBrowserContext(context); // The profile may not be valid yet if it is still being initialized. // In that case, defer loading, since it depends on an initialized profile.
diff --git a/chrome/browser/extensions/chrome_process_manager_delegate.h b/chrome/browser/extensions/chrome_process_manager_delegate.h index ce077fc..c03bb4b3 100644 --- a/chrome/browser/extensions/chrome_process_manager_delegate.h +++ b/chrome/browser/extensions/chrome_process_manager_delegate.h
@@ -25,7 +25,11 @@ ~ChromeProcessManagerDelegate() override; // ProcessManagerDelegate implementation: - bool IsBackgroundPageAllowed(content::BrowserContext* context) const override; + bool AreBackgroundPagesAllowedForContext( + content::BrowserContext* context) const override; + bool IsExtensionBackgroundPageAllowed( + content::BrowserContext* context, + const Extension& extension) const override; bool DeferCreatingStartupBackgroundHosts( content::BrowserContext* context) const override;
diff --git a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc index 22a0b1a..f0c54f3 100644 --- a/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc +++ b/chrome/browser/extensions/display_info_provider_chromeos_unittest.cc
@@ -10,6 +10,7 @@ #include "ash/display/screen_orientation_controller_chromeos.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" +#include "ash/test/screen_orientation_controller_test_api.h" #include "base/command_line.h" #include "base/macros.h" #include "base/strings/string_number_conversions.h" @@ -928,8 +929,10 @@ EXPECT_FALSE(screen_orientation_controller->rotation_locked()); // ScreenOrientationController rotations override display info. - screen_orientation_controller->SetDisplayRotation( - display::Display::ROTATE_0, display::Display::ROTATION_SOURCE_ACTIVE); + ash::test::ScreenOrientationControllerTestApi test_api( + screen_orientation_controller); + test_api.SetDisplayRotation(display::Display::ROTATE_0, + display::Display::ROTATION_SOURCE_ACTIVE); EXPECT_EQ(display::Display::ROTATE_0, GetCurrentInternalDisplayRotation()); // Exiting maximize mode should restore the initial rotation
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 46ddb77b..50c00cf 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc
@@ -105,6 +105,7 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/extensions/install_limiter.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "storage/browser/fileapi/file_system_backend.h" #include "storage/browser/fileapi/file_system_context.h" #endif @@ -439,9 +440,22 @@ DCHECK(!is_ready()); // Can't redo init. DCHECK_EQ(registry_->enabled_extensions().size(), 0u); - // LoadAllExtensions() calls OnLoadedInstalledExtensions(). component_loader_->LoadAll(); - extensions::InstalledLoader(this).LoadAllExtensions(); + bool load_saved_extensions = true; +#if defined(OS_CHROMEOS) + if (chromeos::ProfileHelper::IsSigninProfile(profile_)) + load_saved_extensions = false; +#endif + if (load_saved_extensions) { + extensions::InstalledLoader(this).LoadAllExtensions(); + } else { + // InstalledLoader::LoadAllExtensions normally calls + // OnLoadedInstalledExtensions itself, but here we circumvent that path. + // Call OnLoadedInstalledExtensions directly. + // TODO(devlin): LoadInstalledExtensions() is synchronous - we can simplify + // this. + OnLoadedInstalledExtensions(); + } LoadExtensionsFromCommandLineFlag(switches::kDisableExtensionsExcept); if (extensions_enabled_) LoadExtensionsFromCommandLineFlag(switches::kLoadExtension);
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index 689f719a..8dee5d5 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -2868,8 +2868,7 @@ } // namespace // Test updating a pending theme. -// Disabled due to ASAN failure. http://crbug.com/108320 -TEST_F(ExtensionServiceTest, DISABLED_UpdatePendingTheme) { +TEST_F(ExtensionServiceTest, UpdatePendingTheme) { InitializeEmptyExtensionService(); EXPECT_TRUE(service()->pending_extension_manager()->AddFromSync( theme_crx, GURL(), base::Version(), &IsTheme, false));
diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc index 213de8ed..1938eef2 100644 --- a/chrome/browser/extensions/extension_util.cc +++ b/chrome/browser/extensions/extension_util.cc
@@ -7,6 +7,7 @@ #include <vector> #include "base/command_line.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/metrics/field_trial.h" #include "base/values.h" @@ -18,6 +19,7 @@ #include "chrome/browser/extensions/shared_module_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/sync_helper.h" #include "components/variations/variations_associated_data.h" @@ -330,11 +332,9 @@ bool IsNewBookmarkAppsEnabled() { #if defined(OS_MACOSX) - return base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableNewBookmarkApps); + return base::FeatureList::IsEnabled(features::kBookmarkApps); #else - return !base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableNewBookmarkApps); + return true; #endif }
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc index aa4cc32..28368ee 100644 --- a/chrome/browser/extensions/external_provider_impl.cc +++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -140,8 +140,9 @@ void ExternalProviderImpl::UpdatePrefs(base::DictionaryValue* prefs) { CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - // We only expect updates from windows registry. - CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY); + // We only expect updates from windows registry or via policies on chromeos. + CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY || + download_location_ == Manifest::EXTERNAL_POLICY_DOWNLOAD); // Check if the service is still alive. It is possible that it went // away while |loader_| was working on the FILE thread. @@ -497,7 +498,23 @@ scoped_refptr<ExternalLoader> external_loader; scoped_refptr<ExternalLoader> external_recommended_loader; extensions::Manifest::Location crx_location = Manifest::INVALID_LOCATION; + #if defined(OS_CHROMEOS) + if (chromeos::ProfileHelper::IsSigninProfile(profile)) { + // Download apps installed by policy in the login profile. Flags + // FROM_WEBSTORE/WAS_INSTALLED_BY_DEFAULT are applied because these apps are + // downloaded from the webstore, and we want to treat them as built-in + // extensions. + external_loader = new ExternalPolicyLoader( + ExtensionManagementFactory::GetForBrowserContext(profile), + ExternalPolicyLoader::FORCED); + provider_list->push_back(base::MakeUnique<ExternalProviderImpl>( + service, external_loader, profile, crx_location, + Manifest::EXTERNAL_POLICY_DOWNLOAD, + Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT)); + return; + } + policy::BrowserPolicyConnectorChromeOS* connector = g_browser_process->platform_part()->browser_policy_connector_chromeos(); bool is_chrome_os_public_session = false;
diff --git a/chrome/browser/extensions/native_bindings_apitest.cc b/chrome/browser/extensions/native_bindings_apitest.cc index 6585656..94d974a 100644 --- a/chrome/browser/extensions/native_bindings_apitest.cc +++ b/chrome/browser/extensions/native_bindings_apitest.cc
@@ -3,8 +3,17 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/run_loop.h" +#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" +#include "chrome/browser/extensions/extension_action.h" +#include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/test/base/ui_test_utils.h" #include "extensions/common/switches.h" +#include "extensions/test/extension_test_message_listener.h" #include "net/dns/mock_host_resolver.h" namespace extensions { @@ -44,4 +53,38 @@ ASSERT_TRUE(RunPlatformAppTest("native_bindings/platform_app")) << message_; } +// Tests the declarativeContent API and declarative events. +IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, DeclarativeEvents) { + host_resolver()->AddRule("*", "127.0.0.1"); + embedded_test_server()->ServeFilesFromDirectory(test_data_dir_); + ASSERT_TRUE(StartEmbeddedTestServer()); + // Load an extension and wait for it to be ready. + ExtensionTestMessageListener listener("ready", false); + const Extension* extension = LoadExtension( + test_data_dir_.AppendASCII("native_bindings/declarative_content")); + ASSERT_TRUE(extension); + ASSERT_TRUE(listener.WaitUntilSatisfied()); + + // The extension's page action should currently be hidden. + ExtensionAction* page_action = + ExtensionActionManager::Get(profile())->GetPageAction(*extension); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + int tab_id = SessionTabHelper::IdForTab(web_contents); + EXPECT_FALSE(page_action->GetIsVisible(tab_id)); + + // Navigating to example.com should show the page action. + ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL( + "example.com", "/native_bindings/simple.html")); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(page_action->GetIsVisible(tab_id)); + + // And the extension should be notified of the click. + ExtensionTestMessageListener clicked_listener("clicked and removed", false); + ExtensionActionAPI::Get(profile())->DispatchExtensionActionClicked( + *page_action, web_contents); + ASSERT_TRUE(clicked_listener.WaitUntilSatisfied()); +} + } // namespace extensions
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc index 80acaac6..0f4eb5d 100644 --- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -18,7 +18,9 @@ #include "components/prefs/pref_service.h" #include "components/sync/driver/about_sync_util.h" #include "content/public/browser/browser_thread.h" +#include "extensions/browser/api/power/power_api.h" #include "extensions/browser/extension_registry.h" +#include "extensions/common/api/power.h" #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" @@ -38,6 +40,7 @@ constexpr char kSyncDataKey[] = "about_sync_data"; constexpr char kExtensionsListKey[] = "extensions"; +constexpr char kPowerApiListKey[] = "chrome.power extensions"; constexpr char kDataReductionProxyKey[] = "data_reduction_proxy"; constexpr char kChromeVersionTag[] = "CHROME VERSION"; #if defined(OS_CHROMEOS) @@ -120,6 +123,7 @@ PopulateSyncLogs(response.get()); PopulateExtensionInfoLogs(response.get()); + PopulatePowerApiLogs(response.get()); PopulateDataReductionProxyLogs(response.get()); #if defined(OS_WIN) PopulateUsbKeyboardDetected(response.get()); @@ -211,6 +215,23 @@ (*response)[kExtensionsListKey] = extensions_list; } +void ChromeInternalLogSource::PopulatePowerApiLogs( + SystemLogsResponse* response) { + std::string info; + for (auto* profile : + g_browser_process->profile_manager()->GetLoadedProfiles()) { + for (const auto& it : + extensions::PowerAPI::Get(profile)->extension_levels()) { + if (!info.empty()) + info += ",\n"; + info += it.first + ": " + extensions::api::power::ToString(it.second); + } + } + + if (!info.empty()) + (*response)[kPowerApiListKey] = info; +} + void ChromeInternalLogSource::PopulateDataReductionProxyLogs( SystemLogsResponse* response) { PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h index 6a1128b1..ea97f05a 100644 --- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h +++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h
@@ -23,6 +23,7 @@ private: void PopulateSyncLogs(SystemLogsResponse* response); void PopulateExtensionInfoLogs(SystemLogsResponse* response); + void PopulatePowerApiLogs(SystemLogsResponse* response); void PopulateDataReductionProxyLogs(SystemLogsResponse* response); #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn index 1ff8598..5749c9b 100644 --- a/chrome/browser/media/router/BUILD.gn +++ b/chrome/browser/media/router/BUILD.gn
@@ -85,6 +85,7 @@ if (!is_android) { deps += [ ":mojo_bindings", + "discovery", "//extensions/browser", "//mojo/public/cpp/bindings", ]
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn new file mode 100644 index 0000000..f738655 --- /dev/null +++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -0,0 +1,23 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# + +static_library("discovery") { + deps = [ + "//base", + "//chrome/common:constants", + "//content/public/browser", + "//content/public/common", + ] + sources = [ + "dial/device_description_fetcher.cc", + "dial/device_description_fetcher.h ", + "dial/dial_device_data.cc", + "dial/dial_device_data.h", + "dial/dial_registry.cc", + "dial/dial_registry.h", + "dial/dial_service.cc", + "dial/dial_service.h", + ] +}
diff --git a/chrome/browser/extensions/api/dial/device_description_fetcher.cc b/chrome/browser/media/router/discovery/dial/device_description_fetcher.cc similarity index 95% rename from chrome/browser/extensions/api/dial/device_description_fetcher.cc rename to chrome/browser/media/router/discovery/dial/device_description_fetcher.cc index 6b60803..552a1340 100644 --- a/chrome/browser/extensions/api/dial/device_description_fetcher.cc +++ b/chrome/browser/media/router/discovery/dial/device_description_fetcher.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/device_description_fetcher.h" +#include "chrome/browser/media/router/discovery/dial/device_description_fetcher.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_thread.h" #include "net/base/load_flags.h" @@ -25,9 +25,7 @@ // should be more than sufficient. constexpr int kMaxDescriptionSizeBytes = 262144; -namespace extensions { -namespace api { -namespace dial { +namespace media_router { DeviceDescriptionFetcher::DeviceDescriptionFetcher( const GURL& device_description_url, @@ -177,6 +175,4 @@ std::move(error_cb_).Run(message); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/device_description_fetcher.h b/chrome/browser/media/router/discovery/dial/device_description_fetcher.h similarity index 86% rename from chrome/browser/extensions/api/dial/device_description_fetcher.h rename to chrome/browser/media/router/discovery/dial/device_description_fetcher.h index 8a4a8f56..3287f72 100644 --- a/chrome/browser/extensions/api/dial/device_description_fetcher.h +++ b/chrome/browser/media/router/discovery/dial/device_description_fetcher.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_DIAL_DEVICE_DESCRIPTION_FETCHER_H_ -#define CHROME_BROWSER_EXTENSIONS_API_DIAL_DEVICE_DESCRIPTION_FETCHER_H_ +#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_FETCHER_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_FETCHER_H_ #include <memory> #include <string> @@ -19,9 +19,7 @@ class URLRequestContextGetter; } -namespace extensions { -namespace api { -namespace dial { +namespace media_router { struct DialDeviceDescriptionData; @@ -70,8 +68,6 @@ std::unique_ptr<net::URLFetcher> fetcher_; }; -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router -#endif // CHROME_BROWSER_EXTENSIONS_API_DIAL_DEVICE_DESCRIPTION_FETCHER_H_ +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_FETCHER_H_
diff --git a/chrome/browser/extensions/api/dial/device_description_fetcher_unittest.cc b/chrome/browser/media/router/discovery/dial/device_description_fetcher_unittest.cc similarity index 95% rename from chrome/browser/extensions/api/dial/device_description_fetcher_unittest.cc rename to chrome/browser/media/router/discovery/dial/device_description_fetcher_unittest.cc index 7a64f4b8..ba31a04 100644 --- a/chrome/browser/extensions/api/dial/device_description_fetcher_unittest.cc +++ b/chrome/browser/media/router/discovery/dial/device_description_fetcher_unittest.cc
@@ -9,8 +9,8 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" -#include "chrome/browser/extensions/api/dial/device_description_fetcher.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/device_description_fetcher.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/test_browser_thread_bundle.h" #include "net/http/http_response_headers.h" @@ -20,9 +20,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" -namespace extensions { -namespace api { -namespace dial { +namespace media_router { class DeviceDescriptionFetcherTest : public testing::Test { public: @@ -174,6 +172,4 @@ test_fetcher->delegate()->OnURLFetchComplete(test_fetcher); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_device_data.cc b/chrome/browser/media/router/discovery/dial/dial_device_data.cc similarity index 65% rename from chrome/browser/extensions/api/dial/dial_device_data.cc rename to chrome/browser/media/router/discovery/dial/dial_device_data.cc index 1db2e5c..c130b834 100644 --- a/chrome/browser/extensions/api/dial/dial_device_data.cc +++ b/chrome/browser/media/router/discovery/dial/dial_device_data.cc
@@ -2,26 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" -#include "chrome/common/extensions/api/dial.h" +namespace media_router { -namespace extensions { -namespace api { -namespace dial { - -DialDeviceData::DialDeviceData() : max_age_(-1), config_id_(-1) { } +DialDeviceData::DialDeviceData() : max_age_(-1), config_id_(-1) {} DialDeviceData::DialDeviceData(const std::string& device_id, const GURL& device_description_url, const base::Time& response_time) - : device_id_(device_id), device_description_url_(device_description_url), - response_time_(response_time), max_age_(-1), config_id_(-1) { -} + : device_id_(device_id), + device_description_url_(device_description_url), + response_time_(response_time), + max_age_(-1), + config_id_(-1) {} DialDeviceData::DialDeviceData(const DialDeviceData& other) = default; -DialDeviceData::~DialDeviceData() { } +DialDeviceData::~DialDeviceData() {} const GURL& DialDeviceData::device_description_url() const { return device_description_url_; @@ -48,20 +46,9 @@ return updated_api_visible_field; } -void DialDeviceData::FillDialDevice(api::dial::DialDevice* device) const { - DCHECK(!device_id_.empty()); - DCHECK(IsDeviceDescriptionUrl(device_description_url_)); - device->device_label = label_; - device->device_description_url = device_description_url_.spec(); - if (has_config_id()) - device->config_id.reset(new int(config_id_)); -} - DialDeviceDescriptionData::DialDeviceDescriptionData( const std::string& device_description, const GURL& app_url) : device_description(device_description), app_url(app_url) {} -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_device_data.h b/chrome/browser/media/router/discovery/dial/dial_device_data.h similarity index 82% rename from chrome/browser/extensions/api/dial/dial_device_data.h rename to chrome/browser/media/router/discovery/dial/dial_device_data.h index 4706885..01ace7b3 100644 --- a/chrome/browser/extensions/api/dial/dial_device_data.h +++ b/chrome/browser/media/router/discovery/dial/dial_device_data.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_DEVICE_DATA_H_ -#define CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_DEVICE_DATA_H_ +#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_DEVICE_DATA_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_DEVICE_DATA_H_ #include <string> #include <vector> @@ -12,11 +12,7 @@ #include "base/values.h" #include "url/gurl.h" -namespace extensions { -namespace api { -namespace dial { - -struct DialDevice; +namespace media_router { // Dial device information that is used within the DialService and Registry on // the IO thread. It is updated as new information arrives and a list of @@ -35,14 +31,10 @@ } const std::string& device_id() const { return device_id_; } - void set_device_id(const std::string& id) { - device_id_ = id; - } + void set_device_id(const std::string& id) { device_id_ = id; } const std::string& label() const { return label_; } - void set_label(const std::string& label) { - label_ = label; - } + void set_label(const std::string& label) { label_ = label; } const GURL& device_description_url() const; void set_device_description_url(const GURL& url); @@ -60,9 +52,6 @@ void set_config_id(int config_id) { config_id_ = config_id; } bool has_config_id() const { return config_id_ >= 0; } - // Fills the |device| API struct from this instance. - void FillDialDevice(api::dial::DialDevice* device) const; - // Updates this DeviceData based on information from a new response in // |new_data|. Returns |true| if a field was updated that is visible through // the DIAL API. @@ -102,8 +91,6 @@ GURL app_url; }; -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router -#endif // CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_DEVICE_DATA_H_ +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_DEVICE_DATA_H_
diff --git a/chrome/browser/extensions/api/dial/dial_device_data_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_device_data_unittest.cc similarity index 80% rename from chrome/browser/extensions/api/dial/dial_device_data_unittest.cc rename to chrome/browser/media/router/discovery/dial/dial_device_data_unittest.cc index fc079a3..ac78065 100644 --- a/chrome/browser/extensions/api/dial/dial_device_data_unittest.cc +++ b/chrome/browser/media/router/discovery/dial/dial_device_data_unittest.cc
@@ -2,13 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/dial_device_data.h" -#include "chrome/common/extensions/api/dial.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" #include "testing/gtest/include/gtest/gtest.h" -namespace extensions { -namespace api { -namespace dial { +namespace media_router { namespace { @@ -24,22 +21,6 @@ } // namespace -TEST(DialDeviceDataTest, TestFillDialDevice) { - api::dial::DialDevice api_device; - - DialDeviceData device; - device.set_device_id("device"); - device.set_label("label"); - device.set_device_description_url(GURL("http://127.0.0.1/dd.xml")); - device.set_config_id(1); - - device.FillDialDevice(&api_device); - EXPECT_EQ(api_device.device_label, device.label()); - EXPECT_EQ(api_device.device_description_url, - device.device_description_url().spec()); - EXPECT_EQ(*(api_device.config_id), device.config_id()); -} - TEST(DialDeviceDataTest, TestUpdateFrom) { DialDeviceData original; original.set_device_id("device_a"); @@ -103,6 +84,4 @@ DialDeviceData::IsDeviceDescriptionUrl(GURL("file://path/to/file"))); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_registry.cc b/chrome/browser/media/router/discovery/dial/dial_registry.cc similarity index 93% rename from chrome/browser/extensions/api/dial/dial_registry.cc rename to chrome/browser/media/router/discovery/dial/dial_registry.cc index 280c6f0..bb6459a 100644 --- a/chrome/browser/extensions/api/dial/dial_registry.cc +++ b/chrome/browser/media/router/discovery/dial/dial_registry.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/dial_registry.h" +#include "chrome/browser/media/router/discovery/dial/dial_registry.h" #include <memory> #include <utility> @@ -13,10 +13,8 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/extensions/api/dial/dial_api.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" -#include "chrome/browser/extensions/api/dial/dial_service.h" -#include "chrome/common/extensions/api/dial.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_service.h" #include "components/net_log/chrome_net_log.h" #include "content/public/browser/browser_thread.h" @@ -25,9 +23,7 @@ using content::BrowserThread; using net::NetworkChangeNotifier; -namespace extensions { -namespace api { -namespace dial { +namespace media_router { DialRegistry::DialRegistry(base::TimeDelta refresh_interval, base::TimeDelta expiration, @@ -157,9 +153,7 @@ dial_ = CreateDialService(); dial_->AddObserver(this); DoDiscovery(); - repeating_timer_.Start(FROM_HERE, - refresh_interval_delta_, - this, + repeating_timer_.Start(FROM_HERE, refresh_interval_delta_, this, &DialRegistry::DoDiscovery); } @@ -214,7 +208,7 @@ // Check against the device's cache-control header, if set. if (device.has_max_age()) { Time max_age_expiration_time = - device.response_time() + TimeDelta::FromSeconds(device.max_age()); + device.response_time() + TimeDelta::FromSeconds(device.max_age()); if (now > max_age_expiration_time) return true; } @@ -231,8 +225,9 @@ void DialRegistry::MaybeSendEvent() { // Send an event if the device list has changed since the last event. bool needs_event = last_event_registry_generation_ < registry_generation_; - VLOG(2) << "lerg = " << last_event_registry_generation_ << ", rg = " - << registry_generation_ << ", needs_event = " << needs_event; + VLOG(2) << "lerg = " << last_event_registry_generation_ + << ", rg = " << registry_generation_ + << ", needs_event = " << needs_event; if (needs_event) SendEvent(); } @@ -372,6 +367,4 @@ observer.OnDialError(type); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_registry.h b/chrome/browser/media/router/discovery/dial/dial_registry.h similarity index 94% rename from chrome/browser/extensions/api/dial/dial_registry.h rename to chrome/browser/media/router/discovery/dial/dial_registry.h index f0597e02..12250ff4 100644 --- a/chrome/browser/extensions/api/dial/dial_registry.h +++ b/chrome/browser/media/router/discovery/dial/dial_registry.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_REGISTRY_H_ -#define CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_REGISTRY_H_ +#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_REGISTRY_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_REGISTRY_H_ #include <stddef.h> @@ -19,13 +19,11 @@ #include "base/observer_list.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "chrome/browser/extensions/api/dial/dial_service.h" +#include "chrome/browser/media/router/discovery/dial/dial_service.h" #include "chrome/browser/profiles/profile.h" #include "net/base/network_change_notifier.h" -namespace extensions { -namespace api { -namespace dial { +namespace media_router { // Keeps track of devices that have responded to discovery requests and notifies // the observer with an updated, complete set of active devices. The registry's @@ -203,8 +201,6 @@ DISALLOW_COPY_AND_ASSIGN(DialRegistry); }; -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router -#endif // CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_REGISTRY_H_ +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_REGISTRY_H_
diff --git a/chrome/browser/extensions/api/dial/dial_registry_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_registry_unittest.cc similarity index 95% rename from chrome/browser/extensions/api/dial/dial_registry_unittest.cc rename to chrome/browser/media/router/discovery/dial/dial_registry_unittest.cc index bbe6a9d..22c65e9 100644 --- a/chrome/browser/extensions/api/dial/dial_registry_unittest.cc +++ b/chrome/browser/media/router/discovery/dial/dial_registry_unittest.cc
@@ -5,9 +5,9 @@ #include <stddef.h> #include "base/memory/ptr_util.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" -#include "chrome/browser/extensions/api/dial/dial_registry.h" -#include "chrome/browser/extensions/api/dial/dial_service.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_registry.h" +#include "chrome/browser/media/router/discovery/dial/dial_service.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/test_browser_thread_bundle.h" #include "testing/gmock/include/gmock/gmock.h" @@ -21,9 +21,7 @@ using ::testing::Return; using ::testing::InSequence; -namespace extensions { -namespace api { -namespace dial { +namespace media_router { class MockDialObserver : public DialRegistry::Observer { public: @@ -60,9 +58,7 @@ } // Returns the mock Dial service. - MockDialService& mock_service() { - return mock_service_; - } + MockDialService& mock_service() { return mock_service_; } void set_time(Time time) { time_ = time; } @@ -228,8 +224,7 @@ discovery_times.push_back(discovery_times[0] + TimeDelta::FromSeconds(30)); discovery_times.push_back(discovery_times[1] + TimeDelta::FromSeconds(30)); - DialDeviceData rediscovered_device("first", - GURL("http://127.0.0.1/dd.xml"), + DialDeviceData rediscovered_device("first", GURL("http://127.0.0.1/dd.xml"), discovery_times[2]); SetListenerExpectations(); @@ -334,10 +329,10 @@ // to be added twice. EXPECT_CALL(registry_->mock_service(), AddObserver(A<DialService::Observer*>())) - .Times(2); + .Times(2); EXPECT_CALL(registry_->mock_service(), RemoveObserver(A<DialService::Observer*>())) - .Times(2); + .Times(2); InSequence s; EXPECT_CALL(registry_->mock_service(), Discover()); @@ -377,6 +372,4 @@ registry_->OnListenerRemoved(); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_service.cc b/chrome/browser/media/router/discovery/dial/dial_service.cc similarity index 91% rename from chrome/browser/extensions/api/dial/dial_service.cc rename to chrome/browser/media/router/discovery/dial/dial_service.cc index 679b6b0d..a03fe0c2 100644 --- a/chrome/browser/extensions/api/dial/dial_service.cc +++ b/chrome/browser/media/router/discovery/dial/dial_service.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/dial_service.h" +#include "chrome/browser/media/router/discovery/dial/dial_service.h" #include <stdint.h> @@ -21,7 +21,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" #include "components/version_info/version_info.h" #include "content/public/browser/browser_thread.h" #include "net/base/address_family.h" @@ -54,9 +54,7 @@ using net::StringIOBuffer; using net::UDPSocket; -namespace extensions { -namespace api { -namespace dial { +namespace media_router { namespace { @@ -91,7 +89,8 @@ const int kDialRecvBufferSize = 1500; // Gets a specific header from |headers| and puts it in |value|. -bool GetHeader(HttpResponseHeaders* headers, const char* name, +bool GetHeader(HttpResponseHeaders* headers, + const char* name, std::string* value) { return headers->EnumerateHeader(nullptr, std::string(name), value); } @@ -107,11 +106,8 @@ "ST: %s\r\n" "USER-AGENT: %s/%s %s\r\n" "\r\n", - kDialRequestAddress, - kDialRequestPort, - kDialMaxResponseDelaySecs, - kDialSearchType, - version_info::GetProductName().c_str(), + kDialRequestAddress, kDialRequestPort, kDialMaxResponseDelaySecs, + kDialSearchType, version_info::GetProductName().c_str(), version_info::GetVersionNumber().c_str(), version_info::GetOSType().c_str())); // 1500 is a good MTU value for most Ethernet LANs. @@ -126,7 +122,8 @@ void InsertBestBindAddressChromeOS(const chromeos::NetworkTypePattern& type, net::IPAddressList* bind_address_list) { const chromeos::NetworkState* state = chromeos::NetworkHandler::Get() - ->network_state_handler()->ConnectedNetworkByType(type); + ->network_state_handler() + ->ConnectedNetworkByType(type); IPAddress bind_ip_address; if (state && bind_ip_address.AssignFromIPLiteral(state->ip_address()) && bind_ip_address.IsIPv4()) { @@ -204,11 +201,10 @@ } is_writing_ = true; - int result = socket_->SendTo( - send_buffer.get(), send_buffer->size(), send_address, - base::Bind(&DialServiceImpl::DialSocket::OnSocketWrite, - base::Unretained(this), - send_buffer->size())); + int result = + socket_->SendTo(send_buffer.get(), send_buffer->size(), send_address, + base::Bind(&DialServiceImpl::DialSocket::OnSocketWrite, + base::Unretained(this), send_buffer->size())); bool result_ok = CheckResult("SendTo", result); if (result_ok && result > 0) { // Synchronous write. @@ -249,8 +245,8 @@ if (!CheckResult("OnSocketWrite", result)) return; if (result != send_buffer_size) { - VLOG(1) << "Sent " << result << " chars, expected " - << send_buffer_size << " chars"; + VLOG(1) << "Sent " << result << " chars, expected " << send_buffer_size + << " chars"; } discovery_request_cb_.Run(); } @@ -272,8 +268,7 @@ do { is_reading_ = true; result = socket_->RecvFrom( - recv_buffer_.get(), - kDialRecvBufferSize, &recv_address_, + recv_buffer_.get(), kDialRecvBufferSize, &recv_address_, base::Bind(&DialServiceImpl::DialSocket::OnSocketRead, base::Unretained(this))); result_ok = CheckResult("RecvFrom", result); @@ -319,12 +314,11 @@ } // static -bool DialServiceImpl::DialSocket::ParseResponse( - const std::string& response, - const base::Time& response_time, - DialDeviceData* device) { - int headers_end = HttpUtil::LocateEndOfHeaders(response.c_str(), - response.size()); +bool DialServiceImpl::DialSocket::ParseResponse(const std::string& response, + const base::Time& response_time, + DialDeviceData* device) { + int headers_end = + HttpUtil::LocateEndOfHeaders(response.c_str(), response.size()); if (headers_end < 1) { VLOG(1) << "Headers invalid or empty, ignoring: " << response; return false; @@ -475,9 +469,9 @@ if (addr_family == net::ADDRESS_FAMILY_IPV4) { InterfaceIndexAddressFamily interface_index_addr_family = std::make_pair(iter->interface_index, addr_family); - bool inserted = interface_index_addr_family_seen - .insert(interface_index_addr_family) - .second; + bool inserted = + interface_index_addr_family_seen.insert(interface_index_addr_family) + .second; // We have not seen this interface before, so add its IP address to the // discovery list. if (inserted) { @@ -509,9 +503,7 @@ // Schedule a timer to finish the discovery process (and close the sockets). if (finish_delay_ > TimeDelta::FromSeconds(0)) { VLOG(2) << "Starting timer to finish discovery."; - finish_timer_.Start(FROM_HERE, - finish_delay_, - this, + finish_timer_.Start(FROM_HERE, finish_delay_, this, &DialServiceImpl::FinishDiscovery); } @@ -547,8 +539,7 @@ return; } num_requests_sent_++; - VLOG(2) << "Sending request " << num_requests_sent_ << "/" - << max_requests_; + VLOG(2) << "Sending request " << num_requests_sent_ << "/" << max_requests_; for (const auto& socket : dial_sockets_) { if (!socket->IsClosed()) socket->SendOneRequest(send_address_, send_buffer_); @@ -571,9 +562,7 @@ VLOG(2) << "Scheduling timer to send additional requests"; // TODO(imcheng): Move this to SendOneRequest() once the implications are // understood. - request_timer_.Start(FROM_HERE, - request_interval_, - this, + request_timer_.Start(FROM_HERE, request_interval_, this, &DialServiceImpl::SendOneRequest); } } @@ -621,6 +610,4 @@ return false; } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/extensions/api/dial/dial_service.h b/chrome/browser/media/router/discovery/dial/dial_service.h similarity index 96% rename from chrome/browser/extensions/api/dial/dial_service.h rename to chrome/browser/media/router/discovery/dial/dial_service.h index dfe56c19..11935d7 100644 --- a/chrome/browser/extensions/api/dial/dial_service.h +++ b/chrome/browser/media/router/discovery/dial/dial_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_SERVICE_H_ -#define CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_SERVICE_H_ +#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_SERVICE_H_ +#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_SERVICE_H_ #include <memory> #include <string> @@ -24,9 +24,7 @@ class NetLog; } -namespace extensions { -namespace api { -namespace dial { +namespace media_router { class DialDeviceData; @@ -292,8 +290,6 @@ DISALLOW_COPY_AND_ASSIGN(DialServiceImpl); }; -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router -#endif // CHROME_BROWSER_EXTENSIONS_API_DIAL_DIAL_SERVICE_H_ +#endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DIAL_SERVICE_H_
diff --git a/chrome/browser/extensions/api/dial/dial_service_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_service_unittest.cc similarity index 64% rename from chrome/browser/extensions/api/dial/dial_service_unittest.cc rename to chrome/browser/media/router/discovery/dial/dial_service_unittest.cc index 9c46751..a90112f 100644 --- a/chrome/browser/extensions/api/dial/dial_service_unittest.cc +++ b/chrome/browser/media/router/discovery/dial/dial_service_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/dial/dial_service.h" +#include "chrome/browser/media/router/discovery/dial/dial_service.h" #include <stddef.h> @@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" -#include "chrome/browser/extensions/api/dial/dial_device_data.h" +#include "chrome/browser/media/router/discovery/dial/dial_device_data.h" #include "content/public/test/test_browser_thread_bundle.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" @@ -29,17 +29,15 @@ namespace { const char kValidResponse[] = - "HTTP/1.1 OK\r\n" - "LOCATION: http://127.0.0.1/dd.xml\r\n" - "USN: some_id\r\n" - "CACHE-CONTROL: max-age=1800\r\n" - "CONFIGID.UPNP.ORG: 1\r\n\r\n"; + "HTTP/1.1 OK\r\n" + "LOCATION: http://127.0.0.1/dd.xml\r\n" + "USN: some_id\r\n" + "CACHE-CONTROL: max-age=1800\r\n" + "CONFIGID.UPNP.ORG: 1\r\n\r\n"; } // namespace -namespace extensions { -namespace api { -namespace dial { +namespace media_router { class MockObserver : public DialService::Observer { public: @@ -48,8 +46,8 @@ MOCK_METHOD1(OnDiscoveryRequest, void(DialService*)); MOCK_METHOD2(OnDeviceDiscovered, void(DialService*, const DialDeviceData&)); MOCK_METHOD1(OnDiscoveryFinished, void(DialService*)); - MOCK_METHOD2(OnError, void(DialService*, - const DialService::DialServiceErrorCode&)); + MOCK_METHOD2(OnError, + void(DialService*, const DialService::DialServiceErrorCode&)); }; class DialServiceTest : public testing::Test { @@ -61,6 +59,7 @@ dial_service_.AddObserver(&mock_observer_); dial_socket_ = dial_service_.CreateDialSocket(); } + protected: content::TestBrowserThreadBundle thread_bundle_; net::TestNetLog test_net_log_; @@ -94,41 +93,21 @@ dial_service_.max_requests_ = 4; dial_service_.discovery_active_ = true; net::NetworkInterfaceList interface_list; - interface_list.push_back( - net::NetworkInterface("network1", - "network1", - 0, - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, - mock_ip_, - 0, - net::IP_ADDRESS_ATTRIBUTE_NONE)); - interface_list.push_back( - net::NetworkInterface("network2", - "network2", - 1, - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, - mock_ip_, - 0, - net::IP_ADDRESS_ATTRIBUTE_NONE)); - interface_list.push_back( - net::NetworkInterface("network3", - "network3", - 2, - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, - mock_ip_, - 0, - net::IP_ADDRESS_ATTRIBUTE_NONE)); + interface_list.push_back(net::NetworkInterface( + "network1", "network1", 0, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, + mock_ip_, 0, net::IP_ADDRESS_ATTRIBUTE_NONE)); + interface_list.push_back(net::NetworkInterface( + "network2", "network2", 1, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, + mock_ip_, 0, net::IP_ADDRESS_ATTRIBUTE_NONE)); + interface_list.push_back(net::NetworkInterface( + "network3", "network3", 2, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, + mock_ip_, 0, net::IP_ADDRESS_ATTRIBUTE_NONE)); // "network4" is equivalent to "network2" because both the address family // and interface index are the same. - interface_list.push_back( - net::NetworkInterface("network4", - "network4", - 1, - net::NetworkChangeNotifier::CONNECTION_UNKNOWN, - mock_ip_, - 0, - net::IP_ADDRESS_ATTRIBUTE_NONE)); + interface_list.push_back(net::NetworkInterface( + "network4", "network4", 1, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, + mock_ip_, 0, net::IP_ADDRESS_ATTRIBUTE_NONE)); // 3 sockets * 4 requests per socket = 12 requests EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(12); @@ -153,11 +132,8 @@ TEST_F(DialServiceTest, TestOnDeviceDiscovered) { dial_service_.discovery_active_ = true; int response_size = arraysize(kValidResponse) - 1; - dial_socket_->recv_buffer_ = - new net::IOBufferWithSize(response_size); - strncpy(dial_socket_->recv_buffer_->data(), - kValidResponse, - response_size); + dial_socket_->recv_buffer_ = new net::IOBufferWithSize(response_size); + strncpy(dial_socket_->recv_buffer_->data(), kValidResponse, response_size); dial_socket_->recv_address_ = net::IPEndPoint(mock_ip_, 12345); DialDeviceData expected_device; @@ -182,8 +158,8 @@ // Successful case DialDeviceData parsed; - EXPECT_TRUE(DialServiceImpl::DialSocket::ParseResponse( - kValidResponse, now, &parsed)); + EXPECT_TRUE( + DialServiceImpl::DialSocket::ParseResponse(kValidResponse, now, &parsed)); EXPECT_EQ("some_id", parsed.device_id()); EXPECT_EQ("http://127.0.0.1/dd.xml", parsed.device_description_url().spec()); EXPECT_EQ(1, parsed.config_id()); @@ -193,32 +169,29 @@ DialDeviceData not_parsed; // Empty, garbage - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - std::string(), now, ¬_parsed)); - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - "\r\n\r\n", - now, ¬_parsed)); - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - "xyzzy", - now, ¬_parsed)); + EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(std::string(), now, + ¬_parsed)); + EXPECT_FALSE( + DialServiceImpl::DialSocket::ParseResponse("\r\n\r\n", now, ¬_parsed)); + EXPECT_FALSE( + DialServiceImpl::DialSocket::ParseResponse("xyzzy", now, ¬_parsed)); // No headers - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - "HTTP/1.1 OK\r\n\r\n", - now, ¬_parsed)); + EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse("HTTP/1.1 OK\r\n\r\n", + now, ¬_parsed)); // Missing LOCATION - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - "HTTP/1.1 OK\r\n" - "USN: some_id\r\n\r\n", - now, ¬_parsed)); + EXPECT_FALSE( + DialServiceImpl::DialSocket::ParseResponse("HTTP/1.1 OK\r\n" + "USN: some_id\r\n\r\n", + now, ¬_parsed)); // Empty LOCATION - EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( - "HTTP/1.1 OK\r\n" - "LOCATION:\r\n" - "USN: some_id\r\n\r\n", - now, ¬_parsed)); + EXPECT_FALSE( + DialServiceImpl::DialSocket::ParseResponse("HTTP/1.1 OK\r\n" + "LOCATION:\r\n" + "USN: some_id\r\n\r\n", + now, ¬_parsed)); // Missing USN EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse( @@ -234,6 +207,4 @@ now, ¬_parsed)); } -} // namespace dial -} // namespace api -} // namespace extensions +} // namespace media_router
diff --git a/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc b/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc index 48e2740..2103147 100644 --- a/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc +++ b/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc
@@ -253,7 +253,13 @@ DISALLOW_COPY_AND_ASSIGN(MediaFileValidatorTest); }; -IN_PROC_BROWSER_TEST_F(MediaFileValidatorTest, UnsupportedExtension) { +// Flaky on linux_chromium_rel_ng. https://crbug.com/704614. +#if defined(OS_LINUX) +#define MAYBE_UnsupportedExtension DISABLED_UnsupportedExtension +#else +#define MAYBE_UnsupportedExtension UnsupportedExtension +#endif +IN_PROC_BROWSER_TEST_F(MediaFileValidatorTest, MAYBE_UnsupportedExtension) { MoveTest("a.txt", std::string(kValidImage, arraysize(kValidImage)), false); }
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.cc b/chrome/browser/metrics/chrome_metrics_service_accessor.cc index 49d0b57..5f0fb03e 100644 --- a/chrome/browser/metrics/chrome_metrics_service_accessor.cc +++ b/chrome/browser/metrics/chrome_metrics_service_accessor.cc
@@ -54,15 +54,15 @@ // static bool ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial( - const std::string& trial_name, - const std::string& group_name) { + base::StringPiece trial_name, + base::StringPiece group_name) { return metrics::MetricsServiceAccessor::RegisterSyntheticFieldTrial( g_browser_process->metrics_service(), trial_name, group_name); } // static bool ChromeMetricsServiceAccessor::RegisterSyntheticMultiGroupFieldTrial( - const std::string& trial_name, + base::StringPiece trial_name, const std::vector<uint32_t>& group_name_hashes) { return metrics::MetricsServiceAccessor::RegisterSyntheticMultiGroupFieldTrial( g_browser_process->metrics_service(), trial_name, group_name_hashes); @@ -71,7 +71,7 @@ // static bool ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrialWithNameHash( uint32_t trial_name_hash, - const std::string& group_name) { + base::StringPiece group_name) { return metrics::MetricsServiceAccessor:: RegisterSyntheticFieldTrialWithNameHash( g_browser_process->metrics_service(), trial_name_hash, group_name);
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h index 2f599ea..12b0423 100644 --- a/chrome/browser/metrics/chrome_metrics_service_accessor.h +++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -6,11 +6,11 @@ #define CHROME_BROWSER_METRICS_CHROME_METRICS_SERVICE_ACCESSOR_H_ #include <stdint.h> -#include <string> #include <vector> #include "base/gtest_prod_util.h" #include "base/macros.h" +#include "base/strings/string_piece.h" #include "chrome/browser/metrics/metrics_reporting_state.h" #include "components/metrics/metrics_service_accessor.h" @@ -143,14 +143,14 @@ // Calls metrics::MetricsServiceAccessor::RegisterSyntheticFieldTrial() with // g_browser_process->metrics_service(). See that function's declaration for // details. - static bool RegisterSyntheticFieldTrial(const std::string& trial_name, - const std::string& group_name); + static bool RegisterSyntheticFieldTrial(base::StringPiece trial_name, + base::StringPiece group_name); // Calls MetricsServiceAccessor::RegisterSyntheticMultiGroupFieldTrial() with // g_browser_process->metrics_service(). See that function's declaration for // details. static bool RegisterSyntheticMultiGroupFieldTrial( - const std::string& trial_name, + base::StringPiece trial_name, const std::vector<uint32_t>& group_name_hashes); // Calls @@ -159,7 +159,7 @@ // for details. static bool RegisterSyntheticFieldTrialWithNameHash( uint32_t trial_name_hash, - const std::string& group_name); + base::StringPiece group_name); DISALLOW_IMPLICIT_CONSTRUCTORS(ChromeMetricsServiceAccessor); };
diff --git a/chrome/browser/net/connect_interceptor_unittest.cc b/chrome/browser/net/connect_interceptor_unittest.cc deleted file mode 100644 index c13e959..0000000 --- a/chrome/browser/net/connect_interceptor_unittest.cc +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/net/connect_interceptor.h" - -#include "base/threading/platform_thread.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chrome_browser_net { - -// These tests are all focused ConnectInterceptor::TimedCache. -TEST(ConnectInterceptorTest, TimedCacheRecall) { - // Creat a cache that has a long expiration so that we can test basic recall. - ConnectInterceptor::TimedCache cache(base::TimeDelta::FromHours(1)); - - GURL url("http://google.com/anypath"); - GURL ssl_url("https://ssl_google.com/anypath"); - EXPECT_FALSE(cache.WasRecentlySeen(url)); - EXPECT_FALSE(cache.WasRecentlySeen(ssl_url)); - - cache.SetRecentlySeen(url); - - EXPECT_TRUE(cache.WasRecentlySeen(url)); - EXPECT_FALSE(cache.WasRecentlySeen(ssl_url)); - - cache.SetRecentlySeen(ssl_url); - - EXPECT_TRUE(cache.WasRecentlySeen(url)); - EXPECT_TRUE(cache.WasRecentlySeen(ssl_url)); - - // Check that port defaults correctly in canonicalization. - GURL url_with_port("http://google.com:80/anypath"); - GURL ssl_url_with_port("https://ssl_google.com:443/anypath"); - EXPECT_TRUE(cache.WasRecentlySeen(url_with_port)); - EXPECT_TRUE(cache.WasRecentlySeen(ssl_url_with_port)); - - // Check for similar urls, to verify canonicalization isn't too generous. - GURL ssl_url_wrong_host("https://google.com/otherpath"); - GURL ssl_url_wrong_path("https://ssl_google.com/otherpath"); - GURL ssl_url_wrong_port("https://ssl_google.com:666/anypath"); - GURL url_wrong_scheme("ftp://google.com/anypath"); - GURL url_wrong_host("http://DOODLE.com/otherpath"); - GURL url_wrong_path("http://google.com/otherpath"); - GURL url_wrong_port("http://google.com:81/anypath"); - - EXPECT_FALSE(cache.WasRecentlySeen(ssl_url_wrong_host)); - EXPECT_FALSE(cache.WasRecentlySeen(ssl_url_wrong_path)); - EXPECT_FALSE(cache.WasRecentlySeen(ssl_url_wrong_port)); - - EXPECT_FALSE(cache.WasRecentlySeen(url_wrong_scheme)); - - EXPECT_FALSE(cache.WasRecentlySeen(url_wrong_host)); - EXPECT_FALSE(cache.WasRecentlySeen(url_wrong_path)); - EXPECT_FALSE(cache.WasRecentlySeen(url_wrong_port)); -} - -TEST(ConnectInterceptorTest, TimedCacheEviction) { - // Creat a cache that has a short expiration so that we can force evictions. - ConnectInterceptor::TimedCache cache(base::TimeDelta::FromMilliseconds(1)); - - GURL url("http://google.com/anypath"); - EXPECT_FALSE(cache.WasRecentlySeen(url)); - - cache.SetRecentlySeen(url); - - // Sleep at least long enough to cause an eviction. - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(30)); - - EXPECT_FALSE(cache.WasRecentlySeen(url)); -} - -} // namespace chrome_browser_net.
diff --git a/chrome/browser/ntp_snippets/ntp_snippets_features.cc b/chrome/browser/ntp_snippets/ntp_snippets_features.cc index 160400b..9b288f69 100644 --- a/chrome/browser/ntp_snippets/ntp_snippets_features.cc +++ b/chrome/browser/ntp_snippets/ntp_snippets_features.cc
@@ -11,7 +11,6 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const char kNotificationsPriorityParam[] = "priority"; -const char kNotificationsAlwaysNotifyParam[] = "always_notify"; const char kNotificationsUseSnippetAsTextParam[] = "use_snippet_as_text"; const char kNotificationsKeepWhenFrontmostParam[] = "keep_notification_when_frontmost";
diff --git a/chrome/browser/ntp_snippets/ntp_snippets_features.h b/chrome/browser/ntp_snippets/ntp_snippets_features.h index ad47da2..e25e2bd4 100644 --- a/chrome/browser/ntp_snippets/ntp_snippets_features.h +++ b/chrome/browser/ntp_snippets/ntp_snippets_features.h
@@ -18,10 +18,6 @@ extern const char kNotificationsPriorityParam[]; constexpr int kNotificationsDefaultPriority = -1; -// "false": use server signals to decide whether to send a notification -// "true": always send a notification when we receive ARTICLES suggestions -extern const char kNotificationsAlwaysNotifyParam[]; - // "true": use article's snippet as notification's text // "false": use article's publisher as notification's text extern const char kNotificationsUseSnippetAsTextParam[];
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index c9f6e1c..9ec61061 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -2083,14 +2083,8 @@ // Check that a password form in an iframe of same origin will not be // filled in until user interact with the iframe. -// TODO(crbug.com/683209): Flaky on Win7 dbg. -#if defined(OS_WIN) -#define MAYBE_SameOriginIframeAutoFillTest DISABLED_SameOriginIframeAutoFillTest -#else -#define MAYBE_SameOriginIframeAutoFillTest SameOriginIframeAutoFillTest -#endif IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, - MAYBE_SameOriginIframeAutoFillTest) { + SameOriginIframeAutoFillTest) { // Visit the sign-up form to store a password for autofill later NavigateToFile("/password/password_form_in_same_origin_iframe.html"); NavigationObserver observer(WebContents());
diff --git a/chrome/browser/password_manager/password_manager_test_base.cc b/chrome/browser/password_manager/password_manager_test_base.cc index e51a9926..d691c3a 100644 --- a/chrome/browser/password_manager/password_manager_test_base.cc +++ b/chrome/browser/password_manager/password_manager_test_base.cc
@@ -400,20 +400,20 @@ const std::string& iframe_id, const std::string& element_id, const std::string& expected_value) { - const std::string value_check_script = base::StringPrintf( + const std::string value_get_script = base::StringPrintf( "if (%s)" " var element = document.getElementById(" " '%s').contentDocument.getElementById('%s');" "else " " var element = document.getElementById('%s');" - "window.domAutomationController.send(element && element.value == '%s');", + "var value = element ? element.value : 'element not found';" + "window.domAutomationController.send(value);", iframe_id.c_str(), iframe_id.c_str(), element_id.c_str(), - element_id.c_str(), expected_value.c_str()); - bool return_value = false; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - RenderViewHost(), value_check_script, &return_value)); - EXPECT_TRUE(return_value) << "element_id = " << element_id - << ", expected_value = " << expected_value; + element_id.c_str()); + std::string return_value; + ASSERT_TRUE(content::ExecuteScriptAndExtractString( + RenderViewHost(), value_get_script, &return_value)); + EXPECT_EQ(expected_value, return_value) << "element_id = " << element_id; } void PasswordManagerBrowserTestBase::AddHSTSHost(const std::string& host) {
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 77e005b..7a7472ce 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -80,7 +80,6 @@ #include "apps/browser_context_keyed_service_factories.h" #include "chrome/browser/apps/shortcut_manager_factory.h" #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_factory_impl.h" -#include "chrome/browser/extensions/api/networking_private/networking_private_verify_delegate_factory_impl.h" #include "chrome/browser/extensions/browser_context_keyed_service_factories.h" #include "chrome/browser/extensions/extension_management.h" #include "chrome/browser/search/hotword_service_factory.h" @@ -126,6 +125,7 @@ #include "chrome/browser/android/data_usage/data_use_ui_tab_model_factory.h" #include "chrome/browser/android/search_geolocation/search_geolocation_service.h" #else +#include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/ui/global_error/global_error_service_factory.h" #include "chrome/browser/usb/usb_chooser_context_factory.h" #endif @@ -212,6 +212,9 @@ CloudPrintProxyServiceFactory::GetInstance(); #endif CookieSettingsFactory::GetInstance(); +#if !defined(OS_ANDROID) + ChromeCryptAuthServiceFactory::GetInstance(); +#endif #if BUILDFLAG(ENABLE_EXTENSIONS) ExtensionWelcomeNotificationFactory::GetInstance(); #endif @@ -263,12 +266,6 @@ #endif #if BUILDFLAG(ENABLE_EXTENSIONS) #if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_MACOSX) - std::unique_ptr<extensions::NetworkingPrivateVerifyDelegateFactoryImpl> - networking_private_verify_delegate_factory( - new extensions::NetworkingPrivateVerifyDelegateFactoryImpl); - extensions::NetworkingPrivateDelegateFactory::GetInstance() - ->SetVerifyDelegateFactory( - std::move(networking_private_verify_delegate_factory)); std::unique_ptr<extensions::NetworkingPrivateUIDelegateFactoryImpl> networking_private_ui_delegate_factory( new extensions::NetworkingPrivateUIDelegateFactoryImpl);
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc index ea33467..5ebb2de2 100644 --- a/chrome/browser/profiles/profile_downloader.cc +++ b/chrome/browser/profiles/profile_downloader.cc
@@ -31,7 +31,6 @@ #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_client.h" #include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/profile_management_switches.h" #include "content/public/browser/browser_thread.h" #include "google_apis/gaia/gaia_constants.h" #include "net/base/load_flags.h" @@ -194,9 +193,8 @@ Profile* profile = delegate_->GetBrowserProfile(); OAuth2TokenService::ScopeSet scopes; scopes.insert(GaiaConstants::kGoogleUserInfoProfile); - // Increase scope to get hd attribute to determine if lock should be enabled. - if (switches::IsNewProfileManagement()) - scopes.insert(GaiaConstants::kGoogleUserInfoEmail); + // Required to determine if lock should be enabled. + scopes.insert(GaiaConstants::kGoogleUserInfoEmail); ProfileOAuth2TokenService* token_service = ProfileOAuth2TokenServiceFactory::GetForProfile(profile); oauth2_access_token_request_ = token_service->StartRequest(
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 0c4229c8..563b333 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -81,7 +81,6 @@ #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/gaia_cookie_manager_service.h" #include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/profile_management_switches.h" #include "components/signin/core/common/signin_pref_names.h" #include "components/sync/base/stop_source.h" #include "content/public/browser/browser_thread.h" @@ -1211,8 +1210,16 @@ HostContentSettingsMap* content_settings_map = HostContentSettingsMapFactory::GetForProfile(profile); + bool extensions_enabled = !go_off_the_record; +#if defined(OS_CHROMEOS) + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableLoginScreenApps) && + chromeos::ProfileHelper::IsSigninProfile(profile)) { + extensions_enabled = true; + } +#endif extensions::ExtensionSystem::Get(profile)->InitForRegularProfile( - !go_off_the_record); + extensions_enabled); // During tests, when |profile| is an instance of TestingProfile, // ExtensionSystem might not create an ExtensionService. // This block is duplicated in the HostContentSettingsMapFactory @@ -1245,8 +1252,7 @@ // If the lock enabled algorithm changed, update this profile's lock status. // This depends on services which shouldn't be initialized until // DoFinalInitForServices. - if (switches::IsNewProfileManagement()) - profiles::UpdateIsProfileLockEnabledIfNeeded(profile); + profiles::UpdateIsProfileLockEnabledIfNeeded(profile); #endif // Start the deferred task runners once the profile is loaded. StartupTaskRunnerServiceFactory::GetForProfile(profile)->
diff --git a/chrome/browser/profiles/profile_manager_browsertest.cc b/chrome/browser/profiles/profile_manager_browsertest.cc index 1c5fec1..f0287d7 100644 --- a/chrome/browser/profiles/profile_manager_browsertest.cc +++ b/chrome/browser/profiles/profile_manager_browsertest.cc
@@ -7,12 +7,8 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/macros.h" -#include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "chrome/browser/lifetime/keep_alive_types.h" -#include "chrome/browser/lifetime/scoped_keep_alive.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" @@ -63,39 +59,6 @@ base::MessageLoop::current()->QuitWhenIdle(); } -// An observer returns back to test code after one or more profiles was deleted. -// It has ScopedKeepAlive object to prevent browser shutdown started in case -// browser become windowless. -class MultipleProfileDeletionObserver { - public: - explicit MultipleProfileDeletionObserver(size_t callbacks_calls_expected) - : callback_calls_left_(callbacks_calls_expected) { - EXPECT_LT(0u, callback_calls_left_); - } - ProfileManager::CreateCallback QuitAttemptClosure() { - return base::Bind(&MultipleProfileDeletionObserver::QuitAttempt, - base::Unretained(this)); - } - void Wait() { - keep_alive_ = base::MakeUnique<ScopedKeepAlive>( - KeepAliveOrigin::PROFILE_HELPER, KeepAliveRestartOption::DISABLED); - loop_.Run(); - } - - private: - void QuitAttempt(Profile* profile, Profile::CreateStatus status) { - EXPECT_EQ(Profile::CREATE_STATUS_INITIALIZED, status); - if (--callback_calls_left_) - return; - keep_alive_.reset(nullptr); - loop_.Quit(); - } - - base::RunLoop loop_; - size_t callback_calls_left_; - std::unique_ptr<ScopedKeepAlive> keep_alive_; -}; - void EphemeralProfileCreationComplete(Profile* profile, Profile::CreateStatus status) { if (status == Profile::CREATE_STATUS_INITIALIZED) @@ -117,21 +80,14 @@ std::string last_used_profile_name() { return last_used_profile_name_; } - void set_on_profile_removal_callback(const base::Closure& callback) { - on_profile_removal_callback_ = callback; - } - // ProfileAttributesStorage::Observer overrides: void OnProfileWillBeRemoved(const base::FilePath& profile_path) override { last_used_profile_name_ = g_browser_process->local_state()->GetString( prefs::kProfileLastUsed); - if (!on_profile_removal_callback_.is_null()) - on_profile_removal_callback_.Run(); } private: std::string last_used_profile_name_; - base::Closure on_profile_removal_callback_; DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver); }; @@ -196,9 +152,7 @@ } }; -// Android does not support multi-profiles, and CrOS multi-profiles -// implementation is too different for these tests. -#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) +#if defined(OS_MACOSX) // Delete single profile and make sure a new one is created. IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteSingletonProfile) { @@ -214,13 +168,14 @@ base::FilePath singleton_profile_path = storage.GetAllProfilesAttributes().front()->GetPath(); EXPECT_FALSE(singleton_profile_path.empty()); - MultipleProfileDeletionObserver profile_deletion_observer(1u); + base::RunLoop run_loop; profile_manager->ScheduleProfileForDeletion( - singleton_profile_path, profile_deletion_observer.QuitAttemptClosure()); + singleton_profile_path, + base::Bind(&OnUnblockOnProfileCreation, &run_loop)); // Run the message loop until the profile is actually deleted (as indicated // by the callback above being called). - profile_deletion_observer.Wait(); + run_loop.Run(); // Make sure a new profile was created automatically. EXPECT_EQ(1u, storage.GetNumberOfProfiles()); @@ -239,78 +194,10 @@ EXPECT_EQ(last_used_profile_name, observer.last_used_profile_name()); } -// Delete inactive profile in a multi profile setup and make sure current -// browser is not affected. -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteInactiveProfile) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - ProfileAttributesStorage& storage = - profile_manager->GetProfileAttributesStorage(); - base::FilePath current_profile_path = browser()->profile()->GetPath(); - - // Create an additional profile. - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); - base::RunLoop run_loop; - profile_manager->CreateProfileAsync( - new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop), - base::string16(), std::string(), std::string()); - run_loop.Run(); - - ASSERT_EQ(2u, storage.GetNumberOfProfiles()); - - // Delete inactive profile. - base::RunLoop loop; - ProfileRemovalObserver observer; - observer.set_on_profile_removal_callback(loop.QuitClosure()); - profile_manager->ScheduleProfileForDeletion(new_path, - ProfileManager::CreateCallback()); - loop.Run(); - - // Make sure there only preexisted profile left. - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); - EXPECT_EQ(current_profile_path, - storage.GetAllProfilesAttributes().front()->GetPath()); - - // Make sure that last used profile preference is set correctly. - Profile* last_used = ProfileManager::GetLastUsedProfile(); - EXPECT_EQ(current_profile_path, last_used->GetPath()); -} - -// Delete current profile in a multi profile setup and make sure an existing one -// is loaded. -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteCurrentProfile) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - ProfileAttributesStorage& storage = - profile_manager->GetProfileAttributesStorage(); - - // Create an additional profile. - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); - base::RunLoop run_loop; - profile_manager->CreateProfileAsync( - new_path, base::Bind(&OnUnblockOnProfileCreation, &run_loop), - base::string16(), std::string(), std::string()); - run_loop.Run(); - - ASSERT_EQ(2u, storage.GetNumberOfProfiles()); - - // Delete current profile. - MultipleProfileDeletionObserver profile_deletion_observer(1u); - profile_manager->ScheduleProfileForDeletion( - browser()->profile()->GetPath(), - profile_deletion_observer.QuitAttemptClosure()); - profile_deletion_observer.Wait(); - - // Make sure a profile created earlier become the only profile. - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); - EXPECT_EQ(new_path, storage.GetAllProfilesAttributes().front()->GetPath()); - - // Make sure that last used profile preference is set correctly. - Profile* last_used = ProfileManager::GetLastUsedProfile(); - EXPECT_EQ(new_path, last_used->GetPath()); -} - // Delete all profiles in a multi profile setup and make sure a new one is // created. -IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DeleteAllProfiles) { +// Crashes/CHECKs. See crbug.com/104851 +IN_PROC_BROWSER_TEST_F(ProfileManagerBrowserTest, DISABLED_DeleteAllProfiles) { ProfileManager* profile_manager = g_browser_process->profile_manager(); ProfileAttributesStorage& storage = profile_manager->GetProfileAttributesStorage(); @@ -329,7 +216,6 @@ ASSERT_EQ(2u, storage.GetNumberOfProfiles()); // Delete all profiles. - MultipleProfileDeletionObserver profile_deletion_observer(2u); std::vector<ProfileAttributesEntry*> entries = storage.GetAllProfilesAttributes(); std::vector<base::FilePath> old_profile_paths; @@ -337,10 +223,12 @@ base::FilePath profile_path = entry->GetPath(); EXPECT_FALSE(profile_path.empty()); profile_manager->ScheduleProfileForDeletion( - profile_path, profile_deletion_observer.QuitAttemptClosure()); + profile_path, ProfileManager::CreateCallback()); old_profile_paths.push_back(profile_path); } - profile_deletion_observer.Wait(); + + // Spin things so deletion can take place. + content::RunAllPendingInMessageLoop(); // Make sure a new profile was created automatically. EXPECT_EQ(1u, storage.GetNumberOfProfiles()); @@ -353,7 +241,7 @@ Profile* last_used = ProfileManager::GetLastUsedProfile(); EXPECT_EQ(new_profile_path, last_used->GetPath()); } -#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) +#endif // OS_MACOSX #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/profile_window.cc b/chrome/browser/profiles/profile_window.cc index ec6a9e2..b2949270 100644 --- a/chrome/browser/profiles/profile_window.cc +++ b/chrome/browser/profiles/profile_window.cc
@@ -44,7 +44,6 @@ #include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/signin_manager.h" -#include "components/signin/core/common/profile_management_switches.h" #include "components/signin/core/common/signin_pref_names.h" #include "components/signin/core/common/signin_switches.h" #include "content/public/browser/browser_thread.h" @@ -407,9 +406,6 @@ bool IsLockAvailable(Profile* profile) { DCHECK(profile); - if (!switches::IsNewProfileManagement()) - return false; - if (profile->IsGuestSession() || profile->IsSystemProfile()) return false;
diff --git a/chrome/browser/profiles/profiles_state.cc b/chrome/browser/profiles/profiles_state.cc index 3604905..b0477f1 100644 --- a/chrome/browser/profiles/profiles_state.cc +++ b/chrome/browser/profiles/profiles_state.cc
@@ -29,7 +29,6 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" -#include "components/signin/core/common/profile_management_switches.h" #include "components/signin/core/common/signin_pref_names.h" #include "content/public/browser/resource_dispatcher_host.h" #include "ui/base/l10n/l10n_util.h" @@ -180,8 +179,6 @@ } void UpdateIsProfileLockEnabledIfNeeded(Profile* profile) { - DCHECK(switches::IsNewProfileManagement()); - if (!profile->GetPrefs()->GetString(prefs::kGoogleServicesHostedDomain). empty()) return;
diff --git a/chrome/browser/resources/chromeos/login/header_bar.css b/chrome/browser/resources/chromeos/login/header_bar.css index b157b00..69a24c7 100644 --- a/chrome/browser/resources/chromeos/login/header_bar.css +++ b/chrome/browser/resources/chromeos/login/header_bar.css
@@ -72,14 +72,16 @@ font-size: 13px; height: auto; min-height: 34px; + padding: 0 16px; position: absolute; text-align: center; - width: 180px; + white-space: nowrap; } #more-settings-header-bar-item.active button.add-supervised-user-menu:focus { border: 2px solid var(--google-blue-500); border-radius: 2px; + padding: 0 15px; } html[dir=rtl] .header-bar-item {
diff --git a/chrome/browser/resources/chromeos/login/host-pairing-screen.html b/chrome/browser/resources/chromeos/login/host-pairing-screen.html index 1f6adc0..4f973744 100644 --- a/chrome/browser/resources/chromeos/login/host-pairing-screen.html +++ b/chrome/browser/resources/chromeos/login/host-pairing-screen.html
@@ -88,6 +88,7 @@ <div class="title" i18n-content="loginHostPairingScreenEnrollmentErrorTitle"> </div> + <div>[[C.enrollmentError]]</div> <div i18n-content="loginHostPairingScreenErrorNeedRestartText"></div> </host-pairing-page> <host-pairing-page name="pairing-done">
diff --git a/chrome/browser/resources/chromeos/login/host-pairing-screen.js b/chrome/browser/resources/chromeos/login/host-pairing-screen.js index 7263fe2..8e08a44c 100644 --- a/chrome/browser/resources/chromeos/login/host-pairing-screen.js +++ b/chrome/browser/resources/chromeos/login/host-pairing-screen.js
@@ -27,7 +27,8 @@ ['code', 'deviceName', 'enrollmentDomain', - 'page'].forEach(this.registerBoundContextField, this); + 'page', + 'enrollmentError'].forEach(this.registerBoundContextField, this); this.send(CALLBACK_CONTEXT_READY); },
diff --git a/chrome/browser/resources/settings/device_page/stylus.html b/chrome/browser/resources/settings/device_page/stylus.html index b378f8b..d39715d 100644 --- a/chrome/browser/resources/settings/device_page/stylus.html +++ b/chrome/browser/resources/settings/device_page/stylus.html
@@ -54,9 +54,7 @@ <div id="select-app" class="md-select-wrapper" hidden$="[[!showApps_(appChoices_, waitingForAndroid_)]]"> - <select id="menu" class="md-select" - disabled="[[!prefs.settings.enable_stylus_tools.value]]" - on-change="onSelectedAppChanged_"> + <select id="menu" class="md-select" on-change="onSelectedAppChanged_"> <template is="dom-repeat" items="[[appChoices_]]"> <option value="[[item.value]]" selected="[[item.preferred]]"> [[item.name]]
diff --git a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog_util.html b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog_util.html index 4afc3444..aaaf1640 100644 --- a/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog_util.html +++ b/chrome/browser/resources/settings/printing_page/cups_add_printer_dialog_util.html
@@ -76,8 +76,8 @@ padding: 8px 0; } </style> - <paper-input-container no-label-float> - <input is="iron-input" type="search" on-tap="onTap_" + <paper-input-container no-label-float on-tap="onTap_"> + <input is="iron-input" type="search" on-search="onInputValueChanged_" on-change="onChange_" incremental> <paper-icon-button suffix id="searchIcon" icon="cr:search" hidden> </paper-icon-button>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 4cf04ab..a4f83549 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -272,10 +272,9 @@ <category-default-setting category="{{ContentSettingsTypes.COOKIES}}" toggle-off-label="$i18n{siteSettingsBlocked}" toggle-on-label="$i18n{siteSettingsCookiesAllowedRecommended}" - sub-option-label="$i18n{deleteDataPostSession}" - sub-option-secondary=""><!-- To work with :empty. --> + sub-option-label="$i18n{deleteDataPostSession}"> </category-default-setting> - <div class="settings-box"> + <div class="settings-box two-line"> <settings-toggle-button class="start" pref="{{prefs.profile.block_third_party_cookies}}" label="$i18n{thirdPartyCookie}" @@ -436,7 +435,7 @@ </template> <template is="dom-if" route-path="/cookies/detail" no-search> <settings-subpage page-title="[[pageTitle]]"> - <paper-button class="subpage-title-extra" + <paper-button class="subpage-title-extra secondary-button" on-tap="onRemoveAllCookiesFromSite_"> $i18n{siteSettingsCookieRemoveAll} </paper-button>
diff --git a/chrome/browser/resources/settings/settings.html b/chrome/browser/resources/settings/settings.html index dcd77adc..f64ddf2 100644 --- a/chrome/browser/resources/settings/settings.html +++ b/chrome/browser/resources/settings/settings.html
@@ -6,19 +6,28 @@ <if expr="not use_vulcanize"> <base href="chrome://$i18n{hostname}"> </if> - <link rel="import" href="chrome://resources/html/polymer.html"> - <link rel="import" href="settings_ui/settings_ui.html"> - <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> - <!-- Do not add any <link rel="..."> elements below here. Imports outside of - <head> are disallowed by HTML5 and cause undefined behavior that - confuses Polymer's lifecycle methods: crbug.com/638074. --> + <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> <style> html { overflow: hidden; } + + settings-ui:unresolved { + background-color: var(--md-background-color); + border-top: 56px solid var(--md-toolbar-color); + bottom: 0; + display: block; + left: 0; + position: fixed; + right: 0; + top: 0; + } </style> </head> <body> <settings-ui></settings-ui> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <link rel="import" href="chrome://resources/html/polymer.html"> + <link rel="import" href="settings_ui/settings_ui.html"> </body> </html>
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html index 75bb90d..989e9437 100644 --- a/chrome/browser/resources/settings/settings_shared_css.html +++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -38,7 +38,7 @@ } paper-button { - height: 32px; + height: 36px; margin: 0; }
diff --git a/chrome/browser/resources/settings/site_settings/category_default_setting.html b/chrome/browser/resources/settings/site_settings/category_default_setting.html index f5545bb..19cb12a 100644 --- a/chrome/browser/resources/settings/site_settings/category_default_setting.html +++ b/chrome/browser/resources/settings/site_settings/category_default_setting.html
@@ -9,17 +9,19 @@ <dom-module id="category-default-setting"> <template> <style include="settings-shared"></style> - <div class="settings-box first two-line"> - <div class="start secondary">[[sliderDescription_]]</div> + <div class="settings-box first"> <settings-toggle-button id="toggle" pref="{{controlParams_}}" + class="start" label="[[sliderDescription_]]" disabled$="[[isToggleDisabled_(category)]]"> </settings-toggle-button> </div> <template is="dom-if" if="[[subOptionLabel]]"> - <div class="settings-box"> + <div class$="settings-box [[subOptionClass_(subOptionSecondary)]]"> <div class="start"> [[subOptionLabel]] - <div class="secondary">[[subOptionSecondary]]</div> + <div class="secondary" hidden$="[[!subOptionSecondary]]"> + [[subOptionSecondary]] + </div> </div> <settings-toggle-button disabled$="[[!controlParams_.value]]" id="subOptionToggle" pref="{{subControlParams_}}">
diff --git a/chrome/browser/resources/settings/site_settings/category_default_setting.js b/chrome/browser/resources/settings/site_settings/category_default_setting.js index f481cc5d..c1c3c99 100644 --- a/chrome/browser/resources/settings/site_settings/category_default_setting.js +++ b/chrome/browser/resources/settings/site_settings/category_default_setting.js
@@ -50,6 +50,12 @@ /* Labels for the toggle on/off positions. */ toggleOffLabel: String, toggleOnLabel: String, + + subOptionLabel: String, + subOptionSecondary: { + type: String, + value: null, // Needs default value so binding fires upon initialization. + }, }, observers: [ @@ -208,5 +214,15 @@ isToggleDisabled_: function() { return this.category == settings.ContentSettingsTypes.POPUPS && loadTimeData.getBoolean('isGuest'); + }, + + /** + * Returns classname to indicate secondary label exists. + * @param {boolean} subOptionLabel + * @return {string} + * @private + */ + subOptionClass_: function(subOptionLabel) { + return subOptionLabel ? 'two-line' : ''; } });
diff --git a/chrome/browser/resources/settings/site_settings/pdf_documents.html b/chrome/browser/resources/settings/site_settings/pdf_documents.html index 3c42c4b..8763771 100644 --- a/chrome/browser/resources/settings/site_settings/pdf_documents.html +++ b/chrome/browser/resources/settings/site_settings/pdf_documents.html
@@ -10,10 +10,8 @@ } </style> <div class="settings-box first two-line"> - <div class="start secondary"> - $i18n{siteSettingsPdfDifferentApplication} - </div> - <settings-toggle-button id="toggle" + <settings-toggle-button id="toggle" class="start" + label="$i18n{siteSettingsPdfDifferentApplication}" pref="{{prefs.plugins.always_open_pdf_externally}}"> </settings-toggle-button> </div>
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.html b/chrome/browser/resources/settings/site_settings/protocol_handlers.html index 33fbfec..609ac01 100644 --- a/chrome/browser/resources/settings/site_settings/protocol_handlers.html +++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.html
@@ -23,7 +23,7 @@ } </style> <div class="settings-box first two-line"> - <div id="categoryLabel" class="start secondary"> + <div id="categoryLabel" class="start"> [[computeHandlersDescription_(categoryEnabled)]] </div> <paper-toggle-button id="toggle" checked="{{categoryEnabled}}"
diff --git a/chrome/browser/resources/settings/site_settings/site_data.html b/chrome/browser/resources/settings/site_settings/site_data.html index c1aa8dc..67cf04a 100644 --- a/chrome/browser/resources/settings/site_settings/site_data.html +++ b/chrome/browser/resources/settings/site_settings/site_data.html
@@ -31,7 +31,7 @@ </style> <div class="settings-box first subtitle-row"> <div class="start"> - <div>$i18n{siteSettingsCookieHeader}</div> + <h2>$i18n{siteSettingsCookieHeader}</h2> </div> <settings-subpage-search id="filter" on-search-changed="onSearchChanged_" label="$i18n{siteSettingsCookieSearch}">
diff --git a/chrome/browser/resources/settings/site_settings/site_list.html b/chrome/browser/resources/settings/site_settings/site_list.html index ae632ad..c4e98b7a 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.html +++ b/chrome/browser/resources/settings/site_settings/site_list.html
@@ -81,7 +81,11 @@ <iron-icon icon="[[computeIconControlledBy_(item)]]"></iron-icon> </template> - <paper-icon-button id="dots" icon="cr:more-vert" + <paper-icon-button id="resetSite" icon="cr:delete" + hidden="[[isResetButtonHidden_(item.source, readOnlyList)]]" + on-tap="onResetButtonTap_" alt="$i18n{siteSettingsActionReset}"> + </paper-icon-button> + <paper-icon-button id="actionMenuButton" icon="cr:more-vert" hidden="[[isActionMenuHidden_(item.source, readOnlyList)]]" on-tap="onShowActionMenuTap_" title="$i18n{moreActions}"> </paper-icon-button>
diff --git a/chrome/browser/resources/settings/site_settings/site_list.js b/chrome/browser/resources/settings/site_settings/site_list.js index 7765e36d..a33ae749 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.js +++ b/chrome/browser/resources/settings/site_settings/site_list.js
@@ -62,7 +62,9 @@ */ sites: { type: Array, - value: function() { return []; }, + value: function() { + return []; + }, }, /** @@ -74,10 +76,10 @@ }, /** - * The type of category this widget is displaying data for. Normally - * either 'allow' or 'block', representing which sites are allowed or - * blocked respectively. - */ + * The type of category this widget is displaying data for. Normally + * either 'allow' or 'block', representing which sites are allowed or + * blocked respectively. + */ categorySubtype: { type: String, value: settings.INVALID_CATEGORY_SUBTYPE, @@ -103,16 +105,6 @@ showSessionOnlyAction_: Boolean, /** - * Keeps track of the incognito status of the current profile (whether one - * exists). - * @private - */ - incognitoProfileActive_: { - type: Boolean, - value: false, - }, - - /** * All possible actions in the action menu. * @private */ @@ -128,9 +120,7 @@ }, }, - observers: [ - 'configureWidget_(category, categorySubtype)' - ], + observers: ['configureWidget_(category, categorySubtype)'], ready: function() { this.addWebUIListener('contentSettingSitePermissionChanged', @@ -150,18 +140,21 @@ this.configureWidget_(); }, - onIncognitoStatusChanged_: function(incognitoEnabled) { - // A change notification is not sent for each site that is deleted during - // incognito profile destruction. Therefore, we reconfigure the list when - // the incognito profile is destroyed, except for SESSION_ONLY, which won't - // have any incognito exceptions. + /** + * Called for each site list when incognito is enabled or disabled. Only + * called on change (opening N incogito windows only fires one message). + * Another message is sent when the *last* incognito window closes. + * @private + */ + onIncognitoStatusChanged_: function() { + // The SESSION_ONLY list won't have any incognito exceptions. (Minor + // optimization, not required). if (this.categorySubtype == settings.PermissionValues.SESSION_ONLY) return; - if (this.incognitoProfileActive_) - this.configureWidget_(); // The incognito profile is being destroyed. - - this.incognitoProfileActive_ = incognitoEnabled; + // A change notification is not sent for each site. So we repopulate the + // whole list when the incognito profile is created or destroyed. + this.populateList_(); }, /** @@ -214,6 +207,17 @@ * @return {boolean} * @private */ + isResetButtonHidden_: function(source, readOnlyList) { + return this.isExceptionControlled_(source) || this.allSites || + !readOnlyList; + }, + + /** + * @param {string} source Where the setting came from. + * @param {boolean} readOnlyList Whether the site exception list is read-only. + * @return {boolean} + * @private + */ isActionMenuHidden_: function(source, readOnlyList) { return this.isExceptionControlled_(source) || this.allSites || readOnlyList; }, @@ -415,39 +419,42 @@ }, /** - * A handler for activating one of the menu action items. - * @param {string} action The permission to set (Allow, Block, SessionOnly, - * etc). + * @param {?SiteException} site * @private */ - onActionMenuActivate_: function(action) { - var origin = this.actionMenuSite_.origin; - var incognito = this.actionMenuSite_.incognito; - var embeddingOrigin = this.actionMenuSite_.embeddingOrigin; - if (action == settings.PermissionValues.DEFAULT) { - this.browserProxy.resetCategoryPermissionForOrigin( - origin, embeddingOrigin, this.category, incognito); - } else { - this.browserProxy.setCategoryPermissionForOrigin( - origin, embeddingOrigin, this.category, action, incognito); - } + resetPermissionForOrigin_: function(site) { + assert(site); + this.browserProxy.resetCategoryPermissionForOrigin( + site.origin, site.embeddingOrigin, this.category, site.incognito); + }, + + /** + * @param {string} permissionValue + * @private + */ + setPermissionForActionMenuSite_: function(permissionValue) { + assert(this.actionMenuSite_); + this.browserProxy.setCategoryPermissionForOrigin( + this.actionMenuSite_.origin, this.actionMenuSite_.embeddingOrigin, + this.category, permissionValue, this.actionMenuSite_.incognito); }, /** @private */ onAllowTap_: function() { - this.onActionMenuActivate_(settings.PermissionValues.ALLOW); + this.setPermissionForActionMenuSite_(settings.PermissionValues.ALLOW); this.closeActionMenu_(); }, /** @private */ onBlockTap_: function() { - this.onActionMenuActivate_(settings.PermissionValues.BLOCK); + this.setPermissionForActionMenuSite_(settings.PermissionValues.BLOCK); this.closeActionMenu_(); }, /** @private */ onSessionOnlyTap_: function() { - this.onActionMenuActivate_(settings.PermissionValues.SESSION_ONLY); + this.setPermissionForActionMenuSite_( + settings.PermissionValues.SESSION_ONLY); this.closeActionMenu_(); }, @@ -468,7 +475,7 @@ /** @private */ onResetTap_: function() { - this.onActionMenuActivate_(settings.PermissionValues.DEFAULT); + this.resetPermissionForOrigin_(this.actionMenuSite_); this.closeActionMenu_(); }, @@ -494,6 +501,14 @@ * @param {!{model: !{item: !SiteException}}} e * @private */ + onResetButtonTap_: function(e) { + this.resetPermissionForOrigin_(e.model.item); + }, + + /** + * @param {!{model: !{item: !SiteException}}} e + * @private + */ onShowActionMenuTap_: function(e) { this.actionMenuSite_ = e.model.item; /** @type {!CrActionMenuElement} */ (
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.css b/chrome/browser/resources/vr_shell/vr_shell_ui.css index 8b1f5b7..fd24f77 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.css +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.css
@@ -313,7 +313,14 @@ background-color: orange; } -#omnibox-url-element { +#omnibox-border { + --statusBarColor: rgb(66, 133, 244); + background-color: white; + border-radius: 8px; + padding: 3px; +} + +#omnibox-contents { background-color: white; border-radius: 6px; box-sizing: border-box;
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.html b/chrome/browser/resources/vr_shell/vr_shell_ui.html index 622d008..53ece4c 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.html +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.html
@@ -55,9 +55,11 @@ <div id="suggestion-1" class="suggestion"></div> <div id="suggestion-0" class="suggestion"></div> </div> - <div id="omnibox-url-element"> - <div id="omnibox-clear-button"></div> - <input id="omnibox-input-field" type="url"></input> + <div id="omnibox-border"> + <div id="omnibox-contents"> + <div id="omnibox-clear-button"></div> + <input id="omnibox-input-field" type="url"></input> + </div> </div> </div> <div id="back-indicator" class="gesture-indicator ui-element"></div>
diff --git a/chrome/browser/resources/vr_shell/vr_shell_ui.js b/chrome/browser/resources/vr_shell/vr_shell_ui.js index b7d3a8d33..7203c2c9 100644 --- a/chrome/browser/resources/vr_shell/vr_shell_ui.js +++ b/chrome/browser/resources/vr_shell/vr_shell_ui.js
@@ -26,6 +26,16 @@ return !str || 0 === str.length ? '' : str; } + // Generate a two-color progress bar style background using a gradient. + function makeProgressBackground(loading, percentage, color, background) { + if (!loading) { + return background; + } + return 'linear-gradient(to right, ' + color + ' 0%, ' + color + ' ' + + percentage * 100.0 + '%, ' + background + ' ' + percentage * 100 + + '%, ' + background + ' 100%)'; + } + class ContentQuad { constructor() { /** @const */ this.SCREEN_HEIGHT = 1.375; @@ -672,18 +682,9 @@ } let indicator = document.querySelector('#url-indicator-border'); - if (this.loading) { - // Remap load progress range 0-100 as 5-95 percent, to avoid the - // extremities of the rounded ends of the indicator. - let percent = Math.round((this.loadProgress * 0.9 + 0.05) * 100); - let gradient = 'linear-gradient(to right, ' + this.statusBarColor + - ' 0%, ' + this.statusBarColor + ' ' + percent + '%, ' + - this.backgroundColor + ' ' + percent + '%, ' + - this.backgroundColor + ' 100%)'; - indicator.style.background = gradient; - } else { - indicator.style.background = this.backgroundColor; - } + indicator.style.background = makeProgressBackground( + this.loading, this.loadProgress, this.statusBarColor, + this.backgroundColor); let shouldBeHidden = !this.loading && this.visibilityTimeout > 0 && !this.visibilityTimer; @@ -831,9 +832,16 @@ this.enabled = false; let root = document.querySelector('#omnibox-ui-element'); - this.domUiElement = new DomUiElement('#omnibox-url-element'); + this.domUiElement = new DomUiElement('#omnibox-border'); this.inputField = root.querySelector('#omnibox-input-field'); + let style = window.getComputedStyle(this.domUiElement.domElement); + this.statusBarColor = getStyleString(style, '--statusBarColor'); + this.backgroundColor = style.backgroundColor; + this.loading = false; + this.loadProgress = 0; + this.updateLoadingState(); + // Initially invisible. let update = new api.UiElementUpdate(); update.setVisible(false); @@ -907,6 +915,24 @@ this.updateSuggestions(); } + setLoading(loading) { + this.loading = loading; + this.loadProgress = 0; + this.updateLoadingState(); + } + + setLoadProgress(progress) { + this.loadProgress = progress; + this.updateLoadingState(); + } + + updateLoadingState() { + let indicator = document.querySelector('#omnibox-border'); + indicator.style.background = makeProgressBackground( + this.loading, this.loadProgress, this.statusBarColor, + this.backgroundColor); + } + updateSuggestions() { for (var i = 0; i < this.maxSuggestions; i++) { let element = document.querySelector('#suggestion-' + i); @@ -1262,11 +1288,13 @@ /** @override */ onSetLoading(loading) { this.manager.urlIndicator.setLoading(loading); + this.manager.omnibox.setLoading(loading); } /** @override */ onSetLoadingProgress(progress) { this.manager.urlIndicator.setLoadProgress(progress); + this.manager.omnibox.setLoadProgress(progress); } /** @override */
diff --git a/chrome/browser/resources/welcome/welcome.css b/chrome/browser/resources/welcome/welcome.css index 2ca056c..54556bc 100644 --- a/chrome/browser/resources/welcome/welcome.css +++ b/chrome/browser/resources/welcome/welcome.css
@@ -179,20 +179,29 @@ } .action { + -webkit-font-smoothing: antialiased; background: var(--google-blue-500); border-radius: 2px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1); color: white; font-size: .8125em; font-weight: 500; line-height: 2.25rem; padding: 0 1.5em; + transition: 300ms cubic-bezier(.4, .2, 0, 1); + will-change: box-shadow; +} + +.action:hover { + background: var(--paper-blue-a400); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1), 0 1px 2px rgba(0, 0, 0, .24); } .action:active { background: var(--google-blue-500); } -.action:focus { +.action.keyboard-focus { background: var(--google-blue-700); }
diff --git a/chrome/browser/resources/welcome/win10/inline.html b/chrome/browser/resources/welcome/win10/inline.html index 39d425a..ff53572 100644 --- a/chrome/browser/resources/welcome/win10/inline.html +++ b/chrome/browser/resources/welcome/win10/inline.html
@@ -153,7 +153,15 @@ .button:hover { background: var(--paper-blue-a400); box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .1), 0 1px 2px - rgba(0, 0, 0, .24) + rgba(0, 0, 0, .24); + } + + .button:active { + background: var(--google-blue-500); + } + + .button.keyboard-focus { + background: var(--google-blue-700); } .logo-small {
diff --git a/chrome/browser/sessions/chrome_serialized_navigation_driver.cc b/chrome/browser/sessions/chrome_serialized_navigation_driver.cc index 04d5b78c..9f808f5 100644 --- a/chrome/browser/sessions/chrome_serialized_navigation_driver.cc +++ b/chrome/browser/sessions/chrome_serialized_navigation_driver.cc
@@ -20,7 +20,9 @@ bool IsUberOrUberReplacementURL(const GURL& url) { return url.SchemeIs(content::kChromeUIScheme) && (url.host_piece() == chrome::kChromeUIHistoryHost || - url.host_piece() == chrome::kChromeUIUberHost); + url.host_piece() == chrome::kChromeUIUberHost || + url.host_piece() == chrome::kChromeUISettingsHost || + url.host_piece() == chrome::kChromeUIHelpHost); } } // namespace
diff --git a/chrome/browser/signin/chrome_proximity_auth_client.cc b/chrome/browser/signin/chrome_proximity_auth_client.cc index 25f64a87..94e33cf 100644 --- a/chrome/browser/signin/chrome_proximity_auth_client.cc +++ b/chrome/browser/signin/chrome_proximity_auth_client.cc
@@ -11,6 +11,7 @@ #include "base/sys_info.h" #include "base/version.h" #include "build/build_config.h" +#include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_window.h" #include "chrome/browser/signin/easy_unlock_service.h" @@ -96,72 +97,33 @@ std::unique_ptr<cryptauth::SecureMessageDelegate> ChromeProximityAuthClient::CreateSecureMessageDelegate() { -#if defined(OS_CHROMEOS) - return base::MakeUnique<chromeos::SecureMessageDelegateChromeOS>(); -#else - return nullptr; -#endif + return GetCryptAuthService()->CreateSecureMessageDelegate(); } std::unique_ptr<cryptauth::CryptAuthClientFactory> ChromeProximityAuthClient::CreateCryptAuthClientFactory() { - return base::MakeUnique<cryptauth::CryptAuthClientFactoryImpl>( - ProfileOAuth2TokenServiceFactory::GetForProfile(profile_), GetAccountId(), - profile_->GetRequestContext(), GetDeviceClassifier()); + return GetCryptAuthService()->CreateCryptAuthClientFactory(); } cryptauth::DeviceClassifier ChromeProximityAuthClient::GetDeviceClassifier() { - cryptauth::DeviceClassifier device_classifier; - -#if defined(OS_CHROMEOS) - int32_t major_version, minor_version, bugfix_version; - // TODO(tengs): base::OperatingSystemVersionNumbers only works for ChromeOS. - // We need to get different numbers for other platforms. - base::SysInfo::OperatingSystemVersionNumbers(&major_version, &minor_version, - &bugfix_version); - device_classifier.set_device_os_version_code(major_version); - device_classifier.set_device_type(cryptauth::CHROME); -#endif - - const std::vector<uint32_t>& version_components = - base::Version(version_info::GetVersionNumber()).components(); - if (version_components.size() > 0) - device_classifier.set_device_software_version_code(version_components[0]); - - device_classifier.set_device_software_package(version_info::GetProductName()); - return device_classifier; + return GetCryptAuthService()->GetDeviceClassifier(); } std::string ChromeProximityAuthClient::GetAccountId() { - // There is no SigninManager for the login profile. - if (!SigninManagerFactory::GetForProfile(profile_)) - return std::string(); - - return SigninManagerFactory::GetForProfile(profile_) - ->GetAuthenticatedAccountId(); + return GetCryptAuthService()->GetAccountId(); } cryptauth::CryptAuthEnrollmentManager* ChromeProximityAuthClient::GetCryptAuthEnrollmentManager() { - EasyUnlockServiceRegular* easy_unlock_service = GetEasyUnlockServiceRegular(); - if (!easy_unlock_service) - return nullptr; - return easy_unlock_service->GetCryptAuthEnrollmentManager(); + return GetCryptAuthService()->GetCryptAuthEnrollmentManager(); } cryptauth::CryptAuthDeviceManager* ChromeProximityAuthClient::GetCryptAuthDeviceManager() { - EasyUnlockServiceRegular* easy_unlock_service = GetEasyUnlockServiceRegular(); - if (!easy_unlock_service) - return nullptr; - return easy_unlock_service->GetCryptAuthDeviceManager(); + return GetCryptAuthService()->GetCryptAuthDeviceManager(); } -EasyUnlockServiceRegular* -ChromeProximityAuthClient::GetEasyUnlockServiceRegular() { - EasyUnlockService* easy_unlock_service = EasyUnlockService::Get(profile_); - if (easy_unlock_service->GetType() == EasyUnlockService::TYPE_REGULAR) - return static_cast<EasyUnlockServiceRegular*>(easy_unlock_service); - else - return nullptr; +cryptauth::CryptAuthService* ChromeProximityAuthClient::GetCryptAuthService() { + return ChromeCryptAuthServiceFactory::GetInstance()->GetForBrowserContext( + profile_); }
diff --git a/chrome/browser/signin/chrome_proximity_auth_client.h b/chrome/browser/signin/chrome_proximity_auth_client.h index 7162c1e..463f7c8 100644 --- a/chrome/browser/signin/chrome_proximity_auth_client.h +++ b/chrome/browser/signin/chrome_proximity_auth_client.h
@@ -10,7 +10,10 @@ class PrefService; class Profile; -class EasyUnlockServiceRegular; + +namespace cryptauth { +class CryptAuthService; +} // namespace cryptauth // A Chrome-specific implementation of the ProximityAuthClient interface. // There is one |ChromeProximityAuthClient| per |Profile|. @@ -41,8 +44,7 @@ base::Callback<void(const std::string& challenge)> callback) override; private: - // Returns the EasyUnlockService instance used inside user sessions. - EasyUnlockServiceRegular* GetEasyUnlockServiceRegular(); + cryptauth::CryptAuthService* GetCryptAuthService(); Profile* const profile_;
diff --git a/chrome/browser/signin/easy_unlock_service_factory.cc b/chrome/browser/signin/easy_unlock_service_factory.cc index 41839d95..998648b 100644 --- a/chrome/browser/signin/easy_unlock_service_factory.cc +++ b/chrome/browser/signin/easy_unlock_service_factory.cc
@@ -7,14 +7,12 @@ #include "base/command_line.h" #include "base/memory/singleton.h" #include "build/build_config.h" -#include "chrome/browser/gcm/gcm_profile_service_factory.h" +#include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/easy_unlock_app_manager.h" #include "chrome/browser/signin/easy_unlock_service.h" #include "chrome/browser/signin/easy_unlock_service_regular.h" -#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" -#include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/common/chrome_switches.h" #include "chrome/grit/browser_resources.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" @@ -68,11 +66,9 @@ : BrowserContextKeyedServiceFactory( "EasyUnlockService", BrowserContextDependencyManager::GetInstance()) { + DependsOn(ChromeCryptAuthServiceFactory::GetInstance()); DependsOn( extensions::ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); - DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); - DependsOn(SigninManagerFactory::GetInstance()); - DependsOn(gcm::GCMProfileServiceFactory::GetInstance()); #if defined(OS_CHROMEOS) DependsOn(EasyUnlockTpmKeyManagerFactory::GetInstance()); #endif
diff --git a/chrome/browser/signin/easy_unlock_service_regular.cc b/chrome/browser/signin/easy_unlock_service_regular.cc index d78fa76..312c24b 100644 --- a/chrome/browser/signin/easy_unlock_service_regular.cc +++ b/chrome/browser/signin/easy_unlock_service_regular.cc
@@ -18,6 +18,7 @@ #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/cryptauth/chrome_cryptauth_service_factory.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/chrome_proximity_auth_client.h" @@ -37,7 +38,6 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" -#include "components/proximity_auth/cryptauth_enroller_factory_impl.h" #include "components/proximity_auth/logging/logging.h" #include "components/proximity_auth/proximity_auth_pref_manager.h" #include "components/proximity_auth/proximity_auth_system.h" @@ -87,30 +87,21 @@ EasyUnlockServiceRegular::~EasyUnlockServiceRegular() { } -cryptauth::CryptAuthEnrollmentManager* -EasyUnlockServiceRegular::GetCryptAuthEnrollmentManager() { - return enrollment_manager_.get(); -} - -cryptauth::CryptAuthDeviceManager* -EasyUnlockServiceRegular::GetCryptAuthDeviceManager() { - return device_manager_.get(); -} - proximity_auth::ProximityAuthPrefManager* EasyUnlockServiceRegular::GetProximityAuthPrefManager() { return pref_manager_.get(); } void EasyUnlockServiceRegular::LoadRemoteDevices() { - if (device_manager_->GetUnlockKeys().empty()) { + if (GetCryptAuthDeviceManager()->GetUnlockKeys().empty()) { SetProximityAuthDevices(GetAccountId(), cryptauth::RemoteDeviceList()); return; } remote_device_loader_.reset(new cryptauth::RemoteDeviceLoader( - device_manager_->GetUnlockKeys(), proximity_auth_client()->GetAccountId(), - enrollment_manager_->GetUserPrivateKey(), + GetCryptAuthDeviceManager()->GetUnlockKeys(), + proximity_auth_client()->GetAccountId(), + GetCryptAuthEnrollmentManager()->GetUserPrivateKey(), proximity_auth_client()->CreateSecureMessageDelegate())); remote_device_loader_->Load( base::Bind(&EasyUnlockServiceRegular::OnRemoteDevicesLoaded, @@ -433,7 +424,7 @@ proximity_auth::switches::kEnableBluetoothLowEnergyDiscovery)) { pref_manager_.reset( new proximity_auth::ProximityAuthPrefManager(profile()->GetPrefs())); - InitializeCryptAuth(); + GetCryptAuthDeviceManager()->AddObserver(this); LoadRemoteDevices(); } #endif @@ -482,19 +473,6 @@ lock_screen_last_shown_timestamp_ = base::TimeTicks::Now(); } -void EasyUnlockServiceRegular::OnRefreshTokenAvailable( - const std::string& account_id) { - if (account_id == proximity_auth_client()->GetAccountId()) { - OAuth2TokenService* token_service = - ProfileOAuth2TokenServiceFactory::GetForProfile(profile()); - token_service->RemoveObserver(this); -#if defined(OS_CHROMEOS) - enrollment_manager_->Start(); - device_manager_->Start(); -#endif - } -} - void EasyUnlockServiceRegular::OnSyncFinished( cryptauth::CryptAuthDeviceManager::SyncResult sync_result, cryptauth::CryptAuthDeviceManager::DeviceChangeResult @@ -600,88 +578,22 @@ std::move(user_prefs_dict)); } -cryptauth::GcmDeviceInfo EasyUnlockServiceRegular::GetGcmDeviceInfo() { - cryptauth::GcmDeviceInfo device_info; - device_info.set_long_device_id(EasyUnlockService::GetDeviceId()); - device_info.set_device_type(cryptauth::CHROME); - device_info.set_device_software_version(version_info::GetVersionNumber()); - google::protobuf::int64 software_version_code = - cryptauth::HashStringToInt64(version_info::GetLastChange()); - device_info.set_device_software_version_code(software_version_code); - device_info.set_locale( - translate::TranslateDownloadManager::GetInstance()->application_locale()); - -#if defined(OS_CHROMEOS) - device_info.set_device_model(base::SysInfo::GetLsbReleaseBoard()); - device_info.set_device_os_version(base::GetLinuxDistro()); - // The Chrome OS version tracks the Chrome version, so fill in the same value - // as |device_software_version_code|. - device_info.set_device_os_version_code(software_version_code); - - // There may not be a Shell instance in tests. - if (!ash::Shell::HasInstance()) - return device_info; - - display::DisplayManager* display_manager = - ash::Shell::GetInstance()->display_manager(); - int64_t primary_display_id = - display_manager->GetPrimaryDisplayCandidate().id(); - display::ManagedDisplayInfo display_info = - display_manager->GetDisplayInfo(primary_display_id); - gfx::Rect bounds = display_info.bounds_in_native(); - - // TODO(tengs): This is a heuristic to deterimine the DPI of the display, as - // there is no convenient way of getting this information right now. - const double dpi = display_info.device_scale_factor() > 1.0f ? 239.0f : 96.0f; - double width_in_inches = (bounds.width() - bounds.x()) / dpi; - double height_in_inches = (bounds.height() - bounds.y()) / dpi; - double diagonal_in_inches = sqrt(width_in_inches * width_in_inches + - height_in_inches * height_in_inches); - - // Note: The unit of this measument is in milli-inches. - device_info.set_device_display_diagonal_mils(diagonal_in_inches * 1000.0); -#else -// TODO(tengs): Fill in device information for other platforms. -#endif - return device_info; +cryptauth::CryptAuthEnrollmentManager* +EasyUnlockServiceRegular::GetCryptAuthEnrollmentManager() { + cryptauth::CryptAuthEnrollmentManager* manager = + ChromeCryptAuthServiceFactory::GetInstance() + ->GetForBrowserContext(profile()) + ->GetCryptAuthEnrollmentManager(); + DCHECK(manager); + return manager; } -#if defined(OS_CHROMEOS) -void EasyUnlockServiceRegular::InitializeCryptAuth() { - PA_LOG(INFO) << "Initializing CryptAuth managers."; - // Initialize GCM manager. - gcm_manager_.reset(new cryptauth::CryptAuthGCMManagerImpl( - gcm::GCMProfileServiceFactory::GetForProfile(profile())->driver(), - proximity_auth_client()->GetPrefService())); - gcm_manager_->StartListening(); - - // Initialize enrollment manager. - cryptauth::GcmDeviceInfo device_info; - enrollment_manager_.reset(new cryptauth::CryptAuthEnrollmentManager( - base::MakeUnique<base::DefaultClock>(), - base::MakeUnique<proximity_auth::CryptAuthEnrollerFactoryImpl>( - proximity_auth_client()), - proximity_auth_client()->CreateSecureMessageDelegate(), - GetGcmDeviceInfo(), gcm_manager_.get(), - proximity_auth_client()->GetPrefService())); - - // Initialize device manager. - device_manager_.reset(new cryptauth::CryptAuthDeviceManager( - base::MakeUnique<base::DefaultClock>(), - proximity_auth_client()->CreateCryptAuthClientFactory(), - gcm_manager_.get(), proximity_auth_client()->GetPrefService())); - - OAuth2TokenService* token_service = - ProfileOAuth2TokenServiceFactory::GetForProfile(profile()); - if (!token_service->RefreshTokenIsAvailable( - proximity_auth_client()->GetAccountId())) { - PA_LOG(INFO) << "Refresh token not yet available, " - << "waiting before starting CryptAuth managers"; - token_service->AddObserver(this); - } - - device_manager_->AddObserver(this); - enrollment_manager_->Start(); - device_manager_->Start(); +cryptauth::CryptAuthDeviceManager* +EasyUnlockServiceRegular::GetCryptAuthDeviceManager() { + cryptauth::CryptAuthDeviceManager* manager = + ChromeCryptAuthServiceFactory::GetInstance() + ->GetForBrowserContext(profile()) + ->GetCryptAuthDeviceManager(); + DCHECK(manager); + return manager; } -#endif
diff --git a/chrome/browser/signin/easy_unlock_service_regular.h b/chrome/browser/signin/easy_unlock_service_regular.h index c48c126..84be711 100644 --- a/chrome/browser/signin/easy_unlock_service_regular.h +++ b/chrome/browser/signin/easy_unlock_service_regular.h
@@ -16,7 +16,6 @@ #include "components/cryptauth/cryptauth_device_manager.h" #include "components/prefs/pref_change_registrar.h" #include "components/proximity_auth/screenlock_bridge.h" -#include "google_apis/gaia/oauth2_token_service.h" #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/login/easy_unlock/short_lived_user_context.h" @@ -31,7 +30,6 @@ class CryptAuthClient; class CryptAuthDeviceManager; class CryptAuthEnrollmentManager; -class CryptAuthGCMManager; class RemoteDeviceLoader; class ToggleEasyUnlockResponse; } @@ -47,20 +45,11 @@ class EasyUnlockServiceRegular : public EasyUnlockService, public proximity_auth::ScreenlockBridge::Observer, - public cryptauth::CryptAuthDeviceManager::Observer, - public OAuth2TokenService::Observer { + public cryptauth::CryptAuthDeviceManager::Observer { public: explicit EasyUnlockServiceRegular(Profile* profile); ~EasyUnlockServiceRegular() override; - // Returns the CryptAuthEnrollmentManager, which manages the profile's - // CryptAuth enrollment. - cryptauth::CryptAuthEnrollmentManager* GetCryptAuthEnrollmentManager(); - - // Returns the CryptAuthEnrollmentManager, which manages the profile's - // synced devices from CryptAuth. - cryptauth::CryptAuthDeviceManager* GetCryptAuthDeviceManager(); - // Returns the ProximityAuthPrefManager, which manages the profile's // prefs for proximity_auth classes. proximity_auth::ProximityAuthPrefManager* GetProximityAuthPrefManager(); @@ -100,9 +89,6 @@ void OnWillFinalizeUnlock(bool success) override; void OnSuspendDoneInternal() override; - // OAuth2TokenService::Observer: - void OnRefreshTokenAvailable(const std::string& account_id) override; - // CryptAuthDeviceManager::Observer: void OnSyncFinished( cryptauth::CryptAuthDeviceManager::SyncResult sync_result, @@ -139,9 +125,6 @@ EasyUnlockScreenlockStateHandler::HardlockState state_on_success, bool success); - // Initializes the managers that communicate with CryptAuth. - void InitializeCryptAuth(); - std::unique_ptr<chromeos::ShortLivedUserContext> short_lived_user_context_; #endif @@ -149,9 +132,13 @@ // can be accessed on the sign-in screen. void SyncProfilePrefsToLocalState(); - // Returns the base GcmDeviceInfo proto containing the device's platform and - // version information. - cryptauth::GcmDeviceInfo GetGcmDeviceInfo(); + // Returns the CryptAuthEnrollmentManager, which manages the profile's + // CryptAuth enrollment. + cryptauth::CryptAuthEnrollmentManager* GetCryptAuthEnrollmentManager(); + + // Returns the CryptAuthEnrollmentManager, which manages the profile's + // synced devices from CryptAuth. + cryptauth::CryptAuthDeviceManager* GetCryptAuthDeviceManager(); PrefChangeRegistrar registrar_; @@ -171,13 +158,6 @@ // locked but the computer does not go to sleep. base::TimeTicks lock_screen_last_shown_timestamp_; - // Managers responsible for handling syncing and communications with - // CryptAuth. - std::unique_ptr<cryptauth::CryptAuthGCMManager> gcm_manager_; - std::unique_ptr<cryptauth::CryptAuthEnrollmentManager> - enrollment_manager_; - std::unique_ptr<cryptauth::CryptAuthDeviceManager> device_manager_; - // Manager responsible for handling the prefs used by proximity_auth classes. std::unique_ptr<proximity_auth::ProximityAuthPrefManager> pref_manager_;
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index 47e6a8fa..16c7aad 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -28,7 +28,8 @@ #include "chrome/browser/sync/glue/sync_start_util.h" #include "chrome/browser/sync/glue/theme_data_type_controller.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/sessions/notification_service_sessions_router.h" +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h" +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/themes/theme_syncable_service.h" @@ -67,6 +68,7 @@ #include "components/sync/engine/passive_model_worker.h" #include "components/sync/engine/ui_model_worker.h" #include "components/sync_preferences/pref_service_syncable.h" +#include "components/sync_sessions/favicon_cache.h" #include "components/sync_sessions/sync_sessions_client.h" #include "content/public/browser/browser_thread.h" #include "extensions/features/features.h" @@ -182,12 +184,15 @@ return window_delegates_getter_.get(); } - std::unique_ptr<sync_sessions::LocalSessionEventRouter> - GetLocalSessionEventRouter() override { + sync_sessions::LocalSessionEventRouter* GetLocalSessionEventRouter() + override { syncer::SyncableService::StartSyncFlare flare( sync_start_util::GetFlareForSyncableService(profile_->GetPath())); - return base::MakeUnique<sync_sessions::NotificationServiceSessionsRouter>( - profile_, this, flare); + sync_sessions::SyncSessionsWebContentsRouter* router = + sync_sessions::SyncSessionsWebContentsRouterFactory::GetForProfile( + profile_); + router->InjectStartSyncFlare(flare); + return router; } private:
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android.cc b/chrome/browser/sync/glue/synced_tab_delegate_android.cc index 5a72c7f4..84ddfb6 100644 --- a/chrome/browser/sync/glue/synced_tab_delegate_android.cc +++ b/chrome/browser/sync/glue/synced_tab_delegate_android.cc
@@ -36,6 +36,10 @@ return tab_contents_delegate_->IsBeingDestroyed(); } +SessionID::id_type SyncedTabDelegateAndroid::GetSourceTabID() const { + return tab_contents_delegate_->GetSourceTabID(); +} + std::string SyncedTabDelegateAndroid::GetExtensionAppId() const { return tab_contents_delegate_->GetExtensionAppId(); }
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android.h b/chrome/browser/sync/glue/synced_tab_delegate_android.h index 21d7fa4..836e5f3 100644 --- a/chrome/browser/sync/glue/synced_tab_delegate_android.h +++ b/chrome/browser/sync/glue/synced_tab_delegate_android.h
@@ -35,6 +35,7 @@ SessionID::id_type GetWindowId() const override; SessionID::id_type GetSessionId() const override; bool IsBeingDestroyed() const override; + SessionID::id_type GetSourceTabID() const override; std::string GetExtensionAppId() const override; bool IsInitialBlankNavigation() const override; int GetCurrentEntryIndex() const override;
diff --git a/chrome/browser/sync/sessions/browser_list_router_helper.cc b/chrome/browser/sync/sessions/browser_list_router_helper.cc new file mode 100644 index 0000000..5a52abb --- /dev/null +++ b/chrome/browser/sync/sessions/browser_list_router_helper.cc
@@ -0,0 +1,45 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/sessions/browser_list_router_helper.h" + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" + +namespace sync_sessions { + +BrowserListRouterHelper::BrowserListRouterHelper( + SyncSessionsWebContentsRouter* router) + : router_(router) { + BrowserList* browser_list = BrowserList::GetInstance(); + for (Browser* browser : *browser_list) + browser->tab_strip_model()->AddObserver(this); + browser_list->AddObserver(this); +} + +BrowserListRouterHelper::~BrowserListRouterHelper() { + BrowserList* browser_list = BrowserList::GetInstance(); + for (Browser* browser : *browser_list) + browser->tab_strip_model()->RemoveObserver(this); + BrowserList::GetInstance()->RemoveObserver(this); +} + +void BrowserListRouterHelper::OnBrowserAdded(Browser* browser) { + browser->tab_strip_model()->AddObserver(this); +} + +void BrowserListRouterHelper::OnBrowserRemoved(Browser* browser) { + browser->tab_strip_model()->RemoveObserver(this); +} + +void BrowserListRouterHelper::TabInsertedAt(TabStripModel* model, + content::WebContents* web_contents, + int index, + bool foreground) { + router_->NotifyTabModified(web_contents); +} + +} // namespace sync_sessions
diff --git a/chrome/browser/sync/sessions/browser_list_router_helper.h b/chrome/browser/sync/sessions/browser_list_router_helper.h new file mode 100644 index 0000000..16eccdd9 --- /dev/null +++ b/chrome/browser/sync/sessions/browser_list_router_helper.h
@@ -0,0 +1,42 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_SESSIONS_BROWSER_LIST_ROUTER_HELPER_H_ +#define CHROME_BROWSER_SYNC_SESSIONS_BROWSER_LIST_ROUTER_HELPER_H_ + +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h" +#include "chrome/browser/ui/browser_list_observer.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" + +namespace sync_sessions { + +// Non-android helper of SyncSessionsWebContentsRouter that adds tracking for +// multi-window scenarios(e.g. tab movement between windows). Android doesn't +// have a BrowserList or TabStrip, so it doesn't compile the needed +// dependencies, nor would it benefit from the added tracking. +class BrowserListRouterHelper : public chrome::BrowserListObserver, + public TabStripModelObserver { + public: + explicit BrowserListRouterHelper(SyncSessionsWebContentsRouter* router); + ~BrowserListRouterHelper() override; + + private: + // chrome::BrowserListObserver implementation. + void OnBrowserAdded(Browser* browser) override; + void OnBrowserRemoved(Browser* browser) override; + // TabStripModelObserver implementation. + void TabInsertedAt(TabStripModel* model, + content::WebContents* web_contents, + int index, + bool foreground) override; + + // |router_| owns |this|. + SyncSessionsWebContentsRouter* router_; + + DISALLOW_COPY_AND_ASSIGN(BrowserListRouterHelper); +}; + +} // namespace sync_sessions + +#endif // CHROME_BROWSER_SYNC_SESSIONS_BROWSER_LIST_ROUTER_HELPER_H_
diff --git a/chrome/browser/sync/sessions/notification_service_sessions_router.cc b/chrome/browser/sync/sessions/notification_service_sessions_router.cc deleted file mode 100644 index 9bb3d5c8..0000000 --- a/chrome/browser/sync/sessions/notification_service_sessions_router.cc +++ /dev/null
@@ -1,214 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/sync/sessions/notification_service_sessions_router.h" - -#include "base/logging.h" -#include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/history/history_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/sync/glue/sync_start_util.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h" -#include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" -#include "chrome/common/features.h" -#include "components/history/core/browser/history_service.h" -#include "components/sync_sessions/sync_sessions_client.h" -#include "components/sync_sessions/synced_tab_delegate.h" -#include "content/public/browser/navigation_controller.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/notification_details.h" -#include "content/public/browser/notification_service.h" -#include "content/public/browser/notification_source.h" -#include "content/public/browser/web_contents.h" -#include "extensions/features/features.h" - -#if defined(OS_ANDROID) -#include "chrome/browser/android/tab_android.h" -#endif - -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) -#include "chrome/browser/supervised_user/supervised_user_service.h" -#include "chrome/browser/supervised_user/supervised_user_service_factory.h" -#endif - -#if BUILDFLAG(ENABLE_EXTENSIONS) -#include "chrome/browser/extensions/tab_helper.h" -#endif - -using content::NavigationController; -using content::WebContents; - -namespace sync_sessions { - -namespace { - -SyncedTabDelegate* GetSyncedTabDelegateFromWebContents( - content::WebContents* web_contents) { -#if defined(OS_ANDROID) - TabAndroid* tab = TabAndroid::FromWebContents(web_contents); - return tab ? tab->GetSyncedTabDelegate() : nullptr; -#else - SyncedTabDelegate* delegate = - TabContentsSyncedTabDelegate::FromWebContents(web_contents); - return delegate; -#endif -} - -} // namespace - -NotificationServiceSessionsRouter::NotificationServiceSessionsRouter( - Profile* profile, - SyncSessionsClient* sessions_client, - const syncer::SyncableService::StartSyncFlare& flare) - : handler_(nullptr), - profile_(profile), - sessions_client_(sessions_client), - flare_(flare), - weak_ptr_factory_(this) { - registrar_.Add(this, chrome::NOTIFICATION_TAB_PARENTED, - content::NotificationService::AllSources()); - registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, - content::NotificationService::AllSources()); - registrar_.Add(this, content::NOTIFICATION_NAV_LIST_PRUNED, - content::NotificationService::AllSources()); - registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_CHANGED, - content::NotificationService::AllSources()); - registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, - content::NotificationService::AllSources()); -#if BUILDFLAG(ENABLE_EXTENSIONS) - registrar_.Add(this, - chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, - content::NotificationService::AllSources()); -#endif - registrar_.Add(this, - content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, - content::NotificationService::AllBrowserContextsAndSources()); - history::HistoryService* history_service = - HistoryServiceFactory::GetForProfile(profile, - ServiceAccessType::EXPLICIT_ACCESS); - if (history_service) { - favicon_changed_subscription_ = history_service->AddFaviconsChangedCallback( - base::Bind(&NotificationServiceSessionsRouter::OnFaviconsChanged, - base::Unretained(this))); - } -#if BUILDFLAG(ENABLE_SUPERVISED_USERS) - if (profile_->IsSupervised()) { - SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_); - supervised_user_service->AddNavigationBlockedCallback( - base::Bind(&NotificationServiceSessionsRouter::OnNavigationBlocked, - weak_ptr_factory_.GetWeakPtr())); - } -#endif -} - -NotificationServiceSessionsRouter::~NotificationServiceSessionsRouter() {} - -void NotificationServiceSessionsRouter::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - // Source<WebContents>. - case chrome::NOTIFICATION_TAB_PARENTED: - case content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME: - case content::NOTIFICATION_WEB_CONTENTS_DESTROYED: { - WebContents* web_contents = content::Source<WebContents>(source).ptr(); - if (Profile::FromBrowserContext(web_contents->GetBrowserContext()) != - profile_) - return; - SyncedTabDelegate* tab = - GetSyncedTabDelegateFromWebContents(web_contents); - if (!tab) - return; - if (handler_) - handler_->OnLocalTabModified(tab); - if (!tab->ShouldSync(sessions_client_)) - return; - break; - } - // Source<NavigationController>. - case content::NOTIFICATION_NAV_LIST_PRUNED: - case content::NOTIFICATION_NAV_ENTRY_CHANGED: - case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { - WebContents* web_contents = - content::Source<NavigationController>(source).ptr()->GetWebContents(); - if (Profile::FromBrowserContext(web_contents->GetBrowserContext()) != - profile_) - return; - SyncedTabDelegate* tab = - GetSyncedTabDelegateFromWebContents(web_contents); - if (!tab) - return; - if (handler_) - handler_->OnLocalTabModified(tab); - if (!tab->ShouldSync(sessions_client_)) - return; - break; - } -#if BUILDFLAG(ENABLE_EXTENSIONS) - case chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED: { - extensions::TabHelper* extension_tab_helper = - content::Source<extensions::TabHelper>(source).ptr(); - if (Profile::FromBrowserContext( - extension_tab_helper->web_contents()->GetBrowserContext()) != - profile_) { - return; - } - if (extension_tab_helper->extension_app()) { - SyncedTabDelegate* tab = GetSyncedTabDelegateFromWebContents( - extension_tab_helper->web_contents()); - if (!tab) - return; - if (handler_) - handler_->OnLocalTabModified(tab); - if (!tab->ShouldSync(sessions_client_)) - return; - break; - } - return; - } -#endif - default: - LOG(ERROR) << "Received unexpected notification of type " << type; - return; - } - - if (!flare_.is_null()) { - flare_.Run(syncer::SESSIONS); - flare_.Reset(); - } -} - -void NotificationServiceSessionsRouter::OnNavigationBlocked( - content::WebContents* web_contents) { - DCHECK_EQ(profile_, - Profile::FromBrowserContext(web_contents->GetBrowserContext())); - SyncedTabDelegate* tab = GetSyncedTabDelegateFromWebContents(web_contents); - if (!tab || !handler_) - return; - - handler_->OnLocalTabModified(tab); -} - -void NotificationServiceSessionsRouter::OnFaviconsChanged( - const std::set<GURL>& page_urls, - const GURL& icon_url) { - if (handler_) - handler_->OnFaviconsChanged(page_urls, icon_url); -} - -void NotificationServiceSessionsRouter::StartRoutingTo( - LocalSessionEventHandler* handler) { - DCHECK(!handler_); - handler_ = handler; -} - -void NotificationServiceSessionsRouter::Stop() { - weak_ptr_factory_.InvalidateWeakPtrs(); - handler_ = nullptr; -} - -} // namespace sync_sessions
diff --git a/chrome/browser/sync/sessions/notification_service_sessions_router.h b/chrome/browser/sync/sessions/notification_service_sessions_router.h deleted file mode 100644 index 51ca72a..0000000 --- a/chrome/browser/sync/sessions/notification_service_sessions_router.h +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SYNC_SESSIONS_NOTIFICATION_SERVICE_SESSIONS_ROUTER_H_ -#define CHROME_BROWSER_SYNC_SESSIONS_NOTIFICATION_SERVICE_SESSIONS_ROUTER_H_ - -#include <memory> -#include <set> - -#include "base/callback_list.h" -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "components/sync_sessions/sessions_sync_manager.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" - -class GURL; -class Profile; - -namespace content { -class WebContents; -} - -namespace sync_sessions { - -class SyncSessionsClient; - -// A SessionsSyncManager::LocalEventRouter that drives session sync via -// the NotificationService. -class NotificationServiceSessionsRouter - : public LocalSessionEventRouter, - public content::NotificationObserver { - public: - NotificationServiceSessionsRouter( - Profile* profile, - SyncSessionsClient* sessions_client_, - const syncer::SyncableService::StartSyncFlare& flare); - ~NotificationServiceSessionsRouter() override; - - // content::NotificationObserver implementation. - // BrowserSessionProvider -> sync API model change application. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; - - // SessionsSyncManager::LocalEventRouter implementation. - void StartRoutingTo(LocalSessionEventHandler* handler) override; - void Stop() override; - - private: - // Called when the URL visited in |web_contents| was blocked by the - // SupervisedUserService. We forward this on to our handler_ via the - // normal OnLocalTabModified, but pass through here via a WeakPtr - // callback from SupervisedUserService and to extract the tab delegate - // from WebContents. - void OnNavigationBlocked(content::WebContents* web_contents); - - // Called when the favicons for the given page URLs - // (e.g. http://www.google.com) and the given icon URL (e.g. - // http://www.google.com/favicon.ico) have changed. It is valid to call - // OnFaviconsChanged() with non-empty |page_urls| and an empty |icon_url| - // and vice versa. - void OnFaviconsChanged(const std::set<GURL>& page_urls, - const GURL& icon_url); - - LocalSessionEventHandler* handler_; - content::NotificationRegistrar registrar_; - Profile* const profile_; - SyncSessionsClient* const sessions_client_; - syncer::SyncableService::StartSyncFlare flare_; - - std::unique_ptr<base::CallbackList<void(const std::set<GURL>&, - const GURL&)>::Subscription> - favicon_changed_subscription_; - - base::WeakPtrFactory<NotificationServiceSessionsRouter> weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(NotificationServiceSessionsRouter); -}; - -} // namespace sync_sessions - -#endif // CHROME_BROWSER_SYNC_SESSIONS_NOTIFICATION_SERVICE_SESSIONS_ROUTER_H_
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc new file mode 100644 index 0000000..38298ff --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
@@ -0,0 +1,82 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" + +#include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h" +#include "components/sync_sessions/synced_tab_delegate.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/navigation_handle.h" +#include "content/public/browser/render_frame_host.h" + +DEFINE_WEB_CONTENTS_USER_DATA_KEY(sync_sessions::SyncSessionsRouterTabHelper); + +namespace sync_sessions { + +// static +void SyncSessionsRouterTabHelper::CreateForWebContents( + content::WebContents* web_contents, + SyncSessionsWebContentsRouter* router) { + DCHECK(web_contents); + if (!FromWebContents(web_contents)) { + web_contents->SetUserData( + UserDataKey(), new SyncSessionsRouterTabHelper(web_contents, router)); + } +} + +SyncSessionsRouterTabHelper::SyncSessionsRouterTabHelper( + content::WebContents* web_contents, + SyncSessionsWebContentsRouter* router) + : content::WebContentsObserver(web_contents), + router_(router), + source_tab_id_(kInvalidTabID) {} + +SyncSessionsRouterTabHelper::~SyncSessionsRouterTabHelper() {} + +void SyncSessionsRouterTabHelper::DidFinishNavigation( + content::NavigationHandle* navigation_handle) { + NotifyRouter(); +} + +void SyncSessionsRouterTabHelper::TitleWasSet(content::NavigationEntry* entry, + bool explicit_set) { + NotifyRouter(); +} + +void SyncSessionsRouterTabHelper::WebContentsDestroyed() { + NotifyRouter(); +} + +void SyncSessionsRouterTabHelper::DidFinishLoad( + content::RenderFrameHost* render_frame_host, + const GURL& validated_url) { + NotifyRouter(); +} + +void SyncSessionsRouterTabHelper::DidOpenRequestedURL( + content::WebContents* new_contents, + content::RenderFrameHost* source_render_frame_host, + const GURL& url, + const content::Referrer& referrer, + WindowOpenDisposition disposition, + ui::PageTransition transition, + bool started_from_context_menu, + bool renderer_initiated) { + SessionID::id_type source_tab_id = SessionTabHelper::IdForTab(web_contents()); + if (new_contents && + SyncSessionsRouterTabHelper::FromWebContents(new_contents) && + new_contents != web_contents() && source_tab_id != kInvalidTabID) { + SyncSessionsRouterTabHelper::FromWebContents(new_contents) + ->set_source_tab_id(source_tab_id); + } + NotifyRouter(); +} + +void SyncSessionsRouterTabHelper::NotifyRouter() { + if (router_) + router_->NotifyTabModified(web_contents()); +} + +} // namespace sync_sessions
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h new file mode 100644 index 0000000..944249c0 --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h
@@ -0,0 +1,80 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_ROUTER_TAB_HELPER_H_ +#define CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_ROUTER_TAB_HELPER_H_ + +#include "components/sessions/core/session_id.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace sync_sessions { + +class SyncSessionsWebContentsRouter; + +// TabHelper class that forwards tab-level WebContentsObserver events to a +// (per-profile) sessions router. The router is responsible for forwarding +// these events to sessions sync. This class also tracks the source tab id +// of its corresponding tab, if available. +// A TabHelper is a WebContentsObserver tied to the top level WebContents for a +// browser tab. +// https://chromium.googlesource.com/chromium/src/+/master/docs/tab_helpers.md +class SyncSessionsRouterTabHelper + : public content::WebContentsUserData<SyncSessionsRouterTabHelper>, + public content::WebContentsObserver { + public: + ~SyncSessionsRouterTabHelper() override; + + static void CreateForWebContents( + content::WebContents* web_contents, + SyncSessionsWebContentsRouter* session_router); + + // Get the tab id of the tab responsible for creating the tab this helper + // corresponds to. Returns -1 if there is no such tab. + SessionID::id_type source_tab_id() const { return source_tab_id_; } + + private: + friend class content::WebContentsUserData<SyncSessionsRouterTabHelper>; + + explicit SyncSessionsRouterTabHelper(content::WebContents* web_contents, + SyncSessionsWebContentsRouter* router); + + // Set the tab id of the tab reponsible for creating the tab this helper + // corresponds to. + void set_source_tab_id(const SessionID::id_type id) { source_tab_id_ = id; } + + // WebContentsObserver implementation. + void DidFinishNavigation( + content::NavigationHandle* navigation_handle) override; + void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override; + void WebContentsDestroyed() override; + void DidFinishLoad(content::RenderFrameHost* render_frame_host, + const GURL& validated_url) override; + void DidOpenRequestedURL(content::WebContents* new_contents, + content::RenderFrameHost* source_render_frame_host, + const GURL& url, + const content::Referrer& referrer, + WindowOpenDisposition disposition, + ui::PageTransition transition, + bool started_from_context_menu, + bool renderer_initiated) override; + + void NotifyRouter(); + + // |router_| is a KeyedService and is guaranteed to outlive |this|. + SyncSessionsWebContentsRouter* router_; + // Tab id of the tab from which this tab was created. Example events that + // create this relationship: + // * From context menu, "Open link in new tab". + // * From context menu, "Open link in new window". + // * Ctrl-click. + // * Click on a link with target='_blank'. + SessionID::id_type source_tab_id_; + + DISALLOW_COPY_AND_ASSIGN(SyncSessionsRouterTabHelper); +}; + +} // namespace sync_sessions + +#endif // CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_ROUTER_TAB_HELPER_H_
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc new file mode 100644 index 0000000..16df901 --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc
@@ -0,0 +1,80 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h" + +#include "chrome/browser/history/history_service_factory.h" +#include "chrome/browser/profiles/profile.h" +#if !defined(OS_ANDROID) +#include "chrome/browser/sync/sessions/browser_list_router_helper.h" +#endif // !defined(OS_ANDROID) +#include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "components/history/core/browser/history_service.h" +#include "components/sync_sessions/synced_tab_delegate.h" + +namespace sync_sessions { + +SyncSessionsWebContentsRouter::SyncSessionsWebContentsRouter(Profile* profile) { + history::HistoryService* history_service = + HistoryServiceFactory::GetForProfile(profile, + ServiceAccessType::EXPLICIT_ACCESS); + if (history_service) { + favicon_changed_subscription_ = history_service->AddFaviconsChangedCallback( + base::Bind(&SyncSessionsWebContentsRouter::OnFaviconsChanged, + base::Unretained(this))); + } + +#if !defined(OS_ANDROID) + browser_list_helper_ = base::MakeUnique<BrowserListRouterHelper>(this); +#endif // !defined(OS_ANDROID) +} + +SyncSessionsWebContentsRouter::~SyncSessionsWebContentsRouter() {} + +void SyncSessionsWebContentsRouter::NotifyTabModified( + content::WebContents* web_contents) { + if (handler_ && web_contents) { + SyncedTabDelegate* delegate = + TabContentsSyncedTabDelegate::FromWebContents(web_contents); + if (delegate) + handler_->OnLocalTabModified(delegate); + } + + if (!flare_.is_null()) { + flare_.Run(syncer::SESSIONS); + flare_.Reset(); + } +} + +void SyncSessionsWebContentsRouter::InjectStartSyncFlare( + syncer::SyncableService::StartSyncFlare flare) { + flare_ = flare; +} + +void SyncSessionsWebContentsRouter::StartRoutingTo( + LocalSessionEventHandler* handler) { + handler_ = handler; +} + +void SyncSessionsWebContentsRouter::Stop() { + handler_ = nullptr; +} + +void SyncSessionsWebContentsRouter::OnFaviconsChanged( + const std::set<GURL>& page_urls, + const GURL& icon_url) { + if (handler_) + handler_->OnFaviconsChanged(page_urls, icon_url); +} + +void SyncSessionsWebContentsRouter::Shutdown() { + favicon_changed_subscription_.reset(); + +#if !defined(OS_ANDROID) + browser_list_helper_.reset(); +#endif // !defined(OS_ANDROID) +} + +} // namespace sync_sessions
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h new file mode 100644 index 0000000..dc698f2 --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.h
@@ -0,0 +1,72 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_ +#define CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_ + +#include "base/callback_list.h" + +// Android has no BrowserList or TabStripModel, so we exclude code that refers +// to those two things. For non-android platforms, this code is used to +// ensure we are notified of tabs being added and moved between tab strips. + +#include "components/keyed_service/core/keyed_service.h" +#include "components/sync/model/syncable_service.h" +#include "components/sync_sessions/local_session_event_router.h" + +namespace content { +class WebContents; +} // namespace content + +class Profile; + +namespace sync_sessions { + +class BrowserListRouterHelper; + +// WebContentsObserver-based implementation of LocalSessionEventRouter. This +// class is responsible for notifying Sessions Sync when local tabs are +// modified. It does this by forwarding the events pushed to it by individual +// WebContentsObservers, which are scoped to a single WebContents/tab. +class SyncSessionsWebContentsRouter : public LocalSessionEventRouter, + public KeyedService { + public: + explicit SyncSessionsWebContentsRouter(Profile* profile); + + // Notify the router that the tab corresponding to |web_contents| has been + // modified in some way. + void NotifyTabModified(content::WebContents* web_contents); + // Inject a flare that can be used to start sync. See the comment for + // StartSyncFlare in syncable_service.h for more. + void InjectStartSyncFlare(syncer::SyncableService::StartSyncFlare flare); + + // SessionsSyncManager::LocalEventRouter implementation. + void StartRoutingTo(LocalSessionEventHandler* handler) override; + void Stop() override; + + // KeyedService implementation. + void Shutdown() override; + + protected: + ~SyncSessionsWebContentsRouter() override; + + private: + void OnFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url); + + std::unique_ptr<base::CallbackList<void(const std::set<GURL>&, + const GURL&)>::Subscription> + favicon_changed_subscription_; + syncer::SyncableService::StartSyncFlare flare_; + LocalSessionEventHandler* handler_ = nullptr; + +#if !defined(OS_ANDROID) + std::unique_ptr<BrowserListRouterHelper> browser_list_helper_; +#endif // !defined(OS_ANDROID) + + DISALLOW_COPY_AND_ASSIGN(SyncSessionsWebContentsRouter); +}; + +} // namespace sync_sessions + +#endif // CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_H_
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc new file mode 100644 index 0000000..e3bd7e6 --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc
@@ -0,0 +1,40 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h" + +#include "base/logging.h" +#include "base/memory/singleton.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router.h" + +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +namespace sync_sessions { + +// static +SyncSessionsWebContentsRouter* +SyncSessionsWebContentsRouterFactory::GetForProfile(Profile* profile) { + return static_cast<SyncSessionsWebContentsRouter*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +// static +SyncSessionsWebContentsRouterFactory* +SyncSessionsWebContentsRouterFactory::GetInstance() { + return base::Singleton<SyncSessionsWebContentsRouterFactory>::get(); +} + +SyncSessionsWebContentsRouterFactory::SyncSessionsWebContentsRouterFactory() + : BrowserContextKeyedServiceFactory( + "SyncSessionsWebContentsRouter", + BrowserContextDependencyManager::GetInstance()) {} + +SyncSessionsWebContentsRouterFactory::~SyncSessionsWebContentsRouterFactory() {} + +KeyedService* SyncSessionsWebContentsRouterFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + return new SyncSessionsWebContentsRouter(static_cast<Profile*>(context)); +} + +} // namespace sync_sessions
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h new file mode 100644 index 0000000..23471f4 --- /dev/null +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h
@@ -0,0 +1,52 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_FACTORY_H_ +#define CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_FACTORY_H_ + +#include "base/macros.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class Profile; + +namespace base { +template <typename T> +struct DefaultSingletonTraits; +} // namespace base + +namespace sync_sessions { + +class SyncSessionsWebContentsRouter; + +class SyncSessionsWebContentsRouterFactory + : public BrowserContextKeyedServiceFactory { + public: + // Get the SyncSessionsWebContentsRouter service for |profile|, creating one + // if needed. + static SyncSessionsWebContentsRouter* GetForProfile(Profile* profile); + + // Get the singleton instance of the factory. + static SyncSessionsWebContentsRouterFactory* GetInstance(); + + // Creates a SyncSessionsWebContentsRouter service for |context|. + static SyncSessionsWebContentsRouter* BuildSyncSessionsWebContentsRouter( + content::BrowserContext* context); + + private: + friend struct base::DefaultSingletonTraits< + SyncSessionsWebContentsRouterFactory>; + + SyncSessionsWebContentsRouterFactory(); + ~SyncSessionsWebContentsRouterFactory() override; + + // Overridden from BrowserContextKeyedServiceFactory. + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; + + DISALLOW_COPY_AND_ASSIGN(SyncSessionsWebContentsRouterFactory); +}; + +} // namespace sync_sessions + +#endif // CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSIONS_WEB_CONTENTS_ROUTER_FACTORY_H_
diff --git a/chrome/browser/sync/test/integration/sessions_helper.cc b/chrome/browser/sync/test/integration/sessions_helper.cc index 84a843a..8ac1507 100644 --- a/chrome/browser/sync/test/integration/sessions_helper.cc +++ b/chrome/browser/sync/test/integration/sessions_helper.cc
@@ -20,7 +20,6 @@ #include "base/time/time.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/profile_sync_service_factory.h" -#include "chrome/browser/sync/sessions/notification_service_sessions_router.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" #include "chrome/browser/ui/browser.h" @@ -35,7 +34,10 @@ #include "components/sync/test/fake_server/sessions_hierarchy.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "content/public/browser/navigation_entry.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test_utils.cc" #include "content/public/test/test_utils.h" #include "url/gurl.h" @@ -50,7 +52,7 @@ ->GetLocalSession(session); } -bool ModelAssociatorHasTabWithUrl(int index, const GURL& url) { +bool SessionsSyncManagerHasTabWithURL(int index, const GURL& url) { content::RunAllPendingInMessageLoop(); const sync_sessions::SyncedSession* local_session; if (!GetLocalSession(index, &local_session)) { @@ -101,7 +103,10 @@ bool OpenTabAtIndex(int index, int tab_index, const GURL& url) { chrome::AddTabAt(test()->GetBrowser(index), url, tab_index, true); - return WaitForTabsToLoad(index, {url}); + return WaitForTabToLoad( + index, url, + test()->GetBrowser(index)->tab_strip_model()->GetWebContentsAt( + tab_index)); } bool OpenMultipleTabs(int index, const std::vector<GURL>& urls) { @@ -115,6 +120,31 @@ return WaitForTabsToLoad(index, urls); } +bool OpenTabFromSourceIndex(int index, + int index_of_source_tab, + const GURL& url, + WindowOpenDisposition disposition) { + content::WebContents* source_contents = + test()->GetBrowser(index)->tab_strip_model()->GetWebContentsAt( + index_of_source_tab); + + content::OpenURLParams open_url_params(url, content::Referrer(), disposition, + ui::PAGE_TRANSITION_LINK, false, + false); + open_url_params.source_render_frame_id = + source_contents->GetMainFrame()->GetRoutingID(); + open_url_params.source_render_process_id = + source_contents->GetRenderProcessHost()->GetID(); + + content::WebContents* new_contents = + source_contents->OpenURL(open_url_params); + if (!new_contents) { + return false; + } + + return WaitForTabToLoad(index, url, new_contents); +} + void MoveTab(int from_index, int to_index, int tab_index) { content::WebContents* detached_contents = test() @@ -133,7 +163,7 @@ params.disposition = WindowOpenDisposition::CURRENT_TAB; ui_test_utils::NavigateToURL(¶ms); - return WaitForTabsToLoad(index, {url}); + return WaitForTabToLoad(index, url, params.target_contents); } void NavigateTabBack(int index) { @@ -154,69 +184,38 @@ .GoForward(); } -namespace { - -class TabEventHandler : public sync_sessions::LocalSessionEventHandler { - public: - TabEventHandler() : weak_factory_(this) { - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::Bind(&TabEventHandler::QuitLoop, weak_factory_.GetWeakPtr()), - TestTimeouts::action_max_timeout()); - } - - void OnLocalTabModified( - sync_sessions::SyncedTabDelegate* modified_tab) override { - // Unwind to ensure SessionsSyncManager has processed the event. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&TabEventHandler::QuitLoop, weak_factory_.GetWeakPtr())); - } - - void OnFaviconsChanged(const std::set<GURL>& /* page_urls */, - const GURL& /* icon_url */) override { - // Unwind to ensure SessionsSyncManager has processed the event. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&TabEventHandler::QuitLoop, weak_factory_.GetWeakPtr())); - } - - private: - void QuitLoop() { base::MessageLoop::current()->QuitWhenIdle(); } - - base::WeakPtrFactory<TabEventHandler> weak_factory_; -}; - -} // namespace - bool WaitForTabsToLoad(int index, const std::vector<GURL>& urls) { + int tab_index = 0; + for (const auto& url : urls) { + bool success = WaitForTabToLoad( + index, url, + test()->GetBrowser(index)->tab_strip_model()->GetWebContentsAt( + tab_index)); + if (!success) { + return false; + } + tab_index++; + } + return true; +} + +bool WaitForTabToLoad(int index, + const GURL& url, + content::WebContents* web_contents) { DVLOG(1) << "Waiting for session to propagate to associator."; base::TimeTicks start_time = base::TimeTicks::Now(); base::TimeTicks end_time = start_time + TestTimeouts::action_max_timeout(); - bool found; - for (std::vector<GURL>::const_iterator it = urls.begin(); - it != urls.end(); ++it) { - found = false; - while (!found) { - found = ModelAssociatorHasTabWithUrl(index, *it); - if (base::TimeTicks::Now() >= end_time) { - LOG(ERROR) << "Failed to find all tabs after " - << TestTimeouts::action_max_timeout().InSecondsF() - << " seconds."; - return false; - } - if (!found) { - TabEventHandler handler; - sync_sessions::NotificationServiceSessionsRouter router( - test()->GetProfile(index), - ProfileSyncServiceFactory::GetInstance() - ->GetForProfile(test()->GetProfile(index)) - ->GetSyncClient() - ->GetSyncSessionsClient(), - syncer::SyncableService::StartSyncFlare()); - router.StartRoutingTo(&handler); - content::RunMessageLoop(); - } + bool found = false; + while (!found) { + found = SessionsSyncManagerHasTabWithURL(index, url); + if (base::TimeTicks::Now() >= end_time) { + LOG(ERROR) << "Failed to find url " << url.spec() << " in tab after " + << TestTimeouts::action_max_timeout().InSecondsF() + << " seconds."; + return false; + } + if (!found) { + content::WaitForLoadStop(web_contents); } } return true; @@ -224,7 +223,7 @@ bool GetLocalWindows(int index, ScopedWindowMap* local_windows) { // The local session provided by GetLocalSession is owned, and has lifetime - // controlled, by the model associator, so we must make our own copy. + // controlled, by the sessions sync manager, so we must make our own copy. const sync_sessions::SyncedSession* local_session; if (!GetLocalSession(index, &local_session)) { return false;
diff --git a/chrome/browser/sync/test/integration/sessions_helper.h b/chrome/browser/sync/test/integration/sessions_helper.h index b1078b4..6cfe88b 100644 --- a/chrome/browser/sync/test/integration/sessions_helper.h +++ b/chrome/browser/sync/test/integration/sessions_helper.h
@@ -40,7 +40,7 @@ // Returns number of foreign sessions for a profile. int GetNumForeignSessions(int index); -// Fills the sessions vector with the model associator's foreign session data. +// Fills the sessions vector with the SyncableService's foreign session data. // Caller owns |sessions|, but not SyncedSessions objects within. // Returns true if foreign sessions were found, false otherwise. bool GetSessionData(int index, SyncedSessionVector* sessions); @@ -77,7 +77,7 @@ const std::vector<ScopedWindowMap>& windows); // Open a single tab in the browser at |index| and block until the -// session model associator is aware of it. Returns true upon success, false +// session SyncableService is aware of it. Returns true upon success, false // otherwise. bool OpenTab(int index, const GURL& url); @@ -87,12 +87,23 @@ // size 1, the new tab will be in position 1. bool OpenTabAtIndex(int index, int tab_index, const GURL& url); +// Like OpenTab, but opens |url| from the tab at |index_of_source_tab| using +// |disposition|. +bool OpenTabFromSourceIndex(int index, + int index_of_source_tab, + const GURL& url, + WindowOpenDisposition disposition); + +// Open multiple tabs and block until the session SyncableService is aware +// of all of them. Returns true on success, false on failure. +bool OpenMultipleTabs(int index, const std::vector<GURL>& urls); + // Moves the tab in position |tab_index| in the TabStrip for browser at // |from_index| to the TabStrip for browser at |to_index|. void MoveTab(int from_index, int to_index, int tab_index); // Navigate the active tab for browser in position |index| to the given -// url, and blocks until the session model associator is aware of it. +// url, and blocks until the session SyncableService is aware of it. // WARNING: it's dangerous to assume this will return for any arbitrary URL. // For URLs that don't resolve to a valid server response, this can block // indefinitely. Use a data uri or the embedded_test_server to ensure that this @@ -107,17 +118,20 @@ // one; if this isn't possible, does nothing void NavigateTabForward(int index); -// Open multiple tabs and block until the session model associator is aware -// of all of them. Returns true on success, false on failure. -bool OpenMultipleTabs(int index, const std::vector<GURL>& urls); +// Wait for a session change to |web_contents| to propagate to the model +// associator. Will return true once |url| has been found, or false if it times +// out while waiting. +bool WaitForTabToLoad(int index, + const GURL& url, + content::WebContents* web_contents); -// Wait for a session change to propagate to the model associator. Will not -// return until each url in |urls| has been found. +// Wait for each url in |urls| to load. The ordering of |urls| is assumed to +// match the ordering of the corresponding tabs. bool WaitForTabsToLoad(int index, const std::vector<GURL>& urls); -// Check if the session model associator's knows that the current open tab +// Check if the session SyncableService knows that the current open tab // has this url. -bool ModelAssociatorHasTabWithUrl(int index, const GURL& url); +bool SessionsSyncManagerHasTabWithURL(int index, const GURL& url); // Stores a pointer to the local session for a given profile in |session|. // Returns true on success, false on failure.
diff --git a/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc b/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc index f460295f..c7a6a0f7 100644 --- a/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_printers_sync_test.cc
@@ -60,7 +60,13 @@ } // Verify editing a printer doesn't add it. -IN_PROC_BROWSER_TEST_F(SingleClientPrintersSyncTest, EditPrinter) { +// Flaky on ChromeOS. http://crbug.com/701999 +#if defined(OS_CHROMEOS) +#define MAYBE_EditPrinter DISABLED_EditPrinter +#else +#define MAYBE_EditPrinter EditPrinter +#endif +IN_PROC_BROWSER_TEST_F(SingleClientPrintersSyncTest, MAYBE_EditPrinter) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; AddPrinter(GetPrinterStore(0), printers_helper::CreateTestPrinter(0));
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc index 6003ec8..8733513 100644 --- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -6,12 +6,16 @@ #include "base/run_loop.h" #include "base/test/histogram_tester.h" #include "chrome/browser/sessions/session_service.h" +#include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/session_hierarchy_match_checker.h" #include "chrome/browser/sync/test/integration/sessions_helper.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/typed_urls_helper.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/url_constants.h" #include "components/browser_sync/profile_sync_service.h" #include "components/history/core/browser/history_types.h" @@ -19,6 +23,7 @@ #include "components/sync/base/time.h" #include "components/sync/driver/sync_driver_switches.h" #include "components/sync/test/fake_server/sessions_hierarchy.h" +#include "ui/base/mojo/window_open_disposition.mojom.h" using base::HistogramBase; using base::HistogramSamples; @@ -27,17 +32,17 @@ using sessions_helper::CheckInitialState; using sessions_helper::GetLocalWindows; using sessions_helper::GetSessionData; -using sessions_helper::ModelAssociatorHasTabWithUrl; +using sessions_helper::SessionsSyncManagerHasTabWithURL; using sessions_helper::MoveTab; using sessions_helper::NavigateTab; using sessions_helper::NavigateTabBack; using sessions_helper::NavigateTabForward; using sessions_helper::OpenTab; using sessions_helper::OpenTabAtIndex; +using sessions_helper::OpenTabFromSourceIndex; using sessions_helper::ScopedWindowMap; using sessions_helper::SessionWindowMap; using sessions_helper::SyncedSessionVector; -using sessions_helper::WaitForTabsToLoad; using sessions_helper::WindowsMatch; using typed_urls_helper::GetUrlFromClient; @@ -324,6 +329,34 @@ {{base_url.spec()}, {new_window_url.spec(), moved_tab_url.spec()}})); } +IN_PROC_BROWSER_TEST_F(SingleClientSessionsSyncTest, SourceTabIDSet) { + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(CheckInitialState(0)); + + GURL base_url = GURL(kURL1); + ASSERT_TRUE(OpenTab(0, base_url)); + + WaitForURLOnServer(base_url); + + GURL new_tab_url = GURL(kURL2); + ASSERT_TRUE(OpenTabFromSourceIndex( + 0, 0, new_tab_url, WindowOpenDisposition::NEW_FOREGROUND_TAB)); + WaitForHierarchyOnServer( + SessionsHierarchy({{base_url.spec(), new_tab_url.spec()}})); + + content::WebContents* original_tab_contents = + GetBrowser(0)->tab_strip_model()->GetWebContentsAt(0); + content::WebContents* new_tab_contents = + GetBrowser(0)->tab_strip_model()->GetWebContentsAt(1); + + SessionID::id_type source_tab_id = + SessionTabHelper::IdForTab(original_tab_contents); + sync_sessions::SyncSessionsRouterTabHelper* new_tab_helper = + sync_sessions::SyncSessionsRouterTabHelper::FromWebContents( + new_tab_contents); + EXPECT_EQ(new_tab_helper->source_tab_id(), source_tab_id); +} + // crbug.com/689662 #if defined(OS_CHROMEOS) #define MAYBE_CookieJarMismatch DISABLED_CookieJarMismatch
diff --git a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc index 9ad194b..06c5519 100644 --- a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc
@@ -212,7 +212,7 @@ // Add a second browser for profile 0. This browser ends up in index 2. AddBrowser(0); EXPECT_TRUE(OpenTab(2, GURL(kURL3))); - EXPECT_TRUE(OpenTabAtIndex(2, 2, GURL(kURL4))); + EXPECT_TRUE(OpenTabAtIndex(2, 1, GURL(kURL4))); WaitForForeignSessionsToSync(0, 1); }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 1b9a0fc..6bbd318 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -26,9 +26,11 @@ # Use a static library here because many test binaries depend on this but don't # require many files from it. This makes linking more efficient. split_static_library("ui") { - # Split into multiple static libraries on Windows official builds, where we - # run into a 2GB max size limit. - if (is_win && is_official_build) { + # Split into multiple static libraries on Windows builds. We have hit size + # limits on Windows official builds and on goma builds when symbol_level = 2 + # is selected. Always splitting on Windows builds is simpler than trying to + # perfectly calculate the scenarios where it is required. + if (is_win) { split_count = 5 } else { split_count = 1 @@ -933,6 +935,7 @@ "webui/help/version_updater_mac.h", "webui/help/version_updater_mac.mm", "webui/help/version_updater_win.cc", + "webui/help/version_updater_win.h", "webui/history_login_handler.cc", "webui/history_login_handler.h", "webui/identity_internals_ui.cc", @@ -1483,6 +1486,7 @@ "views/extensions/chooser_dialog_view.cc", "views/extensions/chooser_dialog_view.h", "views/extensions/extension_install_dialog_view.cc", + "views/extensions/extension_install_dialog_view.h", "views/extensions/extension_keybinding_registry_views.cc", "views/extensions/extension_keybinding_registry_views.h", "views/frame/native_widget_mac_frameless_nswindow.h", @@ -2233,6 +2237,7 @@ "android/infobars/update_password_infobar.cc", "android/infobars/update_password_infobar.h", "android/javascript_app_modal_dialog_android.cc", + "android/javascript_app_modal_dialog_android.h", "android/login_handler_android.cc", "android/omnibox/omnibox_url_emphasizer.cc", "android/omnibox/omnibox_url_emphasizer.h", @@ -3079,7 +3084,10 @@ ] if (!is_chrome_branded) { deps -= [ "//google_update" ] - sources -= [ "webui/help/version_updater_win.cc" ] + sources -= [ + "webui/help/version_updater_win.cc", + "webui/help/version_updater_win.h", + ] sources += [ "webui/help/version_updater_basic.cc", "webui/help/version_updater_basic.h",
diff --git a/chrome/browser/ui/app_list/app_list_service_disabled.cc b/chrome/browser/ui/app_list/app_list_service_disabled.cc index 56c87a7..a2ffa9a 100644 --- a/chrome/browser/ui/app_list/app_list_service_disabled.cc +++ b/chrome/browser/ui/app_list/app_list_service_disabled.cc
@@ -21,7 +21,6 @@ #include "chrome/browser/ui/user_manager.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" -#include "components/signin/core/common/profile_management_switches.h" #include "ui/base/page_transition_types.h" #endif @@ -81,10 +80,6 @@ #if defined(TOOLKIT_VIEWS) bool IsProfileSignedOut(Profile* profile) { - // The signed out status only makes sense at the moment in the context of the - // --new-profile-management flag. - if (!switches::IsNewProfileManagement()) - return false; ProfileAttributesEntry* entry; bool has_entry = g_browser_process->profile_manager()
diff --git a/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc index 536fd9f..16da1dd 100644 --- a/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc +++ b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc
@@ -12,7 +12,6 @@ #include "chrome/browser/ui/app_list/app_list_view_delegate.h" #include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h" #include "chrome/browser/ui/browser.h" -#include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/prefs/pref_service.h" @@ -103,8 +102,6 @@ // Test that all the items in the context menu for a hosted app have valid // labels. IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, ShowContextMenu) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableNewBookmarkApps); AppListService* service = AppListService::Get(); EXPECT_TRUE(service);
diff --git a/chrome/browser/ui/app_list/extension_app_item.cc b/chrome/browser/ui/app_list/extension_app_item.cc index 93e2bd5..277256f5 100644 --- a/chrome/browser/ui/app_list/extension_app_item.cc +++ b/chrome/browser/ui/app_list/extension_app_item.cc
@@ -84,20 +84,17 @@ canvas->DrawImageInt(icon_, 0, 0); - SkBitmap mask_bitmap; - mask_bitmap.allocN32Pixels(icon_.width(), icon_.height(), false); - SkCanvas mask_canvas(mask_bitmap); - mask_canvas.clear(SK_ColorTRANSPARENT); - SkPaint mask_paint; - mask_paint.setAntiAlias(true); - mask_paint.setColor(SK_ColorWHITE); - mask_canvas.drawRoundRect( - gfx::RectToSkRect(gfx::Rect(icon_.width(), icon_.height())), - kRoundingRadius, kRoundingRadius, mask_paint); - cc::PaintFlags masking_flags; masking_flags.setBlendMode(SkBlendMode::kDstIn); - canvas->sk_canvas()->drawBitmap(mask_bitmap, 0, 0, &masking_flags); + canvas->SaveLayerWithFlags(masking_flags); + + cc::PaintFlags mask_flags; + mask_flags.setAntiAlias(true); + mask_flags.setColor(SK_ColorWHITE); + canvas->DrawRoundRect(gfx::Rect(icon_.width(), icon_.height()), + kRoundingRadius, mask_flags); + + canvas->Restore(); } gfx::ImageSkia icon_;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h index a216826..3741cfd 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.h
@@ -96,18 +96,9 @@ // Closes or unpins the shelf item. virtual void CloseLauncherItem(ash::ShelfID id) = 0; - // Pins the specified id. Currently only supports platform apps. - virtual void Pin(ash::ShelfID id) = 0; - - // Unpins the specified id, closing if not running. - virtual void Unpin(ash::ShelfID id) = 0; - // Returns true if the item identified by |id| is pinned. virtual bool IsPinned(ash::ShelfID id) = 0; - // Pins/unpins the specified id. - virtual void TogglePinned(ash::ShelfID id) = 0; - // If there is no item in the shelf for application |app_id|, one is created. // The (existing or created) shelf items get then locked against a user's // un-pinning removal. Used for V1 apps opened as windows that aren't pinned.
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc index 27283fd..96b494e8 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc
@@ -350,33 +350,9 @@ } } -void ChromeLauncherControllerImpl::Pin(ash::ShelfID id) { - DCHECK(HasShelfIDToAppIDMapping(id)); +void ChromeLauncherControllerImpl::UnpinShelfItemInternal(ash::ShelfID id) { const ash::ShelfItem* item = GetItem(id); - if (item && item->type == ash::TYPE_APP) - SetItemType(id, ash::TYPE_PINNED_APP); - else if (!item || item->type != ash::TYPE_PINNED_APP) - return; - - SyncPinPosition(id); -} - -void ChromeLauncherControllerImpl::Unpin(ash::ShelfID id) { - UnpinAndUpdatePrefs(id, true /* update_prefs */); -} - -void ChromeLauncherControllerImpl::UnpinAndUpdatePrefs(ash::ShelfID id, - bool update_prefs) { LauncherItemController* controller = GetLauncherItemController(id); - CHECK(controller); - - if (update_prefs) { - ash::launcher::RemovePinPosition( - profile(), - ash::AppLaunchId(GetAppIDForShelfID(id), GetLaunchIDForShelfID(id))); - } - - const ash::ShelfItem* item = GetItem(id); if (item && (item->status != ash::STATUS_CLOSED || controller->locked())) UnpinRunningAppInternal(model_->ItemIndexByID(id)); else @@ -389,16 +365,6 @@ item->type == ash::TYPE_BROWSER_SHORTCUT); } -void ChromeLauncherControllerImpl::TogglePinned(ash::ShelfID id) { - if (!HasShelfIDToAppIDMapping(id)) - return; // May happen if item closed with menu open. - - if (IsPinned(id)) - Unpin(id); - else - Pin(id); -} - void ChromeLauncherControllerImpl::LockV1AppWithID(const std::string& app_id) { ash::ShelfID id = GetShelfIDForAppID(app_id); if (id == ash::kInvalidShelfID) { @@ -444,9 +410,6 @@ } bool ChromeLauncherControllerImpl::IsPlatformApp(ash::ShelfID id) { - if (!HasShelfIDToAppIDMapping(id)) - return false; - std::string app_id = GetAppIDForShelfID(id); const Extension* extension = GetExtensionForAppID(app_id, profile()); // An extension can be synced / updated at any time and therefore not be @@ -731,9 +694,8 @@ LauncherItemController* ChromeLauncherControllerImpl::GetLauncherItemController( const ash::ShelfID id) { - if (!HasShelfIDToAppIDMapping(id)) - return nullptr; - return id_to_item_controller_map_[id]; + IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); + return iter == id_to_item_controller_map_.end() ? nullptr : iter->second; } bool ChromeLauncherControllerImpl::ShelfBoundsChangesProbablyWithUser( @@ -836,68 +798,89 @@ ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForAppID( const std::string& app_id) { - // Get shelf id for app_id and empty launch_id. + // Get shelf id for |app_id| and an empty |launch_id|. return GetShelfIDForAppIDAndLaunchID(app_id, std::string()); } ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForAppIDAndLaunchID( const std::string& app_id, const std::string& launch_id) { + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 const std::string shelf_app_id = ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); - for (const auto& id_to_item_controller_pair : id_to_item_controller_map_) { - if (id_to_item_controller_pair.second->app_id() == shelf_app_id && - id_to_item_controller_pair.second->launch_id() == launch_id) { - return id_to_item_controller_pair.first; + + for (const ash::ShelfItem& item : model_->items()) { + // Ash's ShelfWindowWatcher handles app panel windows separately. + if (item.type != ash::TYPE_APP_PANEL && + item.app_launch_id.app_id() == shelf_app_id && + item.app_launch_id.launch_id() == launch_id) { + return item.id; } } return ash::kInvalidShelfID; } -bool ChromeLauncherControllerImpl::HasShelfIDToAppIDMapping( - ash::ShelfID id) const { - return id_to_item_controller_map_.find(id) != - id_to_item_controller_map_.end(); -} - const std::string& ChromeLauncherControllerImpl::GetAppIDForShelfID( ash::ShelfID id) { - LauncherItemController* controller = GetLauncherItemController(id); - if (controller) - return controller->app_id(); ash::ShelfItems::const_iterator item = model_->ItemByID(id); return item != model_->items().end() ? item->app_launch_id.app_id() : base::EmptyString(); } void ChromeLauncherControllerImpl::PinAppWithID(const std::string& app_id) { + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 const std::string shelf_app_id = ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); - if (GetPinnableForAppID(shelf_app_id, profile()) == - AppListControllerDelegate::PIN_EDITABLE) - DoPinAppWithID(shelf_app_id); - else - NOTREACHED(); + + // Requests to pin should only be be made for apps with editable pin states. + DCHECK_EQ(GetPinnableForAppID(shelf_app_id, profile()), + AppListControllerDelegate::PIN_EDITABLE); + + // If the app is already pinned, do nothing and return. + if (IsAppPinned(shelf_app_id)) + return; + + // Convert an existing item to be pinned, or create a new pinned item. + ash::ShelfID shelf_id = GetShelfIDForAppID(shelf_app_id); + if (shelf_id != ash::kInvalidShelfID) { + DCHECK_EQ(GetItem(shelf_id)->type, ash::TYPE_APP); + DCHECK(!GetItem(shelf_id)->pinned_by_policy); + SetItemType(shelf_id, ash::TYPE_PINNED_APP); + } else { + shelf_id = CreateAppShortcutLauncherItem(ash::AppLaunchId(shelf_app_id), + model_->item_count()); + } + + // TODO(msw): Trigger pref updates in ShelfModelObserver overrides. + SyncPinPosition(shelf_id); } bool ChromeLauncherControllerImpl::IsAppPinned(const std::string& app_id) { + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 const std::string shelf_app_id = ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); - for (const auto& pair : id_to_item_controller_map_) { - if (IsPinned(pair.first) && pair.second->app_id() == shelf_app_id) - return true; - } - return false; + + return IsPinned(GetShelfIDForAppID(shelf_app_id)); } void ChromeLauncherControllerImpl::UnpinAppWithID(const std::string& app_id) { + // TODO(khmel): Fix this Arc application id mapping. See http://b/31703859 const std::string shelf_app_id = ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); - if (GetPinnableForAppID(shelf_app_id, profile()) == - AppListControllerDelegate::PIN_EDITABLE) - DoUnpinAppWithID(shelf_app_id, true /* update_prefs */); - else - NOTREACHED(); + + // Requests to unpin should only be be made for apps with editable pin states. + DCHECK_EQ(GetPinnableForAppID(shelf_app_id, profile()), + AppListControllerDelegate::PIN_EDITABLE); + + // If the app is already not pinned, do nothing and return. + if (!IsAppPinned(shelf_app_id)) + return; + + // TODO(msw): Trigger pref updates in ShelfModelObserver overrides. + ash::launcher::RemovePinPosition(profile(), ash::AppLaunchId(shelf_app_id)); + + // Unpin the shelf item. + UnpinShelfItemInternal(GetShelfIDForAppID(shelf_app_id)); } /////////////////////////////////////////////////////////////////////////////// @@ -932,15 +915,16 @@ // Since we might have windowed apps of this type which might have // outstanding locks which needs to be removed. const Profile* profile = Profile::FromBrowserContext(browser_context); - if (GetShelfIDForAppID(app_id)) + ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); + if (shelf_id != ash::kInvalidShelfID) CloseWindowedAppsFromRemovedExtension(app_id, profile); if (IsAppPinned(app_id)) { - if (profile == this->profile()) { - // Some apps may be removed locally. Don't remove pin position from sync - // model. When needed, it is automatically deleted on app list model - // update. - DoUnpinAppWithID(app_id, false /* update_prefs */); + if (profile == this->profile() && shelf_id != ash::kInvalidShelfID) { + // Some apps may be removed locally. Unpin the item without removing the + // pin position from profile preferences. When needed, it is automatically + // deleted on app list model update. + UnpinShelfItemInternal(shelf_id); } AppIconLoader* app_icon_loader = GetAppIconLoaderForApp(app_id); if (app_icon_loader) @@ -1032,30 +1016,6 @@ model_->RemoveItemAt(index); } -void ChromeLauncherControllerImpl::DoPinAppWithID(const std::string& app_id) { - // If there is an item, do nothing and return. - if (IsAppPinned(app_id)) - return; - - ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); - if (shelf_id) { - // App item exists, pin it - Pin(shelf_id); - } else { - // Otherwise, create a shortcut item for it. - shelf_id = CreateAppShortcutLauncherItem(ash::AppLaunchId(app_id), - model_->item_count()); - SyncPinPosition(shelf_id); - } -} - -void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id, - bool update_prefs) { - ash::ShelfID shelf_id = GetShelfIDForAppID(app_id); - if (shelf_id && IsPinned(shelf_id)) - UnpinAndUpdatePrefs(shelf_id, update_prefs); -} - void ChromeLauncherControllerImpl::PinRunningAppInternal( int index, ash::ShelfID shelf_id) { @@ -1138,7 +1098,7 @@ void ChromeLauncherControllerImpl::UpdateAppLaunchersFromPref() { // There are various functions which will trigger a |SyncPinPosition| call - // like a direct call to |DoPinAppWithID|, or an indirect call to the menu + // like a direct call to |PinAppWithID|, or an indirect call to the menu // model which will use weights to re-arrange the icons to new positions. // Since this function is meant to synchronize the "is state" with the // "sync state", it makes no sense to store any changes by this function back @@ -1203,23 +1163,10 @@ // At second step remove any pin to the right from the current index. while (index < model_->item_count()) { const ash::ShelfItem item = model_->items()[index]; - if (item.type != ash::TYPE_PINNED_APP) { + if (item.type == ash::TYPE_PINNED_APP) + UnpinShelfItemInternal(item.id); + else ++index; - continue; - } - - const LauncherItemController* controller = - GetLauncherItemController(item.id); - DCHECK(controller); - DCHECK_NE(controller->app_id(), extension_misc::kChromeAppId); - - if (item.status != ash::STATUS_CLOSED || controller->locked()) { - UnpinRunningAppInternal(index); - // Note, item can be moved to the right due weighting in shelf model. - DCHECK_GE(model_->ItemIndexByID(item.id), index); - } else { - LauncherItemClosed(item.id); - } } UpdatePolicyPinnedAppsFromPrefs(); @@ -1287,7 +1234,7 @@ int index, ash::ShelfItemType shelf_item_type) { ash::ShelfID id = model_->next_id(); - CHECK(!HasShelfIDToAppIDMapping(id)); + CHECK(!GetItem(id)); CHECK(controller); // Ash's ShelfWindowWatcher handles app panel windows separately. DCHECK_NE(ash::TYPE_APP_PANEL, shelf_item_type); @@ -1325,6 +1272,8 @@ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); browser_shortcut.image = *rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_32); browser_shortcut.title = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); + browser_shortcut.app_launch_id = + ash::AppLaunchId(extension_misc::kChromeAppId); ash::ShelfID id = model_->next_id(); model_->AddAt(0, browser_shortcut); BrowserShortcutLauncherItemController* controller = @@ -1432,7 +1381,7 @@ // We remember the moved item position if it is either pinnable or // it is the app list with the alternate shelf layout. DCHECK_NE(ash::TYPE_APP_LIST, item.type); - if (HasShelfIDToAppIDMapping(item.id) && IsPinned(item.id)) + if (IsPinned(item.id)) SyncPinPosition(item.id); }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h index 6c032f9..cfdc396 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.h
@@ -69,10 +69,7 @@ void SetItemController(ash::ShelfID id, LauncherItemController* controller) override; void CloseLauncherItem(ash::ShelfID id) override; - void Pin(ash::ShelfID id) override; - void Unpin(ash::ShelfID id) override; bool IsPinned(ash::ShelfID id) override; - void TogglePinned(ash::ShelfID id) override; void LockV1AppWithID(const std::string& app_id) override; void UnlockV1AppWithID(const std::string& app_id) override; void Launch(ash::ShelfID id, int event_flags) override; @@ -133,7 +130,6 @@ ash::ShelfID GetShelfIDForAppIDAndLaunchID( const std::string& app_id, const std::string& launch_id) override; - bool HasShelfIDToAppIDMapping(ash::ShelfID id) const override; const std::string& GetAppIDForShelfID(ash::ShelfID id) override; void PinAppWithID(const std::string& app_id) override; bool IsAppPinned(const std::string& app_id) override; @@ -271,9 +267,8 @@ // sync_preferences::PrefServiceSyncableObserver: void OnIsSyncingChanged() override; - // Unpins shelf item and optionally updates pin prefs when |update_prefs| is - // set to true. - void UnpinAndUpdatePrefs(ash::ShelfID id, bool update_prefs); + // An internal helper to unpin a shelf item; this does not update prefs. + void UnpinShelfItemInternal(ash::ShelfID id); ash::ShelfModel* model_;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc index af53acf..798c68a 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -339,10 +339,6 @@ return item.id; } - void RemoveShortcut(ash::ShelfID id) { - controller_->Unpin(id); - } - ash::ShelfID PinFakeApp(const std::string& app_id) { return controller_->CreateAppShortcutLauncherItem(ash::AppLaunchId(app_id), model_->item_count()); @@ -495,7 +491,7 @@ shelf_model()->ItemIndexByID(id)); // Pin the app. The item should remain. - controller_->Pin(id); + controller_->PinAppWithID(extension->id()); ASSERT_EQ(item_count, shelf_model()->item_count()); const ash::ShelfItem& item2 = *shelf_model()->ItemByID(id); EXPECT_EQ(ash::TYPE_PINNED_APP, item2.type); @@ -546,7 +542,7 @@ EXPECT_EQ(ash::STATUS_ACTIVE, item.status); // Unpin the app. The item should remain. - controller_->Unpin(shortcut_id); + controller_->UnpinAppWithID(app_id); ASSERT_EQ(item_count, shelf_model()->item_count()); item = *shelf_model()->ItemByID(shortcut_id); EXPECT_EQ(ash::TYPE_APP, item.type); @@ -2042,7 +2038,7 @@ // Test #5: Uninstalling an application while it is being ripped off should // not crash. - ash::ShelfID app_id = CreateShortcut("app2"); + CreateShortcut("app2"); test.RunMessageLoopUntilAnimationsDone(); int app2_index = GetIndexOfShelfItemType(ash::TYPE_PINNED_APP); EXPECT_EQ(3, model_->item_count()); // And it remains that way. @@ -2050,7 +2046,7 @@ &generator, &test, RIP_OFF_ITEM_AND_DONT_RELEASE_MOUSE); - RemoveShortcut(app_id); + controller_->UnpinAppWithID("app2"); test.RunMessageLoopUntilAnimationsDone(); EXPECT_EQ(2, model_->item_count()); // The item should now be gone. generator.ReleaseLeftButton(); @@ -2224,7 +2220,7 @@ EXPECT_TRUE(shelf_->shelf_widget()->IsShowingOverflowBubble()); // Unpin first pinned app and there should be no crash. - controller_->UnpinAppWithID(std::string("fake_app_0")); + controller_->UnpinAppWithID("fake_app_0"); test.RunMessageLoopUntilAnimationsDone(); EXPECT_FALSE(shelf_->shelf_widget()->IsShowingOverflowBubble());
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_unittest.cc index 0d746cb..1b30599 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_unittest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_unittest.cc
@@ -298,10 +298,6 @@ return controller_->GetShelfIDForAppIDAndLaunchID(app_id, launch_id); } - bool HasShelfIDToAppIDMapping(ash::ShelfID id) const override { - return controller_->HasShelfIDToAppIDMapping(id); - } - const std::string& GetAppIDForShelfID(ash::ShelfID id) override { return controller_->GetAppIDForShelfID(id); }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.cc index 57194c1..a6e0edc0 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.cc
@@ -53,23 +53,11 @@ NOTIMPLEMENTED(); } -void ChromeLauncherControllerMus::Pin(ash::ShelfID id) { - NOTIMPLEMENTED(); -} - -void ChromeLauncherControllerMus::Unpin(ash::ShelfID id) { - NOTIMPLEMENTED(); -} - bool ChromeLauncherControllerMus::IsPinned(ash::ShelfID id) { NOTIMPLEMENTED(); return false; } -void ChromeLauncherControllerMus::TogglePinned(ash::ShelfID id) { - NOTIMPLEMENTED(); -} - void ChromeLauncherControllerMus::LockV1AppWithID(const std::string& app_id) { NOTIMPLEMENTED(); }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.h b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.h index 1f0253e..fda34b2 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.h +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_mus.h
@@ -24,10 +24,7 @@ void SetItemController(ash::ShelfID id, LauncherItemController* controller) override; void CloseLauncherItem(ash::ShelfID id) override; - void Pin(ash::ShelfID id) override; - void Unpin(ash::ShelfID id) override; bool IsPinned(ash::ShelfID id) override; - void TogglePinned(ash::ShelfID id) override; void LockV1AppWithID(const std::string& app_id) override; void UnlockV1AppWithID(const std::string& app_id) override; void Launch(ash::ShelfID id, int event_flags) override;
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc index 5852c23..4ddb2a7 100644 --- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
@@ -127,7 +127,10 @@ ash::UMA_CLOSE_THROUGH_CONTEXT_MENU); break; case MENU_PIN: - controller_->TogglePinned(item_.id); + if (controller_->IsAppPinned(item_.app_launch_id.app_id())) + controller_->UnpinAppWithID(item_.app_launch_id.app_id()); + else + controller_->PinAppWithID(item_.app_launch_id.app_id()); break; case MENU_AUTO_HIDE: wm_shelf_->SetAutoHideBehavior(
diff --git a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm index 34d097b01..579a760 100644 --- a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
@@ -76,13 +76,12 @@ fake_model_.reset(new MockAppMenuModel); sync_prefs_.reset(new syncer::SyncPrefs(profile()->GetPrefs())); + dummy_router_.reset(new DummyRouter()); manager_.reset(new sync_sessions::SessionsSyncManager( ProfileSyncServiceFactory::GetForProfile(profile()) ->GetSyncClient() ->GetSyncSessionsClient(), - sync_prefs_.get(), local_device_.get(), - std::unique_ptr<sync_sessions::LocalSessionEventRouter>( - new DummyRouter()), + sync_prefs_.get(), local_device_.get(), dummy_router_.get(), base::Closure(), base::Closure())); manager_->MergeDataAndStartSyncing( syncer::SESSIONS, syncer::SyncDataList(), @@ -117,6 +116,7 @@ private: std::unique_ptr<syncer::SyncPrefs> sync_prefs_; + std::unique_ptr<DummyRouter> dummy_router_; std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; };
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm index 8035dfc..b1c3ec4 100644 --- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm +++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm
@@ -12,6 +12,7 @@ #import "base/mac/scoped_objc_class_swizzler.h" #include "base/macros.h" #include "base/strings/sys_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/apps/app_browsertest_util.h" #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h" @@ -20,7 +21,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" -#include "chrome/common/chrome_switches.h" +#include "chrome/common/chrome_features.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/app_window/native_app_window.h" #include "extensions/browser/uninstall_reason.h" @@ -42,9 +43,10 @@ hosted_app_(nullptr), initial_menu_item_count_(0) {} - void SetUpCommandLine(base::CommandLine* command_line) override { - PlatformAppBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(switches::kEnableNewBookmarkApps); + // testing::Test: + void SetUp() override { + PlatformAppBrowserTest::SetUp(); + scoped_feature_list_.InitAndEnableFeature(features::kBookmarkApps); } // Start testing apps and wait for them to launch. |flags| is a bitmask of @@ -134,6 +136,8 @@ NSUInteger initial_menu_item_count_; private: + base::test::ScopedFeatureList scoped_feature_list_; + DISALLOW_COPY_AND_ASSIGN(AppShimMenuControllerBrowserTest); };
diff --git a/chrome/browser/ui/cocoa/new_tab_button.mm b/chrome/browser/ui/cocoa/new_tab_button.mm index 3224e67..50a829b 100644 --- a/chrome/browser/ui/cocoa/new_tab_button.mm +++ b/chrome/browser/ui/cocoa/new_tab_button.mm
@@ -25,13 +25,7 @@ DARKEN, }; - const NSSize newTabButtonImageSize = { 34, 18 }; - -const CGFloat k7PercentAlpha = 0.07; -const CGFloat k8PercentAlpha = 0.08; -const CGFloat k10PercentAlpha = 0.1; -const CGFloat k20PercentAlpha = 0.2; -const CGFloat k25PercentAlpha = 0.25; +const NSSize newTabButtonImageSize = {34, 18}; NSImage* GetMaskImageFromCell(NewTabButtonCell* aCell) { return [aCell imageForState:image_button_cell::kDefaultState view:nil]; @@ -185,8 +179,17 @@ // Returns a new tab button image bezier path with the specified line width. + (NSBezierPath*)newTabButtonBezierPathWithLineWidth:(CGFloat)lineWidth; -// NSCustomImageRep custom drawing method that renders the new tab button image. -+ (void)drawNewTabButtonImage:(NewTabButtonCustomImageRep*)imageRep; +// Draws the new tab button image to |imageRep|, with either a normal stroke or +// a heavy stroke for increased visibility. ++ (void)drawNewTabButtonImage:(NewTabButtonCustomImageRep*)imageRep + withHeavyStroke:(BOOL)heavyStroke; + +// NSCustomImageRep custom drawing method shims for normal and heavy strokes +// respectively. ++ (void)drawNewTabButtonImageWithNormalStroke: + (NewTabButtonCustomImageRep*)imageRep; ++ (void)drawNewTabButtonImageWithHeavyStroke: + (NewTabButtonCustomImageRep*)imageRep; // Returns a new tab button image filled with |fillColor|. - (NSImage*)imageWithFillColor:(NSColor*)fillColor; @@ -318,9 +321,13 @@ NOTREACHED(); } + SEL drawSelector = @selector(drawNewTabButtonImageWithNormalStroke:); + if (theme && theme->ShouldIncreaseContrast()) + drawSelector = @selector(drawNewTabButtonImageWithHeavyStroke:); + base::scoped_nsobject<NewTabButtonCustomImageRep> imageRep( [[NewTabButtonCustomImageRep alloc] - initWithDrawSelector:@selector(drawNewTabButtonImage:) + initWithDrawSelector:drawSelector delegate:[NewTabButton class]]); [imageRep setDestView:self]; [imageRep setFillColor:fillColor]; @@ -398,7 +405,8 @@ return bezierPath; } -+ (void)drawNewTabButtonImage:(NewTabButtonCustomImageRep*)imageRep { ++ (void)drawNewTabButtonImage:(NewTabButtonCustomImageRep*)imageRep + withHeavyStroke:(BOOL)heavyStroke { [[NSGraphicsContext currentContext] cr_setPatternPhase:[imageRep patternPhasePosition] forView:[imageRep destView]]; @@ -414,8 +422,9 @@ [bezierPath fill]; } + CGFloat alpha = heavyStroke ? 1.0 : 0.25; static NSColor* strokeColor = - [[NSColor colorWithCalibratedWhite:0 alpha:k25PercentAlpha] retain]; + [[NSColor colorWithCalibratedWhite:0 alpha:alpha] retain]; [strokeColor set]; [bezierPath stroke]; @@ -430,7 +439,7 @@ [bottomEdgePath moveToPoint:bottomEdgeStart]; [bottomEdgePath lineToPoint:bottomEdgeEnd]; static NSColor* bottomEdgeColor = - [[NSColor colorWithCalibratedWhite:0 alpha:k7PercentAlpha] retain]; + [[NSColor colorWithCalibratedWhite:0 alpha:0.07] retain]; [bottomEdgeColor set]; [bottomEdgePath setLineWidth:lineWidth]; [bottomEdgePath setLineCapStyle:NSRoundLineCapStyle]; @@ -445,9 +454,9 @@ const CGFloat kTopShadowY = kBottomShadowY + 15; const CGFloat kShadowWidth = 24; static NSColor* lightOverlayColor = - [[NSColor colorWithCalibratedWhite:1 alpha:k20PercentAlpha] retain]; + [[NSColor colorWithCalibratedWhite:1 alpha:0.20] retain]; static NSColor* darkOverlayColor = - [[NSColor colorWithCalibratedWhite:0 alpha:k8PercentAlpha] retain]; + [[NSColor colorWithCalibratedWhite:0 alpha:0.08] retain]; switch ([imageRep overlayOption]) { case OverlayOption::LIGHTEN: @@ -474,7 +483,7 @@ [shadowPath setLineWidth:lineWidth]; [shadowPath setLineCapStyle:NSRoundLineCapStyle]; static NSColor* shadowColor = - [[NSColor colorWithCalibratedWhite:0 alpha:k10PercentAlpha] retain]; + [[NSColor colorWithCalibratedWhite:0 alpha:0.10] retain]; [shadowColor set]; [shadowPath stroke]; } @@ -485,6 +494,16 @@ } } ++ (void)drawNewTabButtonImageWithNormalStroke: + (NewTabButtonCustomImageRep*)image { + [self drawNewTabButtonImage:image withHeavyStroke:NO]; +} + ++ (void)drawNewTabButtonImageWithHeavyStroke: + (NewTabButtonCustomImageRep*)image { + [self drawNewTabButtonImage:image withHeavyStroke:YES]; +} + - (NSImage*)imageWithFillColor:(NSColor*)fillColor { NSImage* image = [[[NSImage alloc] initWithSize:newTabButtonImageSize] autorelease];
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm index 5b3307a..e1c8a258 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm
@@ -132,16 +132,13 @@ // Icon if ([notificationData_ objectForKey:kNotificationImage]) { - if ([toast respondsToSelector:@selector(_identityImage)]) { - if ([[NSImage class] conformsToProtocol:@protocol(NSSecureCoding)]) { - NSImage* image = [notificationData_ objectForKey:kNotificationImage]; - [toast setValue:image forKey:@"_identityImage"]; - } else { // NSImage only conforms to NSSecureCoding from 10.10 onwards. - base::scoped_nsobject<NSImage> image([[NSImage alloc] - initWithData:[notificationData_ objectForKey:kNotificationImage]]); - [toast setValue:image forKey:@"_identityImage"]; - } - [toast setValue:@NO forKey:@"_identityImageHasBorder"]; + if ([[NSImage class] conformsToProtocol:@protocol(NSSecureCoding)]) { + NSImage* image = [notificationData_ objectForKey:kNotificationImage]; + [toast setContentImage:image]; + } else { // NSImage only conforms to NSSecureCoding from 10.10 onwards. + base::scoped_nsobject<NSImage> image([[NSImage alloc] + initWithData:[notificationData_ objectForKey:kNotificationImage]]); + [toast setContentImage:image]; } }
diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm index 33a43df..a8800bb 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller_unittest.mm
@@ -418,9 +418,6 @@ } TEST_F(ProfileChooserControllerTest, SignedInProfileLockDisabled) { - switches::EnableNewProfileManagementForTesting( - base::CommandLine::ForCurrentProcess()); - SignInFirstProfile(); // The preference, not the email, determines whether the profile can lock. @@ -444,9 +441,6 @@ } TEST_F(ProfileChooserControllerTest, SignedInProfileLockEnabled) { - switches::EnableNewProfileManagementForTesting( - base::CommandLine::ForCurrentProcess()); - SignInFirstProfile(); // The preference, not the email, determines whether the profile can lock.
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc index 97e0218..80b59a1c 100644 --- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc +++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/compiler_specific.h" +#include "base/test/scoped_feature_list.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_util.h" @@ -15,7 +16,6 @@ #include "chrome/browser/ui/extensions/hosted_app_browser_controller.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/web_applications/web_app.h" -#include "chrome/common/chrome_switches.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_registry.h" @@ -23,6 +23,10 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" +#if defined(OS_MACOSX) +#include "chrome/common/chrome_features.h" +#endif + using content::WebContents; using extensions::Extension; @@ -46,6 +50,14 @@ HostedAppTest() : app_browser_(nullptr) {} ~HostedAppTest() override {} + // testing::Test: + void SetUp() override { + ExtensionBrowserTest::SetUp(); +#if defined(OS_MACOSX) + scoped_feature_list_.InitAndEnableFeature(features::kBookmarkApps); +#endif + } + protected: void SetupApp(const std::string& app_folder, bool is_bookmark_app) { const Extension* app = InstallExtensionWithSourceAndFlags( @@ -77,14 +89,16 @@ } Browser* app_browser_; + + private: + base::test::ScopedFeatureList scoped_feature_list_; + + DISALLOW_COPY_AND_ASSIGN(HostedAppTest); }; // Check that the location bar is shown correctly for bookmark apps. IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldShowLocationBarForBookmarkApp) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableNewBookmarkApps); - SetupApp("app", true); // Navigate to the app's launch page; the location bar should be hidden. @@ -105,9 +119,6 @@ // they navigate to a HTTPS page on the same origin. IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldShowLocationBarForHTTPBookmarkApp) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableNewBookmarkApps); - SetupApp("app", true); // Navigate to the app's launch page; the location bar should be hidden. @@ -124,9 +135,6 @@ // they navigate to a HTTP page on the same origin. IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldShowLocationBarForHTTPSBookmarkApp) { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableNewBookmarkApps); - SetupApp("https_app", true); // Navigate to the app's launch page; the location bar should be hidden.
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 0efc97a3..3e48a63d 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -71,7 +71,6 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/search_engines/util.h" -#include "components/signin/core/common/profile_management_switches.h" #include "components/url_formatter/url_fixer.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/child_process_security_policy.h" @@ -964,8 +963,7 @@ auto* storage = &profile_manager->GetProfileAttributesStorage(); ProfileAttributesEntry* entry; bool has_entry = storage->GetProfileAttributesWithPath(profile_path, &entry); - if (has_entry && (!switches::IsNewProfileManagement() || - !entry->IsSigninRequired() || !profile)) { + if (has_entry && (!entry->IsSigninRequired() || !profile)) { return profile; }
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index 636367a..eaf8ccc 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -7,6 +7,7 @@ #include "base/memory/ref_counted.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" +#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" #include "chrome/common/features.h" #include "components/sessions/content/content_serialized_navigation_builder.h" #include "components/sync_sessions/sync_sessions_client.h" @@ -164,3 +165,10 @@ } return false; } + +SessionID::id_type TabContentsSyncedTabDelegate::GetSourceTabID() const { + sync_sessions::SyncSessionsRouterTabHelper* helper = + sync_sessions::SyncSessionsRouterTabHelper::FromWebContents( + web_contents_); + return helper->source_tab_id(); +}
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h index 38e8a2e..79ddf68 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h
@@ -46,6 +46,7 @@ int GetSyncId() const override; void SetSyncId(int sync_id) override; bool ShouldSync(sync_sessions::SyncSessionsClient* sessions_client) override; + SessionID::id_type GetSourceTabID() const override; private: explicit TabContentsSyncedTabDelegate(content::WebContents* web_contents);
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 1a04c4d..49f938d 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -37,6 +37,8 @@ #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" +#include "chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h" #include "chrome/browser/tab_contents/navigation_metrics_recorder.h" #include "chrome/browser/tracing/navigation_tracing.h" #include "chrome/browser/translate/chrome_translate_client.h" @@ -200,6 +202,10 @@ new ChromeSubresourceFilterClient(web_contents)); subresource_filter::ContentSubresourceFilterDriverFactory:: CreateForWebContents(web_contents, std::move(subresource_filter_client)); + sync_sessions::SyncSessionsRouterTabHelper::CreateForWebContents( + web_contents, + sync_sessions::SyncSessionsWebContentsRouterFactory::GetForProfile( + Profile::FromBrowserContext(web_contents->GetBrowserContext()))); // TODO(vabr): Remove TabSpecificContentSettings from here once their function // is taken over by ChromeContentSettingsClient. http://crbug.com/387075 TabSpecificContentSettings::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc index b89a513..a6b2a94 100644 --- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc +++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
@@ -128,14 +128,17 @@ "Chromium 10k", "Chrome 10k", sync_pb::SyncEnums_DeviceType_TYPE_LINUX, - "device_id")) { - sync_prefs_.reset(new syncer::SyncPrefs(testing_profile_.GetPrefs())); - manager_.reset(new sync_sessions::SessionsSyncManager( - sync_service_.GetSyncClient()->GetSyncSessionsClient(), - sync_prefs_.get(), local_device_.get(), - std::unique_ptr<sync_sessions::LocalSessionEventRouter>( - new DummyRouter()), - base::Closure(), base::Closure())); + "device_id")), + dummy_router_(base::MakeUnique<DummyRouter>()), + sync_prefs_( + base::MakeUnique<syncer::SyncPrefs>(testing_profile_.GetPrefs())), + manager_(base::MakeUnique<sync_sessions::SessionsSyncManager>( + sync_service_.GetSyncClient()->GetSyncSessionsClient(), + sync_prefs_.get(), + local_device_.get(), + dummy_router_.get(), + base::Closure(), + base::Closure())) { manager_->MergeDataAndStartSyncing( syncer::SESSIONS, syncer::SyncDataList(), std::unique_ptr<syncer::SyncChangeProcessor>( @@ -167,9 +170,10 @@ private: TestingProfile testing_profile_; browser_sync::ProfileSyncServiceMock sync_service_; + std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; + std::unique_ptr<DummyRouter> dummy_router_; std::unique_ptr<syncer::SyncPrefs> sync_prefs_; std::unique_ptr<sync_sessions::SessionsSyncManager> manager_; - std::unique_ptr<syncer::LocalDeviceInfoProviderMock> local_device_; }; // Test disabled "Recently closed" header with no foreign tabs.
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc index 656e843..9893a37 100644 --- a/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_chooser_view_browsertest.cc
@@ -121,12 +121,10 @@ protected: void SetUp() override { ExtensionBrowserTest::SetUp(); - DCHECK(switches::IsNewProfileManagement()); } void SetUpCommandLine(base::CommandLine* command_line) override { ExtensionBrowserTest::SetUpCommandLine(command_line); - switches::EnableNewProfileManagementForTesting(command_line); } void OpenProfileChooserView(Browser* browser) {
diff --git a/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc index 1f378848..39ff5fe 100644 --- a/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc
@@ -7,9 +7,13 @@ #include "base/command_line.h" #include "base/strings/string_util.h" #include "chrome/browser/chromeos/login/oobe_screen.h" +#include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h" #include "chrome/grit/generated_resources.h" #include "chromeos/chromeos_switches.h" #include "components/login/localized_values_builder.h" +#include "components/policy/core/browser/cloud/message_util.h" +#include "google_apis/gaia/google_service_auth_error.h" +#include "ui/base/l10n/l10n_util.h" namespace chromeos { @@ -117,4 +121,136 @@ CallJS(kMethodContextChanged, diff); } +std::string HostPairingScreenHandler::GetErrorStringFromAuthError( + const GoogleServiceAuthError& error) { + switch (error.state()) { + case GoogleServiceAuthError::NONE: + case GoogleServiceAuthError::CAPTCHA_REQUIRED: + case GoogleServiceAuthError::TWO_FACTOR: + case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: + case GoogleServiceAuthError::REQUEST_CANCELED: + case GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE: + case GoogleServiceAuthError::SERVICE_ERROR: + case GoogleServiceAuthError::WEB_LOGIN_REQUIRED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_AUTH_FATAL_ERROR); + case GoogleServiceAuthError::USER_NOT_SIGNED_UP: + case GoogleServiceAuthError::ACCOUNT_DELETED: + case GoogleServiceAuthError::ACCOUNT_DISABLED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_AUTH_ACCOUNT_ERROR); + case GoogleServiceAuthError::CONNECTION_FAILED: + case GoogleServiceAuthError::SERVICE_UNAVAILABLE: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_AUTH_NETWORK_ERROR); + default: + return std::string(); + } +} + +std::string HostPairingScreenHandler::GetErrorStringFromEnrollmentError( + policy::EnrollmentStatus status) { + switch (status.status()) { + case policy::EnrollmentStatus::NO_STATE_KEYS: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_NO_STATE_KEYS); + case policy::EnrollmentStatus::REGISTRATION_FAILED: + switch (status.client_status()) { + case policy::DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR); + case policy::DM_STATUS_SERVICE_MISSING_LICENSES: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_MISSING_LICENSES_ERROR); + case policy::DM_STATUS_SERVICE_DEPROVISIONED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_DEPROVISIONED_ERROR); + case policy::DM_STATUS_SERVICE_DOMAIN_MISMATCH: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_DOMAIN_MISMATCH_ERROR); + default: + return l10n_util::GetStringFUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_FAILED, + policy::FormatDeviceManagementStatus(status.client_status())); + } + case policy::EnrollmentStatus::ROBOT_AUTH_FETCH_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ROBOT_AUTH_FETCH_FAILED); + case policy::EnrollmentStatus::ROBOT_REFRESH_FETCH_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ROBOT_REFRESH_FETCH_FAILED); + case policy::EnrollmentStatus::ROBOT_REFRESH_STORE_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ROBOT_REFRESH_STORE_FAILED); + case policy::EnrollmentStatus::REGISTRATION_BAD_MODE: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_BAD_MODE); + case policy::EnrollmentStatus::REGISTRATION_CERT_FETCH_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_CERT_FETCH_FAILED); + case policy::EnrollmentStatus::POLICY_FETCH_FAILED: + return l10n_util::GetStringFUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_POLICY_FETCH_FAILED, + policy::FormatDeviceManagementStatus(status.client_status())); + case policy::EnrollmentStatus::VALIDATION_FAILED: + return l10n_util::GetStringFUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_VALIDATION_FAILED, + policy::FormatValidationStatus(status.validation_status())); + case policy::EnrollmentStatus::LOCK_ERROR: + switch (status.lock_status()) { + case InstallAttributes::LOCK_TIMEOUT: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_TIMEOUT); + case InstallAttributes::LOCK_BACKEND_INVALID: + case InstallAttributes::LOCK_ALREADY_LOCKED: + case InstallAttributes::LOCK_SET_ERROR: + case InstallAttributes::LOCK_FINALIZE_ERROR: + case InstallAttributes::LOCK_READBACK_ERROR: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_ERROR); + case InstallAttributes::LOCK_WRONG_DOMAIN: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_WRONG_USER); + case InstallAttributes::LOCK_WRONG_MODE: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_WRONG_MODE); + default: + return std::string(); + } + case policy::EnrollmentStatus::STORE_ERROR: + return l10n_util::GetStringFUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_STORE_ERROR, + policy::FormatStoreStatus(status.store_status(), + status.validation_status())); + case policy::EnrollmentStatus::ATTRIBUTE_UPDATE_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ATTRIBUTE_ERROR); + case policy::EnrollmentStatus::NO_MACHINE_IDENTIFICATION: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_NO_MACHINE_IDENTIFICATION); + case policy::EnrollmentStatus::ACTIVE_DIRECTORY_POLICY_FETCH_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ERROR_ACTIVE_DIRECTORY_POLICY_FETCH); + case policy::EnrollmentStatus::DM_TOKEN_STORE_FAILED: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_ERROR_SAVE_DEVICE_CONFIGURATION); + default: + return std::string(); + } +} + +std::string HostPairingScreenHandler::GetErrorStringFromOtherError( + EnterpriseEnrollmentHelper::OtherError error) { + switch (error) { + case EnterpriseEnrollmentHelper::OTHER_ERROR_DOMAIN_MISMATCH: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_WRONG_USER); + case EnterpriseEnrollmentHelper::OTHER_ERROR_FATAL: + return l10n_util::GetStringUTF8( + IDS_ENTERPRISE_ENROLLMENT_FATAL_ENROLLMENT_ERROR); + default: + return std::string(); + } +} + } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.h index 7bb74f4..9064f8d 100644 --- a/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/host_pairing_screen_handler.h
@@ -34,6 +34,12 @@ void Hide() override; void SetDelegate(Delegate* delegate) override; void OnContextChanged(const base::DictionaryValue& diff) override; + std::string GetErrorStringFromAuthError( + const GoogleServiceAuthError& error) override; + std::string GetErrorStringFromEnrollmentError( + policy::EnrollmentStatus status) override; + std::string GetErrorStringFromOtherError( + EnterpriseEnrollmentHelper::OtherError error) override; HostPairingScreenView::Delegate* delegate_ = nullptr; bool show_on_init_ = false;
diff --git a/chrome/browser/ui/webui/md_downloads/downloads_list_tracker.cc b/chrome/browser/ui/webui/md_downloads/downloads_list_tracker.cc index f9ea5862..b85f1535 100644 --- a/chrome/browser/ui/webui/md_downloads/downloads_list_tracker.cc +++ b/chrome/browser/ui/webui/md_downloads/downloads_list_tracker.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/i18n/rtl.h" +#include "base/i18n/unicodestring.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" @@ -74,8 +75,7 @@ icu::DateFormat::createDateInstance(icu::DateFormat::kLong)); icu::UnicodeString date_string; formatter->format(static_cast<UDate>(time.ToDoubleT() * 1000), date_string); - return base::string16(date_string.getBuffer(), - static_cast<size_t>(date_string.length())); + return base::i18n::UnicodeStringToString16(date_string); } } // namespace
diff --git a/chrome/browser/ui/webui/profile_helper_browsertest.cc b/chrome/browser/ui/webui/profile_helper_browsertest.cc deleted file mode 100644 index aed22c8..0000000 --- a/chrome/browser/ui/webui/profile_helper_browsertest.cc +++ /dev/null
@@ -1,190 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/memory/ptr_util.h" -#include "base/run_loop.h" -#include "base/scoped_observer.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/profiles/profile_attributes_storage.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/browser_list_observer.h" -#include "chrome/browser/ui/webui/profile_helper.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "content/public/browser/notification_service.h" -#include "content/public/test/test_utils.h" -#include "content/public/test/test_web_ui.h" - -namespace { - -// An observer that returns back to test code after a new profile is -// initialized. -void UnblockOnProfileCreation(base::RunLoop* run_loop, - Profile* profile, - Profile::CreateStatus status) { - if (status == Profile::CREATE_STATUS_INITIALIZED) - run_loop->Quit(); -} - -Profile* CreateProfile() { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - base::FilePath new_path = profile_manager->GenerateNextProfileDirectoryPath(); - base::RunLoop run_loop; - profile_manager->CreateProfileAsync( - new_path, base::Bind(&UnblockOnProfileCreation, &run_loop), - base::string16(), std::string(), std::string()); - run_loop.Run(); - return profile_manager->GetProfileByPath(new_path); -} - -// An observer returns back to test code after brower window associated with -// the profile is activated. -class ExpectBrowserActivationForProfile : public chrome::BrowserListObserver { - public: - explicit ExpectBrowserActivationForProfile(Profile* profile) - : profile_(profile), scoped_observer_(this) { - scoped_observer_.Add(BrowserList::GetInstance()); - } - - void Wait() { - loop_.Run(); - } - - protected: - void OnBrowserSetLastActive(Browser* browser) override { - if (browser->profile() == profile_) - loop_.Quit(); - } - - private: - Profile* profile_; - base::RunLoop loop_; - ScopedObserver<BrowserList, chrome::BrowserListObserver> scoped_observer_; -}; - -} // namespace - -using ProfileHelperTest = InProcessBrowserTest; - -IN_PROC_BROWSER_TEST_F(ProfileHelperTest, OpenNewWindowForProfile) { - BrowserList* browser_list = BrowserList::GetInstance(); - - Browser* original_browser = browser(); - Profile* original_profile = original_browser->profile(); - std::unique_ptr<ExpectBrowserActivationForProfile> activation_observer; - - // Sanity checks. - EXPECT_EQ(1u, browser_list->size()); - EXPECT_TRUE(base::ContainsValue(*browser_list, original_browser)); - - // Opening existing browser profile shouldn't open additional browser windows. - webui::OpenNewWindowForProfile(original_profile); - EXPECT_EQ(1u, browser_list->size()); - EXPECT_EQ(original_browser, browser_list->GetLastActive()); - - // Open additional browser will add new window and activates it. - Profile* additional_profile = CreateProfile(); - activation_observer = - base::MakeUnique<ExpectBrowserActivationForProfile>(additional_profile); - webui::OpenNewWindowForProfile(additional_profile); - EXPECT_EQ(2u, browser_list->size()); - activation_observer->Wait(); - EXPECT_EQ(additional_profile, browser_list->GetLastActive()->profile()); - -// On Macs OpenNewWindowForProfile does not activate existing browser -// while non of the browser windows have focus. BrowserWindowCocoa::Show() got -// the same issue as BrowserWindowCocoa::Activate(), and execute call -// BrowserList::SetLastActive() directly. Not sure if it is a bug or desired -// behaviour. -#if !defined(OS_MACOSX) - // Switch to original browser. Only LastActive should change. - activation_observer = - base::MakeUnique<ExpectBrowserActivationForProfile>(original_profile); - webui::OpenNewWindowForProfile(original_profile); - EXPECT_EQ(2u, browser_list->size()); - activation_observer->Wait(); - EXPECT_EQ(original_profile, browser_list->GetLastActive()->profile()); -#endif -} - -IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteSoleProfile) { - content::TestWebUI web_ui; - Browser* original_browser = browser(); - ProfileAttributesStorage& storage = - g_browser_process->profile_manager()->GetProfileAttributesStorage(); - - BrowserList* browser_list = BrowserList::GetInstance(); - EXPECT_EQ(1u, browser_list->size()); - EXPECT_TRUE(base::ContainsValue(*browser_list, original_browser)); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); - - // Original browser will be closed, and browser with the new profile created. - content::WindowedNotificationObserver open_observer( - chrome::NOTIFICATION_BROWSER_OPENED, - content::NotificationService::AllSources()); - content::WindowedNotificationObserver close_observer( - chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(browser())); - webui::DeleteProfileAtPath(original_browser->profile()->GetPath(), &web_ui, - ProfileMetrics::DELETE_PROFILE_SETTINGS); - open_observer.Wait(); - close_observer.Wait(); - - EXPECT_EQ(1u, browser_list->size()); - EXPECT_FALSE(base::ContainsValue(*browser_list, original_browser)); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); -} - -IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteActiveProfile) { - content::TestWebUI web_ui; - Browser* original_browser = browser(); - ProfileAttributesStorage& storage = - g_browser_process->profile_manager()->GetProfileAttributesStorage(); - - BrowserList* browser_list = BrowserList::GetInstance(); - EXPECT_EQ(1u, browser_list->size()); - EXPECT_TRUE(base::ContainsValue(*browser_list, original_browser)); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); - - Profile* additional_profile = CreateProfile(); - EXPECT_EQ(2u, storage.GetNumberOfProfiles()); - - // Original browser will be closed, and browser with the new profile created. - content::WindowedNotificationObserver open_observer( - chrome::NOTIFICATION_BROWSER_OPENED, - content::NotificationService::AllSources()); - content::WindowedNotificationObserver close_observer( - chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(browser())); - webui::DeleteProfileAtPath(original_browser->profile()->GetPath(), &web_ui, - ProfileMetrics::DELETE_PROFILE_SETTINGS); - open_observer.Wait(); - close_observer.Wait(); - - EXPECT_EQ(1u, browser_list->size()); - EXPECT_EQ(additional_profile, browser_list->get(0)->profile()); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); -} - -IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteInactiveProfile) { - content::TestWebUI web_ui; - Browser* original_browser = browser(); - ProfileAttributesStorage& storage = - g_browser_process->profile_manager()->GetProfileAttributesStorage(); - - BrowserList* browser_list = BrowserList::GetInstance(); - EXPECT_EQ(1u, browser_list->size()); - EXPECT_TRUE(base::ContainsValue(*browser_list, original_browser)); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); - - Profile* additional_profile = CreateProfile(); - EXPECT_EQ(2u, storage.GetNumberOfProfiles()); - - webui::DeleteProfileAtPath(additional_profile->GetPath(), &web_ui, - ProfileMetrics::DELETE_PROFILE_SETTINGS); - - EXPECT_EQ(1u, browser_list->size()); - EXPECT_TRUE(base::ContainsValue(*browser_list, original_browser)); - EXPECT_EQ(1u, storage.GetNumberOfProfiles()); -}
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc index a5bc189..9e611a4 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
@@ -34,7 +34,6 @@ #include "components/drive/chromeos/file_system_interface.h" #include "components/user_manager/user_manager.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/bytes_formatting.h" @@ -143,9 +142,13 @@ int64_t* total_size = new int64_t(0); int64_t* available_size = new int64_t(0); - content::BrowserThread::PostBlockingPoolTaskAndReply( - FROM_HERE, base::Bind(&GetSizeStatBlocking, downloads_path, total_size, - available_size), + base::PostTaskWithTraitsAndReply( + FROM_HERE, + base::TaskTraits() + .WithPriority(base::TaskPriority::USER_VISIBLE) + .MayBlock(), + base::Bind(&GetSizeStatBlocking, downloads_path, total_size, + available_size), base::Bind(&StorageHandler::OnGetSizeStat, base::Unretained(this), base::Owned(total_size), base::Owned(available_size))); }
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index b79e488..90b64a1 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -234,8 +234,7 @@ if (gaia::AreEmailsSame(email_, primary_email) && (reason == signin_metrics::Reason::REASON_REAUTHENTICATION || reason == signin_metrics::Reason::REASON_UNLOCK) && - switches::IsNewProfileManagement() && !password_.empty() && - profiles::IsLockAvailable(profile_)) { + !password_.empty() && profiles::IsLockAvailable(profile_)) { LocalAuth::SetLocalAuthCredentials(profile_, password_); }
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc index 2446c2d..32a047ea 100644 --- a/chrome/browser/win/jumplist.cc +++ b/chrome/browser/win/jumplist.cc
@@ -5,18 +5,18 @@ #include "chrome/browser/win/jumplist.h" #include <Shlwapi.h> -#include <windows.h> #include "base/bind.h" #include "base/bind_helpers.h" -#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/files/file_util.h" #include "base/macros.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" +#include "base/sequenced_task_runner.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/task_scheduler/post_task.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" #include "base/trace_event/trace_event.h" @@ -27,6 +27,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/tab_restore_service_factory.h" #include "chrome/browser/shell_integration_win.h" +#include "chrome/browser/win/jumplist_file_util.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_icon_resources_win.h" #include "chrome/common/chrome_switches.h" @@ -229,28 +230,13 @@ return true; } -// Renames the directory |from_dir| to |to_path|. This method fails if any -// process has a handle open in |from_dir| or if |to_path| exists. Base::Move() -// tries to rename a file and if this fails, it tries copy-n-delete; This -// RenameDirectory method only does the rename part. -bool RenameDirectory(const base::FilePath& from_path, - const base::FilePath& to_path) { - base::ThreadRestrictions::AssertIOAllowed(); - if (from_path.ReferencesParent() || to_path.ReferencesParent()) - return false; - if (from_path.value().length() >= MAX_PATH || - to_path.value().length() >= MAX_PATH) { - return false; - } - return MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), 0) != 0; -} - // Updates the jumplist, once all the data has been fetched. void RunUpdateOnFileThread( IncognitoModePrefs::Availability incognito_availability, const std::wstring& app_id, const base::FilePath& icon_dir, - base::RefCountedData<JumpListData>* ref_counted_data) { + base::RefCountedData<JumpListData>* ref_counted_data, + const scoped_refptr<base::SequencedTaskRunner>& sequenced_task_runner) { JumpListData* data = &ref_counted_data->data; ShellLinkItemList local_most_visited_pages; ShellLinkItemList local_recently_closed_pages; @@ -267,73 +253,25 @@ local_recently_closed_pages = data->recently_closed_pages_; } - // Delete the directory which contains old icon files, rename the current - // icon directory, and create a new directory which contains new JumpList - // icon files. - base::FilePath icon_dir_old = icon_dir.DirName().Append( - icon_dir.BaseName().value() + FILE_PATH_LITERAL("Old")); + // Delete the contents in JumpListIcons directory and log the delete status + // to UMA. + FolderDeleteResult delete_status = + DeleteDirectoryContent(icon_dir, kFileDeleteLimit); - enum FolderOperationResult { - SUCCESS = 0, - DELETE_DEST_FAILED = 1 << 0, - RENAME_FAILED = 1 << 1, - DELETE_SRC_CONTENT_FAILED = 1 << 2, - DELETE_SRC_DIR_FAILED = 1 << 3, - CREATE_SRC_FAILED = 1 << 4, - // This value is beyond the sum of all bit fields above and - // should remain last (shifted by one more than the last value) - END = 1 << 5 - }; + UMA_HISTOGRAM_ENUMERATION("WinJumplist.DeleteStatusJumpListIcons", + delete_status, END); - // This variable records the status of three folder operations. - uint32_t folder_operation_status = FolderOperationResult::SUCCESS; - - base::ScopedClosureRunner log_operation_status_when_done(base::Bind( - [](uint32_t* folder_operation_status_ptr) { - UMA_HISTOGRAM_ENUMERATION( - "WinJumplist.DetailedFolderResultsDeleteUpdated", - *folder_operation_status_ptr, FolderOperationResult::END); - }, - base::Unretained(&folder_operation_status))); - - // If deletion of |icon_dir_old| fails, do not rename |icon_dir| to - // |icon_dir_old|, instead, delete |icon_dir| directly to avoid bloating - // |icon_dir_old| by moving more things to it. - if (!base::DeleteFile(icon_dir_old, true)) { - folder_operation_status |= FolderOperationResult::DELETE_DEST_FAILED; - // If deletion of any item in |icon_dir| fails, exit early. If deletion of - // all the items succeeds while only deletion of the dir fails, it is okay - // to proceed. This skips creating the same directory and updating jumplist - // icons to avoid bloating the JumplistIcons folder. - if (!base::DeleteFile(icon_dir, true)) { - if (!::PathIsDirectoryEmpty(icon_dir.value().c_str())) { - folder_operation_status |= - FolderOperationResult::DELETE_SRC_CONTENT_FAILED; - return; - } - folder_operation_status |= FolderOperationResult::DELETE_SRC_DIR_FAILED; - } - } else if (!RenameDirectory(icon_dir, icon_dir_old)) { - // If RenameDirectory() fails, delete |icon_dir| to avoid file accumulation - // in this directory, which can eventually lead the folder to be huge. - folder_operation_status |= FolderOperationResult::RENAME_FAILED; - // If deletion of any item in |icon_dir| fails, exit early. If deletion of - // all the items succeeds while only deletion of the dir fails, it is okay - // to proceed. This skips creating the same directory and updating jumplist - // icons to avoid bloating the JumplistIcons folder. - if (!base::DeleteFile(icon_dir, true)) { - if (!::PathIsDirectoryEmpty(icon_dir.value().c_str())) { - folder_operation_status |= - FolderOperationResult::DELETE_SRC_CONTENT_FAILED; - return; - } - folder_operation_status |= FolderOperationResult::DELETE_SRC_DIR_FAILED; - } - } - - // If CreateDirectory() fails, exit early. - if (!base::CreateDirectory(icon_dir)) { - folder_operation_status |= FolderOperationResult::CREATE_SRC_FAILED; + // If JumpListIcons directory is not empty, skip jumplist update and return + // early. If the directory doesn't exist which shouldn't though, try to create + // a new JumpListIcons directory. If the creation fails, return early. + if (base::DirectoryExists(icon_dir)) { + DirectoryEmptyStatus empty_status = + ::PathIsDirectoryEmpty(icon_dir.value().c_str()) ? EMPTY : NON_EMPTY; + UMA_HISTOGRAM_ENUMERATION("WinJumplist.EmptyStatusJumpListIcons", + empty_status, EMPTY_STATUS_END); + if (empty_status == NON_EMPTY) + return; + } else if (!base::CreateDirectory(icon_dir)) { return; } @@ -349,6 +287,17 @@ // with it. UpdateJumpList(app_id.c_str(), local_most_visited_pages, local_recently_closed_pages, incognito_availability); + + // Post a background task to delete JumpListIconsOld folder if it exists and + // log the delete results to UMA. + base::FilePath icon_dir_old = icon_dir.DirName().Append( + icon_dir.BaseName().value() + FILE_PATH_LITERAL("Old")); + + if (base::DirectoryExists(icon_dir_old)) { + sequenced_task_runner->PostTask( + FROM_HERE, base::Bind(&DeleteDirectoryAndLogResults, icon_dir_old, + kFileDeleteLimit)); + } } } // namespace @@ -363,6 +312,12 @@ profile_(profile), jumplist_data_(new base::RefCountedData<JumpListData>), task_id_(base::CancelableTaskTracker::kBadTaskId), + sequenced_task_runner_(base::CreateSequencedTaskRunnerWithTraits( + base::TaskTraits() + .WithPriority(base::TaskPriority::BACKGROUND) + .WithShutdownBehavior( + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) + .MayBlock())), weak_ptr_factory_(this) { DCHECK(Enabled()); // To update JumpList when a tab is added or removed, we add this object to @@ -661,11 +616,9 @@ BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, - base::Bind(&RunUpdateOnFileThread, - incognito_availability, - app_id_, - icon_dir_, - base::RetainedRef(jumplist_data_))); + base::Bind(&RunUpdateOnFileThread, incognito_availability, app_id_, + icon_dir_, base::RetainedRef(jumplist_data_), + sequenced_task_runner_)); } void JumpList::TopSitesLoaded(history::TopSites* top_sites) {
diff --git a/chrome/browser/win/jumplist.h b/chrome/browser/win/jumplist.h index bb5befa0..5c1c932 100644 --- a/chrome/browser/win/jumplist.h +++ b/chrome/browser/win/jumplist.h
@@ -30,6 +30,10 @@ #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" +namespace base { +class SequencedTaskRunner; +} + namespace chrome { struct FaviconImageResult; } @@ -181,6 +185,9 @@ // comes in before it finishes. base::CancelableTaskTracker::TaskId task_id_; + // A task runner which runs the background file deletion tasks sequentially. + scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; + // For callbacks may be run after destruction. base::WeakPtrFactory<JumpList> weak_ptr_factory_;
diff --git a/chrome/browser/win/jumplist_file_util.cc b/chrome/browser/win/jumplist_file_util.cc new file mode 100644 index 0000000..f66cc71 --- /dev/null +++ b/chrome/browser/win/jumplist_file_util.cc
@@ -0,0 +1,115 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/win/jumplist_file_util.h" + +#include <Shlwapi.h> +#include <windows.h> + +#include "base/files/file_enumerator.h" +#include "base/metrics/histogram_macros.h" +#include "base/threading/thread_restrictions.h" + +FolderDeleteResult DeleteFiles(const base::FilePath& path, + const base::FilePath::StringType& pattern, + int max_file_deleted) { + int success_count = 0; + int failure_count = 0; + FolderDeleteResult delete_status = SUCCEED; + + base::FileEnumerator traversal( + path, false, + base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES, pattern); + for (base::FilePath current = traversal.Next(); !current.empty(); + current = traversal.Next()) { + // Try to clear the read-only bit if we find it. + base::FileEnumerator::FileInfo info = traversal.GetInfo(); + if (info.find_data().dwFileAttributes & FILE_ATTRIBUTE_READONLY) { + SetFileAttributes( + current.value().c_str(), + info.find_data().dwFileAttributes & ~FILE_ATTRIBUTE_READONLY); + } + + if (info.IsDirectory()) { + // JumpListIcons{,Old} directories shouldn't have sub-directories. + // If any of them does for unknown reasons, don't delete them. Instead, + // increment the failure count and record this information. + delete_status = FAIL_SUBDIRECTORY_EXISTS; + failure_count++; + } else if (!::DeleteFile(current.value().c_str())) { + failure_count++; + } else { + success_count++; + } + // If it deletes max_file_deleted files with any attempt failures, record + // this information in |delete_status|. + if (success_count >= max_file_deleted) { + // The desired max number of files have been deleted. + return failure_count ? FAIL_DELETE_MAX_FILES_WITH_ERRORS : delete_status; + } + if (failure_count >= max_file_deleted) { + // The desired max number of failures have been hit. + return FAIL_MAX_DELETE_FAILURES; + } + } + return delete_status; +} + +FolderDeleteResult DeleteDirectoryContent(const base::FilePath& path, + int max_file_deleted) { + base::ThreadRestrictions::AssertIOAllowed(); + + if (path.empty()) + return SUCCEED; + + // For JumpListIcons{,Old} directories, since their names are shorter than + // MAX_PATH, hitting the code in the if-block below is unexpected. + if (path.value().length() >= MAX_PATH) + return FAIL_INVALID_FILE_PATH; + + DWORD attr = GetFileAttributes(path.value().c_str()); + // We're done if we can't find the path. + if (attr == INVALID_FILE_ATTRIBUTES) + return SUCCEED; + // Try to clear the read-only bit if we find it. + if ((attr & FILE_ATTRIBUTE_READONLY) && + !SetFileAttributes(path.value().c_str(), + attr & ~FILE_ATTRIBUTE_READONLY)) { + return FAIL_READ_ONLY_DIRECTORY; + } + + // If |path| is a file, simply delete it. However, since JumpListIcons{,Old} + // are directories, hitting the code inside the if-block below is unexpected. + if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) { + ::DeleteFile(path.value().c_str()); + return FAIL_DELETE_SINGLE_FILE; + } + + // If |path| is a directory, delete at most |max_file_deleted| files in it. + return DeleteFiles(path, L"*", max_file_deleted); +} + +FolderDeleteResult DeleteDirectory(const base::FilePath& path, + int max_file_deleted) { + base::ThreadRestrictions::AssertIOAllowed(); + // Delete at most |max_file_deleted| files in |path|. + FolderDeleteResult delete_status = + DeleteDirectoryContent(path, max_file_deleted); + // Since DeleteDirectoryContent() can only delete at most |max_file_deleted| + // files, its return value cannot indicate if |path| is empty or not. + // Instead, use PathIsDirectoryEmpty to check if |path| is empty and remove it + // if it is. + if (::PathIsDirectoryEmpty(path.value().c_str()) && + !::RemoveDirectory(path.value().c_str())) { + delete_status = FAIL_REMOVE_RAW_DIRECTORY; + } + return delete_status; +} + +void DeleteDirectoryAndLogResults(const base::FilePath& path, + int max_file_deleted) { + FolderDeleteResult delete_status = DeleteDirectory(path, max_file_deleted); + UMA_HISTOGRAM_ENUMERATION("WinJumplist.DeleteStatusJumpListIconsOld", + delete_status, END); +}
diff --git a/chrome/browser/win/jumplist_file_util.h b/chrome/browser/win/jumplist_file_util.h new file mode 100644 index 0000000..ec61816 --- /dev/null +++ b/chrome/browser/win/jumplist_file_util.h
@@ -0,0 +1,80 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WIN_JUMPLIST_FILE_UTIL_H_ +#define CHROME_BROWSER_WIN_JUMPLIST_FILE_UTIL_H_ + +#include "base/files/file_path.h" + +// Maximum number of icon files allowed to delete per jumplist update. +const int kFileDeleteLimit = 100; + +// Folder delete status enumeration, used in Delete* methods below. +// This is used for UMA. Do not delete entries, and keep in sync with +// histograms.xml. +enum FolderDeleteResult { + SUCCEED = 0, + // File name's length exceeds MAX_PATH. This shouldn't happen. + FAIL_INVALID_FILE_PATH, + // JumpListIcons{,Old} directories are read-only. This may heppen. + FAIL_READ_ONLY_DIRECTORY, + // Since JumpListIcons{,Old} are directories. This shouldn't happen. + FAIL_DELETE_SINGLE_FILE, + // JumpListIcons{,Old} should not have sub-directories, so this shouldn't + // happen. If this happens, the root cause must be found. + FAIL_SUBDIRECTORY_EXISTS, + // Delete maximum files allowed succeeds. However, in the process of deleting + // these files, it fails to delete some other files. This may happen. + FAIL_DELETE_MAX_FILES_WITH_ERRORS, + // Fail to delete maximum files allowed when the maximum attempt failures + // are hit. This may heppen. + FAIL_MAX_DELETE_FAILURES, + // Fail to remove the raw empty directory. This may happen. + FAIL_REMOVE_RAW_DIRECTORY, + // Add new items before this one, always keep this one at the end. + END +}; + +// An enumeration indicating if a directory is empty or not. +// This is used for UMA. Do not delete entries, and keep in sync with +// histograms.xml. +enum DirectoryEmptyStatus { + EMPTY = 0, + NON_EMPTY, + // Add new items before this one, always keep this one at the end. + EMPTY_STATUS_END +}; + +// This method is similar to base::DeleteFileRecursive in +// file_util_win.cc with the following differences. +// 1) It has an input parameter |max_file_deleted| to specify the maximum files +// allowed to delete as well as the maximum attempt failures allowd per run. +// 2) It deletes only the files in |path|. All subdirectories in |path| are +// untouched but are considered as attempt failures. +// 3) Detailed delete status is returned. +FolderDeleteResult DeleteFiles(const base::FilePath& path, + const base::FilePath::StringType& pattern, + int max_file_deleted); + +// This method is similar to base::DeleteFile in file_util_win.cc +// with the following differences. +// 1) It has an input parameter |max_file_deleted| to specify the maximum files +// allowed to delete as well as the maximum attempt failures allowd per run. +// 2) It deletes only the files in |path|. All subdirectories in |path| are +// untouched but are considered as attempt failures. +// 3) |path| won't be removed even if all its contents are deleted successfully. +// 4) Detailed delete status is returned. +FolderDeleteResult DeleteDirectoryContent(const base::FilePath& path, + int max_file_deleted); + +// This method firstly calls DeleteDirectoryContent() to delete the contents in +// |path|. If |path| is empty after the call, it is removed. +FolderDeleteResult DeleteDirectory(const base::FilePath& path, + int max_file_deleted); + +// Deletes the directory at |path| and records the result to UMA. +void DeleteDirectoryAndLogResults(const base::FilePath& path, + int max_file_deleted); + +#endif // CHROME_BROWSER_WIN_JUMPLIST_FILE_UTIL_H_
diff --git a/chrome/browser/win/jumplist_file_util_unittest.cc b/chrome/browser/win/jumplist_file_util_unittest.cc new file mode 100644 index 0000000..9004bf3c --- /dev/null +++ b/chrome/browser/win/jumplist_file_util_unittest.cc
@@ -0,0 +1,103 @@ +// Copyright (c) 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/win/jumplist_file_util.h" + +#include <Shlwapi.h> +#include <string> + +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +// Random text to write into a file. +constexpr char kFileContent[] = "I'm random context."; + +// Maximum files allowed to delete and maximum attempt failures allowed. +// For unit tests purpose only. +const int kFileDeleteLimitForTest = 1; + +// Simple function to dump some text into a new file. +void CreateTextFile(const base::FilePath& file_name, + const std::string& contents) { + // Since |contents|'s length is small here, static_cast won't cause overflow. + ASSERT_EQ(static_cast<int>(contents.length()), + base::WriteFile(file_name, contents.data(), contents.length())); + ASSERT_TRUE(base::PathExists(file_name)); +} + +} // namespace + +class JumpListFileUtilTest : public testing::Test { + protected: + // A temporary directory where all file IO operations take place . + base::ScopedTempDir temp_dir_; + + // Get the path to the temporary directory. + const base::FilePath& temp_dir_path() { return temp_dir_.GetPath(); } + + // Create a unique temporary directory. + void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } +}; + +TEST_F(JumpListFileUtilTest, DeleteDirectoryContent) { + base::FilePath dir_path = temp_dir_path(); + + // Create a file. + base::FilePath file_name = + dir_path.Append(FILE_PATH_LITERAL("TestDeleteFile.txt")); + ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_name, kFileContent)); + + // Delete the directory content using DeleteDirectoryContent(). The file + // should be deleted and the directory remains. + ASSERT_EQ(DeleteDirectoryContent(dir_path, kFileDeleteLimit), SUCCEED); + EXPECT_FALSE(PathExists(file_name)); + EXPECT_TRUE(DirectoryExists(dir_path)); +} + +TEST_F(JumpListFileUtilTest, DeleteSubDirectory) { + base::FilePath dir_path = temp_dir_path(); + + // Create a subdirectory. + base::FilePath test_subdir = + dir_path.Append(FILE_PATH_LITERAL("TestSubDirectory")); + ASSERT_NO_FATAL_FAILURE(CreateDirectory(test_subdir)); + + // Delete the directory using DeleteDirectory(), which should fail because + // a subdirectory exists. + ASSERT_EQ(DeleteDirectory(dir_path, kFileDeleteLimit), + FAIL_SUBDIRECTORY_EXISTS); + EXPECT_TRUE(DirectoryExists(dir_path)); + EXPECT_TRUE(DirectoryExists(test_subdir)); + + // Delete the subdirectory alone should be working. + ASSERT_EQ(DeleteDirectory(test_subdir, kFileDeleteLimit), SUCCEED); + EXPECT_TRUE(DirectoryExists(dir_path)); + EXPECT_FALSE(DirectoryExists(test_subdir)); +} + +TEST_F(JumpListFileUtilTest, DeleteMaxFilesAllowed) { + base::FilePath dir_path = temp_dir_path(); + + // Create 2 files. + base::FilePath file_name = + dir_path.Append(FILE_PATH_LITERAL("TestDeleteFile1.txt")); + ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_name, kFileContent)); + + file_name = dir_path.Append(FILE_PATH_LITERAL("TestDeleteFile2.txt")); + ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_name, kFileContent)); + + // Delete the directory content using DeleteDirectoryContent(). + // Sine the maximum files allowed to delete is 1, only 1 out of the 2 + // files is deleted. Therefore, the directory is not empty yet. + ASSERT_EQ(DeleteDirectoryContent(dir_path, kFileDeleteLimitForTest), SUCCEED); + EXPECT_FALSE(::PathIsDirectoryEmpty(dir_path.value().c_str())); + + // Delete another file, and now the directory is empty. + ASSERT_EQ(DeleteDirectoryContent(dir_path, kFileDeleteLimitForTest), SUCCEED); + EXPECT_TRUE(::PathIsDirectoryEmpty(dir_path.value().c_str())); + EXPECT_TRUE(DirectoryExists(dir_path)); +}
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 40412d6..0ab2918 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -211,6 +211,7 @@ "//google_apis", "//gpu/command_buffer/service", "//gpu/config", + "//gpu/config:crash_keys", "//ipc", "//media", "//mojo/edk/system",
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc index 099b93a..de5a0d8 100644 --- a/chrome/common/chrome_content_client.cc +++ b/chrome/common/chrome_content_client.cc
@@ -43,6 +43,7 @@ #include "extensions/common/constants.h" #include "extensions/features/features.h" #include "gpu/config/gpu_info.h" +#include "gpu/config/gpu_util.h" #include "media/media_features.h" #include "net/http/http_util.h" #include "pdf/features.h" @@ -449,24 +450,7 @@ } void ChromeContentClient::SetGpuInfo(const gpu::GPUInfo& gpu_info) { -#if !defined(OS_ANDROID) - base::debug::SetCrashKeyValue(crash_keys::kGPUVendorID, - base::StringPrintf("0x%04x", gpu_info.gpu.vendor_id)); - base::debug::SetCrashKeyValue(crash_keys::kGPUDeviceID, - base::StringPrintf("0x%04x", gpu_info.gpu.device_id)); -#endif - base::debug::SetCrashKeyValue(crash_keys::kGPUDriverVersion, - gpu_info.driver_version); - base::debug::SetCrashKeyValue(crash_keys::kGPUPixelShaderVersion, - gpu_info.pixel_shader_version); - base::debug::SetCrashKeyValue(crash_keys::kGPUVertexShaderVersion, - gpu_info.vertex_shader_version); -#if defined(OS_MACOSX) - base::debug::SetCrashKeyValue(crash_keys::kGPUGLVersion, gpu_info.gl_version); -#elif defined(OS_POSIX) - base::debug::SetCrashKeyValue(crash_keys::kGPUVendor, gpu_info.gl_vendor); - base::debug::SetCrashKeyValue(crash_keys::kGPURenderer, gpu_info.gl_renderer); -#endif + gpu::SetKeysForCrashLogging(gpu_info); } #if BUILDFLAG(ENABLE_PLUGINS) @@ -609,6 +593,11 @@ schemes->no_access_schemes.push_back(chrome::kChromeNativeScheme); + // chrome-native: is a scheme used for placeholder navigations that allow + // UIs to be drawn with platform native widgets instead of HTML. These pages + // should be treated as empty documents that can commit synchronously. + schemes->empty_document_schemes.push_back(chrome::kChromeNativeScheme); + #if BUILDFLAG(ENABLE_EXTENSIONS) if (extensions::feature_util::ExtensionServiceWorkersEnabled()) schemes->service_worker_schemes.push_back(extensions::kExtensionScheme);
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index cf12a9f..641a898f 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -69,6 +69,12 @@ const base::Feature kBlockPromptsIfDismissedOften{ "BlockPromptsIfDismissedOften", base::FEATURE_DISABLED_BY_DEFAULT}; +#if defined(OS_MACOSX) +// Enables the new bookmark app system (e.g. Add To Applications on Mac). +const base::Feature kBookmarkApps{"BookmarkAppsMac", + base::FEATURE_DISABLED_BY_DEFAULT}; +#endif + // Fixes for browser hang bugs are deployed in a field trial in order to measure // their impact. See crbug.com/478209. const base::Feature kBrowserHangFixesExperiment{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 24dbb6c..06f5094 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -49,6 +49,10 @@ extern const base::Feature kBlockPromptsIfDismissedOften; +#if defined(OS_MACOSX) +extern const base::Feature kBookmarkApps; +#endif + extern const base::Feature kBrowserHangFixesExperiment; #if defined(OS_MACOSX)
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 32cad7c..bb583dd1 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -232,9 +232,6 @@ const char kDisableMinimizeOnSecondLauncherItemClick[] = "disable-minimize-on-second-launcher-item-click"; -// Disables the new bookmark app system. -const char kDisableNewBookmarkApps[] = "disable-new-bookmark-apps"; - // Disable auto-reload of error pages if offline. const char kDisableOfflineAutoReload[] = "disable-offline-auto-reload"; @@ -368,9 +365,6 @@ // Enables the network-related benchmarking extensions. const char kEnableNetBenchmarking[] = "enable-net-benchmarking"; -// Enables the new bookmark app system. -const char kEnableNewBookmarkApps[] = "enable-new-bookmark-apps"; - // Enable auto-reload of error pages if offline. const char kEnableOfflineAutoReload[] = "enable-offline-auto-reload"; @@ -949,6 +943,9 @@ #endif // defined(OS_ANDROID) #if defined(OS_CHROMEOS) +// Enables apps on the login screen. +const char kEnableLoginScreenApps[] = "enable-login-screen-apps"; + // Enables native cups integration const char kEnableNativeCups[] = "enable-native-cups";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index 04573287..eb5ab14 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -83,7 +83,6 @@ extern const char kDisableExtensionsHttpThrottling[]; extern const char kDisableHttp2[]; extern const char kDisableMinimizeOnSecondLauncherItemClick[]; -extern const char kDisableNewBookmarkApps[]; extern const char kDisableOfflineAutoReload[]; extern const char kDisableOfflineAutoReloadVisibleOnly[]; extern const char kDisablePermissionActionReporting[]; @@ -120,7 +119,6 @@ extern const char kEnableNaCl[]; extern const char kEnableNavigationTracing[]; extern const char kEnableNetBenchmarking[]; -extern const char kEnableNewBookmarkApps[]; extern const char kEnableOfflineAutoReload[]; extern const char kEnableOfflineAutoReloadVisibleOnly[]; extern const char kEnablePermissionActionReporting[]; @@ -280,6 +278,7 @@ #endif // defined(OS_ANDROID) #if defined(OS_CHROMEOS) +extern const char kEnableLoginScreenApps[]; extern const char kEnableNativeCups[]; extern const char kCroshCommand[]; #endif // defined(OS_CHROMEOS)
diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc index bfc80ff3..baf6abe2 100644 --- a/chrome/common/crash_keys.cc +++ b/chrome/common/crash_keys.cc
@@ -16,6 +16,7 @@ #include "chrome/common/chrome_switches.h" #include "components/flags_ui/flags_ui_switches.h" #include "content/public/common/content_switches.h" +#include "gpu/config/gpu_crash_keys.h" #if defined(OS_CHROMEOS) #include "chrome/common/chrome_switches.h" @@ -35,20 +36,6 @@ const char kShutdownType[] = "shutdown-type"; const char kBrowserUnpinTrace[] = "browser-unpin-trace"; -#if !defined(OS_ANDROID) -const char kGPUVendorID[] = "gpu-venid"; -const char kGPUDeviceID[] = "gpu-devid"; -#endif -const char kGPUDriverVersion[] = "gpu-driver"; -const char kGPUPixelShaderVersion[] = "gpu-psver"; -const char kGPUVertexShaderVersion[] = "gpu-vsver"; -#if defined(OS_MACOSX) -const char kGPUGLVersion[] = "gpu-glver"; -#elif defined(OS_POSIX) -const char kGPUVendor[] = "gpu-gl-vendor"; -const char kGPURenderer[] = "gpu-gl-renderer"; -#endif - #if defined(OS_WIN) const char kHungRendererOutstandingAckCount[] = "hung-outstanding-acks"; const char kHungRendererOutstandingEventType[] = "hung-outstanding-event-type"; @@ -119,17 +106,17 @@ {kShutdownType, kSmallSize}, {kBrowserUnpinTrace, kMediumSize}, #if !defined(OS_ANDROID) - {kGPUVendorID, kSmallSize}, - {kGPUDeviceID, kSmallSize}, + {gpu::crash_keys::kGPUVendorID, kSmallSize}, + {gpu::crash_keys::kGPUDeviceID, kSmallSize}, #endif - {kGPUDriverVersion, kSmallSize}, - {kGPUPixelShaderVersion, kSmallSize}, - {kGPUVertexShaderVersion, kSmallSize}, + {gpu::crash_keys::kGPUDriverVersion, kSmallSize}, + {gpu::crash_keys::kGPUPixelShaderVersion, kSmallSize}, + {gpu::crash_keys::kGPUVertexShaderVersion, kSmallSize}, #if defined(OS_MACOSX) - {kGPUGLVersion, kSmallSize}, + {gpu::crash_keys::kGPUGLVersion, kSmallSize}, #elif defined(OS_POSIX) - {kGPUVendor, kSmallSize}, - {kGPURenderer, kSmallSize}, + {gpu::crash_keys::kGPUVendor, kSmallSize}, + {gpu::crash_keys::kGPURenderer, kSmallSize}, #endif // content/:
diff --git a/chrome/common/crash_keys.h b/chrome/common/crash_keys.h index e7c9bc3..142bd84 100644 --- a/chrome/common/crash_keys.h +++ b/chrome/common/crash_keys.h
@@ -72,21 +72,6 @@ // invalid attempt to Pin the browser process after that. extern const char kBrowserUnpinTrace[]; -// GPU information. -#if !defined(OS_ANDROID) -extern const char kGPUVendorID[]; -extern const char kGPUDeviceID[]; -#endif -extern const char kGPUDriverVersion[]; -extern const char kGPUPixelShaderVersion[]; -extern const char kGPUVertexShaderVersion[]; -#if defined(OS_MACOSX) -extern const char kGPUGLVersion[]; -#elif defined(OS_POSIX) -extern const char kGPUVendor[]; -extern const char kGPURenderer[]; -#endif - #if defined(OS_WIN) extern const char kHungAudioThreadDetails[];
diff --git a/chrome/common/trace_event_args_whitelist.cc b/chrome/common/trace_event_args_whitelist.cc index 3b021a24..740852f4 100644 --- a/chrome/common/trace_event_args_whitelist.cc +++ b/chrome/common/trace_event_args_whitelist.cc
@@ -24,6 +24,7 @@ const WhitelistEntry kEventArgsWhitelist[] = { {"__metadata", "thread_name", nullptr}, {"__metadata", "process_name", nullptr}, + {"__metadata", "process_runtime_sec", nullptr}, {"ipc", "SyncChannel::Send", nullptr}, {"toplevel", "*", nullptr}, {"latencyInfo", "*", kInputLatencyAllowedArgs},
diff --git a/chrome/renderer/chrome_render_thread_observer.cc b/chrome/renderer/chrome_render_thread_observer.cc index ca0909be..0625c11 100644 --- a/chrome/renderer/chrome_render_thread_observer.cc +++ b/chrome/renderer/chrome_render_thread_observer.cc
@@ -251,13 +251,13 @@ // chrome-native: is a scheme used for placeholder navigations that allow // UIs to be drawn with platform native widgets instead of HTML. These pages - // should not be accessible, and should also be treated as empty documents - // that can commit synchronously. No code should be runnable in these pages, + // should not be accessible. No code should be runnable in these pages, // so it should not need to access anything nor should it allow javascript // URLs since it should never be visible to the user. + // See also ChromeContentClient::AddAdditionalSchemes that adds it as an + // empty document scheme. WebString native_scheme(WebString::fromASCII(chrome::kChromeNativeScheme)); WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(native_scheme); - WebSecurityPolicy::registerURLSchemeAsEmptyDocument(native_scheme); WebSecurityPolicy::registerURLSchemeAsNotAllowingJavascriptURLs( native_scheme);
diff --git a/chrome/renderer/extensions/cast_streaming_native_handler.cc b/chrome/renderer/extensions/cast_streaming_native_handler.cc index d076d88..38ab2ae 100644 --- a/chrome/renderer/extensions/cast_streaming_native_handler.cc +++ b/chrome/renderer/extensions/cast_streaming_native_handler.cc
@@ -988,10 +988,14 @@ } if (!content::AddAudioTrackToMediaStream( audio, params.sample_rate(), params.channel_layout(), - params.frames_per_buffer(), &web_stream)) { + params.frames_per_buffer(), true, // is_remote + true, // is_readonly + &web_stream)) { LOG(ERROR) << "Failed to add Cast audio track to media stream."; } - if (!content::AddVideoTrackToMediaStream(std::move(video), &web_stream)) { + if (!content::AddVideoTrackToMediaStream(std::move(video), true, // is_remote + true, // is_readonly + &web_stream)) { LOG(ERROR) << "Failed to add Cast video track to media stream."; } }
diff --git a/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js b/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js index 7375457..8f56124 100644 --- a/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js +++ b/chrome/renderer/resources/extensions/declarative_content_custom_bindings.js
@@ -4,7 +4,8 @@ // Custom binding for the declarativeContent API. -var binding = require('binding').Binding.create('declarativeContent'); +var binding = + apiBridge || require('binding').Binding.create('declarativeContent'); var utils = require('utils'); var validate = require('schemaUtils').validate; @@ -12,7 +13,7 @@ requireNative('css_natives').CanonicalizeCompoundSelector; var setIcon = require('setIcon').setIcon; -binding.registerCustomHook( function(api) { +binding.registerCustomHook(function(api) { var declarativeContent = api.compiledApi; // Returns the schema definition of type |typeId| defined in |namespace|. @@ -34,8 +35,16 @@ } } instance.instanceType = 'declarativeContent.' + typeId; - var schema = getSchema(typeId); - validate([instance], [schema]); + // TODO(devlin): This is wrong. It means we don't validate the construction + // of the instance (which really only matters for PageStateMatcher). + // Currently, we don't pass the schema to JS with native bindings because + // validation should be done natively. We'll need to fix this by either + // allowing some validation to occur in JS, or by moving the instantiation + // of these types to native code. + if (!apiBridge) { + var schema = getSchema(typeId); + validate([instance], [schema]); + } } function canonicalizeCssSelectors(selectors) { @@ -73,4 +82,5 @@ }; }); -exports.$set('binding', binding.generate()); +if (!apiBridge) + exports.$set('binding', binding.generate());
diff --git a/chrome/renderer/web_apps.cc b/chrome/renderer/web_apps.cc index 9d7316c6..1256eb1 100644 --- a/chrome/renderer/web_apps.cc +++ b/chrome/renderer/web_apps.cc
@@ -10,6 +10,7 @@ #include <vector> #include "base/command_line.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" @@ -18,7 +19,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" -#include "chrome/common/chrome_switches.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/web_application_info.h" #include "third_party/WebKit/public/platform/WebIconSizesParser.h" #include "third_party/WebKit/public/platform/WebString.h" @@ -150,11 +151,10 @@ // Bookmark apps also support "apple-touch-icon" and // "apple-touch-icon-precomposed". #if defined(OS_MACOSX) - bool bookmark_apps_enabled = base::CommandLine::ForCurrentProcess()-> - HasSwitch(switches::kEnableNewBookmarkApps); + bool bookmark_apps_enabled = + base::FeatureList::IsEnabled(features::kBookmarkApps); #else - bool bookmark_apps_enabled = !base::CommandLine::ForCurrentProcess()-> - HasSwitch(switches::kDisableNewBookmarkApps); + bool bookmark_apps_enabled = true; #endif if (base::LowerCaseEqualsASCII(rel, "icon") || base::LowerCaseEqualsASCII(rel, "shortcut icon") ||
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 84083a7..1c6ab79 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -356,6 +356,7 @@ "../browser/apps/guest_view/web_view_interactive_browsertest.cc", "../browser/autofill/autofill_interactive_uitest.cc", "../browser/autofill/autofill_uitest_util.cc", + "../browser/autofill/autofill_uitest_util.h", "../browser/browser_keyevents_browsertest.cc", "../browser/extensions/api/extension_action/browser_action_interactive_test.cc", "../browser/extensions/api/notifications/notifications_apitest.cc", @@ -684,6 +685,7 @@ "../browser/notifications/notification_interactive_uitest.cc", "../browser/notifications/notification_interactive_uitest_mac.mm", "../browser/notifications/notification_interactive_uitest_support.cc", + "../browser/notifications/notification_interactive_uitest_support.h", "../browser/notifications/platform_notification_service_interactive_uitest.cc", ] } @@ -1657,6 +1659,7 @@ "../browser/policy/cloud/cloud_policy_browsertest.cc", "../browser/policy/cloud/cloud_policy_manager_browsertest.cc", "../browser/policy/cloud/cloud_policy_test_utils.cc", + "../browser/policy/cloud/cloud_policy_test_utils.h", "../browser/policy/cloud/component_cloud_policy_browsertest.cc", "../browser/policy/cloud/device_management_service_browsertest.cc", "../browser/policy/cloud/test_request_interceptor.cc", @@ -1676,6 +1679,7 @@ "../browser/prerender/prerender_browsertest.cc", "../browser/prerender/prerender_nostate_prefetch_browsertest.cc", "../browser/prerender/prerender_test_utils.cc", + "../browser/prerender/prerender_test_utils.h", "../browser/previews/previews_service_browser_test.cc", "../browser/printing/cloud_print/test/cloud_print_policy_browsertest.cc", "../browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc", @@ -1837,7 +1841,6 @@ "../browser/ui/webui/policy_ui_browsertest.cc", "../browser/ui/webui/prefs_internals_browsertest.cc", "../browser/ui/webui/print_preview/print_preview_ui_browsertest.cc", - "../browser/ui/webui/profile_helper_browsertest.cc", "../browser/ui/webui/set_as_default_browser_ui_browsertest_win.cc", "../browser/ui/webui/settings/md_settings_ui_browsertest.cc", "../browser/ui/webui/signin/inline_login_ui_browsertest.cc", @@ -2368,6 +2371,7 @@ "../browser/ui/views/frame/browser_frame_ash_browsertest.cc", "../browser/ui/webui/options/chromeos/accounts_options_browsertest.cc", "../browser/ui/webui/options/chromeos/guest_mode_options_browsertest.cc", + "../browser/ui/webui/options/chromeos/guest_mode_options_browsertest.h", "../browser/ui/webui/options/chromeos/guest_mode_options_ui_browsertest.cc", "../browser/ui/webui/options/chromeos/shared_options_browsertest.cc", "//ui/base/ime/chromeos/input_method_whitelist.cc", @@ -2384,7 +2388,6 @@ # inline login UI is disabled on chromeos "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_browsertest.cc", - "../browser/ui/webui/profile_helper_browsertest.cc", "../browser/ui/webui/signin/inline_login_ui_browsertest.cc", # chromeos does not use the desktop user manager @@ -2697,6 +2700,7 @@ "remoting/page_load_notification_observer.h", "remoting/pin_browsertest.cc", "remoting/qunit_browser_test_runner.cc", + "remoting/qunit_browser_test_runner.h", "remoting/remote_desktop_browsertest.cc", "remoting/remote_desktop_browsertest.h", "remoting/remote_test_helper.cc", @@ -3291,6 +3295,7 @@ "../browser/permissions/permission_util_unittest.cc", "../browser/policy/cloud/cloud_policy_invalidator_unittest.cc", "../browser/policy/cloud/cloud_policy_test_utils.cc", + "../browser/policy/cloud/cloud_policy_test_utils.h", "../browser/policy/cloud/remote_commands_invalidator_unittest.cc", "../browser/policy/cloud/user_policy_signin_service_unittest.cc", "../browser/policy/file_selection_dialogs_policy_handler_unittest.cc", @@ -3359,6 +3364,7 @@ "../browser/signin/signin_status_metrics_provider_chromeos_unittest.cc", "../browser/signin/signin_tracker_unittest.cc", "../browser/signin/test_signin_client_builder.cc", + "../browser/signin/test_signin_client_builder.h", "../browser/ssl/chrome_expect_ct_reporter_unittest.cc", "../browser/ssl/security_state_tab_helper_unittest.cc", "../browser/ssl/ssl_error_handler_unittest.cc", @@ -3407,6 +3413,7 @@ "../browser/webshare/share_target_pref_helper_unittest.cc", "../browser/win/chrome_elf_init_unittest.cc", "../browser/win/enumerate_modules_model_unittest.cc", + "../browser/win/jumplist_file_util_unittest.cc", "../common/chrome_constants_win_unittest.cc", "../common/chrome_content_client_unittest.cc", "../common/chrome_paths_unittest.cc", @@ -3707,6 +3714,7 @@ "../browser/ui/tabs/pinned_tab_codec_unittest.cc", "../browser/ui/tabs/pinned_tab_service_unittest.cc", "../browser/ui/tabs/pinned_tab_test_utils.cc", + "../browser/ui/tabs/pinned_tab_test_utils.h", "../browser/ui/tabs/tab_menu_model_unittest.cc", "../browser/ui/tabs/tab_strip_model_stats_recorder_unittest.cc", "../browser/ui/tabs/tab_strip_model_unittest.cc", @@ -3749,6 +3757,7 @@ "../browser/ui/webui/sync_internals_message_handler_unittest.cc", "../browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc", "../browser/ui/window_sizer/window_sizer_common_unittest.cc", + "../browser/ui/window_sizer/window_sizer_common_unittest.h", "../browser/ui/window_sizer/window_sizer_unittest.cc", "../browser/ui/zoom/zoom_controller_unittest.cc", "../browser/usb/usb_blocklist_unittest.cc", @@ -3882,10 +3891,6 @@ "../browser/extensions/api/developer_private/developer_private_api_unittest.cc", "../browser/extensions/api/developer_private/extension_info_generator_unittest.cc", "../browser/extensions/api/device_permissions_manager_unittest.cc", - "../browser/extensions/api/dial/device_description_fetcher_unittest.cc", - "../browser/extensions/api/dial/dial_device_data_unittest.cc", - "../browser/extensions/api/dial/dial_registry_unittest.cc", - "../browser/extensions/api/dial/dial_service_unittest.cc", "../browser/extensions/api/downloads/downloads_api_unittest.cc", "../browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc", "../browser/extensions/api/experience_sampling_private/experience_sampling_private_api_unittest.cc", @@ -4304,6 +4309,7 @@ "../browser/safe_browsing/incident_reporting/variations_seed_signature_incident_unittest.cc", "../browser/safe_browsing/local_database_manager_unittest.cc", "../browser/safe_browsing/local_two_phase_testserver.cc", + "../browser/safe_browsing/local_two_phase_testserver.h", "../browser/safe_browsing/notification_image_reporter_unittest.cc", "../browser/safe_browsing/path_sanitizer_unittest.cc", "../browser/safe_browsing/permission_reporter_unittest.cc", @@ -4331,6 +4337,7 @@ "../renderer/safe_browsing/phishing_url_feature_extractor_unittest.cc", "../renderer/safe_browsing/scorer_unittest.cc", "../utility/safe_browsing/mac/dmg_test_utils.cc", + "../utility/safe_browsing/mac/dmg_test_utils.h", "../utility/safe_browsing/mac/hfs_unittest.cc", "../utility/safe_browsing/mac/read_stream_unittest.cc", "../utility/safe_browsing/mac/udif_unittest.cc", @@ -4421,6 +4428,11 @@ deps += [ "//chrome/browser/media/router:test_support" ] if (!is_android) { sources += [ + "../browser/media/router/discovery/dial/device_description_fetcher_unittest.cc", + "../browser/media/router/discovery/dial/dial_device_data_unittest.cc", + "../browser/media/router/discovery/dial/dial_registry_unittest.cc", + "../browser/media/router/discovery/dial/dial_service_unittest.cc", + # TODO(crbug.com/646627): # Move media_router_ui_service_factory_unittest.cc to chrome/browser/ui. "../browser/media/router/media_router_ui_service_factory_unittest.cc", @@ -4646,6 +4658,7 @@ "../browser/ui/cocoa/location_bar/autocomplete_text_field_cell_unittest.mm", "../browser/ui/cocoa/location_bar/autocomplete_text_field_editor_unittest.mm", "../browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm", + "../browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.h", "../browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.mm", "../browser/ui/cocoa/location_bar/image_decoration_unittest.mm", "../browser/ui/cocoa/location_bar/keyword_hint_decoration_unittest.mm", @@ -5027,6 +5040,7 @@ "//chrome/child", "//components/crash/core/common", "//components/flags_ui:switches", + "//gpu/config:crash_keys", ] } }
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn index 4d91b7b..5d145683 100644 --- a/chrome/test/android/BUILD.gn +++ b/chrome/test/android/BUILD.gn
@@ -10,6 +10,7 @@ "javatests/src/org/chromium/chrome/test/BottomSheetTestCaseBase.java", "javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java", "javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java", + "javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java", "javatests/src/org/chromium/chrome/test/ChromeTabbedActivityTestBase.java", "javatests/src/org/chromium/chrome/test/DocumentActivityTestBase.java", "javatests/src/org/chromium/chrome/test/gcore/MockChromeGoogleApiClient.java", @@ -81,12 +82,14 @@ "//net/android:net_java", "//net/android:net_java_test_support", "//testing/android/reporter:reporter_java", + "//third_party/android_support_test_runner:runner_java", "//third_party/android_tools:android_support_design_java", "//third_party/android_tools:android_support_transition_java", "//third_party/android_tools:android_support_v7_appcompat_java", "//third_party/android_tools:android_support_v7_recyclerview_java", "//third_party/android_tools:legacy_http_javalib", "//third_party/jsr-305:jsr_305_javalib", + "//third_party/junit", "//ui/android:ui_java", google_play_services_library, ]
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java index c446243a..43650dd 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeInstrumentationTestRunner.java
@@ -57,7 +57,7 @@ result.addPreTestHook(Policies.getRegistrationHook()); } - private class ChromeRestrictionSkipCheck extends RestrictionSkipCheck { + static class ChromeRestrictionSkipCheck extends RestrictionSkipCheck { private VrDaydreamApi mDaydreamApi; private boolean mAttemptedToGetApi; @@ -128,10 +128,11 @@ && !DeviceFormFactor.isTablet(getTargetContext())) { return true; } - if (TextUtils.equals(restriction, - ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES) - && (ConnectionResult.SUCCESS != GoogleApiAvailability.getInstance() - .isGooglePlayServicesAvailable(getTargetContext()))) { + if (TextUtils.equals( + restriction, ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES) + && (ConnectionResult.SUCCESS + != GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable( + getTargetContext()))) { return true; } if (TextUtils.equals(restriction, @@ -185,8 +186,7 @@ } } - private class ChromeDisableIfSkipCheck extends DisableIfSkipCheck { - + static class ChromeDisableIfSkipCheck extends DisableIfSkipCheck { private final Context mTargetContext; public ChromeDisableIfSkipCheck(Context targetContext) { @@ -196,15 +196,15 @@ @Override protected boolean deviceTypeApplies(String type) { if (TextUtils.equals(type, ChromeDisableIf.PHONE) - && !DeviceFormFactor.isTablet(getTargetContext())) { + && !DeviceFormFactor.isTablet(mTargetContext)) { return true; } if (TextUtils.equals(type, ChromeDisableIf.TABLET) - && DeviceFormFactor.isTablet(getTargetContext())) { + && DeviceFormFactor.isTablet(mTargetContext)) { return true; } if (TextUtils.equals(type, ChromeDisableIf.LARGETABLET) - && DeviceFormFactor.isLargeTablet(getTargetContext())) { + && DeviceFormFactor.isLargeTablet(mTargetContext)) { return true; } return false;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java new file mode 100644 index 0000000..e063ca25 --- /dev/null +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
@@ -0,0 +1,37 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.test; + +import android.support.test.InstrumentationRegistry; + +import org.junit.runners.model.InitializationError; + +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.SkipCheck; +import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeDisableIfSkipCheck; +import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeRestrictionSkipCheck; + +import java.util.Arrays; +import java.util.List; + +/** + * A custom runner for //chrome JUnit4 tests. + */ +public class ChromeJUnit4ClassRunner extends BaseJUnit4ClassRunner { + /** + * Create a ChromeJUnit4ClassRunner to run {@code klass} and initialize values + * + * @throws InitializationError if the test class malformed + */ + public ChromeJUnit4ClassRunner(final Class<?> klass) throws InitializationError { + super(klass, defaultSkipChecks(), null); + } + + private static List<SkipCheck> defaultSkipChecks() { + return Arrays.asList(new SkipCheck[] { + new ChromeRestrictionSkipCheck(InstrumentationRegistry.getTargetContext()), + new ChromeDisableIfSkipCheck(InstrumentationRegistry.getTargetContext())}); + } +}
diff --git a/chrome/test/data/extensions/api_test/native_bindings/declarative_content/background.js b/chrome/test/data/extensions/api_test/native_bindings/declarative_content/background.js new file mode 100644 index 0000000..b2fa914 --- /dev/null +++ b/chrome/test/data/extensions/api_test/native_bindings/declarative_content/background.js
@@ -0,0 +1,36 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Register a rule to show the page action whenever we see a page with 'example' +// in the host. Send messages after registration of the rule is complete and +// when the page action is clicked. + +const kRuleId = 'rule1'; + +var rule = { + conditions: [ + new chrome.declarativeContent.PageStateMatcher( + {pageUrl: {hostPrefix: 'example'}}), + ], actions: [ + new chrome.declarativeContent.ShowPageAction(), + ], + id: kRuleId, +}; + +chrome.pageAction.onClicked.addListener(function() { + chrome.declarativeContent.onPageChanged.removeRules([kRuleId], function() { + chrome.declarativeContent.onPageChanged.getRules(function(rules) { + chrome.test.assertEq(0, rules.length); + chrome.test.sendMessage('clicked and removed'); + }); + }); +}); + +chrome.declarativeContent.onPageChanged.addRules([rule], function() { + chrome.declarativeContent.onPageChanged.getRules(function(rules) { + chrome.test.assertEq(1, rules.length); + chrome.test.assertEq(kRuleId, rules[0].id); + chrome.test.sendMessage('ready'); + }); +});
diff --git a/chrome/test/data/extensions/api_test/native_bindings/declarative_content/manifest.json b/chrome/test/data/extensions/api_test/native_bindings/declarative_content/manifest.json new file mode 100644 index 0000000..c0b0feb --- /dev/null +++ b/chrome/test/data/extensions/api_test/native_bindings/declarative_content/manifest.json
@@ -0,0 +1,12 @@ +{ + "name": "Test declarative content", + "description": "Test declarative content with native bindings", + "version": "0.1", + "manifest_version": 2, + "permissions": ["declarativeContent"], + "page_action": {}, + "background": { + "peristent": false, + "scripts": ["background.js"] + } +}
diff --git a/chrome/test/data/webui/settings/site_list_tests.js b/chrome/test/data/webui/settings/site_list_tests.js index 1cf8636..0fd8139 100644 --- a/chrome/test/data/webui/settings/site_list_tests.js +++ b/chrome/test/data/webui/settings/site_list_tests.js
@@ -388,7 +388,7 @@ */ function openActionMenu(index) { var item = testElement.$.listContainer.children[index]; - var dots = item.querySelector('paper-icon-button'); + var dots = item.querySelector('#actionMenuButton'); MockInteractions.tap(dots); Polymer.dom.flush(); } @@ -445,7 +445,8 @@ .then(function(contentType) { // Flush to be sure list container is populated. Polymer.dom.flush(); - var dotsMenu = testElement.$.listContainer.querySelector('#dots'); + var dotsMenu = testElement.$.listContainer.querySelector( + '#actionMenuButton'); assertFalse(dotsMenu.hidden); testElement.setAttribute('read-only-list', true); Polymer.dom.flush(); @@ -666,6 +667,48 @@ }); }); + test('reset button works for read-only content types', function() { + testElement.readOnlyList = true; + Polymer.dom.flush(); + + var contentType = settings.ContentSettingsTypes.GEOLOCATION; + var categorySubtype = settings.PermissionValues.ALLOW; + setUpCategory(contentType, categorySubtype, prefsOneEnabled); + return browserProxy.whenCalled('getExceptionList') + .then(function(actualContentType) { + assertEquals(contentType, actualContentType); + assertEquals(categorySubtype, testElement.categorySubtype); + + assertEquals(1, testElement.sites.length); + assertEquals( + prefsOneEnabled.exceptions.geolocation[0].origin, + testElement.sites[0].origin); + + Polymer.dom.flush(); + + var item = testElement.$.listContainer.children[0]; + + // Assert action button is hidden. + var dots = item.querySelector('#actionMenuButton'); + assertTrue(!!dots); + assertTrue(dots.hidden); + + // Assert reset button is visible. + var resetButton = item.querySelector('#resetSite'); + assertTrue(!!resetButton); + assertFalse(resetButton.hidden); + + MockInteractions.tap(resetButton); + return browserProxy.whenCalled( + 'resetCategoryPermissionForOrigin'); + }) + .then(function(args) { + assertEquals('https://foo-allow.com:443', args[0]); + assertEquals('https://foo-allow.com:443', args[1]); + assertEquals(contentType, args[2]); + }); + }); + test('edit action menu opens edit exception dialog', function() { setUpCategory( settings.ContentSettingsTypes.COOKIES, @@ -806,7 +849,7 @@ testElement.async(resolver.resolve); return resolver.promise.then(function() { var item = testElement.$.listContainer.children[0]; - var dots = item.querySelector('paper-icon-button'); + var dots = item.querySelector('#actionMenuButton'); assertTrue(!!dots); assertTrue(dots.hidden); });
diff --git a/chrome_elf/BUILD.gn b/chrome_elf/BUILD.gn index 53a29c8..776aa2cd 100644 --- a/chrome_elf/BUILD.gn +++ b/chrome_elf/BUILD.gn
@@ -249,6 +249,7 @@ sources = [ "blacklist/test/blacklist_test_main_dll.cc", "blacklist/test/blacklist_test_main_dll.def", + "blacklist/test/blacklist_test_main_dll.h", ] deps = [ ":blacklist",
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn index 223c541f..98f9358 100644 --- a/chromecast/BUILD.gn +++ b/chromecast/BUILD.gn
@@ -409,56 +409,40 @@ } } -action("chromecast_locales_pak") { - script = "//chromecast/tools/build/chromecast_repack_locales.py" +# Intermediate targets that repack grit resources by locale. For each locale +# in |locales_with_fake_bidi| (see //build/config/locales.gni), all resources +# are packed into a single .pak file in an output directory. These targets +# should not be depended on directly; depend on ":chromecast_locales_pak" +# instead. +foreach(locale, locales_with_fake_bidi) { + repack("_cast_repack_${locale}") { + visibility = [ ":chromecast_locales_pak" ] + output = "$root_out_dir/chromecast_locales/${locale}.pak" + sources = [ + "$root_gen_dir/chromecast/app/chromecast_settings_${locale}.pak", + ] + deps = [ + "//chromecast/app:chromecast_settings", + ] - # .pak resources in |grit_out_dir| with the same suffix are packed into a - # single resource and placed in |locales_dir|. The original .pak resources - # are generated by this target's dependencies. - grit_out_dir = "$root_gen_dir/chromecast_strings" - locales_dir = "$root_out_dir/chromecast_locales" + if (chromecast_branding != "public") { + sources += [ "$root_gen_dir/chromecast/internal/webui/app_strings_${locale}.pak" ] + deps += [ "//chromecast/internal/webui:chromecast_app_strings" ] - sources = [] - outputs = [] - - # |locales| is an array of suffixes declared in //build/config/locals.gni. - foreach(locale, locales) { - sources += [ "$grit_out_dir/chromecast_settings_$locale.pak" ] - outputs += [ "$locales_dir/$locale.pak" ] - } - deps = [ - "//chromecast/app:chromecast_settings", - ] - - # Include string and other localized resources for internal builds. - if (chromecast_branding != "public") { - foreach(locale, locales) { - sources += [ "$grit_out_dir/app_strings_$locale.pak" ] if (enable_chromecast_webui) { - sources += [ "$grit_out_dir/webui_localized_$locale.pak" ] + sources += [ "$root_gen_dir/chromecast/internal/webui/webui_localized_${locale}.pak" ] + deps += [ "//chromecast/internal/webui:chromecast_webui_localized" ] } } - deps += [ "//chromecast/internal/webui:chromecast_app_strings" ] - if (enable_chromecast_webui) { - deps += [ "//chromecast/internal/webui:chromecast_webui_localized" ] - } } +} - # This script only accepts the following values for branding: - assert(chromecast_branding == "public" || chromecast_branding == "internal" || - chromecast_branding == "google") - args = [ - "-b", - "$chromecast_branding", - "-g", - rebase_path("$root_gen_dir/chromecast_strings"), - "-x", - rebase_path("$root_out_dir/chromecast_locales"), - ] - if (enable_chromecast_webui) { - args += [ "-u" ] +# A meta-target which repacks resources by locale. +group("chromecast_locales_pak") { + deps = [] + foreach(locale, locales_with_fake_bidi) { + deps += [ ":_cast_repack_${locale}" ] } - args += locales } buildflag_header("chromecast_features") {
diff --git a/chromecast/app/BUILD.gn b/chromecast/app/BUILD.gn index 84c88cf..edf36236 100644 --- a/chromecast/app/BUILD.gn +++ b/chromecast/app/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/locales.gni") import("//testing/test.gni") import("//tools/grit/grit_rule.gni") @@ -105,68 +106,10 @@ source = "//chromecast/app/resources/chromecast_settings.grd" resource_ids = "//chromecast/app/resources/resource_ids" - # TODO(thakis): Consider removing output_dir in favor of the default - # directory, then it becomes possible to qualify includes of - # grit/chromecast_settings.h and DEPS files work better too. - # https://crbug.com/697090 - output_dir = "$root_gen_dir/chromecast_strings" - use_qualified_include = false - outputs = [ "grit/chromecast_settings.h", - "chromecast_settings_am.pak", - "chromecast_settings_ar.pak", - "chromecast_settings_bg.pak", - "chromecast_settings_bn.pak", - "chromecast_settings_ca.pak", - "chromecast_settings_cs.pak", - "chromecast_settings_da.pak", - "chromecast_settings_de.pak", - "chromecast_settings_el.pak", - "chromecast_settings_en-GB.pak", - "chromecast_settings_en-US.pak", - "chromecast_settings_es.pak", - "chromecast_settings_es-419.pak", - "chromecast_settings_et.pak", - "chromecast_settings_fa.pak", - "chromecast_settings_fake-bidi.pak", - "chromecast_settings_fi.pak", - "chromecast_settings_fil.pak", - "chromecast_settings_fr.pak", - "chromecast_settings_gu.pak", - "chromecast_settings_he.pak", - "chromecast_settings_hi.pak", - "chromecast_settings_hr.pak", - "chromecast_settings_hu.pak", - "chromecast_settings_id.pak", - "chromecast_settings_it.pak", - "chromecast_settings_ja.pak", - "chromecast_settings_kn.pak", - "chromecast_settings_ko.pak", - "chromecast_settings_lt.pak", - "chromecast_settings_lv.pak", - "chromecast_settings_ml.pak", - "chromecast_settings_mr.pak", - "chromecast_settings_ms.pak", - "chromecast_settings_nl.pak", - "chromecast_settings_nb.pak", - "chromecast_settings_pl.pak", - "chromecast_settings_pt-BR.pak", - "chromecast_settings_pt-PT.pak", - "chromecast_settings_ro.pak", - "chromecast_settings_ru.pak", - "chromecast_settings_sk.pak", - "chromecast_settings_sl.pak", - "chromecast_settings_sr.pak", - "chromecast_settings_sv.pak", - "chromecast_settings_sw.pak", - "chromecast_settings_ta.pak", - "chromecast_settings_te.pak", - "chromecast_settings_th.pak", - "chromecast_settings_tr.pak", - "chromecast_settings_uk.pak", - "chromecast_settings_vi.pak", - "chromecast_settings_zh-CN.pak", - "chromecast_settings_zh-TW.pak", ] + foreach(locale, locales_with_fake_bidi) { + outputs += [ "chromecast_settings_${locale}.pak" ] + } }
diff --git a/chromecast/browser/DEPS b/chromecast/browser/DEPS index 68debbb..c273dc2c 100644 --- a/chromecast/browser/DEPS +++ b/chromecast/browser/DEPS
@@ -2,6 +2,7 @@ "+cc/base/switches.h", "+chromecast/common", "+chromecast/graphics", + "+chromecast/app/grit/chromecast_settings.h", "+chromecast/app/resources/grit/shell_resources.h", "+chromecast/media", "+chromecast/net", @@ -18,7 +19,6 @@ "+device/geolocation", "+gin/v8_initializer.h", "+gpu/command_buffer/service/gpu_switches.h", - "+grit/chromecast_settings.h", "+media/audio", "+media/base", "+media/mojo",
diff --git a/chromecast/browser/cast_http_user_agent_settings.cc b/chromecast/browser/cast_http_user_agent_settings.cc index 1161c00..f4eeba9d 100644 --- a/chromecast/browser/cast_http_user_agent_settings.cc +++ b/chromecast/browser/cast_http_user_agent_settings.cc
@@ -7,9 +7,9 @@ #include "base/i18n/rtl.h" #include "base/logging.h" #include "build/build_config.h" +#include "chromecast/app/grit/chromecast_settings.h" #include "chromecast/common/cast_content_client.h" #include "content/public/browser/browser_thread.h" -#include "grit/chromecast_settings.h" #include "net/http/http_util.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chromecast/chromecast.gni b/chromecast/chromecast.gni index dc4ac9a..ec300c5 100644 --- a/chromecast/chromecast.gni +++ b/chromecast/chromecast.gni
@@ -46,7 +46,3 @@ cast_build_release = read_file("//chromecast/internal/build/cast_build_release", "trim string") } - -# Assistant shall only be enabled on audio-only builds. -assert(!enable_assistant || is_cast_audio_only, - "Assistant is only available on audio devices.")
diff --git a/chromecast/tools/build/chromecast_repack_locales.py b/chromecast/tools/build/chromecast_repack_locales.py deleted file mode 100755 index 7d359b8..0000000 --- a/chromecast/tools/build/chromecast_repack_locales.py +++ /dev/null
@@ -1,145 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Helper script to repack paks for a list of locales. - -Gyp doesn't have any built-in looping capability, so this just provides a way to -loop over a list of locales when repacking pak files, thus avoiding a -proliferation of mostly duplicate, cut-n-paste gyp actions. -""" - -import optparse -import os -import sys - -# Prepend the grit module from the source tree so it takes precedence over other -# grit versions that might present in the search path. -sys.path.insert(1, os.path.join(os.path.dirname(__file__), '..', '..', '..', - 'tools', 'grit')) -from grit.format import data_pack - -# Some build paths defined by gyp. -GRIT_DIR = None -INT_DIR = None -CHROMECAST_BRANDING = None - -class Usage(Exception): - def __init__(self, msg): - self.msg = msg - - -def calc_output(locale): - """Determine the file that will be generated for the given locale.""" - #e.g. '<(INTERMEDIATE_DIR)/repack/da.pak', - # For Fake Bidi, generate it at a fixed path so that tests can safely - # reference it. - if locale == 'fake-bidi': - return '%s/%s.pak' % (INT_DIR, locale) - return os.path.join(INT_DIR, locale + '.pak') - - -def calc_inputs(locale): - """Determine the files that need processing for the given locale.""" - inputs = [] - if CHROMECAST_BRANDING != 'public': - inputs.append(os.path.join(GRIT_DIR, 'app_strings_%s.pak' % locale)) - if CHROMECAST_WEBUI: - inputs.append(os.path.join(GRIT_DIR, 'webui_localized_%s.pak' % locale)) - inputs.append(os.path.join(GRIT_DIR, 'chromecast_settings_%s.pak' % locale)) - return inputs - - -def list_outputs(locales): - """Returns the names of files that will be generated for the given locales. - - This is to provide gyp the list of output files, so build targets can - properly track what needs to be built. - """ - outputs = [] - for locale in locales: - outputs.append(calc_output(locale)) - # Quote each element so filename spaces don't mess up gyp's attempt to parse - # it into a list. - return " ".join(['"%s"' % x for x in outputs]) - - -def list_inputs(locales): - """Returns the names of files that will be processed for the given locales. - - This is to provide gyp the list of input files, so build targets can properly - track their prerequisites. - """ - inputs = [] - for locale in locales: - inputs += calc_inputs(locale) - # Quote each element so filename spaces don't mess up gyp's attempt to parse - # it into a list. - return " ".join(['"%s"' % x for x in inputs]) - - -def repack_locales(locales): - """ Loop over and repack the given locales.""" - for locale in locales: - inputs = [] - inputs += calc_inputs(locale) - output = calc_output(locale) - data_pack.DataPack.RePack(output, inputs) - - -def DoMain(argv): - global CHROMECAST_BRANDING - global CHROMECAST_WEBUI - global GRIT_DIR - global INT_DIR - - parser = optparse.OptionParser("usage: %prog [options] locales") - parser.add_option("-i", action="store_true", dest="inputs", default=False, - help="Print the expected input file list, then exit.") - parser.add_option("-o", action="store_true", dest="outputs", default=False, - help="Print the expected output file list, then exit.") - parser.add_option("-g", action="store", dest="grit_dir", - help="GRIT build files output directory.") - parser.add_option("-x", action="store", dest="int_dir", - help="Intermediate build files output directory.") - parser.add_option("-b", action="store", dest="chromecast_branding", - help="Chromecast branding " + - "('public', 'internal' or 'google').") - parser.add_option("-u", action="store_true", dest="chromecast_webui", - default=False, - help="Include Chromecast webui related resources.") - options, locales = parser.parse_args(argv) - - if not locales: - parser.error('Please specificy at least one locale to process.\n') - - print_inputs = options.inputs - print_outputs = options.outputs - GRIT_DIR = options.grit_dir - INT_DIR = options.int_dir - CHROMECAST_BRANDING = options.chromecast_branding - CHROMECAST_WEBUI = options.chromecast_webui - - if (CHROMECAST_BRANDING != 'public' and - CHROMECAST_BRANDING != 'internal' and - CHROMECAST_BRANDING != 'google'): - parser.error('Chromecast branding (-b) must be ' + - '"public", "internal" or "google".\n') - if not (GRIT_DIR and INT_DIR): - parser.error('Please specify all of "-g" and "-x".\n') - if print_inputs and print_outputs: - parser.error('Please specify only one of "-i" or "-o".\n') - - if print_inputs: - return list_inputs(locales) - - if print_outputs: - return list_outputs(locales) - - return repack_locales(locales) - -if __name__ == '__main__': - results = DoMain(sys.argv[1:]) - if results: - print results
diff --git a/chromeos/components/tether/initializer.cc b/chromeos/components/tether/initializer.cc index ec08336..cc2d49c 100644 --- a/chromeos/components/tether/initializer.cc +++ b/chromeos/components/tether/initializer.cc
@@ -8,9 +8,20 @@ namespace tether { -void Initializer::Initialize() {} +// static +Initializer* Initializer::instance_ = nullptr; -Initializer::Initializer() {} +void Initializer::Initialize(cryptauth::CryptAuthService* cryptauth_service) { + if (instance_) { + // TODO(khorimoto): Determine if a new instance should be created. + instance_->cryptauth_service_ = cryptauth_service; + } else { + instance_ = new Initializer(cryptauth_service); + } +} + +Initializer::Initializer(cryptauth::CryptAuthService* cryptauth_service) + : cryptauth_service_(cryptauth_service) {} Initializer::~Initializer() {}
diff --git a/chromeos/components/tether/initializer.h b/chromeos/components/tether/initializer.h index 49d4596..76a98a97 100644 --- a/chromeos/components/tether/initializer.h +++ b/chromeos/components/tether/initializer.h
@@ -7,6 +7,10 @@ #include "base/macros.h" +namespace cryptauth { +class CryptAuthService; +} + namespace chromeos { namespace tether { @@ -15,12 +19,16 @@ // TODO(khorimoto): Implement. class Initializer { public: - static void Initialize(); + static void Initialize(cryptauth::CryptAuthService* cryptauth_service); private: - Initializer(); + static Initializer* instance_; + + explicit Initializer(cryptauth::CryptAuthService* cryptauth_service); ~Initializer(); + cryptauth::CryptAuthService* cryptauth_service_; + DISALLOW_COPY_AND_ASSIGN(Initializer); };
diff --git a/chromeos/dbus/services/proxy_resolution_service_provider.cc b/chromeos/dbus/services/proxy_resolution_service_provider.cc index 607ea190..64bcd47 100644 --- a/chromeos/dbus/services/proxy_resolution_service_provider.cc +++ b/chromeos/dbus/services/proxy_resolution_service_provider.cc
@@ -25,6 +25,20 @@ struct ProxyResolutionServiceProvider::Request { public: + // Constructor for returning proxy info via an asynchronous D-Bus response. + Request(const std::string& source_url, + std::unique_ptr<dbus::Response> response, + const dbus::ExportedObject::ResponseSender& response_sender, + scoped_refptr<net::URLRequestContextGetter> context_getter) + : source_url(source_url), + response(std::move(response)), + response_sender(response_sender), + context_getter(context_getter) { + DCHECK(this->response); + DCHECK(!response_sender.is_null()); + } + + // Constructor for returning proxy info via a D-Bus signal. Request(const std::string& source_url, const std::string& signal_interface, const std::string& signal_name, @@ -32,14 +46,26 @@ : source_url(source_url), signal_interface(signal_interface), signal_name(signal_name), - context_getter(context_getter) {} + context_getter(context_getter) { + DCHECK(!signal_interface.empty()); + DCHECK(!signal_name.empty()); + } + ~Request() = default; // URL being resolved. const std::string source_url; + // D-Bus response and callback for returning data on resolution completion. + // Either these two members or |signal_interface|/|signal_name| must be + // supplied, but not both. + std::unique_ptr<dbus::Response> response; + const dbus::ExportedObject::ResponseSender response_sender; + // D-Bus interface and name for emitting result signal after resolution is // complete. + // TODO(derat): Remove these and associated code after all callers use async + // responses instead of signals: http://crbug.com/446115 const std::string signal_interface; const std::string signal_name; @@ -98,23 +124,43 @@ dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { DCHECK(OnOriginThread()); + VLOG(1) << "Handling method call: " << method_call->ToString(); - // The method call should contain the three string parameters. dbus::MessageReader reader(method_call); std::string source_url; - std::string signal_interface; - std::string signal_name; - if (!reader.PopString(&source_url) || !reader.PopString(&signal_interface) || - !reader.PopString(&signal_name)) { - LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); - response_sender.Run(std::unique_ptr<dbus::Response>()); + if (!reader.PopString(&source_url)) { + LOG(ERROR) << "Method call lacks source URL: " << method_call->ToString(); + response_sender.Run(dbus::ErrorResponse::FromMethodCall( + method_call, DBUS_ERROR_INVALID_ARGS, "No source URL string arg")); return; } + // The signal interface and name arguments are optional but must be supplied + // together. + std::string signal_interface, signal_name; + if (reader.HasMoreData() && + (!reader.PopString(&signal_interface) || signal_interface.empty() || + !reader.PopString(&signal_name) || signal_name.empty())) { + LOG(ERROR) << "Method call has invalid interface/name args: " + << method_call->ToString(); + response_sender.Run(dbus::ErrorResponse::FromMethodCall( + method_call, DBUS_ERROR_INVALID_ARGS, "Invalid interface/name args")); + return; + } + + std::unique_ptr<dbus::Response> response = + dbus::Response::FromMethodCall(method_call); scoped_refptr<net::URLRequestContextGetter> context_getter = delegate_->GetRequestContext(); - auto request = base::MakeUnique<Request>(source_url, signal_interface, - signal_name, context_getter); + + // If signal information was supplied, emit a signal instead of including + // proxy information in the response. + std::unique_ptr<Request> request = + !signal_interface.empty() + ? base::MakeUnique<Request>(source_url, signal_interface, signal_name, + context_getter) + : base::MakeUnique<Request>(source_url, std::move(response), + response_sender, context_getter); // This would ideally call PostTaskAndReply() instead of PostTask(), but // ResolveProxyOnNetworkThread()'s call to net::ProxyService::ResolveProxy() @@ -126,9 +172,10 @@ weak_ptr_factory_.GetWeakPtr(), base::Passed(std::move(request)))); - // Send an empty response for now. We'll send a signal once the network proxy - // resolution is completed. - response_sender.Run(dbus::Response::FromMethodCall(method_call)); + // If we didn't already pass the response to the Request object because we're + // returning data via a signal, send an empty response immediately. + if (response) + response_sender.Run(std::move(response)); } void ProxyResolutionServiceProvider::ResolveProxyOnNetworkThread( @@ -180,14 +227,22 @@ std::unique_ptr<Request> request) { DCHECK(OnOriginThread()); - // Send a signal to the client. - dbus::Signal signal(request->signal_interface, request->signal_name); - dbus::MessageWriter writer(&signal); - writer.AppendString(request->source_url); - writer.AppendString(request->proxy_info.ToPacString()); - writer.AppendString(request->error); - exported_object_->SendSignal(&signal); - VLOG(1) << "Sending signal: " << signal.ToString(); + if (request->response) { + // Reply to the original D-Bus method call. + dbus::MessageWriter writer(request->response.get()); + writer.AppendString(request->proxy_info.ToPacString()); + writer.AppendString(request->error); + request->response_sender.Run(std::move(request->response)); + } else { + // Send a signal to the client. + dbus::Signal signal(request->signal_interface, request->signal_name); + dbus::MessageWriter writer(&signal); + writer.AppendString(request->source_url); + writer.AppendString(request->proxy_info.ToPacString()); + writer.AppendString(request->error); + exported_object_->SendSignal(&signal); + VLOG(1) << "Sending signal: " << signal.ToString(); + } } } // namespace chromeos
diff --git a/chromeos/dbus/services/proxy_resolution_service_provider.h b/chromeos/dbus/services/proxy_resolution_service_provider.h index ab4aec7..6cac9fa 100644 --- a/chromeos/dbus/services/proxy_resolution_service_provider.h +++ b/chromeos/dbus/services/proxy_resolution_service_provider.h
@@ -37,52 +37,39 @@ // This class provides proxy resolution service for CrosDBusService. // It processes proxy resolution requests for ChromeOS clients. // -// The following methods are exported. +// The following method is exported: // // Interface: org.chromium.LibCrosServiceInterface (kLibCrosServiceInterface) // Method: ResolveNetworkProxy (kResolveNetworkProxy) // Parameters: string:source_url -// string:signal_interface -// string:signal_name +// string:signal_interface (optional) +// string:signal_name (optional) // -// Resolves the proxy for |source_url|. Returns the result -// as a D-Bus signal sent to |signal_interface| and |signal_name|. +// Resolves the proxy for |source_url|. If |signal_interface| and +// |signal_name| are supplied, returns an empty reply immediately and +// asynchronously emits a D-Bus signal to the requested destination. +// Otherwise, returns proxy information an asynchronous response without +// emitting a signal. // -// The returned signal will contain the three values: +// The signal (if requested) will contain three values: // - string:source_url - requested source URL. // - string:proxy_info - proxy info for the source URL in PAC format // like "PROXY cache.example.com:12345" // - string:error_message - error message. Empty if successful. // -// This service can be manually tested using dbus-monitor and -// dbus-send. For instance, you can resolve proxy configuration for -// http://www.gmail.com/ as follows: +// The method call response (if requested) will contain just two values: +// - string:proxy_info - proxy info for the source URL in PAC format +// like "PROXY cache.example.com:12345" +// - string:error_message - error message. Empty if successful. // -// 1. Open a terminal and run the following: +// This service can be manually tested using dbus-send: // -// % dbus-monitor --system interface=org.chromium.TestInterface -// -// 2. Open another terminal and run the following: -// -// % dbus-send --system --type=method_call +// % dbus-send --system --type=method_call --print-reply // --dest=org.chromium.LibCrosService // /org/chromium/LibCrosService // org.chromium.LibCrosServiceInterface.ResolveNetworkProxy -// string:http://www.gmail.com/ -// string:org.chromium.TestInterface -// string:TestSignal +// string:https://www.google.com/ // -// 3. Go back to the original terminal and check the output which should -// look like: -// -// signal sender=:1.23 -> dest=(null destination) serial=12345 -// path=/org/chromium/LibCrosService; interface=org.chromium.TestInterface; -// member=TestSignal -// string "http://www.gmail.com/" -// string "PROXY proxy.example.com:8080" -// string "" -// - class CHROMEOS_EXPORT ProxyResolutionServiceProvider : public CrosDBusService::ServiceProviderInterface { public:
diff --git a/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc b/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc index 0a8882a5..3984d61d 100644 --- a/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc +++ b/chromeos/dbus/services/proxy_resolution_service_provider_unittest.cc
@@ -90,17 +90,6 @@ std::unique_ptr<TestDelegate>(delegate_)); test_helper_.SetUp(kResolveNetworkProxy, service_provider_.get()); - - // Connect to the signal that will be sent to kReturnSignalInterface and - // kReturnSignalName. ResolveNetworkProxy() will send the result as a - // signal. OnSignalReceived() will be called upon the delivery. - test_helper_.SetUpReturnSignal( - kReturnSignalInterface, - kReturnSignalName, - base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived, - base::Unretained(this)), - base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal, - base::Unretained(this))); } void TearDown() override { @@ -140,18 +129,33 @@ EXPECT_TRUE(success); } - // Makes a D-Bus call to |service_provider_|'s ResolveNetworkProxy method. + // Makes a D-Bus call to |service_provider_|'s ResolveNetworkProxy method. If + // |request_signal| is true, requests that the proxy information be returned + // via a signal; otherwise it should be included in the response. // |response_out| is updated to hold the response, and |signal_out| is updated // to hold information about the emitted signal, if any. void CallMethod(const std::string& source_url, + bool request_signal, std::unique_ptr<dbus::Response>* response_out, std::unique_ptr<SignalInfo>* signal_out) { dbus::MethodCall method_call(kLibCrosServiceInterface, kResolveNetworkProxy); dbus::MessageWriter writer(&method_call); writer.AppendString(source_url); - writer.AppendString(kReturnSignalInterface); - writer.AppendString(kReturnSignalName); + if (request_signal) { + writer.AppendString(kReturnSignalInterface); + writer.AppendString(kReturnSignalName); + + // Connect to the signal that will be sent to kReturnSignalInterface and + // kReturnSignalName. ResolveNetworkProxy() will send the result as a + // signal. OnSignalReceived() will be called upon the delivery. + test_helper_.SetUpReturnSignal( + kReturnSignalInterface, kReturnSignalName, + base::Bind(&ProxyResolutionServiceProviderTest::OnSignalReceived, + base::Unretained(this)), + base::Bind(&ProxyResolutionServiceProviderTest::OnConnectedToSignal, + base::Unretained(this))); + } *response_out = test_helper_.CallMethod(&method_call); base::RunLoop().RunUntilIdle(); @@ -166,13 +170,13 @@ TestDelegate* delegate_; // Owned by |service_provider_|. }; -// Tests that synchronously-resolved proxy information is returned. -TEST_F(ProxyResolutionServiceProviderTest, ResolveProxySync) { +// Tests that synchronously-resolved proxy information is returned via a signal. +TEST_F(ProxyResolutionServiceProviderTest, SignalSync) { const char kSourceURL[] = "http://www.gmail.com/"; std::unique_ptr<dbus::Response> response; std::unique_ptr<SignalInfo> signal; - CallMethod(kSourceURL, &response, &signal); + CallMethod(kSourceURL, true /* request_signal */, &response, &signal); // An empty response should be returned. ASSERT_TRUE(response); @@ -185,15 +189,16 @@ EXPECT_EQ("", signal->error_message); } -// Tests that asynchronously-resolved proxy information is returned. -TEST_F(ProxyResolutionServiceProviderTest, ResolveProxyAsync) { +// Tests that asynchronously-resolved proxy information is returned via a +// signal. +TEST_F(ProxyResolutionServiceProviderTest, SignalAsync) { const char kSourceURL[] = "http://www.gmail.com/"; delegate_->set_async(true); delegate_->mutable_proxy_info()->UseNamedProxy("http://localhost:8080"); std::unique_ptr<dbus::Response> response; std::unique_ptr<SignalInfo> signal; - CallMethod(kSourceURL, &response, &signal); + CallMethod(kSourceURL, true /* request_signal */, &response, &signal); // An empty response should be returned. ASSERT_TRUE(response); @@ -206,15 +211,16 @@ EXPECT_EQ("", signal->error_message); } -// Tests that an error received during proxy resolution is returned. -TEST_F(ProxyResolutionServiceProviderTest, ResolveProxyError) { +// Tests that an error received during proxy resolution is returned via a +// signal. +TEST_F(ProxyResolutionServiceProviderTest, SignalError) { const char kSourceURL[] = "http://www.gmail.com/"; const net::Error kError = net::ERR_FAILED; delegate_->set_result(kError); std::unique_ptr<dbus::Response> response; std::unique_ptr<SignalInfo> signal; - CallMethod(kSourceURL, &response, &signal); + CallMethod(kSourceURL, true /* request_signal */, &response, &signal); // An empty response should be returned. ASSERT_TRUE(response); @@ -227,4 +233,44 @@ EXPECT_EQ(net::ErrorToString(kError), signal->error_message); } +TEST_F(ProxyResolutionServiceProviderTest, ResponseSync) { + const char kSourceURL[] = "http://www.gmail.com/"; + std::unique_ptr<dbus::Response> response; + std::unique_ptr<SignalInfo> signal; + CallMethod(kSourceURL, false /* request_signal */, &response, &signal); + + // The response should contain the proxy info and an empty error. + ASSERT_TRUE(response); + dbus::MessageReader reader(response.get()); + std::string proxy_info, error; + EXPECT_TRUE(reader.PopString(&proxy_info)); + EXPECT_TRUE(reader.PopString(&error)); + EXPECT_EQ(delegate_->proxy_info().ToPacString(), proxy_info); + EXPECT_EQ("", error); + + // No signal should've been emitted. + EXPECT_FALSE(signal); +} + +TEST_F(ProxyResolutionServiceProviderTest, ResponseAsync) { + const char kSourceURL[] = "http://www.gmail.com/"; + delegate_->set_async(true); + delegate_->mutable_proxy_info()->UseNamedProxy("http://localhost:8080"); + std::unique_ptr<dbus::Response> response; + std::unique_ptr<SignalInfo> signal; + CallMethod(kSourceURL, false /* request_signal */, &response, &signal); + + // The response should contain the proxy info and an empty error. + ASSERT_TRUE(response); + dbus::MessageReader reader(response.get()); + std::string proxy_info, error; + EXPECT_TRUE(reader.PopString(&proxy_info)); + EXPECT_TRUE(reader.PopString(&error)); + EXPECT_EQ(delegate_->proxy_info().ToPacString(), proxy_info); + EXPECT_EQ("", error); + + // No signal should've been emitted. + EXPECT_FALSE(signal); +} + } // namespace chromeos
diff --git a/chromeos/network/network_connect.cc b/chromeos/network/network_connect.cc index bf6ed2e..ee01867 100644 --- a/chromeos/network/network_connect.cc +++ b/chromeos/network/network_connect.cc
@@ -26,6 +26,9 @@ namespace { +void IgnoreDisconnectError(const std::string& error_name, + std::unique_ptr<base::DictionaryValue> error_data) {} + // Returns true for carriers that can be activated through Shill instead of // through a WebUI dialog. bool IsDirectActivatedCarrier(const std::string& carrier) { @@ -48,6 +51,7 @@ // NetworkConnect void ConnectToNetworkId(const std::string& network_id) override; + void DisconnectFromNetworkId(const std::string& network_id) override; bool MaybeShowConfigureUI(const std::string& network_id, const std::string& connect_error) override; void SetTechnologyEnabled(const NetworkTypePattern& technology, @@ -402,6 +406,17 @@ CallConnectToNetwork(network_id, check_error_state); } +void NetworkConnectImpl::DisconnectFromNetworkId( + const std::string& network_id) { + NET_LOG_USER("DisconnectFromNetwork", network_id); + const NetworkState* network = GetNetworkStateFromId(network_id); + if (!network) + return; + NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork( + network->path(), base::Bind(&base::DoNothing), + base::Bind(&IgnoreDisconnectError)); +} + bool NetworkConnectImpl::MaybeShowConfigureUI( const std::string& network_id, const std::string& connect_error) {
diff --git a/chromeos/network/network_connect.h b/chromeos/network/network_connect.h index 375283b0..0e06698 100644 --- a/chromeos/network/network_connect.h +++ b/chromeos/network/network_connect.h
@@ -80,6 +80,9 @@ // Requests a network connection and handles any errors and notifications. virtual void ConnectToNetworkId(const std::string& network_id) = 0; + // Requests a network disconnection. Ignores any errors and notifications. + virtual void DisconnectFromNetworkId(const std::string& network_id) = 0; + // Maybe show the configuration UI after a connect failure based on the // network state and error name. Returns true if the UI is shown. virtual bool MaybeShowConfigureUI(const std::string& network_id,
diff --git a/chromeos/network/network_connect_unittest.cc b/chromeos/network/network_connect_unittest.cc index 0a3cd44..90d2444 100644 --- a/chromeos/network/network_connect_unittest.cc +++ b/chromeos/network/network_connect_unittest.cc
@@ -16,6 +16,7 @@ #include "chromeos/network/network_connect.h" #include "chromeos/network/network_connection_handler.h" #include "chromeos/network/network_handler.h" +#include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -223,6 +224,21 @@ kWiFi1Guid, NetworkConnectionHandler::kErrorCertificateRequired); } +TEST_F(NetworkConnectTest, ConnectThenDisconnectWiFiNetwork) { + const NetworkState* network = + NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( + kWiFi1Guid); + + NetworkConnect::Get()->ConnectToNetworkId(kWiFi1Guid); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(network->IsConnectedState()); + + NetworkConnect::Get()->DisconnectFromNetworkId(kWiFi1Guid); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(network->IsConnectedState()); + EXPECT_FALSE(network->IsConnectingState()); +} + // ShowNetworkSettings only applies to cellular networks. TEST_F(NetworkConnectTest, ShowNetworkSettings) { EXPECT_CALL(*mock_delegate_, ShowNetworkSettings(kCellular1Guid));
diff --git a/chromeos/settings/timezone_settings.cc b/chromeos/settings/timezone_settings.cc index 496e887..9c3a371 100644 --- a/chromeos/settings/timezone_settings.cc +++ b/chromeos/settings/timezone_settings.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/i18n/unicodestring.h" #include "base/location.h" #include "base/logging.h" #include "base/macros.h" @@ -483,8 +484,7 @@ // static base::string16 TimezoneSettings::GetTimezoneID(const icu::TimeZone& timezone) { icu::UnicodeString id; - timezone.getID(id); - return base::string16(id.getBuffer(), id.length()); + return base::i18n::UnicodeStringToString16(timezone.getID(id)); } } // namespace system
diff --git a/components/BUILD.gn b/components/BUILD.gn index 6c8f116..71306c3 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -126,6 +126,7 @@ "//components/proxy_config:unit_tests", "//components/query_parser:unit_tests", "//components/rappor:unit_tests", + "//components/reading_list/core:unit_tests", "//components/search:unit_tests", "//components/search_engines:unit_tests", "//components/search_provider_logos:unit_tests", @@ -167,7 +168,6 @@ if (is_ios) { deps += [ "//components/image_fetcher/ios:unit_tests", - "//components/reading_list/ios:unit_tests", "//components/signin/ios/browser:unit_tests", "//components/translate/ios/browser:unit_tests", ]
diff --git a/components/autofill/core/browser/autofill_profile_comparator.cc b/components/autofill/core/browser/autofill_profile_comparator.cc index c3e87095..fd103d3 100644 --- a/components/autofill/core/browser/autofill_profile_comparator.cc +++ b/components/autofill/core/browser/autofill_profile_comparator.cc
@@ -9,6 +9,7 @@ #include "base/i18n/case_conversion.h" #include "base/i18n/char_iterator.h" +#include "base/i18n/unicodestring.h" #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -128,7 +129,7 @@ icu::UnicodeString value = icu::UnicodeString(result.data(), result.length()); transliterator_->transliterate(value); - return base::string16(value.getBuffer(), value.length()); + return base::i18n::UnicodeStringToString16(value); } bool AutofillProfileComparator::AreMergeable(const AutofillProfile& p1,
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc index bd5110e..0e54c44 100644 --- a/components/autofill/core/browser/credit_card.cc +++ b/components/autofill/core/browser/credit_card.cc
@@ -13,6 +13,7 @@ #include "base/guid.h" #include "base/i18n/time_formatting.h" +#include "base/i18n/unicodestring.h" #include "base/logging.h" #include "base/macros.h" #include "base/metrics/histogram_macros.h" @@ -870,7 +871,8 @@ int32_t num_months; const icu::UnicodeString* months = date_format_symbols.getMonths(num_months); for (int32_t i = 0; i < num_months; ++i) { - const base::string16 icu_month(months[i].getBuffer(), months[i].length()); + const base::string16 icu_month( + base::i18n::UnicodeStringToString16(months[i])); if (compare.StringsEqual(icu_month, month)) { *num = i + 1; // Adjust from 0-indexed to 1-indexed. return true; @@ -883,7 +885,7 @@ base::string16 trimmed_month; base::TrimString(month, ASCIIToUTF16("."), &trimmed_month); for (int32_t i = 0; i < num_months; ++i) { - base::string16 icu_month(months[i].getBuffer(), months[i].length()); + base::string16 icu_month(base::i18n::UnicodeStringToString16(months[i])); base::TrimString(icu_month, ASCIIToUTF16("."), &icu_month); if (compare.StringsEqual(icu_month, trimmed_month)) { *num = i + 1; // Adjust from 0-indexed to 1-indexed.
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 72cf35b..27d1c00 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1700,13 +1700,8 @@ syncer::MetadataBatch* metadata_batch) { DCHECK_EQ(model_type, syncer::AUTOFILL) << "Only the AUTOFILL model type is supported"; - syncer::EntityMetadataMap metadata_records; - if (GetAllSyncEntityMetadata(model_type, &metadata_records)) { - for (const auto& pair : metadata_records) { - // TODO(pnoland): Add batch transfer of metadata map. - metadata_batch->AddMetadata(pair.first, pair.second); - } - } else { + DCHECK(metadata_batch); + if (!GetAllSyncEntityMetadata(model_type, metadata_batch)) { return false; } @@ -1722,9 +1717,10 @@ bool AutofillTable::GetAllSyncEntityMetadata( syncer::ModelType model_type, - syncer::EntityMetadataMap* metadata_records) { + syncer::MetadataBatch* metadata_batch) { DCHECK_EQ(model_type, syncer::AUTOFILL) << "Only the AUTOFILL model type is supported"; + DCHECK(metadata_batch); sql::Statement s(db_->GetUniqueStatement( "SELECT storage_key, value FROM autofill_sync_metadata")); @@ -1732,10 +1728,12 @@ while (s.Step()) { std::string storage_key = s.ColumnString(0); std::string serialized_metadata = s.ColumnString(1); - sync_pb::EntityMetadata metadata_record; - if (metadata_record.ParseFromString(serialized_metadata)) { - metadata_records->insert(std::make_pair(storage_key, metadata_record)); + sync_pb::EntityMetadata entity_metadata; + if (entity_metadata.ParseFromString(serialized_metadata)) { + metadata_batch->AddMetadata(storage_key, entity_metadata); } else { + DLOG(WARNING) << "Failed to deserialize AUTOFILL model type " + "sync_pb::EntityMetadata."; return false; } }
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h index f3f8a14..872d127 100644 --- a/components/autofill/core/browser/webdata/autofill_table.h +++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -517,7 +517,7 @@ base::Time time); bool GetAllSyncEntityMetadata(syncer::ModelType model_type, - syncer::EntityMetadataMap* metadata_records); + syncer::MetadataBatch* metadata_batch); bool GetModelTypeState(syncer::ModelType model_type, sync_pb::ModelTypeState* state);
diff --git a/components/bookmarks/browser/titled_url_index.cc b/components/bookmarks/browser/titled_url_index.cc index abde1aa..fa9ed764 100644 --- a/components/bookmarks/browser/titled_url_index.cc +++ b/components/bookmarks/browser/titled_url_index.cc
@@ -7,6 +7,7 @@ #include <stdint.h> #include "base/i18n/case_conversion.h" +#include "base/i18n/unicodestring.h" #include "base/logging.h" #include "base/stl_util.h" #include "base/strings/utf_offset_string_conversions.h" @@ -42,8 +43,7 @@ LOG(ERROR) << "normalization failed: " << u_errorName(status); return text; } - return base::string16(unicode_normalized_text.getBuffer(), - unicode_normalized_text.length()); + return base::i18n::UnicodeStringToString16(unicode_normalized_text); } } // namespace
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn index 5b870f0a..4c2e287 100644 --- a/components/browser_sync/BUILD.gn +++ b/components/browser_sync/BUILD.gn
@@ -33,8 +33,7 @@ "//components/password_manager/sync/browser", "//components/pref_registry", "//components/prefs", - "//components/reading_list/core", - "//components/reading_list/core:reading_list_enable_flags", + "//components/reading_list/core:flags", "//components/signin/core/browser", "//components/strings", "//components/sync_bookmarks",
diff --git a/components/browser_sync/profile_sync_service.cc b/components/browser_sync/profile_sync_service.cc index 2470f17..015bbd9 100644 --- a/components/browser_sync/profile_sync_service.cc +++ b/components/browser_sync/profile_sync_service.cc
@@ -225,8 +225,8 @@ base::Bind(&ProfileSyncService::CanEngineStart, base::Unretained(this)), base::Bind(&ProfileSyncService::StartUpSlowEngineComponents, weak_factory_.GetWeakPtr())); - std::unique_ptr<sync_sessions::LocalSessionEventRouter> router( - sync_client_->GetSyncSessionsClient()->GetLocalSessionEventRouter()); + sync_sessions::LocalSessionEventRouter* router = + sync_client_->GetSyncSessionsClient()->GetLocalSessionEventRouter(); local_device_ = sync_client_->GetSyncApiComponentFactory() ->CreateLocalDeviceInfoProvider(); sync_stopped_reporter_ = base::MakeUnique<syncer::SyncStoppedReporter>(
diff --git a/components/browsing_data/content/storage_partition_http_cache_data_remover.cc b/components/browsing_data/content/storage_partition_http_cache_data_remover.cc index 5eeff79..ffcbbea7 100644 --- a/components/browsing_data/content/storage_partition_http_cache_data_remover.cc +++ b/components/browsing_data/content/storage_partition_http_cache_data_remover.cc
@@ -83,8 +83,6 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); next_cache_state_ = CacheState::NONE; DCHECK_EQ(CacheState::NONE, next_cache_state_); - DCHECK(main_context_getter_.get()); - DCHECK(media_context_getter_.get()); next_cache_state_ = CacheState::CREATE_MAIN; DoClearCache(net::OK); @@ -97,8 +95,8 @@ } // The expected state sequence is CacheState::NONE --> CacheState::CREATE_MAIN -// --> CacheState::PROCESS_MAIN --> CacheState::CREATE_MEDIA --> -// CacheState::PROCESS_MEDIA --> CacheState::DONE, and any errors are ignored. +// --> CacheState::DELETE_MAIN --> CacheState::CREATE_MEDIA --> +// CacheState::DELETE_MEDIA --> CacheState::DONE, and any errors are ignored. void StoragePartitionHttpCacheDataRemover::DoClearCache(int rv) { DCHECK_NE(CacheState::NONE, next_cache_state_); @@ -111,6 +109,15 @@ (next_cache_state_ == CacheState::CREATE_MAIN) ? main_context_getter_.get() : media_context_getter_.get(); + + // Caches might not exist in tests. + if (!getter) { + next_cache_state_ = (next_cache_state_ == CacheState::CREATE_MAIN) + ? CacheState::CREATE_MEDIA + : CacheState::DONE; + break; + } + net::HttpCache* http_cache = getter->GetURLRequestContext() ->http_transaction_factory() ->GetCache();
diff --git a/components/client_update_protocol/ecdsa.cc b/components/client_update_protocol/ecdsa.cc index 7154793..38faa9ab 100644 --- a/components/client_update_protocol/ecdsa.cc +++ b/components/client_update_protocol/ecdsa.cc
@@ -170,10 +170,9 @@ // Initialize the signature verifier. crypto::SignatureVerifier verifier; - if (!verifier.VerifyInit( - crypto::SignatureVerifier::ECDSA_SHA256, &signature.front(), - static_cast<int>(signature.size()), &public_key_.front(), - static_cast<int>(public_key_.size()))) { + if (!verifier.VerifyInit(crypto::SignatureVerifier::ECDSA_SHA256, + &signature.front(), signature.size(), + &public_key_.front(), public_key_.size())) { DVLOG(1) << "Couldn't init SignatureVerifier."; return false; } @@ -184,7 +183,7 @@ // client assembled -- implying that either request body or response body // was modified, or a different nonce value was used. verifier.VerifyUpdate(&signed_message_hash.front(), - static_cast<int>(signed_message_hash.size())); + signed_message_hash.size()); return verifier.VerifyFinal(); }
diff --git a/components/components_strings.grd b/components/components_strings.grd index 16ca124..7f7f323a 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -291,6 +291,9 @@ <message name="IDS_ACCNAME_CANCEL" desc="The accessible name for the Cancel button."> Cancel </message> + <message name="IDS_ACCNAME_DONE" desc="The accessible name for the DONE button."> + Done + </message> <message name="IDS_ACCNAME_CLOSE" desc="The accessible name for the Close button."> Close </message>
diff --git a/components/constrained_window/BUILD.gn b/components/constrained_window/BUILD.gn index cc023082..a62c555 100644 --- a/components/constrained_window/BUILD.gn +++ b/components/constrained_window/BUILD.gn
@@ -12,6 +12,7 @@ "constrained_window_views_client.h", "native_web_contents_modal_dialog_manager_views.cc", "native_web_contents_modal_dialog_manager_views.h", + "native_web_contents_modal_dialog_manager_views_mac.h", "native_web_contents_modal_dialog_manager_views_mac.mm", ]
diff --git a/components/crx_file/crx_file.cc b/components/crx_file/crx_file.cc index 2445ef1e..c2b05f8 100644 --- a/components/crx_file/crx_file.cc +++ b/components/crx_file/crx_file.cc
@@ -160,8 +160,8 @@ crypto::SignatureVerifier verifier; if (!verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, - signature.data(), static_cast<int>(signature.size()), - key.data(), static_cast<int>(key.size()))) { + signature.data(), signature.size(), key.data(), + key.size())) { // Signature verification initialization failed. This is most likely // caused by a public key in the wrong format (should encode algorithm). return ValidateError::CRX_SIGNATURE_VERIFICATION_INITIALIZATION_FAILED; @@ -170,7 +170,7 @@ uint8_t buf[1 << 12] = {}; while ((len = ReadAndHash(buf, sizeof(buf[0]), arraysize(buf), file.get(), hash.get())) > 0) - verifier.VerifyUpdate(buf, static_cast<int>(len)); + verifier.VerifyUpdate(buf, len); if (!verifier.VerifyFinal()) return ValidateError::CRX_SIGNATURE_VERIFICATION_FAILED;
diff --git a/components/cryptauth/cryptauth_service.h b/components/cryptauth/cryptauth_service.h index 475fbaee..54506bc6 100644 --- a/components/cryptauth/cryptauth_service.h +++ b/components/cryptauth/cryptauth_service.h
@@ -10,8 +10,10 @@ namespace cryptauth { +class CryptAuthClientFactory; class CryptAuthDeviceManager; class CryptAuthEnrollmentManager; +class SecureMessageDelegate; // Service which provides access to various CryptAuth singletons. class CryptAuthService { @@ -19,6 +21,11 @@ virtual CryptAuthDeviceManager* GetCryptAuthDeviceManager() = 0; virtual CryptAuthEnrollmentManager* GetCryptAuthEnrollmentManager() = 0; virtual DeviceClassifier GetDeviceClassifier() = 0; + virtual std::string GetAccountId() = 0; + virtual std::unique_ptr<SecureMessageDelegate> + CreateSecureMessageDelegate() = 0; + virtual std::unique_ptr<CryptAuthClientFactory> + CreateCryptAuthClientFactory() = 0; protected: CryptAuthService() {}
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h index 5d74bd2c..75af6f3 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h
@@ -74,8 +74,8 @@ // be called from there. class DataReductionProxySettings : public DataReductionProxyServiceObserver { public: - typedef base::Callback<bool(const std::string&, const std::string&)> - SyntheticFieldTrialRegistrationCallback; + using SyntheticFieldTrialRegistrationCallback = + base::Callback<bool(base::StringPiece, base::StringPiece)>; DataReductionProxySettings(); virtual ~DataReductionProxySettings();
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc index 0a54fbd5..36bc1ec 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc
@@ -140,10 +140,9 @@ test_context_->CreateDataReductionProxyService(settings_.get())); settings_->data_reduction_proxy_service()->SetIOData( test_context_->io_data()->GetWeakPtr()); - settings_->SetCallbackToRegisterSyntheticFieldTrial( - base::Bind(&DataReductionProxySettingsTestBase:: - SyntheticFieldTrialRegistrationCallback, - base::Unretained(this))); + settings_->SetCallbackToRegisterSyntheticFieldTrial(base::Bind( + &DataReductionProxySettingsTestBase::OnSyntheticFieldTrialRegistration, + base::Unretained(this))); test_context_->RunUntilIdle(); } @@ -154,4 +153,11 @@ synthetic_field_trials_["SyntheticDataReductionProxySetting"]); } +bool DataReductionProxySettingsTestBase::OnSyntheticFieldTrialRegistration( + base::StringPiece trial_name, + base::StringPiece group_name) { + synthetic_field_trials_[trial_name.as_string()] = group_name.as_string(); + return true; +} + } // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h index 987de63..6846173 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.h
@@ -8,8 +8,10 @@ #include <map> #include <memory> #include <string> +#include <utility> #include "base/message_loop/message_loop.h" +#include "base/strings/string_piece.h" #include "base/time/clock.h" #include "base/time/time.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" @@ -41,7 +43,6 @@ static void AddTestProxyToCommandLine(); DataReductionProxySettingsTestBase(); - DataReductionProxySettingsTestBase(bool promo_allowed); ~DataReductionProxySettingsTestBase() override; void AddProxyToCommandLine(); @@ -68,12 +69,10 @@ void InitWithStatisticsPrefs(); void InitDataReductionProxy(bool enabled_at_startup); void CheckDataReductionProxySyntheticTrial(bool enabled); - bool SyntheticFieldTrialRegistrationCallback(const std::string& trial_name, - const std::string& group_name) { - synthetic_field_trials_[trial_name] = group_name; - return true; - } + bool OnSyntheticFieldTrialRegistration(base::StringPiece trial_name, + base::StringPiece group_name); + protected: base::MessageLoopForIO message_loop_; std::unique_ptr<DataReductionProxyTestContext> test_context_; std::unique_ptr<DataReductionProxySettings> settings_;
diff --git a/components/doodle/doodle_fetcher_impl.cc b/components/doodle/doodle_fetcher_impl.cc index 05990c9..af98588 100644 --- a/components/doodle/doodle_fetcher_impl.cc +++ b/components/doodle/doodle_fetcher_impl.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" #include "base/time/time.h" #include "base/values.h" #include "components/data_use_measurement/core/data_use_user_data.h" @@ -24,7 +25,10 @@ const double kMaxTimeToLiveMS = 30.0 * 24 * 60 * 60 * 1000; // 30 days -const char kDoodleConfigPath[] = "/async/ddljson"; +// "/async/ddljson" is the base API path. "ntp:1" identifies this request as +// being for a New Tab page. The "graybg:" param specifies whether the doodle +// will be displayed on a gray background. +const char kDoodleConfigPathFormat[] = "/async/ddljson?async=ntp:1,graybg:%d"; std::string StripSafetyPreamble(const std::string& json) { // The response may start with )]}'. Ignore this. @@ -38,15 +42,22 @@ return json_sp.as_string(); } +GURL BuildDoodleURL(const GURL& base_url, bool gray_background) { + return base_url.Resolve( + base::StringPrintf(kDoodleConfigPathFormat, gray_background ? 1 : 0)); +} + } // namespace DoodleFetcherImpl::DoodleFetcherImpl( scoped_refptr<net::URLRequestContextGetter> download_context, GoogleURLTracker* google_url_tracker, - const ParseJSONCallback& json_parsing_callback) + const ParseJSONCallback& json_parsing_callback, + bool gray_background) : download_context_(download_context), - json_parsing_callback_(json_parsing_callback), google_url_tracker_(google_url_tracker), + json_parsing_callback_(json_parsing_callback), + gray_background_(gray_background), weak_ptr_factory_(this) { DCHECK(google_url_tracker_); } @@ -60,8 +71,9 @@ } DCHECK(!fetcher_.get()); callbacks_.push_back(std::move(callback)); - fetcher_ = URLFetcher::Create(GetGoogleBaseUrl().Resolve(kDoodleConfigPath), - URLFetcher::GET, this); + fetcher_ = + URLFetcher::Create(BuildDoodleURL(GetGoogleBaseUrl(), gray_background_), + URLFetcher::GET, this); fetcher_->SetRequestContext(download_context_.get()); fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES |
diff --git a/components/doodle/doodle_fetcher_impl.h b/components/doodle/doodle_fetcher_impl.h index d0d3861..463570c 100644 --- a/components/doodle/doodle_fetcher_impl.h +++ b/components/doodle/doodle_fetcher_impl.h
@@ -45,7 +45,8 @@ DoodleFetcherImpl( scoped_refptr<net::URLRequestContextGetter> download_context, GoogleURLTracker* google_url_tracker, - const ParseJSONCallback& json_parsing_callback); + const ParseJSONCallback& json_parsing_callback, + bool gray_background); ~DoodleFetcherImpl() override; // Fetches a doodle asynchronously. The |callback| is called with a @@ -79,8 +80,9 @@ // Parameters set from constructor. scoped_refptr<net::URLRequestContextGetter> const download_context_; - ParseJSONCallback json_parsing_callback_; GoogleURLTracker* google_url_tracker_; + ParseJSONCallback json_parsing_callback_; + const bool gray_background_; std::vector<FinishedCallback> callbacks_; std::unique_ptr<net::URLFetcher> fetcher_;
diff --git a/components/doodle/doodle_fetcher_impl_unittest.cc b/components/doodle/doodle_fetcher_impl_unittest.cc index 8835b101..b9908d4 100644 --- a/components/doodle/doodle_fetcher_impl_unittest.cc +++ b/components/doodle/doodle_fetcher_impl_unittest.cc
@@ -34,7 +34,8 @@ namespace { -const char kDoodleConfigPath[] = "/async/ddljson"; +const char kDoodleConfigPath[] = "/async/ddljson?async=ntp:1,graybg:1"; +const char kDoodleConfigPathNoGrayBg[] = "/async/ddljson?async=ntp:1,graybg:0"; // Required to instantiate a GoogleUrlTracker in UNIT_TEST_MODE. class GoogleURLTrackerClientStub : public GoogleURLTrackerClient { @@ -67,15 +68,16 @@ } // namespace -class DoodleFetcherImplTest : public testing::Test { +class DoodleFetcherImplTestBase : public testing::Test { public: - DoodleFetcherImplTest() + DoodleFetcherImplTestBase(bool gray_background) : google_url_tracker_(base::MakeUnique<GoogleURLTrackerClientStub>(), GoogleURLTracker::UNIT_TEST_MODE), doodle_fetcher_( new net::TestURLRequestContextGetter(message_loop_.task_runner()), &google_url_tracker_, - base::Bind(ParseJson)) {} + base::Bind(ParseJson), + gray_background) {} void RespondWithData(const std::string& data) { net::TestURLFetcher* url_fetcher = GetRunningFetcher(); @@ -116,6 +118,12 @@ DoodleFetcherImpl doodle_fetcher_; }; +class DoodleFetcherImplTest : public DoodleFetcherImplTestBase { + public: + DoodleFetcherImplTest() + : DoodleFetcherImplTestBase(/*gray_background=*/true) {} +}; + TEST_F(DoodleFetcherImplTest, ReturnsFromFetchWithoutError) { base::MockCallback<DoodleFetcherImpl::FinishedCallback> callback; doodle_fetcher()->FetchDoodle(callback.Get()); @@ -423,7 +431,7 @@ // Google base URL is the default anyway. Find a way to set the base URL in // the tracker. EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), - Eq(GetGoogleBaseURL().Resolve(kDoodleConfigPath))); + Eq(Resolve(kDoodleConfigPath))); } TEST_F(DoodleFetcherImplTest, OverridesBaseUrlWithCommandLineArgument) { @@ -437,4 +445,18 @@ Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath))); } +class DoodleFetcherImplNoGrayBgTest : public DoodleFetcherImplTestBase { + public: + DoodleFetcherImplNoGrayBgTest() + : DoodleFetcherImplTestBase(/*gray_background=*/false) {} +}; + +TEST_F(DoodleFetcherImplNoGrayBgTest, PassesNoGrayBgParam) { + base::MockCallback<DoodleFetcherImpl::FinishedCallback> callback; + doodle_fetcher()->FetchDoodle(callback.Get()); + + EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(), + Eq(Resolve(kDoodleConfigPathNoGrayBg))); +} + } // namespace doodle
diff --git a/components/exo/pointer.cc b/components/exo/pointer.cc index 61442ed..a1778eb 100644 --- a/components/exo/pointer.cc +++ b/components/exo/pointer.cc
@@ -140,9 +140,6 @@ void Pointer::OnMouseEvent(ui::MouseEvent* event) { Surface* target = GetEffectiveTargetForEvent(event); - if (event->flags() & ui::EF_TOUCH_ACCESSIBILITY) - return; - // If target is different than the current pointer focus then we need to // generate enter and leave events. if (target != focus_) {
diff --git a/components/history/core/browser/typed_url_sync_metadata_database.cc b/components/history/core/browser/typed_url_sync_metadata_database.cc index 5cecf50d..6cc6d157 100644 --- a/components/history/core/browser/typed_url_sync_metadata_database.cc +++ b/components/history/core/browser/typed_url_sync_metadata_database.cc
@@ -4,6 +4,7 @@ #include "components/history/core/browser/typed_url_sync_metadata_database.h" +#include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "sql/statement.h" @@ -31,16 +32,8 @@ bool TypedURLSyncMetadataDatabase::GetAllSyncMetadata( syncer::MetadataBatch* metadata_batch) { - syncer::EntityMetadataMap metadata_records_map; - - // TODO(gangwu): crbug.com/701670 remove metadata_records_map to reduce memory - // usage and time. - if (GetAllSyncEntityMetadata(&metadata_records_map)) { - for (const auto& storage_key_to_metadata : metadata_records_map) { - metadata_batch->AddMetadata(storage_key_to_metadata.first, - storage_key_to_metadata.second); - } - } else { + DCHECK(metadata_batch); + if (!GetAllSyncEntityMetadata(metadata_batch)) { return false; } @@ -109,17 +102,20 @@ } bool TypedURLSyncMetadataDatabase::GetAllSyncEntityMetadata( - syncer::EntityMetadataMap* metadata_records) { + syncer::MetadataBatch* metadata_batch) { + DCHECK(metadata_batch); sql::Statement s(GetDB().GetUniqueStatement( "SELECT storage_key, value FROM typed_url_sync_metadata")); while (s.Step()) { std::string storage_key = base::Int64ToString(s.ColumnInt64(0)); std::string serialized_metadata = s.ColumnString(1); - sync_pb::EntityMetadata metadata_record; - if (metadata_record.ParseFromString(serialized_metadata)) { - metadata_records->insert(std::make_pair(storage_key, metadata_record)); + sync_pb::EntityMetadata entity_metadata; + if (entity_metadata.ParseFromString(serialized_metadata)) { + metadata_batch->AddMetadata(storage_key, entity_metadata); } else { + DLOG(WARNING) << "Failed to deserialize TYPED_URLS model type " + "sync_pb::EntityMetadata."; return false; } }
diff --git a/components/history/core/browser/typed_url_sync_metadata_database.h b/components/history/core/browser/typed_url_sync_metadata_database.h index b7321f3..0b68753 100644 --- a/components/history/core/browser/typed_url_sync_metadata_database.h +++ b/components/history/core/browser/typed_url_sync_metadata_database.h
@@ -61,7 +61,7 @@ private: // Read all sync_pb::EntityMetadata for typed URL and fill // |metadata_records| with it. - bool GetAllSyncEntityMetadata(syncer::EntityMetadataMap* metadata_records); + bool GetAllSyncEntityMetadata(syncer::MetadataBatch* metadata_batch); // Read sync_pb::ModelTypeState for typed URL and fill |state| with it. bool GetModelTypeState(sync_pb::ModelTypeState* state);
diff --git a/components/metrics/metrics_service_accessor.cc b/components/metrics/metrics_service_accessor.cc index 786895b..29b67bd9 100644 --- a/components/metrics/metrics_service_accessor.cc +++ b/components/metrics/metrics_service_accessor.cc
@@ -32,8 +32,8 @@ // static bool MetricsServiceAccessor::RegisterSyntheticFieldTrial( MetricsService* metrics_service, - const std::string& trial_name, - const std::string& group_name) { + base::StringPiece trial_name, + base::StringPiece group_name) { return RegisterSyntheticFieldTrialWithNameAndGroupHash( metrics_service, HashName(trial_name), HashName(group_name)); } @@ -41,7 +41,7 @@ // static bool MetricsServiceAccessor::RegisterSyntheticMultiGroupFieldTrial( MetricsService* metrics_service, - const std::string& trial_name, + base::StringPiece trial_name, const std::vector<uint32_t>& group_name_hashes) { if (!metrics_service) return false; @@ -55,7 +55,7 @@ bool MetricsServiceAccessor::RegisterSyntheticFieldTrialWithNameHash( MetricsService* metrics_service, uint32_t trial_name_hash, - const std::string& group_name) { + base::StringPiece group_name) { return RegisterSyntheticFieldTrialWithNameAndGroupHash( metrics_service, trial_name_hash, HashName(group_name)); }
diff --git a/components/metrics/metrics_service_accessor.h b/components/metrics/metrics_service_accessor.h index c4b5e62..7e1a107 100644 --- a/components/metrics/metrics_service_accessor.h +++ b/components/metrics/metrics_service_accessor.h
@@ -6,10 +6,10 @@ #define COMPONENTS_METRICS_METRICS_SERVICE_ACCESSOR_H_ #include <stdint.h> -#include <string> #include <vector> #include "base/macros.h" +#include "base/strings/string_piece.h" class PrefService; @@ -38,8 +38,8 @@ // See the comment on MetricsService::RegisterSyntheticFieldTrial() for // details. static bool RegisterSyntheticFieldTrial(MetricsService* metrics_service, - const std::string& trial_name, - const std::string& group_name); + base::StringPiece trial_name, + base::StringPiece group_name); // Registers a field trial name and set of groups with |metrics_service| (if // not null), to be used to annotate a UMA report with a particular @@ -48,7 +48,7 @@ // for details. static bool RegisterSyntheticMultiGroupFieldTrial( MetricsService* metrics_service, - const std::string& trial_name, + base::StringPiece trial_name, const std::vector<uint32_t>& group_name_hashes); // Same as RegisterSyntheticFieldTrial above, but takes in the trial name as a @@ -56,7 +56,7 @@ static bool RegisterSyntheticFieldTrialWithNameHash( MetricsService* metrics_service, uint32_t trial_name_hash, - const std::string& group_name); + base::StringPiece group_name); // Same as RegisterSyntheticFieldTrial above, but takes in the trial and group // names as hashes rather than computing those hashes from the strings.
diff --git a/components/nacl/broker/BUILD.gn b/components/nacl/broker/BUILD.gn index 252ab4da..bf0bf3a4 100644 --- a/components/nacl/broker/BUILD.gn +++ b/components/nacl/broker/BUILD.gn
@@ -166,6 +166,7 @@ "//components/flags_ui:switches", "//components/policy:generated", "//content/public/common:static_switches", + "//gpu/config:crash_keys", "//ipc", ] }
diff --git a/components/nacl/browser/BUILD.gn b/components/nacl/browser/BUILD.gn index 5307b79..a0b01ee 100644 --- a/components/nacl/browser/BUILD.gn +++ b/components/nacl/browser/BUILD.gn
@@ -80,6 +80,7 @@ "pnacl_host_unittest.cc", "pnacl_translation_cache_unittest.cc", "test_nacl_browser_delegate.cc", + "test_nacl_browser_delegate.h", ] deps = [
diff --git a/components/nacl/loader/sandbox_linux/BUILD.gn b/components/nacl/loader/sandbox_linux/BUILD.gn index 8f61844..96dc1dbd 100644 --- a/components/nacl/loader/sandbox_linux/BUILD.gn +++ b/components/nacl/loader/sandbox_linux/BUILD.gn
@@ -11,6 +11,7 @@ source_set("sandbox_linux") { sources = [ "nacl_bpf_sandbox_linux.cc", + "nacl_bpf_sandbox_linux.h", "nacl_sandbox_linux.cc", ]
diff --git a/components/nacl/renderer/plugin/BUILD.gn b/components/nacl/renderer/plugin/BUILD.gn index a002595..46d654a0 100644 --- a/components/nacl/renderer/plugin/BUILD.gn +++ b/components/nacl/renderer/plugin/BUILD.gn
@@ -5,13 +5,20 @@ static_library("nacl_trusted_plugin") { sources = [ "module_ppapi.cc", + "module_ppapi.h", "nacl_subprocess.cc", + "nacl_subprocess.h", "plugin.cc", "pnacl_coordinator.cc", + "pnacl_coordinator.h", "pnacl_resources.cc", + "pnacl_resources.h", "pnacl_translate_thread.cc", + "pnacl_translate_thread.h", "ppapi_entrypoints.cc", + "ppapi_entrypoints.h", "service_runtime.cc", + "service_runtime.h", ] deps = [
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css index f83710b..4649cd82 100644 --- a/components/neterror/resources/neterror.css +++ b/components/neterror/resources/neterror.css
@@ -397,6 +397,7 @@ } .offline .runner-container { + direction: ltr; height: 150px; max-width: 600px; overflow: hidden;
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js index 79ffa5c..ed3582f 100644 --- a/components/neterror/resources/offline.js +++ b/components/neterror/resources/offline.js
@@ -20,7 +20,6 @@ this.outerContainerEl = document.querySelector(outerContainerId); this.containerEl = null; this.snackbarEl = null; - this.detailsButton = this.outerContainerEl.querySelector('#details-button'); this.config = opt_config || Runner.config; @@ -661,9 +660,11 @@ e.preventDefault(); } - if (e.target != this.detailsButton) { - if (!this.crashed && (Runner.keycodes.JUMP[e.keyCode] || - e.type == Runner.events.TOUCHSTART)) { + if (!this.crashed && !this.paused) { + if (Runner.keycodes.JUMP[e.keyCode] || + e.type == Runner.events.TOUCHSTART) { + e.preventDefault(); + // Starting the game for the first time. if (!this.playing) { this.loadSounds(); this.playing = true; @@ -672,28 +673,24 @@ errorPageController.trackEasterEgg(); } } - // Play sound effect and jump on starting the game for the first time. + // Start jump. if (!this.tRex.jumping && !this.tRex.ducking) { this.playSound(this.soundFx.BUTTON_PRESS); this.tRex.startJump(this.currentSpeed); } + } else if (this.playing && Runner.keycodes.DUCK[e.keyCode]) { + e.preventDefault(); + if (this.tRex.jumping) { + // Speed drop, activated only when jump key is not pressed. + this.tRex.setSpeedDrop(); + } else if (!this.tRex.jumping && !this.tRex.ducking) { + // Duck. + this.tRex.setDuck(true); + } } - - if (this.crashed && e.type == Runner.events.TOUCHSTART && - e.currentTarget == this.containerEl) { - this.restart(); - } - } - - if (this.playing && !this.crashed && Runner.keycodes.DUCK[e.keyCode]) { - e.preventDefault(); - if (this.tRex.jumping) { - // Speed drop, activated only when jump key is not pressed. - this.tRex.setSpeedDrop(); - } else if (!this.tRex.jumping && !this.tRex.ducking) { - // Duck. - this.tRex.setDuck(true); - } + } else if (this.crashed && e.type == Runner.events.TOUCHSTART && + e.currentTarget == this.containerEl) { + this.restart(); } }, @@ -812,6 +809,7 @@ this.playCount++; this.runningTime = 0; this.playing = true; + this.paused = false; this.crashed = false; this.distanceRan = 0; this.setSpeed(this.config.SPEED);
diff --git a/components/ntp_snippets/ntp_snippets_constants.cc b/components/ntp_snippets/ntp_snippets_constants.cc index daaa0060..22bcb6c5 100644 --- a/components/ntp_snippets/ntp_snippets_constants.cc +++ b/components/ntp_snippets/ntp_snippets_constants.cc
@@ -12,8 +12,6 @@ const base::FilePath::CharType kDatabaseFolder[] = FILE_PATH_LITERAL("NTPSnippets"); -const char kChromeReaderServer[] = - "https://chromereader-pa.googleapis.com/v1/fetch"; const char kContentSuggestionsServer[] = "https://chromecontentsuggestions-pa.googleapis.com/v1/suggestions/fetch"; const char kContentSuggestionsStagingServer[] =
diff --git a/components/ntp_snippets/ntp_snippets_constants.h b/components/ntp_snippets/ntp_snippets_constants.h index 5f805d11..2c17eb05 100644 --- a/components/ntp_snippets/ntp_snippets_constants.h +++ b/components/ntp_snippets/ntp_snippets_constants.h
@@ -18,7 +18,6 @@ extern const base::FilePath::CharType kDatabaseFolder[]; // Server endpoints for fetching snippets. -extern const char kChromeReaderServer[]; // old endpoint extern const char kContentSuggestionsServer[]; // used on stable/beta extern const char kContentSuggestionsStagingServer[]; // used on dev/canary extern const char kContentSuggestionsAlphaServer[]; // for testing
diff --git a/components/ntp_snippets/remote/json_request.cc b/components/ntp_snippets/remote/json_request.cc index 3f312599..b9e47d1 100644 --- a/components/ntp_snippets/remote/json_request.cc +++ b/components/ntp_snippets/remote/json_request.cc
@@ -218,9 +218,7 @@ /*error_details=*/base::StringPrintf(" (error %s)", error.c_str())); } -JsonRequest::Builder::Builder() - : fetch_api_(CHROME_READER_API), - language_model_(nullptr) {} +JsonRequest::Builder::Builder() : language_model_(nullptr) {} JsonRequest::Builder::Builder(JsonRequest::Builder&&) = default; JsonRequest::Builder::~Builder() = default; @@ -250,11 +248,6 @@ return *this; } -JsonRequest::Builder& JsonRequest::Builder::SetFetchAPI(FetchAPI fetch_api) { - fetch_api_ = fetch_api; - return *this; -} - JsonRequest::Builder& JsonRequest::Builder::SetLanguageModel( const translate::LanguageModel* language_model) { language_model_ = language_model; @@ -317,83 +310,42 @@ std::string JsonRequest::Builder::BuildBody() const { auto request = base::MakeUnique<base::DictionaryValue>(); std::string user_locale = PosixLocaleFromBCP47Language(params_.language_code); - switch (fetch_api_) { - case CHROME_READER_API: { - auto content_restricts = base::MakeUnique<base::ListValue>(); - for (const auto* metadata : {"TITLE", "SNIPPET", "THUMBNAIL"}) { - auto entry = base::MakeUnique<base::DictionaryValue>(); - entry->SetString("type", "METADATA"); - entry->SetString("value", metadata); - content_restricts->Append(std::move(entry)); - } + if (!user_locale.empty()) { + request->SetString("uiLanguage", user_locale); + } - auto local_scoring_params = base::MakeUnique<base::DictionaryValue>(); - local_scoring_params->Set("content_restricts", - std::move(content_restricts)); + request->SetString("priority", params_.interactive_request + ? "USER_ACTION" + : "BACKGROUND_PREFETCH"); - auto global_scoring_params = base::MakeUnique<base::DictionaryValue>(); - global_scoring_params->SetInteger("num_to_return", - params_.count_to_fetch); - global_scoring_params->SetInteger("sort_type", 1); - - auto advanced = base::MakeUnique<base::DictionaryValue>(); - advanced->Set("local_scoring_params", std::move(local_scoring_params)); - advanced->Set("global_scoring_params", std::move(global_scoring_params)); - - request->SetString("response_detail_level", "STANDARD"); - request->Set("advanced_options", std::move(advanced)); - if (!obfuscated_gaia_id_.empty()) { - request->SetString("obfuscated_gaia_id", obfuscated_gaia_id_); - } - if (!user_locale.empty()) { - request->SetString("user_locale", user_locale); - } - break; - } - - case CHROME_CONTENT_SUGGESTIONS_API: { - if (!user_locale.empty()) { - request->SetString("uiLanguage", user_locale); - } - - request->SetString("priority", params_.interactive_request - ? "USER_ACTION" - : "BACKGROUND_PREFETCH"); - - auto excluded = base::MakeUnique<base::ListValue>(); - for (const auto& id : params_.excluded_ids) { - excluded->AppendString(id); - if (excluded->GetSize() >= kMaxExcludedIds) { - break; - } - } - request->Set("excludedSuggestionIds", std::move(excluded)); - - if (!user_class_.empty()) { - request->SetString("userActivenessClass", user_class_); - } - - translate::LanguageModel::LanguageInfo ui_language; - translate::LanguageModel::LanguageInfo other_top_language; - PrepareLanguages(&ui_language, &other_top_language); - - if (ui_language.frequency == 0 && other_top_language.frequency == 0) { - break; - } - - auto language_list = base::MakeUnique<base::ListValue>(); - if (ui_language.frequency > 0) { - AppendLanguageInfoToList(language_list.get(), ui_language); - } - if (other_top_language.frequency > 0) { - AppendLanguageInfoToList(language_list.get(), other_top_language); - } - request->Set("topLanguages", std::move(language_list)); - - // TODO(sfiera): Support count_to_fetch. + auto excluded = base::MakeUnique<base::ListValue>(); + for (const auto& id : params_.excluded_ids) { + excluded->AppendString(id); + if (excluded->GetSize() >= kMaxExcludedIds) { break; } } + request->Set("excludedSuggestionIds", std::move(excluded)); + + if (!user_class_.empty()) { + request->SetString("userActivenessClass", user_class_); + } + + translate::LanguageModel::LanguageInfo ui_language; + translate::LanguageModel::LanguageInfo other_top_language; + PrepareLanguages(&ui_language, &other_top_language); + if (ui_language.frequency != 0 || other_top_language.frequency != 0) { + auto language_list = base::MakeUnique<base::ListValue>(); + if (ui_language.frequency > 0) { + AppendLanguageInfoToList(language_list.get(), ui_language); + } + if (other_top_language.frequency > 0) { + AppendLanguageInfoToList(language_list.get(), other_top_language); + } + request->Set("topLanguages", std::move(language_list)); + } + + // TODO(sfiera): Support count_to_fetch. std::string request_json; bool success = base::JSONWriter::WriteWithOptions(
diff --git a/components/ntp_snippets/remote/json_request.h b/components/ntp_snippets/remote/json_request.h index 571268f..849df611 100644 --- a/components/ntp_snippets/remote/json_request.h +++ b/components/ntp_snippets/remote/json_request.h
@@ -24,8 +24,6 @@ class Clock; } // namespace base -class FetchAPI; - namespace ntp_snippets { class UserClassifier; @@ -48,11 +46,6 @@ RESULT_MAX = 10 }; -enum FetchAPI { - CHROME_READER_API, - CHROME_CONTENT_SUGGESTIONS_API, -}; - // A single request to query remote suggestions. On success, the suggestions are // returned in parsed JSON form (base::Value). class JsonRequest : public net::URLFetcherDelegate { @@ -77,7 +70,6 @@ Builder& SetAuthentication(const std::string& account_id, const std::string& auth_header); Builder& SetCreationTime(base::TimeTicks creation_time); - Builder& SetFetchAPI(FetchAPI fetch_api); // The language_model borrowed from the fetcher needs to stay alive until // the request body is built. Builder& SetLanguageModel(const translate::LanguageModel* language_model); @@ -118,7 +110,6 @@ // Only required, if the request needs to be sent. std::string auth_header_; base::Clock* clock_; - FetchAPI fetch_api_; RequestParams params_; ParseJSONCallback parse_json_callback_; GURL url_;
diff --git a/components/ntp_snippets/remote/json_request_unittest.cc b/components/ntp_snippets/remote/json_request_unittest.cc index 912042f..9284219 100644 --- a/components/ntp_snippets/remote/json_request_unittest.cc +++ b/components/ntp_snippets/remote/json_request_unittest.cc
@@ -112,10 +112,8 @@ params.interactive_request = false; builder.SetParams(params) .SetUrl(GURL("http://valid-url.test")) - .SetUrl(GURL("http://valid-url.test")) .SetAuthentication("0BFUSGAIA", "headerstuff") .SetUserClassForTesting("ACTIVE_NTP_USER") - .SetFetchAPI(FetchAPI::CHROME_READER_API) .Build(); EXPECT_THAT(builder.PreviewRequestHeadersForTesting(), @@ -124,36 +122,6 @@ "\r\n")); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{" - " \"response_detail_level\": \"STANDARD\"," - " \"obfuscated_gaia_id\": \"0BFUSGAIA\"," - " \"advanced_options\": {" - " \"local_scoring_params\": {" - " \"content_restricts\": [" - " {" - " \"type\": \"METADATA\"," - " \"value\": \"TITLE\"" - " }," - " {" - " \"type\": \"METADATA\"," - " \"value\": \"SNIPPET\"" - " }," - " {" - " \"type\": \"METADATA\"," - " \"value\": \"THUMBNAIL\"" - " }" - " ]" - " }," - " \"global_scoring_params\": {" - " \"num_to_return\": 25," - " \"sort_type\": 1" - " }" - " }" - "}")); - - builder.SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); - - EXPECT_THAT(builder.PreviewRequestBodyForTesting(), - EqualsJSON("{" " \"priority\": \"BACKGROUND_PREFETCH\"," " \"excludedSuggestionIds\": [" " \"1234567890\"" @@ -167,43 +135,13 @@ RequestParams params; params.interactive_request = true; params.count_to_fetch = 10; - builder.SetParams(params) - .SetUserClassForTesting("ACTIVE_NTP_USER") - .SetFetchAPI(FetchAPI::CHROME_READER_API); + builder.SetParams(params).SetUserClassForTesting("ACTIVE_NTP_USER"); EXPECT_THAT(builder.PreviewRequestHeadersForTesting(), StrEq("Content-Type: application/json; charset=UTF-8\r\n" "\r\n")); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{" - " \"response_detail_level\": \"STANDARD\"," - " \"advanced_options\": {" - " \"local_scoring_params\": {" - " \"content_restricts\": [" - " {" - " \"type\": \"METADATA\"," - " \"value\": \"TITLE\"" - " }," - " {" - " \"type\": \"METADATA\"," - " \"value\": \"SNIPPET\"" - " }," - " {" - " \"type\": \"METADATA\"," - " \"value\": \"THUMBNAIL\"" - " }" - " ]" - " }," - " \"global_scoring_params\": {" - " \"num_to_return\": 10," - " \"sort_type\": 1" - " }" - " }" - "}")); - - builder.SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); - EXPECT_THAT(builder.PreviewRequestBodyForTesting(), - EqualsJSON("{" " \"priority\": \"USER_ACTION\"," " \"excludedSuggestionIds\": []," " \"userActivenessClass\": \"ACTIVE_NTP_USER\"" @@ -217,9 +155,7 @@ for (int i = 0; i < 200; ++i) { params.excluded_ids.insert(base::StringPrintf("%03d", i)); } - builder.SetParams(params) - .SetUserClassForTesting("ACTIVE_NTP_USER") - .SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); + builder.SetParams(params).SetUserClassForTesting("ACTIVE_NTP_USER"); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{" @@ -256,8 +192,7 @@ JsonRequest::Builder builder; RequestParams params; params.interactive_request = false; - builder.SetParams(params) - .SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); + builder.SetParams(params); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{" @@ -273,9 +208,7 @@ RequestParams params; params.interactive_request = true; params.language_code = "en"; - builder.SetParams(params) - .SetLanguageModel(language_model.get()) - .SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); + builder.SetParams(params).SetLanguageModel(language_model.get()); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{" @@ -302,9 +235,7 @@ RequestParams params; params.interactive_request = true; params.language_code = "en"; - builder.SetParams(params) - .SetLanguageModel(language_model.get()) - .SetFetchAPI(FetchAPI::CHROME_CONTENT_SUGGESTIONS_API); + builder.SetParams(params).SetLanguageModel(language_model.get()); EXPECT_THAT(builder.PreviewRequestBodyForTesting(), EqualsJSON("{"
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc index 992f05c3..c7218ee 100644 --- a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc +++ b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
@@ -40,13 +40,10 @@ namespace ntp_snippets { using internal::JsonRequest; -using internal::FetchAPI; using internal::FetchResult; namespace { -const char kChromeReaderApiScope[] = - "https://www.googleapis.com/auth/webhistory"; const char kContentSuggestionsApiScope[] = "https://www.googleapis.com/auth/chrome-content-suggestions"; const char kSnippetsServerNonAuthorizedFormat[] = "%s?key=%s"; @@ -104,20 +101,6 @@ return Status(StatusCode::PERMANENT_ERROR, std::string()); } -bool UsesChromeContentSuggestionsAPI(const GURL& endpoint) { - if (endpoint == kChromeReaderServer) { - return false; - } - - if (endpoint != kContentSuggestionsServer && - endpoint != kContentSuggestionsStagingServer && - endpoint != kContentSuggestionsAlphaServer) { - LOG(WARNING) << "Unknown value for " << kContentSuggestionsBackend << ": " - << endpoint << "; assuming chromecontentsuggestions-style API"; - } - return true; -} - // Creates suggestions from dictionary values in |list| and adds them to // |suggestions|. Returns true on success, false if anything went wrong. // |remote_category_id| is only used if |content_suggestions_api| is true. @@ -267,9 +250,6 @@ language_model_(language_model), parse_json_callback_(parse_json_callback), fetch_url_(api_endpoint), - fetch_api_(UsesChromeContentSuggestionsAPI(fetch_url_) - ? FetchAPI::CHROME_CONTENT_SUGGESTIONS_API - : FetchAPI::CHROME_READER_API), api_key_(api_key), clock_(new base::DefaultClock()), user_classifier_(user_classifier) {} @@ -295,9 +275,7 @@ } JsonRequest::Builder builder; - builder.SetFetchAPI(fetch_api_) - .SetFetchAPI(fetch_api_) - .SetLanguageModel(language_model_) + builder.SetLanguageModel(language_model_) .SetParams(params) .SetParseJsonCallback(parse_json_callback_) .SetClock(clock_.get()) @@ -365,9 +343,7 @@ void RemoteSuggestionsFetcher::StartTokenRequest() { OAuth2TokenService::ScopeSet scopes; - scopes.insert(fetch_api_ == FetchAPI::CHROME_CONTENT_SUGGESTIONS_API - ? kContentSuggestionsApiScope - : kChromeReaderApiScope); + scopes.insert(kContentSuggestionsApiScope); oauth_request_ = token_service_->StartRequest( signin_manager_->GetAuthenticatedAccountId(), scopes, this); } @@ -457,8 +433,8 @@ error_details); return; } - FetchedCategoriesVector categories; + FetchedCategoriesVector categories; if (!JsonToSnippets(*result, &categories, fetch_time)) { LOG(WARNING) << "Received invalid snippets: " << last_fetch_json_; FetchFinished(OptionalFetchedCategories(), std::move(callback), @@ -502,70 +478,51 @@ return false; } - switch (fetch_api_) { - case FetchAPI::CHROME_READER_API: { - const int kUnusedRemoteCategoryId = -1; - categories->push_back(FetchedCategory( - Category::FromKnownCategory(KnownCategories::ARTICLES), - BuildArticleCategoryInfo(base::nullopt))); + const base::ListValue* categories_value = nullptr; + if (!top_dict->GetList("categories", &categories_value)) { + return false; + } - const base::ListValue* recos = nullptr; - return top_dict->GetList("recos", &recos) && - AddSuggestionsFromListValue( - /*content_suggestions_api=*/false, kUnusedRemoteCategoryId, - *recos, &categories->back().suggestions, fetch_time); + for (const auto& v : *categories_value) { + std::string utf8_title; + int remote_category_id = -1; + const base::DictionaryValue* category_value = nullptr; + if (!(v->GetAsDictionary(&category_value) && + category_value->GetString("localizedTitle", &utf8_title) && + category_value->GetInteger("id", &remote_category_id) && + (remote_category_id > 0))) { + return false; } - case FetchAPI::CHROME_CONTENT_SUGGESTIONS_API: { - const base::ListValue* categories_value = nullptr; - if (!top_dict->GetList("categories", &categories_value)) { + RemoteSuggestion::PtrVector suggestions; + const base::ListValue* suggestions_list = nullptr; + // Absence of a list of suggestions is treated as an empty list, which + // is permissible. + if (category_value->GetList("suggestions", &suggestions_list)) { + if (!AddSuggestionsFromListValue( + /*content_suggestions_api=*/true, remote_category_id, + *suggestions_list, &suggestions, fetch_time)) { return false; } - - for (const auto& v : *categories_value) { - std::string utf8_title; - int remote_category_id = -1; - const base::DictionaryValue* category_value = nullptr; - if (!(v->GetAsDictionary(&category_value) && - category_value->GetString("localizedTitle", &utf8_title) && - category_value->GetInteger("id", &remote_category_id) && - (remote_category_id > 0))) { - return false; - } - - RemoteSuggestion::PtrVector suggestions; - const base::ListValue* suggestions_list = nullptr; - // Absence of a list of suggestions is treated as an empty list, which - // is permissible. - if (category_value->GetList("suggestions", &suggestions_list)) { - if (!AddSuggestionsFromListValue( - /*content_suggestions_api=*/true, remote_category_id, - *suggestions_list, &suggestions, fetch_time)) { - return false; - } - } - Category category = Category::FromRemoteCategory(remote_category_id); - if (category.IsKnownCategory(KnownCategories::ARTICLES)) { - categories->push_back(FetchedCategory( - category, - BuildArticleCategoryInfo(base::UTF8ToUTF16(utf8_title)))); - } else { - // TODO(tschumann): Right now, the backend does not yet populate this - // field. Make it mandatory once the backends provide it. - bool allow_fetching_more_results = false; - category_value->GetBoolean("allowFetchingMoreResults", - &allow_fetching_more_results); - categories->push_back(FetchedCategory( - category, BuildRemoteCategoryInfo(base::UTF8ToUTF16(utf8_title), - allow_fetching_more_results))); - } - categories->back().suggestions = std::move(suggestions); - } - return true; } + Category category = Category::FromRemoteCategory(remote_category_id); + if (category.IsKnownCategory(KnownCategories::ARTICLES)) { + categories->push_back(FetchedCategory( + category, BuildArticleCategoryInfo(base::UTF8ToUTF16(utf8_title)))); + } else { + // TODO(tschumann): Right now, the backend does not yet populate this + // field. Make it mandatory once the backends provide it. + bool allow_fetching_more_results = false; + category_value->GetBoolean("allowFetchingMoreResults", + &allow_fetching_more_results); + categories->push_back(FetchedCategory( + category, BuildRemoteCategoryInfo(base::UTF8ToUTF16(utf8_title), + allow_fetching_more_results))); + } + categories->back().suggestions = std::move(suggestions); } - NOTREACHED(); - return false; + + return true; } } // namespace ntp_snippets
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher.h b/components/ntp_snippets/remote/remote_suggestions_fetcher.h index c2c9297..f767f1cf 100644 --- a/components/ntp_snippets/remote/remote_suggestions_fetcher.h +++ b/components/ntp_snippets/remote/remote_suggestions_fetcher.h
@@ -190,8 +190,6 @@ // API endpoint for fetching suggestions. const GURL fetch_url_; - // Which API to use - const internal::FetchAPI fetch_api_; // API key to use for non-authenticated requests. const std::string api_key_;
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc index 6ef68515..714c821 100644 --- a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc +++ b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
@@ -6,13 +6,11 @@ #include <deque> #include <map> -#include <set> #include <utility> #include <vector> #include "base/json/json_reader.h" #include "base/memory/ptr_util.h" -#include "base/strings/stringprintf.h" #include "base/test/histogram_tester.h" #include "base/test/test_mock_time_task_runner.h" #include "base/threading/thread_task_runner_handle.h" @@ -45,19 +43,12 @@ using testing::AllOf; using testing::ElementsAre; using testing::Eq; -using testing::Field; using testing::IsEmpty; using testing::Not; using testing::NotNull; -using testing::Pointee; -using testing::PrintToString; -using testing::Return; using testing::StartsWith; -using testing::WithArg; const char kAPIKey[] = "fakeAPIkey"; -const char kTestChromeReaderUrl[] = - "https://chromereader-pa.googleapis.com/v1/fetch?key=fakeAPIkey"; const char kTestChromeContentSuggestionsSignedOutUrl[] = "https://chromecontentsuggestions-pa.googleapis.com/v1/suggestions/" "fetch?key=fakeAPIkey"; @@ -87,6 +78,12 @@ return arg.IsSuccess(); } +MATCHER(IsEmptyCategoriesList, "is an empty list of categories") { + RemoteSuggestionsFetcher::OptionalFetchedCategories& fetched_categories = + *arg; + return fetched_categories && fetched_categories->empty(); +} + MATCHER(IsEmptyArticleList, "is an empty list of articles") { RemoteSuggestionsFetcher::OptionalFetchedCategories& fetched_categories = *arg; @@ -394,18 +391,6 @@ DISALLOW_COPY_AND_ASSIGN(RemoteSuggestionsFetcherTestBase); }; -class RemoteSuggestionsChromeReaderFetcherTest - : public RemoteSuggestionsFetcherTestBase { - public: - RemoteSuggestionsChromeReaderFetcherTest() - : RemoteSuggestionsFetcherTestBase(GURL(kTestChromeReaderUrl)) { - default_variation_params_["content_suggestions_backend"] = - kChromeReaderServer; - SetVariationParam("content_suggestions_backend", kChromeReaderServer); - ResetFetcher(); - } -}; - class RemoteSuggestionsSignedOutFetcherTest : public RemoteSuggestionsFetcherTestBase { public: @@ -425,7 +410,7 @@ GURL(kTestChromeContentSuggestionsSignedInUrl)) {} }; -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldNotFetchOnCreation) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldNotFetchOnCreation) { // The lack of registered baked in responses would cause any fetch to fail. FastForwardUntilNoTasksRemain(); EXPECT_THAT(histogram_tester().GetAllSamples( @@ -436,37 +421,6 @@ EXPECT_THAT(fetcher().last_status(), IsEmpty()); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldFetchSuccessfully) { - const std::string kJsonStr = - "{\"recos\": [{" - " \"contentInfo\": {" - " \"url\" : \"http://localhost/foobar\"," - " \"sourceCorpusInfo\" : [{" - " \"ampUrl\" : \"http://localhost/amp\"," - " \"corpusId\" : \"http://localhost/foobar\"," - " \"publisherData\": { \"sourceName\" : \"Foo News\" }" - " }]" - " }" - "}]}"; - SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, - net::URLRequestStatus::SUCCESS); - EXPECT_CALL(mock_callback(), - Run(IsSuccess(), - AllOf(IsSingleArticle("http://localhost/foobar"), - FirstCategoryHasInfo(IsCategoryInfoForArticles())))); - fetcher().FetchSnippets(test_params(), - ToSnippetsAvailableCallback(&mock_callback())); - FastForwardUntilNoTasksRemain(); - EXPECT_THAT(fetcher().last_status(), Eq("OK")); - EXPECT_THAT(fetcher().last_json(), Eq(kJsonStr)); - EXPECT_THAT(histogram_tester().GetAllSamples( - "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), - ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); - EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), - ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, - /*count=*/1))); -} - TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldFetchSuccessfully) { const std::string kJsonStr = "{\"categories\" : [{" @@ -819,12 +773,12 @@ IsEmpty()); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldFetchSuccessfullyEmptyList) { - const std::string kJsonStr = "{\"recos\": []}"; + const std::string kJsonStr = "{\"categories\": []}"; SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, net::URLRequestStatus::SUCCESS); - EXPECT_CALL(mock_callback(), Run(IsSuccess(), IsEmptyArticleList())); + EXPECT_CALL(mock_callback(), Run(IsSuccess(), IsEmptyCategoriesList())); fetcher().FetchSnippets(test_params(), ToSnippetsAvailableCallback(&mock_callback())); FastForwardUntilNoTasksRemain(); @@ -838,7 +792,7 @@ ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, RetryOnInteractiveRequests) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, RetryOnInteractiveRequests) { DelegateCallingTestURLFetcherFactory fetcher_factory; RequestParams params = test_params(); params.interactive_request = true; @@ -851,7 +805,7 @@ EXPECT_THAT(fetcher->GetMaxRetriesOn5xx(), Eq(2)); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, +TEST_F(RemoteSuggestionsSignedOutFetcherTest, RetriesConfigurableOnNonInteractiveRequests) { struct ExpectationForVariationParam { std::string param_value; @@ -881,7 +835,7 @@ } } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldReportUrlStatusError) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportUrlStatusError) { SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND, net::URLRequestStatus::FAILED); EXPECT_CALL(mock_callback(), Run(HasCode(StatusCode::TEMPORARY_ERROR), @@ -902,7 +856,7 @@ Not(IsEmpty())); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldReportHttpError) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportHttpError) { SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND, net::URLRequestStatus::SUCCESS); EXPECT_CALL(mock_callback(), Run(HasCode(StatusCode::TEMPORARY_ERROR), @@ -922,7 +876,7 @@ Not(IsEmpty())); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldReportJsonError) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportJsonError) { const std::string kInvalidJsonStr = "{ \"recos\": []"; SetFakeResponse(/*response_data=*/kInvalidJsonStr, net::HTTP_OK, net::URLRequestStatus::SUCCESS); @@ -946,7 +900,7 @@ /*count=*/1))); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportJsonErrorForEmptyResponse) { SetFakeResponse(/*response_data=*/std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS); @@ -965,7 +919,7 @@ ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, ShouldReportInvalidListError) { +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportInvalidListError) { const std::string kJsonStr = "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, @@ -989,7 +943,7 @@ // This test actually verifies that the test setup itself is sane, to prevent // hard-to-reproduce test failures. -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { InitFakeURLFetcherFactory(); EXPECT_CALL(mock_callback(), Run(HasCode(StatusCode::TEMPORARY_ERROR), @@ -1000,12 +954,12 @@ FastForwardUntilNoTasksRemain(); } -TEST_F(RemoteSuggestionsChromeReaderFetcherTest, - ShouldProcessConcurrentFetches) { - const std::string kJsonStr = "{ \"recos\": [] }"; +TEST_F(RemoteSuggestionsSignedOutFetcherTest, ShouldProcessConcurrentFetches) { + const std::string kJsonStr = "{ \"categories\": [] }"; SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, net::URLRequestStatus::SUCCESS); - EXPECT_CALL(mock_callback(), Run(IsSuccess(), IsEmptyArticleList())).Times(5); + EXPECT_CALL(mock_callback(), Run(IsSuccess(), IsEmptyCategoriesList())) + .Times(5); fetcher().FetchSnippets(test_params(), ToSnippetsAvailableCallback(&mock_callback())); // More calls to FetchSnippets() do not interrupt the previous.
diff --git a/components/ntp_tiles/BUILD.gn b/components/ntp_tiles/BUILD.gn index c1e0be7..2c48703 100644 --- a/components/ntp_tiles/BUILD.gn +++ b/components/ntp_tiles/BUILD.gn
@@ -33,6 +33,7 @@ "switches.h", "webui/ntp_tiles_internals_message_handler.cc", "webui/ntp_tiles_internals_message_handler.h", + "webui/ntp_tiles_internals_message_handler_client.cc", "webui/ntp_tiles_internals_message_handler_client.h", "webui/popular_sites_internals_message_handler.cc", "webui/popular_sites_internals_message_handler.h",
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc index 74be74c..f8480de 100644 --- a/components/ntp_tiles/icon_cacher_impl.cc +++ b/components/ntp_tiles/icon_cacher_impl.cc
@@ -6,10 +6,12 @@ #include <utility> +#include "base/memory/ptr_util.h" #include "components/favicon/core/favicon_service.h" #include "components/favicon/core/favicon_util.h" #include "components/favicon_base/favicon_types.h" #include "components/favicon_base/favicon_util.h" +#include "components/image_fetcher/core/image_decoder.h" #include "components/image_fetcher/core/image_fetcher.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/geometry/size.h" @@ -20,6 +22,8 @@ namespace { +constexpr int kDesiredFrameSize = 128; + favicon_base::IconType IconType(const PopularSites::Site& site) { return site.large_icon_url.is_valid() ? favicon_base::TOUCH_ICON : favicon_base::FAVICON; @@ -36,11 +40,13 @@ favicon::FaviconService* favicon_service, std::unique_ptr<image_fetcher::ImageFetcher> image_fetcher) : favicon_service_(favicon_service), - image_fetcher_(std::move(image_fetcher)) { + image_fetcher_(std::move(image_fetcher)), + weak_ptr_factory_(this) { image_fetcher_->SetDataUseServiceName( data_use_measurement::DataUseUserData::NTP_TILES); // For images with multiple frames, prefer one of size 128x128px. - image_fetcher_->SetDesiredImageFrameSize(gfx::Size(128, 128)); + image_fetcher_->SetDesiredImageFrameSize( + gfx::Size(kDesiredFrameSize, kDesiredFrameSize)); } IconCacherImpl::~IconCacherImpl() = default; @@ -68,18 +74,20 @@ if (!result.image.IsEmpty()) { return; } - if (ProvideDefaultIcon(site) && !preliminary_icon_available.is_null()) { - preliminary_icon_available.Run(); - } + + std::unique_ptr<CancelableImageCallback> preliminary_callback = + MaybeProvideDefaultIcon(site, preliminary_icon_available); image_fetcher_->StartOrQueueNetworkRequest( std::string(), IconURL(site), base::Bind(&IconCacherImpl::OnFaviconDownloaded, base::Unretained(this), - site, icon_available)); + site, base::Passed(std::move(preliminary_callback)), + icon_available)); } void IconCacherImpl::OnFaviconDownloaded( PopularSites::Site site, + std::unique_ptr<CancelableImageCallback> preliminary_callback, const base::Closure& icon_available, const std::string& id, const gfx::Image& fetched_image, @@ -88,25 +96,48 @@ return; } - SaveIconForSite(site, fetched_image); + // Avoid invoking callback about preliminary icon to be triggered. The best + // possible icon has already been downloaded. + if (preliminary_callback) { + preliminary_callback->Cancel(); + } + SaveAndNotifyIconForSite(site, icon_available, fetched_image); +} + +void IconCacherImpl::SaveAndNotifyIconForSite( + const PopularSites::Site& site, + const base::Closure& icon_available, + const gfx::Image& image) { + // Although |SetFaviconColorSpace| affects OSX only, copies of gfx::Images are + // just copies of the reference to the image and therefore cheap. + gfx::Image img(image); + favicon_base::SetFaviconColorSpace(&img); + + favicon_service_->SetFavicons(site.url, IconURL(site), IconType(site), + std::move(img)); + if (icon_available) { icon_available.Run(); } } -void IconCacherImpl::SaveIconForSite(const PopularSites::Site& site, - gfx::Image image) { - favicon_base::SetFaviconColorSpace(&image); - favicon_service_->SetFavicons(site.url, IconURL(site), IconType(site), image); -} - -bool IconCacherImpl::ProvideDefaultIcon(const PopularSites::Site& site) { +std::unique_ptr<IconCacherImpl::CancelableImageCallback> +IconCacherImpl::MaybeProvideDefaultIcon(const PopularSites::Site& site, + const base::Closure& icon_available) { if (site.default_icon_resource < 0) { - return false; + return std::unique_ptr<CancelableImageCallback>(); } - SaveIconForSite(site, ResourceBundle::GetSharedInstance().GetNativeImageNamed( - site.default_icon_resource)); - return true; + std::unique_ptr<CancelableImageCallback> preliminary_callback( + new CancelableImageCallback( + base::Bind(&IconCacherImpl::SaveAndNotifyIconForSite, + weak_ptr_factory_.GetWeakPtr(), site, icon_available))); + image_fetcher_->GetImageDecoder()->DecodeImage( + ResourceBundle::GetSharedInstance() + .GetRawDataResource(site.default_icon_resource) + .as_string(), + gfx::Size(kDesiredFrameSize, kDesiredFrameSize), + preliminary_callback->callback()); + return preliminary_callback; } } // namespace ntp_tiles
diff --git a/components/ntp_tiles/icon_cacher_impl.h b/components/ntp_tiles/icon_cacher_impl.h index 5cd1ee7..58ed735 100644 --- a/components/ntp_tiles/icon_cacher_impl.h +++ b/components/ntp_tiles/icon_cacher_impl.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback.h" +#include "base/cancelable_callback.h" #include "base/memory/weak_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "components/ntp_tiles/icon_cacher.h" @@ -44,25 +45,36 @@ const base::Closure& preliminary_icon_available) override; private: + using CancelableImageCallback = + base::CancelableCallback<void(const gfx::Image&)>; + void OnGetFaviconImageForPageURLFinished( PopularSites::Site site, const base::Closure& icon_available, const base::Closure& preliminary_icon_available, const favicon_base::FaviconImageResult& result); - void OnFaviconDownloaded(PopularSites::Site site, - const base::Closure& icon_available, - const std::string& id, - const gfx::Image& fetched_image, - const image_fetcher::RequestMetadata& metadata); + void OnFaviconDownloaded( + PopularSites::Site site, + std::unique_ptr<CancelableImageCallback> preliminary_callback, + const base::Closure& icon_available, + const std::string& id, + const gfx::Image& fetched_image, + const image_fetcher::RequestMetadata& metadata); - bool ProvideDefaultIcon(const PopularSites::Site& site); - void SaveIconForSite(const PopularSites::Site& site, const gfx::Image image); + std::unique_ptr<CancelableImageCallback> MaybeProvideDefaultIcon( + const PopularSites::Site& site, + const base::Closure& icon_available); + void SaveAndNotifyIconForSite(const PopularSites::Site& site, + const base::Closure& icon_available, + const gfx::Image& image); base::CancelableTaskTracker tracker_; favicon::FaviconService* const favicon_service_; std::unique_ptr<image_fetcher::ImageFetcher> const image_fetcher_; + base::WeakPtrFactory<IconCacherImpl> weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(IconCacherImpl); };
diff --git a/components/ntp_tiles/icon_cacher_impl_unittest.cc b/components/ntp_tiles/icon_cacher_impl_unittest.cc index d89eef8..7e2c98a 100644 --- a/components/ntp_tiles/icon_cacher_impl_unittest.cc +++ b/components/ntp_tiles/icon_cacher_impl_unittest.cc
@@ -19,6 +19,7 @@ #include "components/favicon/core/favicon_util.h" #include "components/history/core/browser/history_database_params.h" #include "components/history/core/browser/history_service.h" +#include "components/image_fetcher/core/image_decoder.h" #include "components/image_fetcher/core/image_fetcher.h" #include "components/image_fetcher/core/request_metadata.h" #include "testing/gmock/include/gmock/gmock.h" @@ -52,6 +53,14 @@ MOCK_METHOD0(GetImageDecoder, image_fetcher::ImageDecoder*()); }; +class MockImageDecoder : public image_fetcher::ImageDecoder { + public: + MOCK_METHOD3(DecodeImage, + void(const std::string& image_data, + const gfx::Size& desired_image_frame_size, + const image_fetcher::ImageDecodedCallback& callback)); +}; + // This class provides methods to inject an image resource where a real resource // would be necessary otherwise. All other methods have return values that allow // the normal implementation to proceed. @@ -91,6 +100,7 @@ GURL("http://url.google/favicon.ico"), GURL()), // thumbnail, unused image_fetcher_(new ::testing::StrictMock<MockImageFetcher>), + image_decoder_(new ::testing::StrictMock<MockImageDecoder>), favicon_service_(/*favicon_client=*/nullptr, &history_service_), task_runner_(new base::TestSimpleTaskRunner()) { CHECK(history_dir_.CreateUniqueTempDir()); @@ -168,6 +178,7 @@ base::MessageLoop message_loop_; PopularSites::Site site_; std::unique_ptr<MockImageFetcher> image_fetcher_; + std::unique_ptr<MockImageDecoder> image_decoder_; base::ScopedTempDir history_dir_; history::HistoryService history_service_; favicon::FaviconServiceImpl favicon_service_; @@ -181,6 +192,11 @@ base::Bind(arg2, arg0, gfx::Image(), image_fetcher::RequestMetadata())); } +ACTION_P2(DecodeSuccessfully, width, height) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(arg2, gfx::test::CreateImage(width, height))); +} + ACTION_P2(PassFetch, width, height) { base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(arg2, arg0, gfx::test::CreateImage(width, height), @@ -289,12 +305,15 @@ } TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) { - // We are not interested which delegate function actually handles the call to - // |GetNativeImageNamed| as long as we receive the right image. - ON_CALL(mock_resource_delegate_, GetNativeImageNamed(12345)) - .WillByDefault(Return(gfx::test::CreateImage(64, 64))); - ON_CALL(mock_resource_delegate_, GetImageNamed(12345)) - .WillByDefault(Return(gfx::test::CreateImage(64, 64))); + // The returned data string is not used by the mocked decoder. + ON_CALL(mock_resource_delegate_, GetRawDataResource(12345, _, _)) + .WillByDefault(Return("")); + // It's not important when the image_fetcher's decoder is used to decode the + // image but it must happen at some point. + EXPECT_CALL(*image_fetcher_, GetImageDecoder()) + .WillOnce(Return(image_decoder_.get())); + EXPECT_CALL(*image_decoder_, DecodeImage(_, gfx::Size(128, 128), _)) + .WillOnce(DecodeSuccessfully(64, 64)); base::MockCallback<base::Closure> preliminary_icon_available; base::MockCallback<base::Closure> icon_available; base::RunLoop default_loop; @@ -305,11 +324,14 @@ SetDataUseServiceName( data_use_measurement::DataUseUserData::NTP_TILES)); EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(gfx::Size(128, 128))); - EXPECT_CALL(preliminary_icon_available, Run()) - .WillOnce(Quit(&default_loop)); EXPECT_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, site_.large_icon_url, _)) .WillOnce(PassFetch(128, 128)); + + // Both callback are called async after the request but preliminary has to + // preceed icon_available. + EXPECT_CALL(preliminary_icon_available, Run()) + .WillOnce(Quit(&default_loop)); EXPECT_CALL(icon_available, Run()).WillOnce(Quit(&fetch_loop)); }
diff --git a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc index e362f77..135a89be 100644 --- a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc +++ b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
@@ -34,11 +34,6 @@ } // namespace -NTPTilesInternalsMessageHandlerClient::NTPTilesInternalsMessageHandlerClient() = - default; -NTPTilesInternalsMessageHandlerClient:: - ~NTPTilesInternalsMessageHandlerClient() = default; - NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler() : client_(nullptr), site_count_(8), weak_ptr_factory_(this) {}
diff --git a/components/offline_pages/core/background/offliner_policy.h b/components/offline_pages/core/background/offliner_policy.h index d828d4c6..b4fc28c 100644 --- a/components/offline_pages/core/background/offliner_policy.h +++ b/components/offline_pages/core/background/offliner_policy.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_OFFLINE_PAGES_CORE_BACKGROUND_OFFLINER_POLICY_H_ #define COMPONENTS_OFFLINE_PAGES_CORE_BACKGROUND_OFFLINER_POLICY_H_ +#include "base/sys_info.h" + namespace { // The max number of started tries is to guard against pages that make the // prerenderer crash. It should be greater than or equal to the max number of @@ -17,13 +19,22 @@ // By the time we get to a week, the user has forgotten asking for a page. const int kRequestExpirationTimeInSeconds = 60 * 60 * 24 * 7; -// Scheduled background processing time limits. +// Scheduled background processing time limits for doze mode, which requires +// Android version >= 6.0 (API level >= 23). Otherwise the scheduled background +// processing time should be the same as immediate loading (4 min 50 secs), it's +// capped by the Prerenderer's 5 minute timeout. const int kDozeModeBackgroundServiceWindowSeconds = 60 * 3; const int kDefaultBackgroundProcessingTimeBudgetSeconds = kDozeModeBackgroundServiceWindowSeconds - 10; const int kSinglePageTimeLimitWhenBackgroundScheduledSeconds = kDozeModeBackgroundServiceWindowSeconds - 10; +const int kNonDozeModeBackgroundServiceWindowSeconds = 60 * 5; +const int kNonDozeDefaultBackgroundProcessingTimeBudgetSeconds = + kNonDozeModeBackgroundServiceWindowSeconds - 10; +const int kNonDozeSinglePageTimeLimitWhenBackgroundScheduledSeconds = + kNonDozeModeBackgroundServiceWindowSeconds - 10; + // Immediate processing time limits. Note: experiments on GIN-2g-poor show many // page requests took 3 or 4 attempts in background scheduled mode with timeout // of 2 minutes. So for immediate processing mode, give page requests just under @@ -45,24 +56,29 @@ prefer_earlier_requests_(true), retry_count_is_more_important_than_recency_(true), max_started_tries_(kMaxStartedTries), - max_completed_tries_(kMaxCompletedTries), - background_scheduled_processing_time_budget_( - kDefaultBackgroundProcessingTimeBudgetSeconds) {} + max_completed_tries_(kMaxCompletedTries) { + int32_t os_major_version = 0; + int32_t os_minor_version = 0; + int32_t os_bugfix_version = 0; + base::SysInfo::OperatingSystemVersionNumbers( + &os_major_version, &os_minor_version, &os_bugfix_version); + if (os_major_version < 6) + has_doze_mode_ = false; + else + has_doze_mode_ = true; + } // Constructor for unit tests. OfflinerPolicy(bool prefer_untried, bool prefer_earlier, bool prefer_retry_count, int max_started_tries, - int max_completed_tries, - int background_processing_time_budget) + int max_completed_tries) : prefer_untried_requests_(prefer_untried), prefer_earlier_requests_(prefer_earlier), retry_count_is_more_important_than_recency_(prefer_retry_count), max_started_tries_(max_started_tries), - max_completed_tries_(max_completed_tries), - background_scheduled_processing_time_budget_( - background_processing_time_budget) {} + max_completed_tries_(max_completed_tries) {} // TODO(petewil): Numbers here are chosen arbitrarily, do the proper studies // to get good policy numbers. Eventually this should get data from a finch @@ -109,7 +125,9 @@ // TODO(dougarnett): Consider parameterizing these time limit/budget // calls with processing mode. int GetProcessingTimeBudgetWhenBackgroundScheduledInSeconds() const { - return background_scheduled_processing_time_budget_; + if (has_doze_mode_) + return kDefaultBackgroundProcessingTimeBudgetSeconds; + return kNonDozeDefaultBackgroundProcessingTimeBudgetSeconds; } // How many seconds to keep trying new pages for, before we give up, when @@ -121,7 +139,9 @@ // How long do we allow a page to load before giving up on it when // background loading was scheduled. int GetSinglePageTimeLimitWhenBackgroundScheduledInSeconds() const { - return kSinglePageTimeLimitWhenBackgroundScheduledSeconds; + if (has_doze_mode_) + return kSinglePageTimeLimitWhenBackgroundScheduledSeconds; + return kNonDozeSinglePageTimeLimitWhenBackgroundScheduledSeconds; } // How long do we allow a page to load before giving up on it when @@ -139,9 +159,9 @@ bool prefer_untried_requests_; bool prefer_earlier_requests_; bool retry_count_is_more_important_than_recency_; + bool has_doze_mode_; int max_started_tries_; int max_completed_tries_; - int background_scheduled_processing_time_budget_; }; } // namespace offline_pages
diff --git a/components/offline_pages/core/background/pick_request_task_unittest.cc b/components/offline_pages/core/background/pick_request_task_unittest.cc index 7f686246..2cae77b 100644 --- a/components/offline_pages/core/background/pick_request_task_unittest.cc +++ b/components/offline_pages/core/background/pick_request_task_unittest.cc
@@ -42,7 +42,6 @@ const bool kPreferUntried = false; const bool kPreferEarlier = true; const bool kPreferRetryCount = true; -const int kBackgroundProcessingTimeBudgetSeconds = 170; // Default request const SavePageRequest kEmptyRequest(0UL, @@ -245,9 +244,9 @@ TEST_F(PickRequestTaskTest, ChooseRequestWithHigherRetryCount) { // Set up policy to prefer higher retry count. - policy_.reset(new OfflinerPolicy( - kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, + kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries + 1)); MakePickRequestTask(); base::Time creation_time = base::Time::Now(); @@ -290,9 +289,9 @@ TEST_F(PickRequestTaskTest, ChooseEarlierRequest) { // We need a custom policy object prefering recency to retry count. - policy_.reset(new OfflinerPolicy( - kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, + !kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries)); MakePickRequestTask(); base::Time creation_time1 = @@ -316,9 +315,9 @@ TEST_F(PickRequestTaskTest, ChooseSameTimeRequestWithHigherRetryCount) { // We need a custom policy object preferring recency to retry count. - policy_.reset(new OfflinerPolicy( - kPreferUntried, kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, + !kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries + 1)); MakePickRequestTask(); base::Time creation_time = base::Time::Now(); @@ -340,9 +339,9 @@ TEST_F(PickRequestTaskTest, ChooseRequestWithLowerRetryCount) { // We need a custom policy object preferring lower retry count. - policy_.reset(new OfflinerPolicy( - !kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(!kPreferUntried, kPreferEarlier, + kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries + 1)); MakePickRequestTask(); base::Time creation_time = base::Time::Now(); @@ -364,9 +363,9 @@ TEST_F(PickRequestTaskTest, ChooseLaterRequest) { // We need a custom policy preferring recency over retry, and later requests. - policy_.reset(new OfflinerPolicy( - kPreferUntried, !kPreferEarlier, !kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(kPreferUntried, !kPreferEarlier, + !kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries)); MakePickRequestTask(); base::Time creation_time1 = @@ -461,9 +460,9 @@ } TEST_F(PickRequestTaskTest, ChooseRequestThatIsNotDisabled) { - policy_.reset(new OfflinerPolicy( - kPreferUntried, kPreferEarlier, kPreferRetryCount, kMaxStartedTries, - kMaxCompletedTries + 1, kBackgroundProcessingTimeBudgetSeconds)); + policy_.reset(new OfflinerPolicy(kPreferUntried, kPreferEarlier, + kPreferRetryCount, kMaxStartedTries, + kMaxCompletedTries + 1)); // put request 2 on disabled list, ensure request1 picked instead, // even though policy would prefer 2.
diff --git a/components/offline_pages/core/background/request_coordinator_unittest.cc b/components/offline_pages/core/background/request_coordinator_unittest.cc index bf36ebc9..5e1b1dc 100644 --- a/components/offline_pages/core/background/request_coordinator_unittest.cc +++ b/components/offline_pages/core/background/request_coordinator_unittest.cc
@@ -46,7 +46,6 @@ const ClientId kClientId2(kClientNamespace, kId2); const int kRequestId1(1); const int kRequestId2(2); -const long kTestTimeBudgetSeconds = 200; const int kBatteryPercentageHigh = 75; const int kMaxCompletedTries = 3; const bool kPowerRequired = true; @@ -1229,7 +1228,11 @@ // Advance the mock clock far enough to exceed our time budget. // The first request will time out, and because we are over time budget, // the second request will not be started. - AdvanceClockBy(base::TimeDelta::FromSeconds(kTestTimeBudgetSeconds)); + int over_time_budget_seconds = + OfflinerPolicy() + .GetProcessingTimeBudgetWhenBackgroundScheduledInSeconds() + + 10; + AdvanceClockBy(base::TimeDelta::FromSeconds(over_time_budget_seconds)); PumpLoop(); // TryNextRequest should decide that there is no more work to be done,
diff --git a/components/policy/core/common/remote_commands/remote_command_job.cc b/components/policy/core/common/remote_commands/remote_command_job.cc index bf43a59..b0675ad 100644 --- a/components/policy/core/common/remote_commands/remote_command_job.cc +++ b/components/policy/core/common/remote_commands/remote_command_job.cc
@@ -80,6 +80,11 @@ << " initialized."; break; } + case em::RemoteCommand_Type_DEVICE_FETCH_STATUS: { + SYSLOG(INFO) << "Remote fetch device status command " << unique_id_ + << " initialized."; + break; + } } status_ = NOT_STARTED; return true;
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 1bb72401..03f2646 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -1061,6 +1061,9 @@ // Set device volume. DEVICE_SET_VOLUME = 2; + + // Force a refresh of device status (attributes and logs). + DEVICE_FETCH_STATUS = 3; } // The command type.
diff --git a/components/prefs/pref_service.cc b/components/prefs/pref_service.cc index 89033a2..cff7e54 100644 --- a/components/prefs/pref_service.cc +++ b/components/prefs/pref_service.cc
@@ -385,23 +385,23 @@ } void PrefService::Set(const std::string& path, const base::Value& value) { - SetUserPrefValue(path, value.DeepCopy()); + SetUserPrefValue(path, value.CreateDeepCopy()); } void PrefService::SetBoolean(const std::string& path, bool value) { - SetUserPrefValue(path, new base::Value(value)); + SetUserPrefValue(path, base::MakeUnique<base::Value>(value)); } void PrefService::SetInteger(const std::string& path, int value) { - SetUserPrefValue(path, new base::Value(value)); + SetUserPrefValue(path, base::MakeUnique<base::Value>(value)); } void PrefService::SetDouble(const std::string& path, double value) { - SetUserPrefValue(path, new base::Value(value)); + SetUserPrefValue(path, base::MakeUnique<base::Value>(value)); } void PrefService::SetString(const std::string& path, const std::string& value) { - SetUserPrefValue(path, new base::Value(value)); + SetUserPrefValue(path, base::MakeUnique<base::Value>(value)); } void PrefService::SetFilePath(const std::string& path, @@ -410,7 +410,8 @@ } void PrefService::SetInt64(const std::string& path, int64_t value) { - SetUserPrefValue(path, new base::Value(base::Int64ToString(value))); + SetUserPrefValue(path, + base::MakeUnique<base::Value>(base::Int64ToString(value))); } int64_t PrefService::GetInt64(const std::string& path) const { @@ -431,7 +432,8 @@ } void PrefService::SetUint64(const std::string& path, uint64_t value) { - SetUserPrefValue(path, new base::Value(base::Uint64ToString(value))); + SetUserPrefValue(path, + base::MakeUnique<base::Value>(base::Uint64ToString(value))); } uint64_t PrefService::GetUint64(const std::string& path) const { @@ -491,8 +493,7 @@ } void PrefService::SetUserPrefValue(const std::string& path, - base::Value* new_value) { - std::unique_ptr<base::Value> owned_value(new_value); + std::unique_ptr<base::Value> new_value) { DCHECK(CalledOnValidThread()); const Preference* pref = FindPreference(path); @@ -507,7 +508,7 @@ return; } - user_pref_store_->SetValue(path, std::move(owned_value), GetWriteFlags(pref)); + user_pref_store_->SetValue(path, std::move(new_value), GetWriteFlags(pref)); } void PrefService::UpdateCommandLinePrefStore(PrefStore* command_line_store) {
diff --git a/components/prefs/pref_service.h b/components/prefs/pref_service.h index d26e118..e08e361 100644 --- a/components/prefs/pref_service.h +++ b/components/prefs/pref_service.h
@@ -355,7 +355,8 @@ // Sets the value for this pref path in the user pref store and informs the // PrefNotifier of the change. - void SetUserPrefValue(const std::string& path, base::Value* new_value); + void SetUserPrefValue(const std::string& path, + std::unique_ptr<base::Value> new_value); // Load preferences from storage, attempting to diagnose and handle errors. // This should only be called from the constructor.
diff --git a/components/prefs/pref_service_unittest.cc b/components/prefs/pref_service_unittest.cc index 55d3ccc..35033153 100644 --- a/components/prefs/pref_service_unittest.cc +++ b/components/prefs/pref_service_unittest.cc
@@ -330,7 +330,8 @@ EXPECT_TRUE(flag_checker->last_write_flags_set()); EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear()); - prefs->SetUserPrefValue(entry.pref_name, new base::DictionaryValue()); + prefs->SetUserPrefValue(entry.pref_name, + base::MakeUnique<base::DictionaryValue>()); EXPECT_TRUE(flag_checker->last_write_flags_set()); EXPECT_EQ(entry.write_flags, flag_checker->GetLastFlagsAndClear()); }
diff --git a/components/proximity_auth/BUILD.gn b/components/proximity_auth/BUILD.gn index d3e6fcd..40cb457 100644 --- a/components/proximity_auth/BUILD.gn +++ b/components/proximity_auth/BUILD.gn
@@ -13,8 +13,6 @@ "bluetooth_util.cc", "bluetooth_util.h", "bluetooth_util_chromeos.cc", - "cryptauth_enroller_factory_impl.cc", - "cryptauth_enroller_factory_impl.h", "messenger.h", "messenger_impl.cc", "messenger_impl.h",
diff --git a/components/proximity_auth/cryptauth_enroller_factory_impl.cc b/components/proximity_auth/cryptauth_enroller_factory_impl.cc deleted file mode 100644 index c27e0a6..0000000 --- a/components/proximity_auth/cryptauth_enroller_factory_impl.cc +++ /dev/null
@@ -1,27 +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. - -#include "components/proximity_auth/cryptauth_enroller_factory_impl.h" - -#include "base/memory/ptr_util.h" -#include "components/cryptauth/cryptauth_client_impl.h" -#include "components/cryptauth/cryptauth_enroller_impl.h" -#include "components/cryptauth/secure_message_delegate.h" - -namespace proximity_auth { - -CryptAuthEnrollerFactoryImpl::CryptAuthEnrollerFactoryImpl( - ProximityAuthClient* proximity_auth_client) - : proximity_auth_client_(proximity_auth_client) {} - -CryptAuthEnrollerFactoryImpl::~CryptAuthEnrollerFactoryImpl() {} - -std::unique_ptr<cryptauth::CryptAuthEnroller> -CryptAuthEnrollerFactoryImpl::CreateInstance() { - return base::MakeUnique<cryptauth::CryptAuthEnrollerImpl>( - proximity_auth_client_->CreateCryptAuthClientFactory(), - proximity_auth_client_->CreateSecureMessageDelegate()); -} - -} // namespace proximity_auth
diff --git a/components/proximity_auth/cryptauth_enroller_factory_impl.h b/components/proximity_auth/cryptauth_enroller_factory_impl.h deleted file mode 100644 index 14891525..0000000 --- a/components/proximity_auth/cryptauth_enroller_factory_impl.h +++ /dev/null
@@ -1,35 +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 COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_FACTORY_IMPL_H -#define COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_FACTORY_IMPL_H - -#include "base/macros.h" -#include "components/cryptauth/cryptauth_enroller.h" -#include "components/proximity_auth/proximity_auth_client.h" - -namespace proximity_auth { - -// Implementation of CryptAuthEnrollerFactory. Note that this class is in the -// proximity_auth/ rather than the cryptauth/ directory because of the -// dependency on ProximityAuthClient. -class CryptAuthEnrollerFactoryImpl - : public cryptauth::CryptAuthEnrollerFactory { - public: - explicit CryptAuthEnrollerFactoryImpl( - ProximityAuthClient* proximity_auth_client); - ~CryptAuthEnrollerFactoryImpl() override; - - // CryptAuthEnrollerFactory: - std::unique_ptr<cryptauth::CryptAuthEnroller> CreateInstance() override; - - private: - proximity_auth::ProximityAuthClient* proximity_auth_client_; - - DISALLOW_COPY_AND_ASSIGN(CryptAuthEnrollerFactoryImpl); -}; - -} // namespace proximity_auth - -#endif // COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_FACTORY_IMPL_H
diff --git a/components/reading_list/core/BUILD.gn b/components/reading_list/core/BUILD.gn index f45b10c..a5d4f13 100644 --- a/components/reading_list/core/BUILD.gn +++ b/components/reading_list/core/BUILD.gn
@@ -7,13 +7,67 @@ source_set("core") { sources = [ + "offline_url_utils.cc", + "offline_url_utils.h", + "reading_list_entry.cc", + "reading_list_entry.h", + "reading_list_model.cc", + "reading_list_model.h", + "reading_list_model_impl.cc", + "reading_list_model_impl.h", + "reading_list_model_observer.h", + "reading_list_model_storage.cc", + "reading_list_model_storage.h", + "reading_list_pref_names.cc", + "reading_list_pref_names.h", + "reading_list_store.cc", + "reading_list_store.h", + "reading_list_store_delegate.h", + ] + deps = [ + ":flags", + "//base", + "//components/keyed_service/core", + "//components/prefs", + "//components/sync", + "//net", + "//url", + ] + public_deps = [ + "//components/reading_list/core/proto", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ + "offline_url_utils_unittest.cc", + "reading_list_entry_unittest.cc", + "reading_list_model_unittest.cc", + "reading_list_store_unittest.cc", + ] + deps = [ + ":core", + "//base", + "//base/test:test_support", + "//components/sync", + "//components/sync:test_support_model", + "//testing/gtest", + "//url", + ] +} + +source_set("flags") { + sources = [ "reading_list_switches.cc", "reading_list_switches.h", ] deps = [ - ":reading_list_enable_flags", "//base", ] + public_deps = [ + ":reading_list_enable_flags", + ] } buildflag_header("reading_list_enable_flags") {
diff --git a/components/reading_list/core/offline_url_utils.cc b/components/reading_list/core/offline_url_utils.cc new file mode 100644 index 0000000..1542922 --- /dev/null +++ b/components/reading_list/core/offline_url_utils.cc
@@ -0,0 +1,54 @@ +// 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 "components/reading_list/core/offline_url_utils.h" + +#include "base/logging.h" +#include "base/md5.h" +#include "base/strings/stringprintf.h" + +namespace { +const base::FilePath::CharType kOfflineDirectory[] = + FILE_PATH_LITERAL("Offline"); +const base::FilePath::CharType kMainPageFileName[] = + FILE_PATH_LITERAL("page.html"); +const base::FilePath::CharType kPDFFileName[] = FILE_PATH_LITERAL("file.pdf"); +} // namespace + +namespace reading_list { + +base::FilePath OfflineRootDirectoryPath(const base::FilePath& profile_path) { + return profile_path.Append(kOfflineDirectory); +} + +std::string OfflineURLDirectoryID(const GURL& url) { + return base::MD5String(url.spec()); +} + +base::FilePath OfflineURLDirectoryAbsolutePath( + const base::FilePath& profile_path, + const GURL& url) { + return OfflineURLAbsolutePathFromRelativePath( + profile_path, base::FilePath::FromUTF8Unsafe(OfflineURLDirectoryID(url))); +} + +base::FilePath OfflinePagePath(const GURL& url, OfflineFileType type) { + base::FilePath directory = + base::FilePath::FromUTF8Unsafe(OfflineURLDirectoryID(url)); + switch (type) { + case OFFLINE_TYPE_HTML: + return directory.Append(kMainPageFileName); + case OFFLINE_TYPE_PDF: + return directory.Append(kPDFFileName); + } + NOTREACHED(); + return base::FilePath(); +} + +base::FilePath OfflineURLAbsolutePathFromRelativePath( + const base::FilePath& profile_path, + const base::FilePath& relative_path) { + return OfflineRootDirectoryPath(profile_path).Append(relative_path); +} +}
diff --git a/components/reading_list/ios/offline_url_utils.h b/components/reading_list/core/offline_url_utils.h similarity index 91% rename from components/reading_list/ios/offline_url_utils.h rename to components/reading_list/core/offline_url_utils.h index dc9060f..4eb9ba7 100644 --- a/components/reading_list/ios/offline_url_utils.h +++ b/components/reading_list/core/offline_url_utils.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_READING_LIST_IOS_OFFLINE_URL_UTILS_H_ -#define COMPONENTS_READING_LIST_IOS_OFFLINE_URL_UTILS_H_ +#ifndef COMPONENTS_READING_LIST_CORE_OFFLINE_URL_UTILS_H_ +#define COMPONENTS_READING_LIST_CORE_OFFLINE_URL_UTILS_H_ #include <string> @@ -49,4 +49,4 @@ } // namespace reading_list -#endif // COMPONENTS_READING_LIST_IOS_OFFLINE_URL_UTILS_H_ +#endif // COMPONENTS_READING_LIST_CORE_OFFLINE_URL_UTILS_H_
diff --git a/components/reading_list/core/offline_url_utils_unittest.cc b/components/reading_list/core/offline_url_utils_unittest.cc new file mode 100644 index 0000000..cf5b8bc --- /dev/null +++ b/components/reading_list/core/offline_url_utils_unittest.cc
@@ -0,0 +1,85 @@ +// 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 "components/reading_list/core/offline_url_utils.h" + +#include <string> + +#include "base/files/file_path.h" +#include "base/strings/stringprintf.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +// Checks the root directory of offline pages. +TEST(OfflineURLUtilsTest, OfflineRootDirectoryPathTest) { + base::FilePath::StringType separator(&base::FilePath::kSeparators[0], 1); + base::FilePath profile_path(FILE_PATH_LITERAL("profile_path")); + base::FilePath offline_directory = + reading_list::OfflineRootDirectoryPath(profile_path); + // Expected value: profile_path/Offline + std::string expected = + base::StringPrintf("profile_path%" PRIsFP "Offline", separator.c_str()); + EXPECT_EQ(expected, offline_directory.AsUTF8Unsafe()); +} + +// Checks the offline page directory is the MD5 of the URL +TEST(OfflineURLUtilsTest, OfflineURLDirectoryIDTest) { + GURL url("http://www.google.com/test"); + // MD5 of "http://www.google.com/test" + std::string md5 = "0090071ef710946a1263c276284bb3b8"; + std::string directory_id = reading_list::OfflineURLDirectoryID(url); + EXPECT_EQ(md5, directory_id); +} + +// Checks the offline page directory is +// |profile_path|/Offline/OfflineURLDirectoryID; +TEST(OfflineURLUtilsTest, OfflineURLDirectoryAbsolutePathTest) { + base::FilePath::StringType separator(&base::FilePath::kSeparators[0], 1); + base::FilePath profile_path(FILE_PATH_LITERAL("profile_path")); + GURL url("http://www.google.com/test"); + base::FilePath offline_directory = + reading_list::OfflineURLDirectoryAbsolutePath(profile_path, url); + // Expected value: profile_path/Offline/0090071ef710946a1263c276284bb3b8 + std::string expected = + base::StringPrintf("profile_path%" PRIsFP "Offline%" PRIsFP + "0090071ef710946a1263c276284bb3b8", + separator.c_str(), separator.c_str()); + EXPECT_EQ(expected, offline_directory.AsUTF8Unsafe()); +} + +// Checks the offline page directory is +// |profile_path|/Offline/OfflineURLDirectoryID; +TEST(OfflineURLUtilsTest, AbsolutePathForRelativePathTest) { + base::FilePath::StringType separator(&base::FilePath::kSeparators[0], 1); + base::FilePath profile_path(FILE_PATH_LITERAL("profile_path")); + base::FilePath relative_path(FILE_PATH_LITERAL("relative")); + relative_path = relative_path.Append(FILE_PATH_LITERAL("path")); + base::FilePath absolute_path = + reading_list::OfflineURLAbsolutePathFromRelativePath(profile_path, + relative_path); + // Expected value: profile_path/Offline/relative/path + std::string expected = base::StringPrintf( + "profile_path%" PRIsFP "Offline%" PRIsFP "relative%" PRIsFP "path", + separator.c_str(), separator.c_str(), separator.c_str()); + EXPECT_EQ(expected, absolute_path.AsUTF8Unsafe()); +} + +// Checks the offline page path is OfflineURLDirectoryID/page.html; +TEST(OfflineURLUtilsTest, OfflinePagePathTest) { + base::FilePath::StringType separator(&base::FilePath::kSeparators[0], 1); + GURL url("http://www.google.com/test"); + base::FilePath offline_page = + reading_list::OfflinePagePath(url, reading_list::OFFLINE_TYPE_HTML); + // Expected value: 0090071ef710946a1263c276284bb3b8/page.html + std::string expected_html = + base::StringPrintf("0090071ef710946a1263c276284bb3b8%" PRIsFP "page.html", + separator.c_str()); + EXPECT_EQ(expected_html, offline_page.AsUTF8Unsafe()); + offline_page = + reading_list::OfflinePagePath(url, reading_list::OFFLINE_TYPE_PDF); + // Expected value: 0090071ef710946a1263c276284bb3b8/file.pdf + std::string expected_pdf = base::StringPrintf( + "0090071ef710946a1263c276284bb3b8%" PRIsFP "file.pdf", separator.c_str()); + EXPECT_EQ(expected_pdf, offline_page.AsUTF8Unsafe()); +}
diff --git a/components/reading_list/ios/proto/BUILD.gn b/components/reading_list/core/proto/BUILD.gn similarity index 100% rename from components/reading_list/ios/proto/BUILD.gn rename to components/reading_list/core/proto/BUILD.gn
diff --git a/components/reading_list/ios/proto/reading_list.proto b/components/reading_list/core/proto/reading_list.proto similarity index 97% rename from components/reading_list/ios/proto/reading_list.proto rename to components/reading_list/core/proto/reading_list.proto index 4125454..04a3e9463 100644 --- a/components/reading_list/ios/proto/reading_list.proto +++ b/components/reading_list/core/proto/reading_list.proto
@@ -35,7 +35,7 @@ PROCESSING = 1; PROCESSED = 2; WILL_RETRY = 3; - ERROR = 4; + DISTILLATION_ERROR = 4; } optional DistillationState distillation_state = 7; optional string distilled_path = 8;
diff --git a/components/reading_list/ios/reading_list_entry.cc b/components/reading_list/core/reading_list_entry.cc similarity index 95% rename from components/reading_list/ios/reading_list_entry.cc rename to components/reading_list/core/reading_list_entry.cc index f7f1ff3..25956e3 100644 --- a/components/reading_list/ios/reading_list_entry.cc +++ b/components/reading_list/core/reading_list_entry.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_entry.h" +#include "components/reading_list/core/reading_list_entry.h" #include "base/json/json_string_value_serializer.h" #include "base/memory/ptr_util.h" -#include "components/reading_list/ios/offline_url_utils.h" -#include "components/reading_list/ios/proto/reading_list.pb.h" -#include "components/reading_list/ios/reading_list_store.h" +#include "components/reading_list/core/offline_url_utils.h" +#include "components/reading_list/core/proto/reading_list.pb.h" +#include "components/reading_list/core/reading_list_store.h" #include "components/sync/protocol/reading_list_specifics.pb.h" #include "net/base/backoff_entry_serializer.h" @@ -236,8 +236,10 @@ DCHECK(distilled_state != WAITING); // Increase time until next retry exponentially if the state change from a // non-error state to an error state. - if ((distilled_state == WILL_RETRY || distilled_state == ERROR) && - distilled_state_ != WILL_RETRY && distilled_state_ != ERROR) { + if ((distilled_state == WILL_RETRY || + distilled_state == DISTILLATION_ERROR) && + distilled_state_ != WILL_RETRY && + distilled_state_ != DISTILLATION_ERROR) { backoff_->InformOfRequest(false); failed_download_counter_++; } @@ -336,15 +338,15 @@ case reading_list::ReadingListLocal::WILL_RETRY: distillation_state = ReadingListEntry::WILL_RETRY; break; - case reading_list::ReadingListLocal::ERROR: - distillation_state = ReadingListEntry::ERROR; + case reading_list::ReadingListLocal::DISTILLATION_ERROR: + distillation_state = ReadingListEntry::DISTILLATION_ERROR; break; } } base::FilePath distilled_path; if (pb_entry.has_distilled_path()) { - distilled_path = base::FilePath(pb_entry.distilled_path()); + distilled_path = base::FilePath::FromUTF8Unsafe(pb_entry.distilled_path()); } GURL distilled_url; @@ -521,7 +523,8 @@ break; } - reading_list::ReadingListLocal::DistillationState distilation_state; + reading_list::ReadingListLocal::DistillationState distilation_state = + reading_list::ReadingListLocal::WAITING; switch (DistilledState()) { case ReadingListEntry::WAITING: distilation_state = reading_list::ReadingListLocal::WAITING; @@ -535,13 +538,13 @@ case ReadingListEntry::WILL_RETRY: distilation_state = reading_list::ReadingListLocal::WILL_RETRY; break; - case ReadingListEntry::ERROR: - distilation_state = reading_list::ReadingListLocal::ERROR; + case ReadingListEntry::DISTILLATION_ERROR: + distilation_state = reading_list::ReadingListLocal::DISTILLATION_ERROR; break; } pb_entry->set_distillation_state(distilation_state); if (!DistilledPath().empty()) { - pb_entry->set_distilled_path(DistilledPath().value()); + pb_entry->set_distilled_path(DistilledPath().AsUTF8Unsafe()); } if (DistilledURL().is_valid()) { pb_entry->set_distilled_url(DistilledURL().spec());
diff --git a/components/reading_list/ios/reading_list_entry.h b/components/reading_list/core/reading_list_entry.h similarity index 95% rename from components/reading_list/ios/reading_list_entry.h rename to components/reading_list/core/reading_list_entry.h index f296a22..042cf05c 100644 --- a/components/reading_list/ios/reading_list_entry.h +++ b/components/reading_list/core/reading_list_entry.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_READING_LIST_IOS_READING_LIST_ENTRY_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_ENTRY_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_ENTRY_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_ENTRY_H_ #include <string> @@ -62,8 +62,14 @@ // Entries are created in WAITING state. At some point they will be PROCESSING // into one of the three state: PROCESSED, the only state a distilled URL // would be set, WILL_RETRY, similar to wait, but with exponential delays or - // ERROR where the system will not retry at all. - enum DistillationState { WAITING, PROCESSING, PROCESSED, WILL_RETRY, ERROR }; + // DISTILLATION_ERROR where the system will not retry at all. + enum DistillationState { + WAITING, + PROCESSING, + PROCESSED, + WILL_RETRY, + DISTILLATION_ERROR + }; static const net::BackoffEntry::Policy kBackoffPolicy; @@ -206,4 +212,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListEntry); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_ENTRY_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_ENTRY_H_
diff --git a/components/reading_list/ios/reading_list_entry_unittest.cc b/components/reading_list/core/reading_list_entry_unittest.cc similarity index 91% rename from components/reading_list/ios/reading_list_entry_unittest.cc rename to components/reading_list/core/reading_list_entry_unittest.cc index 018a7de..23bc82f 100644 --- a/components/reading_list/ios/reading_list_entry_unittest.cc +++ b/components/reading_list/core/reading_list_entry_unittest.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_entry.h" +#include "components/reading_list/core/reading_list_entry.h" #include "base/memory/ptr_util.h" #include "base/test/simple_test_tick_clock.h" -#include "components/reading_list/ios/proto/reading_list.pb.h" +#include "components/reading_list/core/proto/reading_list.pb.h" #include "components/sync/protocol/reading_list_specifics.pb.h" #include "testing/gtest/include/gtest/gtest.h" @@ -91,7 +91,7 @@ EXPECT_TRUE(e.DistilledPath().empty()); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); int64_t size = 50; int64_t time = 100; @@ -109,10 +109,10 @@ EXPECT_EQ(ReadingListEntry::WAITING, e.DistilledState()); - e.SetDistilledState(ReadingListEntry::ERROR); - EXPECT_EQ(ReadingListEntry::ERROR, e.DistilledState()); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); + EXPECT_EQ(ReadingListEntry::DISTILLATION_ERROR, e.DistilledState()); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); e.SetDistilledInfo(distilled_path, distilled_url, 50, base::Time::FromTimeT(100)); @@ -136,7 +136,7 @@ EXPECT_EQ(0, e.TimeUntilNextTry().InSeconds()); // First error. - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); int nextTry = e.TimeUntilNextTry().InMinutes(); EXPECT_NEAR(kFirstBackoff, nextTry, kFirstBackoff * fuzzing); e.SetDistilledState(ReadingListEntry::WILL_RETRY); @@ -149,7 +149,7 @@ e.SetDistilledState(ReadingListEntry::WILL_RETRY); nextTry = e.TimeUntilNextTry().InMinutes(); EXPECT_NEAR(kSecondBackoff, nextTry, kSecondBackoff * fuzzing); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); EXPECT_EQ(nextTry, e.TimeUntilNextTry().InMinutes()); e.SetDistilledState(ReadingListEntry::PROCESSING); @@ -162,13 +162,13 @@ // Fourth error. e.SetDistilledState(ReadingListEntry::PROCESSING); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); EXPECT_NEAR(kFourthBackoff, e.TimeUntilNextTry().InMinutes(), kFourthBackoff * fuzzing); // Fifth error. e.SetDistilledState(ReadingListEntry::PROCESSING); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); EXPECT_NEAR(kFifthBackoff, e.TimeUntilNextTry().InMinutes(), kFifthBackoff * fuzzing); } @@ -184,7 +184,7 @@ base::Time::FromTimeT(10), std::move(backoff)); double fuzzing = ReadingListEntry::kBackoffPolicy.jitter_factor; - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); ASSERT_NEAR(kFirstBackoff, e.TimeUntilNextTry().InMinutes(), kFirstBackoff * fuzzing); @@ -206,19 +206,19 @@ base::Time::FromTimeT(10), std::move(backoff)); double fuzzing = ReadingListEntry::kBackoffPolicy.jitter_factor; - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); ASSERT_NEAR(kFirstBackoff, e.TimeUntilNextTry().InMinutes(), kFirstBackoff * fuzzing); // Action. - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); e.SetDistilledInfo(distilled_path, distilled_url, 50, base::Time::FromTimeT(100)); // Test. EXPECT_EQ(0, e.TimeUntilNextTry().InSeconds()); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); ASSERT_NEAR(kFirstBackoff, e.TimeUntilNextTry().InMinutes(), kFirstBackoff * fuzzing); } @@ -231,7 +231,7 @@ EXPECT_EQ(0, e.FailedDownloadCounter()); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); EXPECT_EQ(1, e.FailedDownloadCounter()); e.SetDistilledState(ReadingListEntry::WILL_RETRY); EXPECT_EQ(1, e.FailedDownloadCounter()); @@ -241,7 +241,7 @@ e.SetDistilledState(ReadingListEntry::WILL_RETRY); EXPECT_EQ(2, e.FailedDownloadCounter()); - e.SetDistilledState(ReadingListEntry::ERROR); + e.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); EXPECT_EQ(2, e.FailedDownloadCounter()); } @@ -326,7 +326,7 @@ reading_list::ReadingListLocal::WILL_RETRY); EXPECT_EQ(will_retry_pb_entry->failed_download_counter(), 1); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); int64_t size = 50; entry.SetDistilledInfo(distilled_path, distilled_url, size, @@ -355,7 +355,7 @@ TEST(ReadingListEntry, FromReadingListLocal) { ReadingListEntry entry(GURL("http://example.com/"), "title", base::Time::FromTimeT(10)); - entry.SetDistilledState(ReadingListEntry::ERROR); + entry.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); std::unique_ptr<reading_list::ReadingListLocal> pb_entry( entry.AsReadingListLocal(base::Time::FromTimeT(10))); @@ -397,13 +397,13 @@ TEST(ReadingListEntry, MergeWithEntry) { ReadingListEntry local_entry(GURL("http://example.com/"), "title", base::Time::FromTimeT(10)); - local_entry.SetDistilledState(ReadingListEntry::ERROR); + local_entry.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); local_entry.SetTitle("title updated", base::Time::FromTimeT(30)); int64_t local_update_time_us = local_entry.UpdateTime(); ReadingListEntry sync_entry(GURL("http://example.com/"), "title2", base::Time::FromTimeT(20)); - sync_entry.SetDistilledState(ReadingListEntry::ERROR); + sync_entry.SetDistilledState(ReadingListEntry::DISTILLATION_ERROR); int64_t sync_update_time_us = sync_entry.UpdateTime(); EXPECT_NE(local_update_time_us, sync_update_time_us); local_entry.MergeWithEntry(sync_entry); @@ -414,7 +414,7 @@ EXPECT_FALSE(local_entry.HasBeenSeen()); EXPECT_EQ(local_entry.UpdateTime(), sync_update_time_us); EXPECT_EQ(local_entry.FailedDownloadCounter(), 1); - EXPECT_EQ(local_entry.DistilledState(), ReadingListEntry::ERROR); + EXPECT_EQ(local_entry.DistilledState(), ReadingListEntry::DISTILLATION_ERROR); // Allow twice the jitter as test is not instantaneous. double fuzzing = 2 * ReadingListEntry::kBackoffPolicy.jitter_factor; int nextTry = local_entry.TimeUntilNextTry().InMinutes();
diff --git a/components/reading_list/ios/reading_list_model.cc b/components/reading_list/core/reading_list_model.cc similarity index 97% rename from components/reading_list/ios/reading_list_model.cc rename to components/reading_list/core/reading_list_model.cc index ede2f8d7..d3d2829 100644 --- a/components/reading_list/ios/reading_list_model.cc +++ b/components/reading_list/core/reading_list_model.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "base/logging.h" #include "base/memory/ptr_util.h"
diff --git a/components/reading_list/ios/reading_list_model.h b/components/reading_list/core/reading_list_model.h similarity index 95% rename from components/reading_list/ios/reading_list_model.h rename to components/reading_list/core/reading_list_model.h index 50d983fb..7666cce 100644 --- a/components/reading_list/ios/reading_list_model.h +++ b/components/reading_list/core/reading_list_model.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_READING_LIST_IOS_READING_LIST_MODEL_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_H_ #include <memory> #include <string> @@ -12,8 +12,8 @@ #include "base/callback.h" #include "base/observer_list.h" #include "base/threading/non_thread_safe.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model_observer.h" class GURL; class ReadingListModel; @@ -172,4 +172,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListModel); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_H_
diff --git a/components/reading_list/ios/reading_list_model_impl.cc b/components/reading_list/core/reading_list_model_impl.cc similarity index 98% rename from components/reading_list/ios/reading_list_model_impl.cc rename to components/reading_list/core/reading_list_model_impl.cc index aad6432..6b60704 100644 --- a/components/reading_list/ios/reading_list_model_impl.cc +++ b/components/reading_list/core/reading_list_model_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_model_impl.h" #include "base/bind.h" #include "base/logging.h" @@ -10,8 +10,8 @@ #include "base/strings/string_util.h" #include "base/time/clock.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/ios/reading_list_model_storage.h" -#include "components/reading_list/ios/reading_list_pref_names.h" +#include "components/reading_list/core/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_pref_names.h" #include "url/gurl.h" ReadingListModelImpl::ReadingListModelImpl(
diff --git a/components/reading_list/ios/reading_list_model_impl.h b/components/reading_list/core/reading_list_model_impl.h similarity index 91% rename from components/reading_list/ios/reading_list_model_impl.h rename to components/reading_list/core/reading_list_model_impl.h index ef6f1ba..d388d80 100644 --- a/components/reading_list/ios/reading_list_model_impl.h +++ b/components/reading_list/core/reading_list_model_impl.h
@@ -2,17 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_IMPL_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_IMPL_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_IMPL_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_IMPL_H_ #include <map> #include <memory> #include "components/keyed_service/core/keyed_service.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model.h" -#include "components/reading_list/ios/reading_list_model_storage.h" -#include "components/reading_list/ios/reading_list_store_delegate.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model.h" +#include "components/reading_list/core/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_store_delegate.h" namespace base { class Clock; @@ -150,4 +150,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListModelImpl); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_IMPL_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_IMPL_H_
diff --git a/components/reading_list/ios/reading_list_model_observer.h b/components/reading_list/core/reading_list_model_observer.h similarity index 92% rename from components/reading_list/ios/reading_list_model_observer.h rename to components/reading_list/core/reading_list_model_observer.h index ffaaed8..061d1cc 100644 --- a/components/reading_list/ios/reading_list_model_observer.h +++ b/components/reading_list/core/reading_list_model_observer.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_OBSERVER_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_OBSERVER_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_OBSERVER_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_OBSERVER_H_ #include <set> #include <vector> -#include "components/reading_list/ios/reading_list_entry.h" +#include "components/reading_list/core/reading_list_entry.h" class GURL; class ReadingListModel; @@ -80,4 +80,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListModelObserver); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_OBSERVER_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_OBSERVER_H_
diff --git a/components/reading_list/ios/reading_list_model_storage.cc b/components/reading_list/core/reading_list_model_storage.cc similarity index 85% rename from components/reading_list/ios/reading_list_model_storage.cc rename to components/reading_list/core/reading_list_model_storage.cc index c1dbd05..ee7c4ab 100644 --- a/components/reading_list/ios/reading_list_model_storage.cc +++ b/components/reading_list/core/reading_list_model_storage.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_model_storage.h" ReadingListModelStorage::ReadingListModelStorage( const ChangeProcessorFactory& change_processor_factory,
diff --git a/components/reading_list/ios/reading_list_model_storage.h b/components/reading_list/core/reading_list_model_storage.h similarity index 89% rename from components/reading_list/ios/reading_list_model_storage.h rename to components/reading_list/core/reading_list_model_storage.h index 40a5a540..5edc30d0 100644 --- a/components/reading_list/ios/reading_list_model_storage.h +++ b/components/reading_list/core/reading_list_model_storage.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_STORAGE_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_STORAGE_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_STORAGE_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_STORAGE_H_ #include <vector> #include "base/macros.h" -#include "components/reading_list/ios/reading_list_entry.h" +#include "components/reading_list/core/reading_list_entry.h" #include "components/sync/base/model_type.h" #include "components/sync/model/model_type_sync_bridge.h" @@ -71,4 +71,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListModelStorage); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_STORAGE_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_MODEL_STORAGE_H_
diff --git a/components/reading_list/ios/reading_list_model_unittest.cc b/components/reading_list/core/reading_list_model_unittest.cc similarity index 97% rename from components/reading_list/ios/reading_list_model_unittest.cc rename to components/reading_list/core/reading_list_model_unittest.cc index af9e3a0..ee00dc77 100644 --- a/components/reading_list/ios/reading_list_model_unittest.cc +++ b/components/reading_list/core/reading_list_model_unittest.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/test/simple_test_clock.h" -#include "components/reading_list/ios/reading_list_model_impl.h" -#include "components/reading_list/ios/reading_list_model_storage.h" -#include "components/reading_list/ios/reading_list_store_delegate.h" +#include "components/reading_list/core/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_store_delegate.h" #include "components/sync/model/metadata_change_list.h" #include "components/sync/model/model_error.h" #include "testing/gtest/include/gtest/gtest.h" @@ -395,7 +395,7 @@ SetStorage(std::move(storage), std::move(clock)); model_->AddEntry(GURL("http://example.com"), "sample", reading_list::ADDED_VIA_CURRENT_APP); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); int64_t size = 50; int64_t time = 100; @@ -421,7 +421,7 @@ EXPECT_EQ(0ul, UnreadSize()); EXPECT_EQ(1ul, ReadSize()); EXPECT_EQ(merged_entry->DistilledPath(), - base::FilePath("distilled/page.html")); + base::FilePath(FILE_PATH_LITERAL("distilled/page.html"))); EXPECT_EQ(merged_entry->UpdateTime(), sync_update_time); EXPECT_EQ(size, merged_entry->DistillationSize()); EXPECT_EQ(time * base::Time::kMicrosecondsPerSecond, @@ -642,7 +642,7 @@ model_->AddEntry(gurl, "sample", reading_list::ADDED_VIA_CURRENT_APP); ClearCounts(); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); int64_t size = 50; int64_t time = 100; @@ -692,7 +692,7 @@ const ReadingListEntry* entry = model_->GetEntryByURL(gurl); ClearCounts(); - const base::FilePath distilled_path("distilled/page.html"); + const base::FilePath distilled_path(FILE_PATH_LITERAL("distilled/page.html")); const GURL distilled_url("http://example.com/distilled"); int64_t size = 50; int64_t time = 100;
diff --git a/components/reading_list/ios/reading_list_pref_names.cc b/components/reading_list/core/reading_list_pref_names.cc similarity index 86% rename from components/reading_list/ios/reading_list_pref_names.cc rename to components/reading_list/core/reading_list_pref_names.cc index 0c160945..9e43435 100644 --- a/components/reading_list/ios/reading_list_pref_names.cc +++ b/components/reading_list/core/reading_list_pref_names.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_pref_names.h" +#include "components/reading_list/core/reading_list_pref_names.h" namespace reading_list { namespace prefs {
diff --git a/components/reading_list/ios/reading_list_pref_names.h b/components/reading_list/core/reading_list_pref_names.h similarity index 66% rename from components/reading_list/ios/reading_list_pref_names.h rename to components/reading_list/core/reading_list_pref_names.h index c9afb60..997da56 100644 --- a/components/reading_list/ios/reading_list_pref_names.h +++ b/components/reading_list/core/reading_list_pref_names.h
@@ -4,8 +4,8 @@ // Constants for the names of various reading list preferences. -#ifndef COMPONENTS_READING_LIST_IOS_READING_LIST_PREF_NAMES_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_PREF_NAMES_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_PREF_NAMES_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_PREF_NAMES_H_ namespace reading_list { namespace prefs { @@ -15,4 +15,4 @@ } // namespace prefs } // namespace reading_list -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_PREF_NAMES_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_PREF_NAMES_H_
diff --git a/components/reading_list/ios/reading_list_store.cc b/components/reading_list/core/reading_list_store.cc similarity index 98% rename from components/reading_list/ios/reading_list_store.cc rename to components/reading_list/core/reading_list_store.cc index c61f85be..a9af371a 100644 --- a/components/reading_list/ios/reading_list_store.cc +++ b/components/reading_list/core/reading_list_store.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_store.h" +#include "components/reading_list/core/reading_list_store.h" #include <set> #include <utility> @@ -11,8 +11,8 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/time/clock.h" -#include "components/reading_list/ios/proto/reading_list.pb.h" -#include "components/reading_list/ios/reading_list_model_impl.h" +#include "components/reading_list/core/proto/reading_list.pb.h" +#include "components/reading_list/core/reading_list_model_impl.h" #include "components/sync/model/entity_change.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/model/metadata_change_list.h"
diff --git a/components/reading_list/ios/reading_list_store.h b/components/reading_list/core/reading_list_store.h similarity index 95% rename from components/reading_list/ios/reading_list_store.h rename to components/reading_list/core/reading_list_store.h index 9852d791..9f6eef8 100644 --- a/components/reading_list/ios/reading_list_store.h +++ b/components/reading_list/core/reading_list_store.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_H_ #include <memory> #include <string> #include "base/threading/non_thread_safe.h" -#include "components/reading_list/ios/reading_list_model_storage.h" -#include "components/reading_list/ios/reading_list_store_delegate.h" +#include "components/reading_list/core/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_store_delegate.h" #include "components/sync/model/model_error.h" #include "components/sync/model/model_type_store.h" @@ -171,4 +171,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListStore); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_H_
diff --git a/components/reading_list/ios/reading_list_store_delegate.h b/components/reading_list/core/reading_list_store_delegate.h similarity index 87% rename from components/reading_list/ios/reading_list_store_delegate.h rename to components/reading_list/core/reading_list_store_delegate.h index d95100c3..ad960d2e 100644 --- a/components/reading_list/ios/reading_list_store_delegate.h +++ b/components/reading_list/core/reading_list_store_delegate.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_READING_LIST_IOS_READING_LIST_STORE_DELEGATE_H_ -#define COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_DELEGATE_H_ +#ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_DELEGATE_H_ +#define COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_DELEGATE_H_ #include <map> @@ -42,4 +42,4 @@ DISALLOW_COPY_AND_ASSIGN(ReadingListStoreDelegate); }; -#endif // COMPONENTS_READING_LIST_IOS_READING_LIST_STORE_DELEGATE_H_ +#endif // COMPONENTS_READING_LIST_CORE_READING_LIST_STORE_DELEGATE_H_
diff --git a/components/reading_list/ios/reading_list_store_unittest.cc b/components/reading_list/core/reading_list_store_unittest.cc similarity index 98% rename from components/reading_list/ios/reading_list_store_unittest.cc rename to components/reading_list/core/reading_list_store_unittest.cc index b346c3a1..7006ed3 100644 --- a/components/reading_list/ios/reading_list_store_unittest.cc +++ b/components/reading_list/core/reading_list_store_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/reading_list/ios/reading_list_store.h" +#include "components/reading_list/core/reading_list_store.h" #include <map> #include <set> @@ -12,7 +12,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/test/simple_test_clock.h" -#include "components/reading_list/ios/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_model_impl.h" #include "components/sync/model/fake_model_type_change_processor.h" #include "components/sync/model/model_type_store_test_util.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/reading_list/ios/BUILD.gn b/components/reading_list/ios/BUILD.gn index 3f1f0a44..5d605fb 100644 --- a/components/reading_list/ios/BUILD.gn +++ b/components/reading_list/ios/BUILD.gn
@@ -5,54 +5,11 @@ source_set("ios") { sources = [ "favicon_web_state_dispatcher.h", - "offline_url_utils.cc", - "offline_url_utils.h", - "reading_list_entry.cc", - "reading_list_entry.h", - "reading_list_model.cc", - "reading_list_model.h", "reading_list_model_bridge_observer.h", "reading_list_model_bridge_observer.mm", - "reading_list_model_impl.cc", - "reading_list_model_impl.h", - "reading_list_model_observer.h", - "reading_list_model_storage.cc", - "reading_list_model_storage.h", - "reading_list_pref_names.cc", - "reading_list_pref_names.h", - "reading_list_store.cc", - "reading_list_store.h", - "reading_list_store_delegate.h", ] deps = [ "//base", - "//components/keyed_service/core", - "//components/prefs", "//components/reading_list/core", - "//components/sync", - "//net", - "//url", - ] - public_deps = [ - "//components/reading_list/ios/proto", - ] -} - -source_set("unit_tests") { - testonly = true - sources = [ - "offline_url_utils_unittest.cc", - "reading_list_entry_unittest.cc", - "reading_list_model_unittest.cc", - "reading_list_store_unittest.cc", - ] - deps = [ - ":ios", - "//base", - "//base/test:test_support", - "//components/sync", - "//components/sync:test_support_model", - "//testing/gtest", - "//url", ] }
diff --git a/components/reading_list/ios/offline_url_utils.cc b/components/reading_list/ios/offline_url_utils.cc deleted file mode 100644 index 25b0561b..0000000 --- a/components/reading_list/ios/offline_url_utils.cc +++ /dev/null
@@ -1,48 +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 "components/reading_list/ios/offline_url_utils.h" - -#include "base/md5.h" -#include "base/strings/stringprintf.h" - -namespace { -const char kOfflineDirectory[] = "Offline"; -const char kMainPageFileName[] = "page.html"; -const char kPDFFileName[] = "file.pdf"; -} // namespace - -namespace reading_list { - -base::FilePath OfflineRootDirectoryPath(const base::FilePath& profile_path) { - return profile_path.Append(FILE_PATH_LITERAL(kOfflineDirectory)); -} - -std::string OfflineURLDirectoryID(const GURL& url) { - return base::MD5String(url.spec()); -} - -base::FilePath OfflineURLDirectoryAbsolutePath( - const base::FilePath& profile_path, - const GURL& url) { - return OfflineURLAbsolutePathFromRelativePath( - profile_path, base::FilePath(OfflineURLDirectoryID(url))); -} - -base::FilePath OfflinePagePath(const GURL& url, OfflineFileType type) { - base::FilePath directory(OfflineURLDirectoryID(url)); - switch (type) { - case OFFLINE_TYPE_HTML: - return directory.Append(FILE_PATH_LITERAL(kMainPageFileName)); - case OFFLINE_TYPE_PDF: - return directory.Append(FILE_PATH_LITERAL(kPDFFileName)); - } -} - -base::FilePath OfflineURLAbsolutePathFromRelativePath( - const base::FilePath& profile_path, - const base::FilePath& relative_path) { - return OfflineRootDirectoryPath(profile_path).Append(relative_path); -} -}
diff --git a/components/reading_list/ios/offline_url_utils_unittest.cc b/components/reading_list/ios/offline_url_utils_unittest.cc deleted file mode 100644 index 8d9199a..0000000 --- a/components/reading_list/ios/offline_url_utils_unittest.cc +++ /dev/null
@@ -1,61 +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 "components/reading_list/ios/offline_url_utils.h" - -#include <string> - -#include "base/files/file_path.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -// Checks the root directory of offline pages. -TEST(OfflineURLUtilsTest, OfflineRootDirectoryPathTest) { - base::FilePath profile_path("/profile_path"); - base::FilePath offline_directory = - reading_list::OfflineRootDirectoryPath(profile_path); - EXPECT_EQ("/profile_path/Offline", offline_directory.value()); -} - -// Checks the offline page directory is the MD5 of the URL -TEST(OfflineURLUtilsTest, OfflineURLDirectoryIDTest) { - GURL url("http://www.google.com/test"); - // MD5 of "http://www.google.com/test" - std::string md5 = "0090071ef710946a1263c276284bb3b8"; - std::string directory_id = reading_list::OfflineURLDirectoryID(url); - EXPECT_EQ(md5, directory_id); -} - -// Checks the offline page directory is -// |profile_path|/Offline/OfflineURLDirectoryID; -TEST(OfflineURLUtilsTest, OfflineURLDirectoryAbsolutePathTest) { - base::FilePath profile_path("/profile_path"); - GURL url("http://www.google.com/test"); - base::FilePath offline_directory = - reading_list::OfflineURLDirectoryAbsolutePath(profile_path, url); - EXPECT_EQ("/profile_path/Offline/0090071ef710946a1263c276284bb3b8", - offline_directory.value()); -} - -// Checks the offline page directory is -// |profile_path|/Offline/OfflineURLDirectoryID; -TEST(OfflineURLUtilsTest, AbsolutePathForRelativePathTest) { - base::FilePath profile_path("/profile_path"); - base::FilePath relative_path("relative/path"); - base::FilePath absolute_path = - reading_list::OfflineURLAbsolutePathFromRelativePath(profile_path, - relative_path); - EXPECT_EQ("/profile_path/Offline/relative/path", absolute_path.value()); -} - -// Checks the offline page path is OfflineURLDirectoryID/page.html; -TEST(OfflineURLUtilsTest, OfflinePagePathTest) { - GURL url("http://www.google.com/test"); - base::FilePath offline_page = - reading_list::OfflinePagePath(url, reading_list::OFFLINE_TYPE_HTML); - EXPECT_EQ("0090071ef710946a1263c276284bb3b8/page.html", offline_page.value()); - offline_page = - reading_list::OfflinePagePath(url, reading_list::OFFLINE_TYPE_PDF); - EXPECT_EQ("0090071ef710946a1263c276284bb3b8/file.pdf", offline_page.value()); -}
diff --git a/components/reading_list/ios/reading_list_model_bridge_observer.h b/components/reading_list/ios/reading_list_model_bridge_observer.h index f19e09e..9b34e49 100644 --- a/components/reading_list/ios/reading_list_model_bridge_observer.h +++ b/components/reading_list/ios/reading_list_model_bridge_observer.h
@@ -9,7 +9,7 @@ #import <Foundation/Foundation.h> #include "base/macros.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model_observer.h" // Protocol duplicating all Reading List Model Observer methods in Objective-C. @protocol ReadingListModelBridgeObserver<NSObject>
diff --git a/components/reading_list/ios/reading_list_model_bridge_observer.mm b/components/reading_list/ios/reading_list_model_bridge_observer.mm index 3595d38..f295c7f 100644 --- a/components/reading_list/ios/reading_list_model_bridge_observer.mm +++ b/components/reading_list/ios/reading_list_model_bridge_observer.mm
@@ -4,8 +4,8 @@ #import "components/reading_list/ios/reading_list_model_bridge_observer.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model.h" ReadingListModelBridge::ReadingListModelBridge( id<ReadingListModelBridgeObserver> observer,
diff --git a/components/resources/ntp_tiles_resources.grdp b/components/resources/ntp_tiles_resources.grdp index 750d7d1..7d8d6c0a 100644 --- a/components/resources/ntp_tiles_resources.grdp +++ b/components/resources/ntp_tiles_resources.grdp
@@ -7,14 +7,14 @@ <if expr="_google_chrome"> <then> <include name="IDR_DEFAULT_POPULAR_SITES_JSON" file="../ntp_tiles/resources/internal/default_popular_sites.json" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON0" file="../ntp_tiles/resources/internal/icon0.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON1" file="../ntp_tiles/resources/internal/icon1.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON2" file="../ntp_tiles/resources/internal/icon2.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON3" file="../ntp_tiles/resources/internal/icon3.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON4" file="../ntp_tiles/resources/internal/icon4.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON5" file="../ntp_tiles/resources/internal/icon5.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON6" file="../ntp_tiles/resources/internal/icon6.png" type="BINDATA" /> - <include name="IDR_DEFAULT_POPULAR_SITES_ICON7" file="../ntp_tiles/resources/internal/icon7.png" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON0" file="../ntp_tiles/resources/internal/icon0.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON1" file="../ntp_tiles/resources/internal/icon1.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON2" file="../ntp_tiles/resources/internal/icon2.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON3" file="../ntp_tiles/resources/internal/icon3.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON4" file="../ntp_tiles/resources/internal/icon4.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON5" file="../ntp_tiles/resources/internal/icon5.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON6" file="../ntp_tiles/resources/internal/icon6.webp" type="BINDATA" /> + <include name="IDR_DEFAULT_POPULAR_SITES_ICON7" file="../ntp_tiles/resources/internal/icon7.webp" type="BINDATA" /> </then> <else> <!-- Fall back to a local resource so popular sites can be tested properly. -->
diff --git a/components/sessions/ios/ios_live_tab.mm b/components/sessions/ios/ios_live_tab.mm index b34747a..584b523 100644 --- a/components/sessions/ios/ios_live_tab.mm +++ b/components/sessions/ios/ios_live_tab.mm
@@ -33,7 +33,7 @@ } int IOSLiveTab::GetCurrentEntryIndex() { - return navigation_manager()->GetCurrentItemIndex(); + return navigation_manager()->GetLastCommittedItemIndex(); } int IOSLiveTab::GetPendingEntryIndex() {
diff --git a/components/signin/core/browser/about_signin_internals.cc b/components/signin/core/browser/about_signin_internals.cc index d925e37..c8af763 100644 --- a/components/signin/core/browser/about_signin_internals.cc +++ b/components/signin/core/browser/about_signin_internals.cc
@@ -537,8 +537,6 @@ // A summary of signin related info first. base::ListValue* basic_info = AddSection(signin_info, "Basic Information"); AddSectionEntry(basic_info, "Chrome Version", product_version); - AddSectionEntry(basic_info, "New Profile Management?", - switches::IsNewProfileManagement() == true ? "On" : "Off"); AddSectionEntry(basic_info, "Account Consistency?", switches::IsEnableAccountConsistency() == true ? "On" : "Off"); AddSectionEntry(basic_info, "Signin Status",
diff --git a/components/signin/core/common/profile_management_switches.cc b/components/signin/core/common/profile_management_switches.cc index e9f883c..733ea08 100644 --- a/components/signin/core/common/profile_management_switches.cc +++ b/components/signin/core/common/profile_management_switches.cc
@@ -36,19 +36,11 @@ IsEnableAccountConsistency(); } -bool IsNewProfileManagement() { - return true; -} - bool UsePasswordSeparatedSigninFlow() { return base::FeatureList::IsEnabled( switches::kUsePasswordSeparatedSigninFlow); } -void EnableNewProfileManagementForTesting(base::CommandLine* command_line) { - // No-op as new profile management is always enabled. -} - void EnableAccountConsistencyForTesting(base::CommandLine* command_line) { command_line->AppendSwitch(switches::kEnableAccountConsistency); }
diff --git a/components/signin/core/common/profile_management_switches.h b/components/signin/core/common/profile_management_switches.h index bdfbf275..7ed543d 100644 --- a/components/signin/core/common/profile_management_switches.h +++ b/components/signin/core/common/profile_management_switches.h
@@ -22,15 +22,10 @@ // Whether the chrome.identity API should be multi-account. bool IsExtensionsMultiAccount(); -// Use new profile management system, including profile sign-out and new -// choosers. -bool IsNewProfileManagement(); - // Checks whether the new gaia password separated sign in flow is enabled. bool UsePasswordSeparatedSigninFlow(); -// Called in tests to force enabling different modes. -void EnableNewProfileManagementForTesting(base::CommandLine* command_line); +// Called in tests to force enable account consistency. void EnableAccountConsistencyForTesting(base::CommandLine* command_line); } // namespace switches
diff --git a/components/subresource_filter/core/browser/subresource_filter_features_test_support.cc b/components/subresource_filter/core/browser/subresource_filter_features_test_support.cc index 47ef01a..657e89c 100644 --- a/components/subresource_filter/core/browser/subresource_filter_features_test_support.cc +++ b/components/subresource_filter/core/browser/subresource_filter_features_test_support.cc
@@ -41,8 +41,6 @@ ScopedSubresourceFilterFeatureToggle::ScopedSubresourceFilterFeatureToggle( base::FeatureList::OverrideState feature_state, std::map<std::string, std::string> variation_params) { - variations::testing::ClearAllVariationParams(); - EXPECT_TRUE(variations::AssociateVariationParams( kTestFieldTrialName, kTestExperimentGroupName, variation_params));
diff --git a/components/sync_sessions/fake_sync_sessions_client.cc b/components/sync_sessions/fake_sync_sessions_client.cc index 9bdc821..3ef4ae0 100644 --- a/components/sync_sessions/fake_sync_sessions_client.cc +++ b/components/sync_sessions/fake_sync_sessions_client.cc
@@ -33,8 +33,7 @@ return nullptr; } -std::unique_ptr<LocalSessionEventRouter> -FakeSyncSessionsClient::GetLocalSessionEventRouter() { +LocalSessionEventRouter* FakeSyncSessionsClient::GetLocalSessionEventRouter() { return nullptr; }
diff --git a/components/sync_sessions/fake_sync_sessions_client.h b/components/sync_sessions/fake_sync_sessions_client.h index 7b17f3a..acffdce 100644 --- a/components/sync_sessions/fake_sync_sessions_client.h +++ b/components/sync_sessions/fake_sync_sessions_client.h
@@ -24,8 +24,7 @@ history::HistoryService* GetHistoryService() override; bool ShouldSyncURL(const GURL& url) const override; SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter() override; - std::unique_ptr<LocalSessionEventRouter> GetLocalSessionEventRouter() - override; + LocalSessionEventRouter* GetLocalSessionEventRouter() override; private: DISALLOW_COPY_AND_ASSIGN(FakeSyncSessionsClient);
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc index d61d755..0fba2e8 100644 --- a/components/sync_sessions/sessions_sync_manager.cc +++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -106,7 +106,7 @@ // Ensure that the tab id is not invalid. bool ShouldSyncTabId(SessionID::id_type tab_id) { - if (tab_id == TabNodePool::kInvalidTabID) + if (tab_id == kInvalidTabID) return false; return true; } @@ -119,7 +119,7 @@ sync_sessions::SyncSessionsClient* sessions_client, syncer::SyncPrefs* sync_prefs, LocalDeviceInfoProvider* local_device, - std::unique_ptr<LocalSessionEventRouter> router, + LocalSessionEventRouter* router, const base::Closure& sessions_updated_callback, const base::Closure& datatype_refresh_callback) : sessions_client_(sessions_client), @@ -681,7 +681,7 @@ syncer::SyncChange tombstone(TombstoneTab(specifics)); if (tombstone.IsValid()) new_changes->push_back(tombstone); - } else if (specifics.tab().tab_id() == TabNodePool::kInvalidTabID) { + } else if (specifics.tab().tab_id() == kInvalidTabID) { LOG(WARNING) << "Found tab node with invalid tab id."; syncer::SyncChange tombstone(TombstoneTab(specifics)); if (tombstone.IsValid())
diff --git a/components/sync_sessions/sessions_sync_manager.h b/components/sync_sessions/sessions_sync_manager.h index d685c65..2513fc7 100644 --- a/components/sync_sessions/sessions_sync_manager.h +++ b/components/sync_sessions/sessions_sync_manager.h
@@ -62,7 +62,7 @@ SessionsSyncManager(SyncSessionsClient* sessions_client, syncer::SyncPrefs* sync_prefs, syncer::LocalDeviceInfoProvider* local_device, - std::unique_ptr<LocalSessionEventRouter> router, + LocalSessionEventRouter* router, const base::Closure& sessions_updated_callback, const base::Closure& datatype_refresh_callback); ~SessionsSyncManager() override; @@ -309,7 +309,7 @@ // stale and a candidate for garbage collection. int stale_session_threshold_days_; - std::unique_ptr<LocalSessionEventRouter> local_event_router_; + LocalSessionEventRouter* local_event_router_; // Owns revisiting instrumentation logic for page visit events. PageRevisitBroadcaster page_revisit_broadcaster_;
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc index ab5cbfd..bc6e56d 100644 --- a/components/sync_sessions/sessions_sync_manager_unittest.cc +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -211,6 +211,8 @@ return http_count > 0; } + SessionID::id_type GetSourceTabID() const override { return kInvalidTabID; } + void AppendEntry(std::unique_ptr<sessions::SerializedNavigationEntry> entry) { entries_.push_back(std::move(entry)); } @@ -322,6 +324,8 @@ return false; } + SessionID::id_type GetSourceTabID() const override { return kInvalidTabID; } + private: SessionID::id_type session_id_; int sync_id_; @@ -370,7 +374,7 @@ SessionID::id_type GetTabIdAt(int index) const override { SyncedTabDelegate* delegate = GetTabAt(index); if (!delegate) - return TabNodePool::kInvalidTabID; + return kInvalidTabID; return delegate->GetSessionId(); } @@ -512,9 +516,10 @@ base::MakeUnique<SyncSessionsClientShim>(&window_getter_); sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(sync_client_->GetPrefService()); + router_ = base::MakeUnique<DummyRouter>(); manager_ = base::MakeUnique<SessionsSyncManager>( sessions_client_shim(), sync_prefs_.get(), local_device_.get(), - std::unique_ptr<LocalSessionEventRouter>(NewDummyRouter()), + router_.get(), base::Bind(&SessionNotificationObserver::NotifyOfUpdate, base::Unretained(&observer_)), base::Bind(&SessionNotificationObserver::NotifyOfRefresh, @@ -546,12 +551,6 @@ } SyncedWindowDelegatesGetter* window_getter() { return &window_getter_; } - std::unique_ptr<LocalSessionEventRouter> NewDummyRouter() { - std::unique_ptr<DummyRouter> router(new DummyRouter()); - router_ = router.get(); - return std::unique_ptr<LocalSessionEventRouter>(std::move(router)); - } - void InitWithSyncDataTakeOutput(const SyncDataList& initial_data, SyncChangeList* output) { test_processor_ = new TestSyncChangeProcessor(output); @@ -728,7 +727,7 @@ std::unique_ptr<SyncSessionsClientShim> sessions_client_shim_; std::unique_ptr<syncer::SyncPrefs> sync_prefs_; SessionNotificationObserver observer_; - DummyRouter* router_ = nullptr; + std::unique_ptr<DummyRouter> router_; std::unique_ptr<SessionsSyncManager> manager_; SessionSyncTestHelper helper_; TestSyncChangeProcessor* test_processor_ = nullptr;
diff --git a/components/sync_sessions/sync_sessions_client.h b/components/sync_sessions/sync_sessions_client.h index fab928f..e8b4874 100644 --- a/components/sync_sessions/sync_sessions_client.h +++ b/components/sync_sessions/sync_sessions_client.h
@@ -52,8 +52,7 @@ // Returns a LocalSessionEventRouter instance that is customized for the // embedder's context. - virtual std::unique_ptr<LocalSessionEventRouter> - GetLocalSessionEventRouter() = 0; + virtual LocalSessionEventRouter* GetLocalSessionEventRouter() = 0; // TODO(zea): add getters for the history and favicon services for the favicon // cache to consume once it's componentized.
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index 87ee848..491850d6 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -10,7 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" #include "components/sync_sessions/sync_sessions_client.h" - +#include "components/sync_sessions/synced_tab_delegate.h" namespace sync_sessions { namespace { @@ -92,7 +92,7 @@ const std::string& tag, SessionID::id_type tab_id, const sessions::SessionTab** tab) const { - if (tab_id == TabNodePool::kInvalidTabID) + if (tab_id == kInvalidTabID) return false; DCHECK(tab); @@ -382,15 +382,14 @@ bool SyncedSessionTracker::IsLocalTabNodeAssociated(int tab_node_id) { if (tab_node_id == TabNodePool::kInvalidTabNodeID) return false; - return local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id) != - TabNodePool::kInvalidTabID; + return local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id) != kInvalidTabID; } void SyncedSessionTracker::ReassociateLocalTab(int tab_node_id, SessionID::id_type new_tab_id) { DCHECK(!local_session_tag_.empty()); DCHECK_NE(TabNodePool::kInvalidTabNodeID, tab_node_id); - DCHECK_NE(TabNodePool::kInvalidTabID, new_tab_id); + DCHECK_NE(kInvalidTabID, new_tab_id); SessionID::id_type old_tab_id = local_tab_pool_.GetTabIdFromTabNodeId(tab_node_id); @@ -399,7 +398,7 @@ sessions::SessionTab* tab_ptr = nullptr; auto old_tab_iter = synced_tab_map_[local_session_tag_].find(old_tab_id); - if (old_tab_id != TabNodePool::kInvalidTabID && + if (old_tab_id != kInvalidTabID && old_tab_iter != synced_tab_map_[local_session_tag_].end()) { tab_ptr = old_tab_iter->second; // Remove the tab from the synced tab map under the old id. @@ -412,7 +411,7 @@ // If the old tab is unmapped, update the tab id under which it is indexed. auto unmapped_tabs_iter = unmapped_tabs_[local_session_tag_].find(old_tab_id); - if (old_tab_id != TabNodePool::kInvalidTabID && + if (old_tab_id != kInvalidTabID && unmapped_tabs_iter != unmapped_tabs_[local_session_tag_].end()) { std::unique_ptr<sessions::SessionTab> tab = std::move(unmapped_tabs_iter->second); @@ -422,7 +421,7 @@ } // Update the tab id. - if (old_tab_id != TabNodePool::kInvalidTabID) { + if (old_tab_id != kInvalidTabID) { DVLOG(1) << "Remapped tab " << old_tab_id << " with node " << tab_node_id << " to tab " << new_tab_id; } else {
diff --git a/components/sync_sessions/synced_session_tracker_unittest.cc b/components/sync_sessions/synced_session_tracker_unittest.cc index 0728a369..6728e1d 100644 --- a/components/sync_sessions/synced_session_tracker_unittest.cc +++ b/components/sync_sessions/synced_session_tracker_unittest.cc
@@ -9,6 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sync_sessions/fake_sync_sessions_client.h" +#include "components/sync_sessions/synced_tab_delegate.h" #include "testing/gtest/include/gtest/gtest.h" namespace sync_sessions { @@ -124,8 +125,7 @@ TEST_F(SyncedSessionTrackerTest, LookupSessionTab) { const sessions::SessionTab* tab; - ASSERT_FALSE( - GetTracker()->LookupSessionTab(kTag, TabNodePool::kInvalidTabID, &tab)); + ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, kInvalidTabID, &tab)); ASSERT_FALSE(GetTracker()->LookupSessionTab(kTag, 5, &tab)); GetTracker()->GetSession(kTag); GetTracker()->PutWindowInSession(kTag, 0);
diff --git a/components/sync_sessions/synced_tab_delegate.h b/components/sync_sessions/synced_tab_delegate.h index 9781578..c69de875 100644 --- a/components/sync_sessions/synced_tab_delegate.h +++ b/components/sync_sessions/synced_tab_delegate.h
@@ -20,6 +20,8 @@ namespace sync_sessions { +enum InvalidTab { kInvalidTabID = -1 }; + // A SyncedTabDelegate is used to insulate the sync code from depending // directly on WebContents, NavigationController, and the extensions TabHelper. class SyncedTabDelegate { @@ -31,6 +33,10 @@ virtual SessionID::id_type GetSessionId() const = 0; virtual bool IsBeingDestroyed() const = 0; + // Get the tab id of the tab responsible for opening this tab, if applicable. + // Returns kUnknownTabID(-1) if no such tab relationship is known. + virtual SessionID::id_type GetSourceTabID() const = 0; + // Method derived from extensions TabHelper. virtual std::string GetExtensionAppId() const = 0;
diff --git a/components/sync_sessions/tab_node_pool.cc b/components/sync_sessions/tab_node_pool.cc index f187d23d..1b4c1f88 100644 --- a/components/sync_sessions/tab_node_pool.cc +++ b/components/sync_sessions/tab_node_pool.cc
@@ -10,6 +10,7 @@ #include "components/sync/base/model_type.h" #include "components/sync/protocol/session_specifics.pb.h" #include "components/sync/protocol/sync.pb.h" +#include "components/sync_sessions/synced_tab_delegate.h" namespace sync_sessions {
diff --git a/components/sync_sessions/tab_node_pool.h b/components/sync_sessions/tab_node_pool.h index 365edc46..84f2c34 100644 --- a/components/sync_sessions/tab_node_pool.h +++ b/components/sync_sessions/tab_node_pool.h
@@ -32,7 +32,6 @@ public: TabNodePool(); ~TabNodePool(); - enum InvalidTab { kInvalidTabID = -1 }; // If free nodes > kFreeNodesHighWatermark, delete all free nodes until // free nodes <= kFreeNodesLowWatermark.
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn index 6608413..8b0bd09 100644 --- a/components/tracing/BUILD.gn +++ b/components/tracing/BUILD.gn
@@ -99,6 +99,7 @@ "core/trace_buffer_writer_unittest.cc", "core/trace_ring_buffer_unittest.cc", "test/fake_scattered_buffer.cc", + "test/fake_scattered_buffer.h", "test/proto_zero_generation_unittest.cc", ]
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn index e35d4f4..14d1274 100644 --- a/components/update_client/BUILD.gn +++ b/components/update_client/BUILD.gn
@@ -122,6 +122,7 @@ testonly = true sources = [ "component_patcher_unittest.cc", + "component_patcher_unittest.h", "component_unpacker_unittest.cc", "persisted_data_unittest.cc", "ping_manager_unittest.cc",
diff --git a/components/url_formatter/url_formatter.cc b/components/url_formatter/url_formatter.cc index a93bf11..3d5740f 100644 --- a/components/url_formatter/url_formatter.cc +++ b/components/url_formatter/url_formatter.cc
@@ -15,6 +15,7 @@ #include "base/strings/utf_offset_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_local_storage.h" +#include "third_party/icu/source/common/unicode/schriter.h" #include "third_party/icu/source/common/unicode/uidna.h" #include "third_party/icu/source/common/unicode/uniset.h" #include "third_party/icu/source/common/unicode/uscript.h" @@ -33,6 +34,7 @@ base::OffsetAdjuster::Adjustments* adjustments); bool IDNToUnicodeOneComponent(const base::char16* comp, size_t comp_len, + bool is_tld_ascii, base::string16* out); class AppendComponentTransform { @@ -200,6 +202,13 @@ input16.reserve(host.length()); input16.insert(input16.end(), host.begin(), host.end()); + bool is_tld_ascii = true; + size_t last_dot = host.rfind('.'); + if (last_dot != base::StringPiece::npos && + host.substr(last_dot).starts_with(".xn--")) { + is_tld_ascii = false; + } + // Do each component of the host separately, since we enforce script matching // on a per-component basis. base::string16 out16; @@ -217,7 +226,7 @@ // Add the substring that we just found. converted_idn = IDNToUnicodeOneComponent(input16.data() + component_start, - component_length, &out16); + component_length, is_tld_ascii, &out16); } size_t new_component_length = out16.length() - new_component_start; @@ -241,17 +250,22 @@ public: IDNSpoofChecker(); - // Returns true if |label| is safe to display as Unicode. In the event of - // library failure, all IDN inputs will be treated as unsafe. - bool Check(base::StringPiece16 label); + // Returns true if |label| is safe to display as Unicode. When the TLD is + // ASCII, check if a label is entirely made of Cyrillic letters that look like + // Latin letters. In the event of library failure, all IDN inputs will be + // treated as unsafe. + bool Check(base::StringPiece16 label, bool is_tld_ascii); private: void SetAllowedUnicodeSet(UErrorCode* status); + bool IsMadeOfLatinAlikeCyrillic(const icu::UnicodeString& label_string); USpoofChecker* checker_; icu::UnicodeSet deviation_characters_; icu::UnicodeSet non_ascii_latin_letters_; icu::UnicodeSet kana_letters_exceptions_; + icu::UnicodeSet cyrillic_letters_; + icu::UnicodeSet cyrillic_letters_latin_alike_; DISALLOW_COPY_AND_ASSIGN(IDNSpoofChecker); }; @@ -314,10 +328,20 @@ "[\\u3078-\\u307a\\u30d8-\\u30da\\u30fb\\u30fc]"), status); kana_letters_exceptions_.freeze(); + // These Cyrillic letters look like Latin. A domain label entirely made of + // these letters is blocked as a simpliified whole-script-spoofable. + cyrillic_letters_latin_alike_ = + icu::UnicodeSet(icu::UnicodeString("[асԁеһіјӏорԛѕԝхуъЬҽпгѵѡ]"), status); + cyrillic_letters_latin_alike_.freeze(); + + cyrillic_letters_ = + icu::UnicodeSet(UNICODE_STRING_SIMPLE("[[:Cyrl:]]"), status); + cyrillic_letters_.freeze(); + DCHECK(U_SUCCESS(status)); } -bool IDNSpoofChecker::Check(base::StringPiece16 label) { +bool IDNSpoofChecker::Check(base::StringPiece16 label, bool is_tld_ascii) { UErrorCode status = U_ZERO_ERROR; int32_t result = uspoof_check(checker_, label.data(), base::checked_cast<int32_t>(label.size()), @@ -345,17 +369,19 @@ return false; // If there's no script mixing, the input is regarded as safe without any - // extra check unless it contains Kana letter exceptions. Note that - // the following combinations of scripts are treated as a 'logical' single - // script. + // extra check unless it contains Kana letter exceptions or it's made entirely + // of Cyrillic letters that look like Latin letters. Note that the following + // combinations of scripts are treated as a 'logical' single script. // - Chinese: Han, Bopomofo, Common // - Japanese: Han, Hiragana, Katakana, Common // - Korean: Hangul, Han, Common result &= USPOOF_RESTRICTION_LEVEL_MASK; - if (result == USPOOF_ASCII || - (result == USPOOF_SINGLE_SCRIPT_RESTRICTIVE && - kana_letters_exceptions_.containsNone(label_string))) - return true; + if (result == USPOOF_ASCII) return true; + if (result == USPOOF_SINGLE_SCRIPT_RESTRICTIVE && + kana_letters_exceptions_.containsNone(label_string)) { + // Check Cyrillic confusable only for ASCII TLDs. + return !is_tld_ascii || !IsMadeOfLatinAlikeCyrillic(label_string); + } // Additional checks for |label| with multiple scripts, one of which is Latin. // Disallow non-ASCII Latin letters to mix with a non-Latin script. @@ -407,6 +433,25 @@ return !dangerous_pattern->find(); } +bool IDNSpoofChecker::IsMadeOfLatinAlikeCyrillic( + const icu::UnicodeString& label_string) { + // Collect all the Cyrillic letters in |label_string| and see if they're + // a subset of |cyrillic_letters_latin_alike_|. + // A shortcut of defining cyrillic_letters_latin_alike_ to include [0-9] and + // [_-] and checking if the set contains all letters of |label_string| + // would work in most cases, but not if a label has non-letters outside + // ASCII. + icu::UnicodeSet cyrillic_in_label; + icu::StringCharacterIterator it(label_string); + for (it.setToStart(); it.hasNext();) { + const UChar32 c = it.next32PostInc(); + if (cyrillic_letters_.contains(c)) + cyrillic_in_label.add(c); + } + return !cyrillic_in_label.isEmpty() && + cyrillic_letters_latin_alike_.containsAll(cyrillic_in_label); +} + void IDNSpoofChecker::SetAllowedUnicodeSet(UErrorCode* status) { if (U_FAILURE(*status)) return; @@ -481,8 +526,8 @@ // user. Note that this function does not deal with pure ASCII domain labels at // all even though it's possible to make up look-alike labels with ASCII // characters alone. -bool IsIDNComponentSafe(base::StringPiece16 label) { - return g_idn_spoof_checker.Get().Check(label); +bool IsIDNComponentSafe(base::StringPiece16 label, bool is_tld_ascii) { + return g_idn_spoof_checker.Get().Check(label, is_tld_ascii); } // A wrapper to use LazyInstance<>::Leaky with ICU's UIDNA, a C pointer to @@ -527,6 +572,7 @@ // Returns whether any conversion was performed. bool IDNToUnicodeOneComponent(const base::char16* comp, size_t comp_len, + bool is_tld_ascii, base::string16* out) { DCHECK(out); if (comp_len == 0) @@ -558,8 +604,9 @@ // can be safely displayed to the user. out->resize(original_length + output_length); if (IsIDNComponentSafe( - base::StringPiece16(out->data() + original_length, - base::checked_cast<size_t>(output_length)))) + base::StringPiece16(out->data() + original_length, + base::checked_cast<size_t>(output_length)), + is_tld_ascii)) return true; }
diff --git a/components/url_formatter/url_formatter_unittest.cc b/components/url_formatter/url_formatter_unittest.cc index c0fe950..5b2646c 100644 --- a/components/url_formatter/url_formatter_unittest.cc +++ b/components/url_formatter/url_formatter_unittest.cc
@@ -32,6 +32,7 @@ const bool unicode_allowed; }; +// TODO(jshin): Replace L"..." with "..." in UTF-8 when it's easier to read. const IDNTestCase idn_cases[] = { // No IDN {"www.google.com", L"www.google.com", true}, @@ -209,6 +210,35 @@ // U+30FB + Latin {"xn--abc-os4b.jp", L"\x30fb" L"abc.jp", false}, + // Cyrillic labels made of Latin-look-alike Cyrillic letters. + // ѕсоре.com with ѕсоре in Cyrillic + {"xn--e1argc3h.com", L"\x0455\x0441\x043e\x0440\x0435.com", false}, + // ѕсоре123.com with ѕсоре in Cyrillic. + {"xn--123-qdd8bmf3n.com", + L"\x0455\x0441\x043e\x0440\x0435" L"123.com", false}, + // ѕсоре-рау.com with ѕсоре and рау in Cyrillic. + {"xn----8sbn9akccw8m.com", + L"\x0455\x0441\x043e\x0440\x0435-\x0440\x0430\x0443.com", false}, + // ѕсоре·рау.com with scope and pay in Cyrillic and U+00B7 between them. + {"xn--uba29ona9akccw8m.com", + L"\x0455\x0441\x043e\x0440\x0435\u00b7\x0440\x0430\x0443.com", false}, + + // The same as above three, but in IDN TLD. + {"xn--e1argc3h.xn--p1ai", + L"\x0455\x0441\x043e\x0440\x0435.\x0440\x0444", true}, + {"xn--123-qdd8bmf3n.xn--p1ai", + L"\x0455\x0441\x043e\x0440\x0435" L"123.\x0440\x0444", true}, + {"xn--uba29ona9akccw8m.xn--p1ai", + L"\x0455\x0441\x043e\x0440\x0435\u00b7\x0440\x0430\x0443.\x0440\x0444", + true}, + + // ѕсоре-рау.한국 with ѕсоре and рау in Cyrillic. + {"xn----8sbn9akccw8m.xn--3e0b707e", + L"\x0455\x0441\x043e\x0440\x0435-\x0440\x0430\x0443.\xd55c\xad6d", true}, + + // музей (museum in Russian) has characters without a Latin-look-alike. + {"xn--e1adhj9a.com", L"\x043c\x0443\x0437\x0435\x0439.com", true}, + // Mixed digits: the first two will also fail mixed script test // Latin + ASCII digit + Deva digit {"xn--asc1deva-j0q.co.in", L"asc1deva\x0967.co.in", false},
diff --git a/components/variations/metrics_util.cc b/components/variations/metrics_util.cc index 52fa0be0..e6e713c 100644 --- a/components/variations/metrics_util.cc +++ b/components/variations/metrics_util.cc
@@ -11,13 +11,12 @@ namespace metrics { -uint32_t HashName(const std::string& name) { +uint32_t HashName(base::StringPiece name) { // SHA-1 is designed to produce a uniformly random spread in its output space, // even for nearly-identical inputs. unsigned char sha1_hash[base::kSHA1Length]; - base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(name.c_str()), - name.size(), - sha1_hash); + base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(name.data()), + name.size(), sha1_hash); uint32_t bits; static_assert(sizeof(bits) < sizeof(sha1_hash), "more data required");
diff --git a/components/variations/metrics_util.h b/components/variations/metrics_util.h index 823fcd7..0a03fd43 100644 --- a/components/variations/metrics_util.h +++ b/components/variations/metrics_util.h
@@ -7,14 +7,13 @@ #include <stdint.h> -#include <string> - +#include "base/strings/string_piece.h" namespace metrics { // Computes a uint32_t hash of a given string based on its SHA1 hash. Suitable // for uniquely identifying field trial names and group names. -uint32_t HashName(const std::string& name); +uint32_t HashName(base::StringPiece name); } // namespace metrics
diff --git a/content/app/DEPS b/content/app/DEPS index bdeee41..7027510 100644 --- a/content/app/DEPS +++ b/content/app/DEPS
@@ -1,7 +1,6 @@ include_rules = [ "+components/tracing", "+content", - "+device/battery", "+device/bluetooth", "+device/gamepad", "+device/generic_sensor",
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index a41124a..30e1be6 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -67,8 +67,6 @@ "//content/common:mojo_bindings", "//content/public/common:common_sources", "//crypto", - "//device/battery", - "//device/battery:mojo_bindings", "//device/bluetooth", "//device/gamepad", "//device/generic_sensor", @@ -1840,7 +1838,6 @@ "tracing/tracing_ui.cc", "tracing/tracing_ui.h", ] - deps -= [ "//device/battery" ] deps += [ "//content/public/android:jni", "//media",
diff --git a/content/browser/DEPS b/content/browser/DEPS index 241ea31c..68e196b 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -16,7 +16,6 @@ "+content/app/strings/grit", # For generated headers "+content/public/browser", - "+device/battery", # For battery status service. "+device/gamepad", # For gamepad API "+device/generic_sensor", # For sensors service. "+device/geolocation",
diff --git a/content/browser/accessibility/ax_platform_position.cc b/content/browser/accessibility/ax_platform_position.cc index cecd16b1..34d3139 100644 --- a/content/browser/accessibility/ax_platform_position.cc +++ b/content/browser/accessibility/ax_platform_position.cc
@@ -69,13 +69,13 @@ DCHECK(tree_id); DCHECK(parent_id); - if (!GetAnchor() || !GetAnchor()->GetParent()) { + if (!GetAnchor() || !GetAnchor()->PlatformGetParent()) { *tree_id = AXPosition::INVALID_TREE_ID; *parent_id = AXPosition::INVALID_ANCHOR_ID; return; } - BrowserAccessibility* parent = GetAnchor()->GetParent(); + BrowserAccessibility* parent = GetAnchor()->PlatformGetParent(); *tree_id = parent->manager()->ax_tree_id(); *parent_id = parent->GetId(); }
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 7a02b3af8..0584256 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -99,7 +99,7 @@ BrowserAccessibilityManager* child_manager = BrowserAccessibilityManager::FromID( GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)); - if (child_manager && child_manager->GetRoot()->GetParent() == this) + if (child_manager && child_manager->GetRoot()->PlatformGetParent() == this) return 1; return 0; @@ -120,8 +120,8 @@ if (this == ancestor) return true; - if (GetParent()) - return GetParent()->IsDescendantOf(ancestor); + if (PlatformGetParent()) + return PlatformGetParent()->IsDescendantOf(ancestor); return false; } @@ -134,8 +134,8 @@ bool BrowserAccessibility::IsLineBreakObject() const { return GetRole() == ui::AX_ROLE_LINE_BREAK || - (IsTextOnlyObject() && GetParent() && - GetParent()->GetRole() == ui::AX_ROLE_LINE_BREAK); + (IsTextOnlyObject() && PlatformGetParent() && + PlatformGetParent()->GetRole() == ui::AX_ROLE_LINE_BREAK); } BrowserAccessibility* BrowserAccessibility::PlatformGetChild( @@ -146,7 +146,7 @@ BrowserAccessibilityManager* child_manager = BrowserAccessibilityManager::FromID( GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)); - if (child_manager && child_manager->GetRoot()->GetParent() == this) + if (child_manager && child_manager->GetRoot()->PlatformGetParent() == this) result = child_manager->GetRoot(); } else { result = InternalGetChild(child_index); @@ -177,18 +177,17 @@ } BrowserAccessibility* BrowserAccessibility::GetPreviousSibling() const { - if (GetParent() && GetIndexInParent() > 0) - return GetParent()->InternalGetChild(GetIndexInParent() - 1); + if (PlatformGetParent() && GetIndexInParent() > 0) + return PlatformGetParent()->InternalGetChild(GetIndexInParent() - 1); return nullptr; } BrowserAccessibility* BrowserAccessibility::GetNextSibling() const { - if (GetParent() && - GetIndexInParent() >= 0 && - GetIndexInParent() < static_cast<int>( - GetParent()->InternalChildCount() - 1)) { - return GetParent()->InternalGetChild(GetIndexInParent() + 1); + if (PlatformGetParent() && GetIndexInParent() >= 0 && + GetIndexInParent() < + static_cast<int>(PlatformGetParent()->InternalChildCount() - 1)) { + return PlatformGetParent()->InternalGetChild(GetIndexInParent() + 1); } return nullptr; @@ -307,7 +306,7 @@ return manager_->GetFromAXNode(child_node); } -BrowserAccessibility* BrowserAccessibility::GetParent() const { +BrowserAccessibility* BrowserAccessibility::PlatformGetParent() const { if (!instance_active()) return nullptr; @@ -828,7 +827,8 @@ if (GetData().HasStringAttribute(attribute)) return true; - return GetParent() && GetParent()->HasInheritedStringAttribute(attribute); + return PlatformGetParent() && + PlatformGetParent()->HasInheritedStringAttribute(attribute); } const std::string& BrowserAccessibility::GetInheritedStringAttribute( @@ -840,7 +840,7 @@ do { if (current_object->GetData().HasStringAttribute(attribute)) return current_object->GetData().GetStringAttribute(attribute); - current_object = current_object->GetParent(); + current_object = current_object->PlatformGetParent(); } while (current_object); return base::EmptyString(); } @@ -855,8 +855,8 @@ if (GetData().GetStringAttribute(attribute, value)) return true; - return GetParent() && - GetParent()->GetData().GetStringAttribute(attribute, value); + return PlatformGetParent() && + PlatformGetParent()->GetData().GetStringAttribute(attribute, value); } base::string16 BrowserAccessibility::GetInheritedString16Attribute( @@ -868,7 +868,7 @@ do { if (current_object->GetData().HasStringAttribute(attribute)) return current_object->GetData().GetString16Attribute(attribute); - current_object = current_object->GetParent(); + current_object = current_object->PlatformGetParent(); } while (current_object); return base::string16(); } @@ -883,8 +883,8 @@ if (GetData().GetString16Attribute(attribute, value)) return true; - return GetParent() && - GetParent()->GetData().GetString16Attribute(attribute, value); + return PlatformGetParent() && + PlatformGetParent()->GetData().GetString16Attribute(attribute, value); } bool BrowserAccessibility::HasIntAttribute( @@ -1018,7 +1018,7 @@ return false; } - BrowserAccessibility* parent = GetParent(); + BrowserAccessibility* parent = PlatformGetParent(); if (!parent) return false; @@ -1109,7 +1109,8 @@ // Indicates if this object is at the root of a rich edit text control. bool BrowserAccessibility::IsRichTextControl() const { return HasState(ui::AX_STATE_RICHLY_EDITABLE) && - (!GetParent() || !GetParent()->HasState(ui::AX_STATE_RICHLY_EDITABLE)); + (!PlatformGetParent() || + !PlatformGetParent()->HasState(ui::AX_STATE_RICHLY_EDITABLE)); } std::string BrowserAccessibility::ComputeAccessibleNameFromDescendants() { @@ -1194,7 +1195,7 @@ node->manager()->GetFromID(node->GetData().offset_container_id); if (!container) { if (node == node->manager()->GetRoot() && !frame_only) { - container = node->GetParent(); + container = node->PlatformGetParent(); } else { container = node->manager()->GetRoot(); } @@ -1207,7 +1208,7 @@ bounds.Offset(container_bounds.x(), container_bounds.y()); if (container->manager()->UseRootScrollOffsetsWhenComputingBounds() || - container->GetParent()) { + container->PlatformGetParent()) { int sx = 0; int sy = 0; if (container->GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) &&
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index 8334569e..3d34edf8 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -232,7 +232,7 @@ BrowserAccessibility* InternalGetChild(uint32_t child_index) const; BrowserAccessibility* InternalGetParent() const; - BrowserAccessibility* GetParent() const; + BrowserAccessibility* PlatformGetParent() const; int32_t GetIndexInParent() const; int32_t GetId() const;
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index 1fa290f..1d08a5f 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -214,7 +214,8 @@ // only mark it as focusable if the element has an explicit name. // Otherwise mark it as not focusable to avoid the user landing on // empty container elements in the tree. - if (IsIframe() || (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && GetParent())) + if (IsIframe() || + (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && PlatformGetParent())) return HasStringAttribute(ui::AX_ATTR_NAME); return HasState(ui::AX_STATE_FOCUSABLE); @@ -226,7 +227,7 @@ bool BrowserAccessibilityAndroid::IsHeading() const { BrowserAccessibilityAndroid* parent = - static_cast<BrowserAccessibilityAndroid*>(GetParent()); + static_cast<BrowserAccessibilityAndroid*>(PlatformGetParent()); if (parent && parent->IsHeading()) return true; @@ -382,7 +383,7 @@ class_name = ui::kAXDialogClassname; break; case ui::AX_ROLE_ROOT_WEB_AREA: - if (GetParent() == nullptr) + if (PlatformGetParent() == nullptr) class_name = ui::kAXWebViewClassname; else class_name = ui::kAXViewClassname; @@ -1045,19 +1046,19 @@ // Figure out the bounding box of the visible portion of this scrollable // view so we know how much to scroll by. gfx::Rect bounds; - if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && !GetParent()) { + if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && !PlatformGetParent()) { // If this is the root web area, use the bounds of the view to determine // how big one page is. if (!manager()->delegate()) return false; bounds = manager()->delegate()->AccessibilityGetViewBounds(); - } else if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && GetParent()) { + } else if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA && PlatformGetParent()) { // If this is a web area inside of an iframe, try to use the bounds of // the containing element. - BrowserAccessibility* parent = GetParent(); + BrowserAccessibility* parent = PlatformGetParent(); while (parent && (parent->GetPageBoundsRect().width() == 0 || parent->GetPageBoundsRect().height() == 0)) { - parent = parent->GetParent(); + parent = parent->PlatformGetParent(); } if (parent) bounds = parent->GetPageBoundsRect();
diff --git a/content/browser/accessibility/browser_accessibility_auralinux.cc b/content/browser/accessibility/browser_accessibility_auralinux.cc index c990120..0a1cf53c 100644 --- a/content/browser/accessibility/browser_accessibility_auralinux.cc +++ b/content/browser/accessibility/browser_accessibility_auralinux.cc
@@ -489,8 +489,9 @@ ToBrowserAccessibilityAuraLinux(atk_object); if (!obj) return NULL; - if (obj->GetParent()) - return ToBrowserAccessibilityAuraLinux(obj->GetParent())->GetAtkObject(); + if (obj->PlatformGetParent()) + return ToBrowserAccessibilityAuraLinux(obj->PlatformGetParent()) + ->GetAtkObject(); BrowserAccessibilityManagerAuraLinux* manager = static_cast<BrowserAccessibilityManagerAuraLinux*>(obj->manager()); @@ -784,10 +785,10 @@ if (!atk_object_) { interface_mask_ = GetInterfaceMaskFromObject(this); atk_object_ = ATK_OBJECT(browser_accessibility_new(this)); - if (this->GetParent()) { - atk_object_set_parent( - atk_object_, - ToBrowserAccessibilityAuraLinux(this->GetParent())->GetAtkObject()); + if (this->PlatformGetParent()) { + atk_object_set_parent(atk_object_, ToBrowserAccessibilityAuraLinux( + this->PlatformGetParent()) + ->GetAtkObject()); } } }
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index c3fde96..89fe4d98 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -770,8 +770,8 @@ if (![self isIgnored]) { children_.reset(); } else { - [ToBrowserAccessibilityCocoa(browserAccessibility_->GetParent()) - childrenChanged]; + [ToBrowserAccessibilityCocoa(browserAccessibility_->PlatformGetParent()) + childrenChanged]; } } @@ -1243,9 +1243,9 @@ if (![self instanceActive]) return nil; // A nil parent means we're the root. - if (browserAccessibility_->GetParent()) { - return NSAccessibilityUnignoredAncestor( - ToBrowserAccessibilityCocoa(browserAccessibility_->GetParent())); + if (browserAccessibility_->PlatformGetParent()) { + return NSAccessibilityUnignoredAncestor(ToBrowserAccessibilityCocoa( + browserAccessibility_->PlatformGetParent())); } else { // Hook back up to RenderWidgetHostViewCocoa. BrowserAccessibilityManagerMac* manager = @@ -2417,7 +2417,7 @@ if (!child) return nil; - if (child->GetParent() != browserAccessibility_) + if (child->PlatformGetParent() != browserAccessibility_) return nil; return @(child->GetIndexInParent()); @@ -2648,10 +2648,10 @@ NSAccessibilityDisclosedRowsAttribute ]]; } else if ([role isEqualToString:NSAccessibilityRowRole]) { - if (browserAccessibility_->GetParent()) { + if (browserAccessibility_->PlatformGetParent()) { base::string16 parentRole; - browserAccessibility_->GetParent()->GetHtmlAttribute( - "role", &parentRole); + browserAccessibility_->PlatformGetParent()->GetHtmlAttribute("role", + &parentRole); const base::string16 treegridRole(base::ASCIIToUTF16("treegrid")); if (parentRole == treegridRole) { [ret addObjectsFromArray:@[
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index b5a9a587..fe01c59 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -754,7 +754,7 @@ if (sibling) return sibling; - object = object->GetParent(); + object = object->PlatformGetParent(); } return nullptr; @@ -769,7 +769,7 @@ BrowserAccessibility* sibling = object->GetPreviousSibling(); if (!sibling) - return object->GetParent(); + return object->PlatformGetParent(); if (sibling->PlatformChildCount()) return sibling->PlatformDeepestLastChild(); @@ -809,7 +809,7 @@ auto* ancestor2 = const_cast<BrowserAccessibility*>(&object2); do { *child_index1 = ancestor1->GetIndexInParent(); - ancestor1 = ancestor1->GetParent(); + ancestor1 = ancestor1->PlatformGetParent(); } while ( ancestor1 && // |BrowserAccessibility::IsAncestorOf| returns true if objects are equal. @@ -824,7 +824,7 @@ do { *child_index2 = ancestor2->GetIndexInParent(); - ancestor2 = ancestor2->GetParent(); + ancestor2 = ancestor2->PlatformGetParent(); } while (ancestor1 != ancestor2); *common_parent = ancestor1; @@ -1252,11 +1252,11 @@ BrowserAccessibility* hit_test_result) { // Walk up to the highest ancestor that's a leaf node; we don't want to // return a node that's hidden from the tree. - BrowserAccessibility* parent = hit_test_result->GetParent(); + BrowserAccessibility* parent = hit_test_result->PlatformGetParent(); while (parent) { if (parent->PlatformChildCount() == 0) hit_test_result = parent; - parent = parent->GetParent(); + parent = parent->PlatformGetParent(); } last_hover_ax_tree_id_ = hit_test_result->manager()->ax_tree_id();
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index dd398a4e..5023824 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -404,9 +404,9 @@ if (!node) return false; - if (node->GetParent()) { + if (node->PlatformGetParent()) { Java_BrowserAccessibilityManager_setAccessibilityNodeInfoParent( - env, obj, info, node->GetParent()->unique_id()); + env, obj, info, node->PlatformGetParent()->unique_id()); } for (unsigned i = 0; i < node->PlatformChildCount(); ++i) { Java_BrowserAccessibilityManager_addAccessibilityNodeInfoChild( @@ -458,11 +458,11 @@ gfx::Rect absolute_rect = node->GetPageBoundsRect(); gfx::Rect parent_relative_rect = absolute_rect; - if (node->GetParent()) { - gfx::Rect parent_rect = node->GetParent()->GetPageBoundsRect(); + if (node->PlatformGetParent()) { + gfx::Rect parent_rect = node->PlatformGetParent()->GetPageBoundsRect(); parent_relative_rect.Offset(-parent_rect.OffsetFromOrigin()); } - bool is_root = node->GetParent() == NULL; + bool is_root = node->PlatformGetParent() == NULL; Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLocation( env, obj, info, id, @@ -728,7 +728,7 @@ // find an interesting parent. while (android_node && !android_node->IsInterestingOnAndroid()) { android_node = static_cast<BrowserAccessibilityAndroid*>( - android_node->GetParent()); + android_node->PlatformGetParent()); } if (android_node) {
diff --git a/content/browser/accessibility/browser_accessibility_manager_unittest.cc b/content/browser/accessibility/browser_accessibility_manager_unittest.cc index 329cdc2..2bf46c29d 100644 --- a/content/browser/accessibility/browser_accessibility_manager_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_manager_unittest.cc
@@ -454,7 +454,7 @@ EXPECT_FALSE(child3_accessible->instance_active()); // Ensure that we retain the parent of the detached subtree. - EXPECT_EQ(root_accessible, container_accessible->GetParent()); + EXPECT_EQ(root_accessible, container_accessible->PlatformGetParent()); EXPECT_EQ(0, container_accessible->GetIndexInParent()); // Check that the index in parent has been updated.
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc index 769cf37..01b5e28f 100644 --- a/content/browser/accessibility/browser_accessibility_win.cc +++ b/content/browser/accessibility/browser_accessibility_win.cc
@@ -690,7 +690,7 @@ base::string16 name_str = target->name(); if (name_str.empty()) { - if (target->ia2_role() == ROLE_SYSTEM_DOCUMENT && GetParent()) { + if (target->ia2_role() == ROLE_SYSTEM_DOCUMENT && PlatformGetParent()) { // Hack: Some versions of JAWS crash if they get an empty name on // a document that's the child of an iframe, so always return a // nonempty string for this role. https://crbug.com/583057 @@ -714,7 +714,7 @@ if (!disp_parent) return E_INVALIDARG; - IAccessible* parent_obj = ToBrowserAccessibilityWin(GetParent()); + IAccessible* parent_obj = ToBrowserAccessibilityWin(PlatformGetParent()); if (parent_obj == NULL) { // This happens if we're the root of the tree; // return the IAccessible for the window. @@ -1105,8 +1105,8 @@ if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { scroll_to -= manager_->GetViewBounds().OffsetFromOrigin(); } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { - if (GetParent()) - scroll_to += GetParent()->GetFrameBoundsRect().OffsetFromOrigin(); + if (PlatformGetParent()) + scroll_to += PlatformGetParent()->GetFrameBoundsRect().OffsetFromOrigin(); } else { return E_INVALIDARG; } @@ -1307,8 +1307,9 @@ *y = bounds.y(); } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { gfx::Rect bounds = GetPageBoundsRect(); - gfx::Rect parent_bounds = - GetParent() ? GetParent()->GetPageBoundsRect() : gfx::Rect(); + gfx::Rect parent_bounds = PlatformGetParent() + ? PlatformGetParent()->GetPageBoundsRect() + : gfx::Rect(); *x = bounds.x() - parent_bounds.x(); *y = bounds.y() - parent_bounds.y(); } else { @@ -2048,9 +2049,9 @@ return S_FALSE; } - BrowserAccessibility* table = GetParent(); + BrowserAccessibility* table = PlatformGetParent(); while (table && table->GetRole() != ui::AX_ROLE_TABLE) - table = table->GetParent(); + table = table->PlatformGetParent(); if (!table) { NOTREACHED(); return S_FALSE; @@ -2151,9 +2152,9 @@ return S_FALSE; } - BrowserAccessibility* table = GetParent(); + BrowserAccessibility* table = PlatformGetParent(); while (table && table->GetRole() != ui::AX_ROLE_TABLE) - table = table->GetParent(); + table = table->PlatformGetParent(); if (!table) { NOTREACHED(); return S_FALSE; @@ -2282,9 +2283,9 @@ GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row); GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column); - BrowserAccessibility* find_table = GetParent(); + BrowserAccessibility* find_table = PlatformGetParent(); while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) - find_table = find_table->GetParent(); + find_table = find_table->PlatformGetParent(); if (!find_table) { NOTREACHED(); return S_FALSE; @@ -2362,8 +2363,9 @@ character_bounds = GetScreenBoundsForRange(offset, 1); } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { character_bounds = GetPageBoundsForRange(offset, 1); - if (GetParent()) - character_bounds -= GetParent()->GetPageBoundsRect().OffsetFromOrigin(); + if (PlatformGetParent()) + character_bounds -= + PlatformGetParent()->GetPageBoundsRect().OffsetFromOrigin(); } else { return E_INVALIDARG; } @@ -2916,7 +2918,7 @@ return E_INVALIDARG; int32_t hypertext_offset = 0; - auto* parent = GetParent(); + auto* parent = PlatformGetParent(); if (parent) { hypertext_offset = ToBrowserAccessibilityWin(parent)->GetHypertextOffsetFromChild(*this); @@ -3397,7 +3399,7 @@ if (!node) return E_INVALIDARG; - *node = ToBrowserAccessibilityWin(GetParent())->NewReference(); + *node = ToBrowserAccessibilityWin(PlatformGetParent())->NewReference(); return S_OK; } @@ -3445,13 +3447,14 @@ if (!node) return E_INVALIDARG; - if (!GetParent() || GetIndexInParent() <= 0) { + if (!PlatformGetParent() || GetIndexInParent() <= 0) { *node = NULL; return S_FALSE; } *node = ToBrowserAccessibilityWin( - GetParent()->InternalGetChild(GetIndexInParent() - 1))->NewReference(); + PlatformGetParent()->InternalGetChild(GetIndexInParent() - 1)) + ->NewReference(); return S_OK; } @@ -3463,16 +3466,16 @@ if (!node) return E_INVALIDARG; - if (!GetParent() || - GetIndexInParent() < 0 || - GetIndexInParent() >= static_cast<int>( - GetParent()->InternalChildCount()) - 1) { + if (!PlatformGetParent() || GetIndexInParent() < 0 || + GetIndexInParent() >= + static_cast<int>(PlatformGetParent()->InternalChildCount()) - 1) { *node = NULL; return S_FALSE; } *node = ToBrowserAccessibilityWin( - GetParent()->InternalGetChild(GetIndexInParent() + 1))->NewReference(); + PlatformGetParent()->InternalGetChild(GetIndexInParent() + 1)) + ->NewReference(); return S_OK; } @@ -3661,8 +3664,8 @@ // Screen readers use this to distinguish between a document loaded event // on the root document vs on an iframe. BrowserAccessibility* node = this; - while (node->GetParent()) - node = node->GetParent()->manager()->GetRoot(); + while (node->PlatformGetParent()) + node = node->PlatformGetParent()->manager()->GetRoot(); return ToBrowserAccessibilityWin(node)->QueryInterface( IID_IAccessible2, object); } @@ -4021,9 +4024,9 @@ // Expose table cell index. if (IsCellOrTableHeaderRole()) { - BrowserAccessibility* table = GetParent(); + BrowserAccessibility* table = PlatformGetParent(); while (table && table->GetRole() != ui::AX_ROLE_TABLE) - table = table->GetParent(); + table = table->PlatformGetParent(); if (table) { const std::vector<int32_t>& unique_cell_ids = table->GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); @@ -4190,7 +4193,8 @@ (old_win_attributes_->ia_state & STATE_SYSTEM_SELECTED) != 0; if (is_selected_now || was_selected_before) { bool multiselect = false; - if (GetParent() && GetParent()->HasState(ui::AX_STATE_MULTISELECTABLE)) + if (PlatformGetParent() && + PlatformGetParent()->HasState(ui::AX_STATE_MULTISELECTABLE)) multiselect = true; if (multiselect) { @@ -4233,7 +4237,8 @@ // Changing a static text node can affect the IAccessibleText hypertext // of the parent node, so force an update on the parent. - BrowserAccessibilityWin* parent = ToBrowserAccessibilityWin(GetParent()); + BrowserAccessibilityWin* parent = + ToBrowserAccessibilityWin(PlatformGetParent()); if (parent && IsTextOnlyObject() && name() != old_win_attributes_->name) { parent->UpdatePlatformAttributes(); @@ -4614,7 +4619,7 @@ bool BrowserAccessibilityWin::IsHyperlink() const { int32_t hyperlink_index = -1; - auto* parent = GetParent(); + auto* parent = PlatformGetParent(); if (parent) { hyperlink_index = ToBrowserAccessibilityWin(parent)->GetHyperlinkIndexFromChild(*this); @@ -4668,7 +4673,7 @@ int32_t BrowserAccessibilityWin::GetHypertextOffsetFromChild( const BrowserAccessibilityWin& child) const { - DCHECK(child.GetParent() == this); + DCHECK(child.PlatformGetParent() == this); // Handle the case when we are dealing with a direct text-only child. // (Note that this object might be a platform leaf, e.g. an ARIA searchbox, @@ -4701,11 +4706,13 @@ int32_t BrowserAccessibilityWin::GetHypertextOffsetFromDescendant( const BrowserAccessibilityWin& descendant) const { - auto* parent_object = ToBrowserAccessibilityWin(descendant.GetParent()); + auto* parent_object = + ToBrowserAccessibilityWin(descendant.PlatformGetParent()); auto* current_object = const_cast<BrowserAccessibilityWin*>(&descendant); while (parent_object && parent_object != this) { current_object = parent_object; - parent_object = ToBrowserAccessibilityWin(current_object->GetParent()); + parent_object = + ToBrowserAccessibilityWin(current_object->PlatformGetParent()); } if (!parent_object) return -1; @@ -4736,7 +4743,7 @@ int32_t index_in_common_parent = GetIndexInParent(); while (common_parent && !endpoint_object.IsDescendantOf(common_parent)) { index_in_common_parent = common_parent->GetIndexInParent(); - common_parent = common_parent->GetParent(); + common_parent = common_parent->PlatformGetParent(); } if (!common_parent) return -1; @@ -4752,7 +4759,7 @@ if (common_parent == this) { int32_t hypertext_offset = GetHypertextOffsetFromDescendant(endpoint_object); - if (endpoint_object.GetParent() == this && + if (endpoint_object.PlatformGetParent() == this && endpoint_object.IsTextOnlyObject()) { hypertext_offset += endpoint_offset; } @@ -5028,11 +5035,11 @@ } bool BrowserAccessibilityWin::IsListBoxOptionOrMenuListOption() { - if (!GetParent()) + if (!PlatformGetParent()) return false; int32_t role = GetRole(); - int32_t parent_role = GetParent()->GetRole(); + int32_t parent_role = PlatformGetParent()->GetRole(); if (role == ui::AX_ROLE_LIST_BOX_OPTION && parent_role == ui::AX_ROLE_LIST_BOX) {
diff --git a/content/browser/accessibility/one_shot_accessibility_tree_search.cc b/content/browser/accessibility/one_shot_accessibility_tree_search.cc index bd54a8d..4a0d4bc 100644 --- a/content/browser/accessibility/one_shot_accessibility_tree_search.cc +++ b/content/browser/accessibility/one_shot_accessibility_tree_search.cc
@@ -49,8 +49,8 @@ DCHECK(!did_search_); CHECK(start_node); - if (!scope_node_->GetParent() || - start_node->IsDescendantOf(scope_node_->GetParent())) { + if (!scope_node_->PlatformGetParent() || + start_node->IsDescendantOf(scope_node_->PlatformGetParent())) { start_node_ = start_node; } } @@ -124,8 +124,8 @@ // We only care about immediate children of scope_node_, so walk up // start_node_ until we get to an immediate child. If it isn't a child, // we ignore start_node_. - while (start_node_ && start_node_->GetParent() != scope_node_) - start_node_ = start_node_->GetParent(); + while (start_node_ && start_node_->PlatformGetParent() != scope_node_) + start_node_ = start_node_->PlatformGetParent(); uint32_t index = (direction_ == FORWARDS ? 0 : count - 1); if (start_node_) { @@ -160,7 +160,7 @@ node = tree_->PreviousInTreeOrder(start_node_); } - BrowserAccessibility* stop_node = scope_node_->GetParent(); + BrowserAccessibility* stop_node = scope_node_->PlatformGetParent(); while (node && node != stop_node && (result_limit_ == UNLIMITED_RESULTS || @@ -336,7 +336,7 @@ BrowserAccessibility* start, BrowserAccessibility* node) { if (node->IsWebAreaForPresentationalIframe()) return false; - if (!node->GetParent()) + if (!node->PlatformGetParent()) return false; return (node->GetRole() == ui::AX_ROLE_WEB_AREA || node->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA);
diff --git a/content/browser/accessibility/site_per_process_accessibility_browsertest.cc b/content/browser/accessibility/site_per_process_accessibility_browsertest.cc index 0909e3a9..b5bc3a9a 100644 --- a/content/browser/accessibility/site_per_process_accessibility_browsertest.cc +++ b/content/browser/accessibility/site_per_process_accessibility_browsertest.cc
@@ -132,7 +132,7 @@ ASSERT_EQ(0U, ax_child_frame_static_text->PlatformChildCount()); // Last, check that the parent of the child frame root is correct. - EXPECT_EQ(ax_child_frame_root->GetParent(), ax_iframe); + EXPECT_EQ(ax_child_frame_root->PlatformGetParent(), ax_iframe); } IN_PROC_BROWSER_TEST_F(MAYBE_SitePerProcessAccessibilityBrowserTest,
diff --git a/content/browser/android/date_time_chooser_android.cc b/content/browser/android/date_time_chooser_android.cc index ba20ad53..28b6d03 100644 --- a/content/browser/android/date_time_chooser_android.cc +++ b/content/browser/android/date_time_chooser_android.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/i18n/char_iterator.h" +#include "base/i18n/unicodestring.h" #include "content/common/date_time_suggestion.h" #include "content/common/view_messages.h" #include "content/public/browser/render_view_host.h" @@ -36,8 +37,7 @@ sanitized.append(c); sanitized_iterator.Advance(); } - return base::string16(sanitized.getBuffer(), - static_cast<size_t>(sanitized.length())); + return base::i18n::UnicodeStringToString16(sanitized); } } // namespace
diff --git a/content/browser/battery_status/DEPS b/content/browser/battery_status/DEPS new file mode 100644 index 0000000..6197c268 --- /dev/null +++ b/content/browser/battery_status/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+device/battery", # For integration tests +]
diff --git a/content/browser/battery_status/battery_monitor_integration_browsertest.cc b/content/browser/battery_status/battery_monitor_integration_browsertest.cc deleted file mode 100644 index 5db921f..0000000 --- a/content/browser/battery_status/battery_monitor_integration_browsertest.cc +++ /dev/null
@@ -1,190 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <utility> - -#include "base/callback_list.h" -#include "base/lazy_instance.h" -#include "base/macros.h" -#include "base/memory/ptr_util.h" -#include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" -#include "content/public/browser/content_browser_client.h" -#include "content/public/browser/web_contents.h" -#include "content/public/common/content_client.h" -#include "content/public/test/content_browser_test.h" -#include "content/public/test/content_browser_test_utils.h" -#include "content/public/test/test_navigation_observer.h" -#include "content/public/test/test_utils.h" -#include "content/shell/browser/shell.h" -#include "content/shell/browser/shell_content_browser_client.h" -#include "device/battery/battery_monitor.mojom.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "services/service_manager/public/cpp/interface_registry.h" - -// These tests run against a dummy implementation of the BatteryMonitor service. -// That is, they verify that the service implementation is correctly exposed to -// the renderer, whatever the implementation is. - -namespace content { - -namespace { - -typedef base::CallbackList<void(const device::BatteryStatus&)> - BatteryUpdateCallbackList; -typedef BatteryUpdateCallbackList::Subscription BatteryUpdateSubscription; - -// Global battery state used in the tests. -device::BatteryStatus g_battery_status; -// Global list of test battery monitors to notify when |g_battery_status| -// changes. -base::LazyInstance<BatteryUpdateCallbackList>::Leaky g_callback_list = - LAZY_INSTANCE_INITIALIZER; - -// Updates the global battery state and notifies existing test monitors. -void UpdateBattery(const device::BatteryStatus& battery_status) { - g_battery_status = battery_status; - g_callback_list.Get().Notify(battery_status); -} - -class FakeBatteryMonitor : public device::BatteryMonitor { - public: - FakeBatteryMonitor() {} - ~FakeBatteryMonitor() override {} - - static void Create(mojo::InterfaceRequest<BatteryMonitor> request) { - mojo::MakeStrongBinding(base::MakeUnique<FakeBatteryMonitor>(), - std::move(request)); - } - - private: - void QueryNextStatus(const QueryNextStatusCallback& callback) override { - // We don't expect overlapped calls to QueryNextStatus. - DCHECK(callback_.is_null()); - - callback_ = callback; - - if (!subscription_) { - subscription_ = - g_callback_list.Get().Add(base::Bind(&FakeBatteryMonitor::DidChange, - base::Unretained(this))); - // Report initial value. - DidChange(g_battery_status); - } - } - - void DidChange(const device::BatteryStatus& battery_status) { - if (!callback_.is_null()) { - callback_.Run(battery_status.Clone()); - callback_.Reset(); - } - } - - std::unique_ptr<BatteryUpdateSubscription> subscription_; - QueryNextStatusCallback callback_; -}; - -// Overrides the default service implementation with the test implementation -// declared above. -class TestContentBrowserClient : public ContentBrowserClient { - public: - void ExposeInterfacesToRenderer( - service_manager::InterfaceRegistry* registry, - RenderProcessHost* render_process_host) override { - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = - BrowserThread::GetTaskRunnerForThread(BrowserThread::UI); - registry->AddInterface(base::Bind(&FakeBatteryMonitor::Create), - ui_task_runner); - } - - void AppendExtraCommandLineSwitches(base::CommandLine* command_line, - int child_process_id) override { - // Necessary for passing kIsolateSitesForTesting flag to the renderer. - ShellContentBrowserClient::Get()->AppendExtraCommandLineSwitches( - command_line, child_process_id); - } - -#if defined(OS_ANDROID) - void GetAdditionalMappedFilesForChildProcess( - const base::CommandLine& command_line, - int child_process_id, - FileDescriptorInfo* mappings) override { - ShellContentBrowserClient::Get()->GetAdditionalMappedFilesForChildProcess( - command_line, child_process_id, mappings); - } -#endif // defined(OS_ANDROID) -}; - -class BatteryMonitorIntegrationTest : public ContentBrowserTest { - public: - BatteryMonitorIntegrationTest() {} - - void SetUpOnMainThread() override { - old_client_ = SetBrowserClientForTesting(&test_client_); - } - - void TearDownOnMainThread() override { - SetBrowserClientForTesting(old_client_); - } - - private: - TestContentBrowserClient test_client_; - ContentBrowserClient* old_client_; - - DISALLOW_COPY_AND_ASSIGN(BatteryMonitorIntegrationTest); -}; - -IN_PROC_BROWSER_TEST_F(BatteryMonitorIntegrationTest, DefaultValues) { - // From JavaScript request a promise for the battery status information and - // once it resolves check the default values and navigate to #pass. - UpdateBattery(device::BatteryStatus()); - GURL test_url = - GetTestUrl("battery_status", "battery_status_default_test.html"); - NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); - EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); -} - -IN_PROC_BROWSER_TEST_F(BatteryMonitorIntegrationTest, ResolvePromise) { - // Set the fake battery monitor to return predefined battery status values. - // From JavaScript request a promise for the battery status information and - // once it resolves check the values and navigate to #pass. - device::BatteryStatus status; - status.charging = true; - status.charging_time = 100; - status.discharging_time = std::numeric_limits<double>::infinity(); - status.level = 0.5; - UpdateBattery(status); - - GURL test_url = GetTestUrl("battery_status", - "battery_status_promise_resolution_test.html"); - NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); - EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); -} - -IN_PROC_BROWSER_TEST_F(BatteryMonitorIntegrationTest, EventListener) { - // Set the fake battery monitor to return default battery status values. - // From JavaScript request a promise for the battery status information. - // Once it resolves add an event listener for battery level change. Set - // battery level to 0.6 and invoke update. Check that the event listener - // is invoked with the correct value for level and navigate to #pass. - device::BatteryStatus status; - UpdateBattery(status); - - TestNavigationObserver same_tab_observer(shell()->web_contents(), 2); - GURL test_url = - GetTestUrl("battery_status", "battery_status_event_listener_test.html"); - shell()->LoadURL(test_url); - same_tab_observer.Wait(); - EXPECT_EQ("resolved", shell()->web_contents()->GetLastCommittedURL().ref()); - - TestNavigationObserver same_tab_observer2(shell()->web_contents(), 1); - status.level = 0.6; - UpdateBattery(status); - same_tab_observer2.Wait(); - EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); -} - -} // namespace - -} // namespace content
diff --git a/content/browser/bluetooth/frame_connected_bluetooth_devices.cc b/content/browser/bluetooth/frame_connected_bluetooth_devices.cc index d469a50..f36b44c 100644 --- a/content/browser/bluetooth/frame_connected_bluetooth_devices.cc +++ b/content/browser/bluetooth/frame_connected_bluetooth_devices.cc
@@ -4,6 +4,7 @@ #include "content/browser/bluetooth/frame_connected_bluetooth_devices.h" +#include "base/memory/ptr_util.h" #include "base/optional.h" #include "base/strings/string_util.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -12,6 +13,17 @@ namespace content { +struct GATTConnectionAndServerClient { + GATTConnectionAndServerClient( + std::unique_ptr<device::BluetoothGattConnection> connection, + blink::mojom::WebBluetoothServerClientAssociatedPtr client) + : gatt_connection(std::move(connection)), + server_client(std::move(client)) {} + + std::unique_ptr<device::BluetoothGattConnection> gatt_connection; + blink::mojom::WebBluetoothServerClientAssociatedPtr server_client; +}; + FrameConnectedBluetoothDevices::FrameConnectedBluetoothDevices( RenderFrameHost* rfh) : web_contents_impl_(static_cast<WebContentsImpl*>( @@ -29,13 +41,14 @@ if (connection_iter == device_id_to_connection_map_.end()) { return false; } - DCHECK(connection_iter->second->IsConnected()); + DCHECK(connection_iter->second->gatt_connection->IsConnected()); return true; } void FrameConnectedBluetoothDevices::Insert( const WebBluetoothDeviceId& device_id, - std::unique_ptr<device::BluetoothGattConnection> connection) { + std::unique_ptr<device::BluetoothGattConnection> connection, + blink::mojom::WebBluetoothServerClientAssociatedPtr client) { if (device_id_to_connection_map_.find(device_id) != device_id_to_connection_map_.end()) { // It's possible for WebBluetoothServiceImpl to issue two successive @@ -50,7 +63,11 @@ return; } device_address_to_id_map_[connection->GetDeviceAddress()] = device_id; - device_id_to_connection_map_[device_id] = std::move(connection); + auto gatt_connection_and_client = + base::MakeUnique<GATTConnectionAndServerClient>(std::move(connection), + std::move(client)); + device_id_to_connection_map_[device_id] = + std::move(gatt_connection_and_client); IncrementDevicesConnectedCount(); } @@ -61,7 +78,7 @@ return; } CHECK(device_address_to_id_map_.erase( - connection_iter->second->GetDeviceAddress())); + connection_iter->second->gatt_connection->GetDeviceAddress())); device_id_to_connection_map_.erase(connection_iter); DecrementDevicesConnectedCount(); } @@ -74,8 +91,11 @@ return base::nullopt; } WebBluetoothDeviceId device_id = device_address_iter->second; + auto device_id_iter = device_id_to_connection_map_.find(device_id); + CHECK(device_id_iter != device_id_to_connection_map_.end()); + device_id_iter->second->server_client->GATTServerDisconnected(); CHECK(device_address_to_id_map_.erase(device_address)); - CHECK(device_id_to_connection_map_.erase(device_id)); + device_id_to_connection_map_.erase(device_id); DecrementDevicesConnectedCount(); return base::make_optional(device_id); }
diff --git a/content/browser/bluetooth/frame_connected_bluetooth_devices.h b/content/browser/bluetooth/frame_connected_bluetooth_devices.h index 4168059..3c4dcf0 100644 --- a/content/browser/bluetooth/frame_connected_bluetooth_devices.h +++ b/content/browser/bluetooth/frame_connected_bluetooth_devices.h
@@ -12,6 +12,7 @@ #include "base/optional.h" #include "content/common/bluetooth/web_bluetooth_device_id.h" #include "content/common/content_export.h" +#include "third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom.h" #include "url/origin.h" namespace device { @@ -20,6 +21,7 @@ namespace content { +struct GATTConnectionAndServerClient; class RenderFrameHost; class WebContentsImpl; @@ -42,7 +44,8 @@ // If a connection doesn't exist already for |device_id|, adds a connection to // the map and increases the WebContents count of connected devices. void Insert(const WebBluetoothDeviceId& device_id, - std::unique_ptr<device::BluetoothGattConnection> connection); + std::unique_ptr<device::BluetoothGattConnection> connection, + blink::mojom::WebBluetoothServerClientAssociatedPtr client); // Deletes the BluetoothGattConnection for |device_id| and decrements the // WebContents count of connected devices if |device_id| had a connection. @@ -67,7 +70,7 @@ // Keeps the BluetoothGattConnection objects alive so that connections don't // get closed. std::unordered_map<WebBluetoothDeviceId, - std::unique_ptr<device::BluetoothGattConnection>, + std::unique_ptr<GATTConnectionAndServerClient>, WebBluetoothDeviceIdHash> device_id_to_connection_map_;
diff --git a/content/browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc b/content/browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc index 21ddd440..4c78421 100644 --- a/content/browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc +++ b/content/browser/bluetooth/frame_connected_bluetooth_devices_unittest.cc
@@ -13,6 +13,7 @@ #include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "device/bluetooth/test/mock_bluetooth_device.h" #include "device/bluetooth/test/mock_bluetooth_gatt_connection.h" +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -38,6 +39,12 @@ constexpr char kDeviceAddress1[] = "1"; constexpr char kDeviceName1[] = "Device1"; +blink::mojom::WebBluetoothServerClientAssociatedPtr CreateServerClient() { + blink::mojom::WebBluetoothServerClientAssociatedPtr client; + mojo::MakeIsolatedRequest(&client); + return client; +} + } // namespace class FrameConnectedBluetoothDevicesTest @@ -122,23 +129,28 @@ }; TEST_F(FrameConnectedBluetoothDevicesTest, Insert_Once) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); } TEST_F(FrameConnectedBluetoothDevicesTest, Insert_Twice) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); } TEST_F(FrameConnectedBluetoothDevicesTest, Insert_TwoDevices) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -146,8 +158,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, Insert_TwoMaps) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -156,7 +170,8 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_OneDevice_AddOnce_RemoveOnce) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -169,7 +184,8 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_OneDevice_AddOnce_RemoveTwice) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -183,8 +199,10 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_OneDevice_AddTwice_RemoveOnce) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -197,8 +215,10 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_OneDevice_AddTwice_RemoveTwice) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -211,8 +231,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_TwoDevices) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -230,8 +252,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionId_TwoMaps) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -250,7 +274,8 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_OneDevice_AddOnce_RemoveOnce) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -264,7 +289,8 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_OneDevice_AddOnce_RemoveTwice) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -279,8 +305,10 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_OneDevice_AddTwice_RemoveOnce) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -294,8 +322,10 @@ TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_OneDevice_AddTwice_RemoveTwice) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -309,8 +339,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_TwoDevices) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -331,8 +363,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, CloseConnectionAddress_TwoMaps) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); EXPECT_TRUE(map0_->IsConnectedToDeviceWithId(kDeviceId0)); @@ -353,8 +387,10 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, Destruction_MultipleDevices) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); @@ -364,11 +400,15 @@ } TEST_F(FrameConnectedBluetoothDevicesTest, Destruction_MultipleMaps) { - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map0_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); - map1_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); - map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1)); + map1_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); + map1_->Insert(kDeviceId1, GetConnection(kDeviceAddress1), + CreateServerClient()); EXPECT_TRUE(contents()->IsConnectedToBluetoothDevice()); @@ -387,7 +427,8 @@ // Tests that we don't crash when FrameConnectedBluetoothDevices contains // at least one device, and it is destroyed while WebContentsImpl is being // destroyed. - map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0)); + map0_->Insert(kDeviceId0, GetConnection(kDeviceAddress0), + CreateServerClient()); DeleteContents(); }
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc index f4bce42..9c6b899 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.cc +++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -12,6 +12,7 @@ #include <algorithm> +#include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/bluetooth/bluetooth_blocklist.h" @@ -147,6 +148,18 @@ CacheQueryOutcome outcome; }; +struct GATTNotifySessionAndCharacteristicClient { + GATTNotifySessionAndCharacteristicClient( + std::unique_ptr<device::BluetoothGattNotifySession> session, + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr client) + : gatt_notify_session(std::move(session)), + characteristic_client(std::move(client)) {} + + std::unique_ptr<device::BluetoothGattNotifySession> gatt_notify_session; + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr + characteristic_client; +}; + WebBluetoothServiceImpl::WebBluetoothServiceImpl( RenderFrameHost* render_frame_host, blink::mojom::WebBluetoothServiceRequest request) @@ -212,9 +225,6 @@ base::Optional<WebBluetoothDeviceId> device_id = connected_devices_->CloseConnectionToDeviceWithAddress( device->GetAddress()); - if (device_id && client_) { - client_->GattServerDisconnected(device_id.value()); - } } } @@ -271,18 +281,14 @@ void WebBluetoothServiceImpl::NotifyCharacteristicValueChanged( const std::string& characteristic_instance_id, const std::vector<uint8_t>& value) { - if (client_) { - client_->RemoteCharacteristicValueChanged(characteristic_instance_id, - value); + auto iter = + characteristic_id_to_notify_session_.find(characteristic_instance_id); + if (iter != characteristic_id_to_notify_session_.end()) { + iter->second->characteristic_client->RemoteCharacteristicValueChanged( + value); } } -void WebBluetoothServiceImpl::SetClient( - blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo client) { - DCHECK(!client_.get()); - client_.Bind(std::move(client)); -} - void WebBluetoothServiceImpl::RequestDevice( blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, const RequestDeviceCallback& callback) { @@ -309,6 +315,7 @@ void WebBluetoothServiceImpl::RemoteServerConnect( const WebBluetoothDeviceId& device_id, + blink::mojom::WebBluetoothServerClientAssociatedPtrInfo client, const RemoteServerConnectCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT); @@ -337,10 +344,13 @@ // abstraction allows to check for pending connections. // http://crbug.com/583544 const base::TimeTicks start_time = base::TimeTicks::Now(); + blink::mojom::WebBluetoothServerClientAssociatedPtr + web_bluetooth_server_client; + web_bluetooth_server_client.Bind(std::move(client)); query_result.device->CreateGattConnection( base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess, weak_ptr_factory_.GetWeakPtr(), device_id, start_time, - callback), + base::Passed(&web_bluetooth_server_client), callback), base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionFailed, weak_ptr_factory_.GetWeakPtr(), start_time, callback)); } @@ -660,6 +670,7 @@ void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications( const std::string& characteristic_instance_id, + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtrInfo client, const RemoteCharacteristicStartNotificationsCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RecordWebBluetoothFunctionCall( @@ -668,7 +679,7 @@ auto iter = characteristic_id_to_notify_session_.find(characteristic_instance_id); if (iter != characteristic_id_to_notify_session_.end() && - iter->second->IsActive()) { + iter->second->gatt_notify_session->IsActive()) { // If the frame has already started notifications and the notifications // are active we return SUCCESS. callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); @@ -697,9 +708,14 @@ return; } + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr + characteristic_client; + characteristic_client.Bind(std::move(client)); + query_result.characteristic->StartNotifySession( base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionSuccess, - weak_ptr_factory_.GetWeakPtr(), callback), + weak_ptr_factory_.GetWeakPtr(), + base::Passed(&characteristic_client), callback), base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionFailed, weak_ptr_factory_.GetWeakPtr(), callback)); } @@ -726,7 +742,7 @@ callback.Run(); return; } - notify_session_iter->second->Stop(base::Bind( + notify_session_iter->second->gatt_notify_session->Stop(base::Bind( &WebBluetoothServiceImpl::OnStopNotifySessionComplete, weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); } @@ -930,14 +946,22 @@ void WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess( const WebBluetoothDeviceId& device_id, base::TimeTicks start_time, + blink::mojom::WebBluetoothServerClientAssociatedPtr client, const RemoteServerConnectCallback& callback, std::unique_ptr<device::BluetoothGattConnection> connection) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); - connected_devices_->Insert(device_id, std::move(connection)); + if (connected_devices_->IsConnectedToDeviceWithId(device_id)) { + DVLOG(1) << "Already connected."; + callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); + return; + } + callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); + connected_devices_->Insert(device_id, std::move(connection), + std::move(client)); } void WebBluetoothServiceImpl::OnCreateGATTConnectionFailed( @@ -982,6 +1006,7 @@ } void WebBluetoothServiceImpl::OnStartNotifySessionSuccess( + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr client, const RemoteCharacteristicStartNotificationsCallback& callback, std::unique_ptr<device::BluetoothGattNotifySession> notify_session) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -989,10 +1014,14 @@ // compilers may evaluate arguments in any order. std::string characteristic_instance_id = notify_session->GetCharacteristicIdentifier(); - // Saving the BluetoothGattNotifySession keeps notifications active. - characteristic_id_to_notify_session_[characteristic_instance_id] = - std::move(notify_session); + callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); + // Saving the BluetoothGattNotifySession keeps notifications active. + auto gatt_notify_session_and_client = + base::MakeUnique<GATTNotifySessionAndCharacteristicClient>( + std::move(notify_session), std::move(client)); + characteristic_id_to_notify_session_[characteristic_instance_id] = + std::move(gatt_notify_session_and_client); } void WebBluetoothServiceImpl::OnStartNotifySessionFailed(
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.h b/content/browser/bluetooth/web_bluetooth_service_impl.h index e607e1a2..6e5e164 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl.h +++ b/content/browser/bluetooth/web_bluetooth_service_impl.h
@@ -32,6 +32,7 @@ class BluetoothDeviceChooserController; struct CacheQueryResult; class FrameConnectedBluetoothDevices; +struct GATTNotifySessionAndCharacteristicClient; class RenderFrameHost; class RenderProcessHost; @@ -97,12 +98,11 @@ const std::vector<uint8_t>& value); // WebBluetoothService methods: - void SetClient( - blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo client) override; void RequestDevice(blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, const RequestDeviceCallback& callback) override; void RemoteServerConnect( const WebBluetoothDeviceId& device_id, + blink::mojom::WebBluetoothServerClientAssociatedPtrInfo client, const RemoteServerConnectCallback& callback) override; void RemoteServerDisconnect(const WebBluetoothDeviceId& device_id) override; void RemoteServerGetPrimaryServices( @@ -124,6 +124,7 @@ const RemoteCharacteristicWriteValueCallback& callback) override; void RemoteCharacteristicStartNotifications( const std::string& characteristic_instance_id, + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtrInfo client, const RemoteCharacteristicStartNotificationsCallback& callback) override; void RemoteCharacteristicStopNotifications( const std::string& characteristic_instance_id, @@ -167,6 +168,7 @@ void OnCreateGATTConnectionSuccess( const WebBluetoothDeviceId& device_id, base::TimeTicks start_time, + blink::mojom::WebBluetoothServerClientAssociatedPtr client, const RemoteServerConnectCallback& callback, std::unique_ptr<device::BluetoothGattConnection> connection); void OnCreateGATTConnectionFailed( @@ -191,6 +193,7 @@ // Callbacks for BluetoothRemoteGattCharacteristic::StartNotifySession. void OnStartNotifySessionSuccess( + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr client, const RemoteCharacteristicStartNotificationsCallback& callback, std::unique_ptr<device::BluetoothGattNotifySession> notify_session); void OnStartNotifySessionFailed( @@ -272,15 +275,12 @@ // Map to keep track of the characteristics' notify sessions. std::unordered_map<std::string, - std::unique_ptr<device::BluetoothGattNotifySession>> + std::unique_ptr<GATTNotifySessionAndCharacteristicClient>> characteristic_id_to_notify_session_; // The RFH that owns this instance. RenderFrameHost* render_frame_host_; - // Proxy to the WebBluetoothServiceClient to send device events to. - blink::mojom::WebBluetoothServiceClientAssociatedPtr client_; - // The lifetime of this instance is exclusively managed by the RFH that // owns it so we use a "Binding" as opposed to a "StrongBinding" which deletes // the service on pipe connection errors.
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index ca35b9a..0d8d1220 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -90,7 +90,6 @@ #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" #include "content/public/common/result_codes.h" -#include "device/battery/battery_status_service.h" #include "device/gamepad/gamepad_service.h" #include "gpu/vulkan/features.h" #include "media/audio/audio_system_impl.h" @@ -1376,12 +1375,6 @@ TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:GamepadService"); device::GamepadService::GetInstance()->Terminate(); } -#if !defined(OS_ANDROID) - { - TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:BatteryStatusService"); - device::BatteryStatusService::GetInstance()->Shutdown(); - } -#endif { TRACE_EVENT0("shutdown", "BrowserMainLoop::Subsystem:DeleteDataSources"); URLDataManager::DeleteDataSources();
diff --git a/content/browser/child_process_launcher_helper_android.cc b/content/browser/child_process_launcher_helper_android.cc index 233b2ef..2e5b6fee 100644 --- a/content/browser/child_process_launcher_helper_android.cc +++ b/content/browser/child_process_launcher_helper_android.cc
@@ -38,51 +38,6 @@ namespace { -// Starts a process as a child process spawned by the Android ActivityManager. -// The created process handle is returned to the |callback| on success, 0 is -// returned if the process could not be created. -void StartChildProcess(const base::CommandLine::StringVector& argv, - int child_process_id, - content::FileDescriptorInfo* files_to_register, - const StartChildProcessCallback& callback) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - - // Create the Command line String[] - ScopedJavaLocalRef<jobjectArray> j_argv = ToJavaArrayOfStrings(env, argv); - - size_t file_count = files_to_register->GetMappingSize(); - DCHECK(file_count > 0); - - ScopedJavaLocalRef<jclass> j_file_info_class = base::android::GetClass( - env, "org/chromium/base/process_launcher/FileDescriptorInfo"); - ScopedJavaLocalRef<jobjectArray> j_file_infos( - env, env->NewObjectArray(file_count, j_file_info_class.obj(), NULL)); - base::android::CheckException(env); - - for (size_t i = 0; i < file_count; ++i) { - int fd = files_to_register->GetFDAt(i); - PCHECK(0 <= fd); - int id = files_to_register->GetIDAt(i); - const auto& region = files_to_register->GetRegionAt(i); - bool auto_close = files_to_register->OwnsFD(fd); - ScopedJavaLocalRef<jobject> j_file_info = - Java_ChildProcessLauncher_makeFdInfo(env, id, fd, auto_close, - region.offset, region.size); - PCHECK(j_file_info.obj()); - env->SetObjectArrayElement(j_file_infos.obj(), i, j_file_info.obj()); - if (auto_close) { - ignore_result(files_to_register->ReleaseFD(fd).release()); - } - } - - constexpr int param_key = 0; // TODO(boliu): Use this. - Java_ChildProcessLauncher_start( - env, base::android::GetApplicationContext(), param_key, j_argv, - child_process_id, j_file_infos, - reinterpret_cast<intptr_t>(new StartChildProcessCallback(callback))); -} - // Stops a child process based on the handle returned from StartChildProcess. void StopChildProcess(base::ProcessHandle handle) { JNIEnv* env = AttachCurrentThread(); @@ -90,21 +45,6 @@ Java_ChildProcessLauncher_stop(env, static_cast<jint>(handle)); } -bool IsChildProcessOomProtected(base::ProcessHandle handle) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - return Java_ChildProcessLauncher_isOomProtected(env, - static_cast<jint>(handle)); -} - -void SetChildProcessInForeground(base::ProcessHandle handle, - bool in_foreground) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - return Java_ChildProcessLauncher_setInForeground( - env, static_cast<jint>(handle), static_cast<jboolean>(in_foreground)); -} - // Callback invoked from Java once the process has been started. void ChildProcessStartedCallback( ChildProcessLauncherHelper* helper, @@ -196,11 +136,44 @@ int* launch_result) { *is_synchronous_launch = false; - StartChildProcess(command_line()->argv(), - child_process_id(), - files_to_register.get(), - base::Bind(&ChildProcessStartedCallback, - RetainedRef(this))); + JNIEnv* env = AttachCurrentThread(); + DCHECK(env); + + // Create the Command line String[] + ScopedJavaLocalRef<jobjectArray> j_argv = + ToJavaArrayOfStrings(env, command_line()->argv()); + + size_t file_count = files_to_register->GetMappingSize(); + DCHECK(file_count > 0); + + ScopedJavaLocalRef<jclass> j_file_info_class = base::android::GetClass( + env, "org/chromium/base/process_launcher/FileDescriptorInfo"); + ScopedJavaLocalRef<jobjectArray> j_file_infos( + env, env->NewObjectArray(file_count, j_file_info_class.obj(), NULL)); + base::android::CheckException(env); + + for (size_t i = 0; i < file_count; ++i) { + int fd = files_to_register->GetFDAt(i); + PCHECK(0 <= fd); + int id = files_to_register->GetIDAt(i); + const auto& region = files_to_register->GetRegionAt(i); + bool auto_close = files_to_register->OwnsFD(fd); + ScopedJavaLocalRef<jobject> j_file_info = + Java_ChildProcessLauncher_makeFdInfo(env, id, fd, auto_close, + region.offset, region.size); + PCHECK(j_file_info.obj()); + env->SetObjectArrayElement(j_file_infos.obj(), i, j_file_info.obj()); + if (auto_close) { + ignore_result(files_to_register->ReleaseFD(fd).release()); + } + } + + constexpr int param_key = 0; // TODO(boliu): Use this. + Java_ChildProcessLauncher_start( + env, base::android::GetApplicationContext(), param_key, j_argv, + child_process_id(), j_file_infos, + reinterpret_cast<intptr_t>(new StartChildProcessCallback( + base::Bind(&ChildProcessStartedCallback, RetainedRef(this))))); return Process(); } @@ -215,8 +188,10 @@ const ChildProcessLauncherHelper::Process& process, bool known_dead, int* exit_code) { - if (IsChildProcessOomProtected(process.process.Handle())) + if (Java_ChildProcessLauncher_isOomProtected( + AttachCurrentThread(), static_cast<jint>(process.process.Handle()))) { return base::TERMINATION_STATUS_OOM_PROTECTED; + } return base::GetTerminationStatus(process.process.Handle(), exit_code); } @@ -238,8 +213,12 @@ // static void ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread( - base::Process process, bool background) { - SetChildProcessInForeground(process.Handle(), !background); + base::Process process, + bool background) { + JNIEnv* env = AttachCurrentThread(); + DCHECK(env); + return Java_ChildProcessLauncher_setInForeground( + env, static_cast<jint>(process.Handle()), !background); } // static @@ -260,8 +239,6 @@ return base::File(base::android::OpenApkAsset(path.value(), region)); } -} // namespace internal - // Called from ChildProcessLauncher.java when the ChildProcess was // started. // |client_context| is the pointer to StartChildProcessCallback which was @@ -281,13 +258,10 @@ delete callback; } -jboolean IsSingleProcess(JNIEnv* env, const JavaParamRef<jclass>& clazz) { - return base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kSingleProcess); -} +} // namespace internal bool RegisterChildProcessLauncher(JNIEnv* env) { - return RegisterNativesImpl(env); + return internal::RegisterNativesImpl(env); } } // namespace content
diff --git a/content/browser/device_sensors/device_sensor_browsertest.cc b/content/browser/device_sensors/device_sensor_browsertest.cc index f3d65a6..451b7fe 100644 --- a/content/browser/device_sensors/device_sensor_browsertest.cc +++ b/content/browser/device_sensors/device_sensor_browsertest.cc
@@ -152,54 +152,54 @@ void SetMotionBufferReady(device::DeviceMotionHardwareBuffer* buffer) { buffer->seqlock.WriteBegin(); - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } void SetOrientationBufferReady( device::DeviceOrientationHardwareBuffer* buffer) { buffer->seqlock.WriteBegin(); - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } void UpdateMotion(device::DeviceMotionHardwareBuffer* buffer) { buffer->seqlock.WriteBegin(); - buffer->data.accelerationX = 1; - buffer->data.hasAccelerationX = true; - buffer->data.accelerationY = 2; - buffer->data.hasAccelerationY = true; - buffer->data.accelerationZ = 3; - buffer->data.hasAccelerationZ = true; + buffer->data.acceleration_x = 1; + buffer->data.has_acceleration_x = true; + buffer->data.acceleration_y = 2; + buffer->data.has_acceleration_y = true; + buffer->data.acceleration_z = 3; + buffer->data.has_acceleration_z = true; - buffer->data.accelerationIncludingGravityX = 4; - buffer->data.hasAccelerationIncludingGravityX = true; - buffer->data.accelerationIncludingGravityY = 5; - buffer->data.hasAccelerationIncludingGravityY = true; - buffer->data.accelerationIncludingGravityZ = 6; - buffer->data.hasAccelerationIncludingGravityZ = true; + buffer->data.acceleration_including_gravity_x = 4; + buffer->data.has_acceleration_including_gravity_x = true; + buffer->data.acceleration_including_gravity_y = 5; + buffer->data.has_acceleration_including_gravity_y = true; + buffer->data.acceleration_including_gravity_z = 6; + buffer->data.has_acceleration_including_gravity_z = true; - buffer->data.rotationRateAlpha = 7; - buffer->data.hasRotationRateAlpha = true; - buffer->data.rotationRateBeta = 8; - buffer->data.hasRotationRateBeta = true; - buffer->data.rotationRateGamma = 9; - buffer->data.hasRotationRateGamma = true; + buffer->data.rotation_rate_alpha = 7; + buffer->data.has_rotation_rate_alpha = true; + buffer->data.rotation_rate_beta = 8; + buffer->data.has_rotation_rate_beta = true; + buffer->data.rotation_rate_gamma = 9; + buffer->data.has_rotation_rate_gamma = true; buffer->data.interval = 100; - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } void UpdateOrientation(device::DeviceOrientationHardwareBuffer* buffer) { buffer->seqlock.WriteBegin(); buffer->data.alpha = 1; - buffer->data.hasAlpha = true; + buffer->data.has_alpha = true; buffer->data.beta = 2; - buffer->data.hasBeta = true; + buffer->data.has_beta = true; buffer->data.gamma = 3; - buffer->data.hasGamma = true; - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.has_gamma = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } @@ -207,13 +207,13 @@ device::DeviceOrientationHardwareBuffer* buffer) { buffer->seqlock.WriteBegin(); buffer->data.alpha = 4; - buffer->data.hasAlpha = true; + buffer->data.has_alpha = true; buffer->data.beta = 5; - buffer->data.hasBeta = true; + buffer->data.has_beta = true; buffer->data.gamma = 6; - buffer->data.hasGamma = true; + buffer->data.has_gamma = true; buffer->data.absolute = true; - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); }
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 2fdd79c..ee394a60 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -384,7 +384,7 @@ // RenderFrameHostManager will take care of updates to the speculative // RenderFrameHost in DidCreateNavigationRequest below. if (was_previously_loading) - ResetNavigationRequest(true); + ResetNavigationRequest(true, true); navigation_request_ = std::move(navigation_request); render_manager()->DidCreateNavigationRequest(navigation_request_.get()); @@ -395,7 +395,8 @@ DidStartLoading(to_different_document, was_previously_loading); } -void FrameTreeNode::ResetNavigationRequest(bool keep_state) { +void FrameTreeNode::ResetNavigationRequest(bool keep_state, + bool inform_renderer) { CHECK(IsBrowserSideNavigationEnabled()); if (!navigation_request_) return; @@ -420,8 +421,11 @@ } // If the navigation is renderer-initiated, the renderer should also be - // informed that the navigation stopped. - if (was_renderer_initiated) { + // informed that the navigation stopped if needed. In the case the renderer + // process asked for the navigation to be aborted, e.g. following a + // document.open, do not send an IPC to the renderer process as it already + // expects the navigation to stop. + if (was_renderer_initiated && inform_renderer) { current_frame_host()->Send( new FrameMsg_Stop(current_frame_host()->GetRoutingID())); } @@ -500,7 +504,7 @@ navigation_request_->navigation_handle()->set_net_error_code( net::ERR_ABORTED); } - ResetNavigationRequest(false); + ResetNavigationRequest(false, true); } // TODO(nasko): see if child frames should send IPCs in site-per-process
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h index f48f00c..5409f41 100644 --- a/content/browser/frame_host/frame_tree_node.h +++ b/content/browser/frame_host/frame_tree_node.h
@@ -261,7 +261,10 @@ // Resets the current navigation request. If |keep_state| is true, any state // created by the NavigationRequest (e.g. speculative RenderFrameHost, // loading state) will not be reset by the function. - void ResetNavigationRequest(bool keep_state); + // If |keep_state| is false and the request is renderer-initiated and + // |inform_renderer| is true, an IPC will be sent to the renderer process to + // inform it that the navigation it requested was cancelled. + void ResetNavigationRequest(bool keep_state, bool inform_renderer); // Returns true if this node is in a state where the loading progress is being // tracked.
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index f01cc7aa..9db0474 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -3652,7 +3652,7 @@ // stop or a new navigation from the user. The URL should remain visible. if (IsBrowserSideNavigationEnabled()) { static_cast<NavigatorImpl*>(main_test_rfh()->frame_tree_node()->navigator()) - ->CancelNavigation(main_test_rfh()->frame_tree_node()); + ->CancelNavigation(main_test_rfh()->frame_tree_node(), true); } else { FrameHostMsg_DidFailProvisionalLoadWithError_Params params; params.error_code = net::ERR_ABORTED;
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 759ab5e..c4a3e3a 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -365,15 +365,16 @@ !navigation_handle_->IsSameDocument()) { // It's safe to use base::Unretained because this NavigationRequest owns // the NavigationHandle where the callback will be stored. - // TODO(clamy): pass the real value for |is_external_protocol| if needed. // TODO(clamy): pass the method to the NavigationHandle instead of a // boolean. + bool is_external_protocol = + !GetContentClient()->browser()->IsHandledURL(common_params_.url); navigation_handle_->WillStartRequest( common_params_.method, common_params_.post_data, Referrer::SanitizeForRequest(common_params_.url, common_params_.referrer), - begin_params_.has_user_gesture, common_params_.transition, false, - begin_params_.request_context_type, + begin_params_.has_user_gesture, common_params_.transition, + is_external_protocol, begin_params_.request_context_type, begin_params_.mixed_content_context_type, base::Bind(&NavigationRequest::OnStartChecksComplete, base::Unretained(this))); @@ -480,17 +481,19 @@ // FilterURL sets the URL to about:blank if the CSP checks prevent the // renderer from accessing it. if ((url == url::kAboutBlankURL) && (url != common_params_.url)) { - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); return; } } // It's safe to use base::Unretained because this NavigationRequest owns the // NavigationHandle where the callback will be stored. - // TODO(clamy): pass the real value for |is_external_protocol| if needed. + bool is_external_protocol = + !GetContentClient()->browser()->IsHandledURL(common_params_.url); navigation_handle_->WillRedirectRequest( common_params_.url, common_params_.method, common_params_.referrer.url, - false, response->head.headers, response->head.connection_info, + is_external_protocol, response->head.headers, + response->head.connection_info, base::Bind(&NavigationRequest::OnRedirectChecksComplete, base::Unretained(this))); } @@ -559,7 +562,7 @@ // TODO(clamy): Rename ShouldTransferNavigation once PlzNavigate ships. if (!frame_tree_node_->navigator()->GetDelegate()->ShouldTransferNavigation( frame_tree_node_->IsMainFrame())) { - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); return; } } @@ -598,7 +601,7 @@ // If the request was canceled by the user do not show an error page. if (net_error == net::ERR_ABORTED) { - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); return; } @@ -833,7 +836,7 @@ common_params_, request_params_, is_view_source_); - frame_tree_node_->ResetNavigationRequest(true); + frame_tree_node_->ResetNavigationRequest(true, true); } } // namespace content
diff --git a/content/browser/frame_host/navigator.h b/content/browser/frame_host/navigator.h index 5f0a059..5a1f906 100644 --- a/content/browser/frame_host/navigator.h +++ b/content/browser/frame_host/navigator.h
@@ -157,9 +157,16 @@ const BeginNavigationParams& begin_params); // PlzNavigate - // Cancel a NavigationRequest for |frame_tree_node|. Called when - // |frame_tree_node| is destroyed. - virtual void CancelNavigation(FrameTreeNode* frame_tree_node) {} + // Used to abort an ongoing renderer-initiated navigation. + virtual void OnAbortNavigation(FrameTreeNode* frame_tree_node) {} + + // PlzNavigate + // Cancel a NavigationRequest for |frame_tree_node|. If the request is + // renderer-initiated and |inform_renderer| is true, an IPC will be sent to + // the renderer process to inform it that the navigation it requested was + // cancelled. + virtual void CancelNavigation(FrameTreeNode* frame_tree_node, + bool inform_renderer) {} // Called when the network stack started handling the navigation request // so that the |timestamp| when it happened can be recorded into an histogram.
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc index 32e73c3..d8e9e313c 100644 --- a/content/browser/frame_host/navigator_impl.cc +++ b/content/browser/frame_host/navigator_impl.cc
@@ -968,7 +968,7 @@ if (proceed) navigation_request->BeginNavigation(); else - CancelNavigation(frame_tree_node); + CancelNavigation(frame_tree_node, true); } // PlzNavigate @@ -993,7 +993,7 @@ .is_history_navigation_in_new_child) { // Preemptively clear this local pointer before deleting the request. ongoing_navigation_request = nullptr; - frame_tree_node->ResetNavigationRequest(false); + frame_tree_node->ResetNavigationRequest(false, true); } // The renderer-initiated navigation request is ignored iff a) there is an @@ -1041,10 +1041,23 @@ navigation_request->BeginNavigation(); } +void NavigatorImpl::OnAbortNavigation(FrameTreeNode* frame_tree_node) { + NavigationRequest* ongoing_navigation_request = + frame_tree_node->navigation_request(); + if (!ongoing_navigation_request || + ongoing_navigation_request->browser_initiated()) { + return; + } + + // Abort the renderer-initiated navigation request. + CancelNavigation(frame_tree_node, false); +} + // PlzNavigate -void NavigatorImpl::CancelNavigation(FrameTreeNode* frame_tree_node) { +void NavigatorImpl::CancelNavigation(FrameTreeNode* frame_tree_node, + bool inform_renderer) { CHECK(IsBrowserSideNavigationEnabled()); - frame_tree_node->ResetNavigationRequest(false); + frame_tree_node->ResetNavigationRequest(false, inform_renderer); if (frame_tree_node->IsMainFrame()) navigation_data_.reset(); }
diff --git a/content/browser/frame_host/navigator_impl.h b/content/browser/frame_host/navigator_impl.h index c461bcf..e59fa4e 100644 --- a/content/browser/frame_host/navigator_impl.h +++ b/content/browser/frame_host/navigator_impl.h
@@ -88,12 +88,14 @@ void OnBeginNavigation(FrameTreeNode* frame_tree_node, const CommonNavigationParams& common_params, const BeginNavigationParams& begin_params) override; + void OnAbortNavigation(FrameTreeNode* frame_tree_node) override; void LogResourceRequestTime(base::TimeTicks timestamp, const GURL& url) override; void LogBeforeUnloadTime( const base::TimeTicks& renderer_before_unload_start_time, const base::TimeTicks& renderer_before_unload_end_time) override; - void CancelNavigation(FrameTreeNode* frame_tree_node) override; + void CancelNavigation(FrameTreeNode* frame_tree_node, + bool inform_renderer) override; void DiscardPendingEntryIfNeeded(NavigationHandleImpl* handle) override; private:
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 25b0981..11cebcd 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -784,6 +784,7 @@ IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding) IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, OnBeginNavigation) + IPC_MESSAGE_HANDLER(FrameHostMsg_AbortNavigation, OnAbortNavigation) IPC_MESSAGE_HANDLER(FrameHostMsg_DispatchLoad, OnDispatchLoad) IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, OnTextSurroundingSelectionResponse) @@ -2044,6 +2045,16 @@ frame_tree_node(), validated_params, validated_begin_params); } +void RenderFrameHostImpl::OnAbortNavigation() { + if (!IsBrowserSideNavigationEnabled()) { + NOTREACHED(); + return; + } + if (!is_active()) + return; + frame_tree_node()->navigator()->OnAbortNavigation(frame_tree_node()); +} + void RenderFrameHostImpl::OnDispatchLoad() { CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); @@ -2090,6 +2101,9 @@ RenderWidgetHostViewBase* view = GetViewForAccessibility(); + if (frame_tree_node_->IsMainFrame() && view) + view->SetMainFrameAXTreeID(GetAXTreeID()); + AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); if (!accessibility_mode.is_mode_off() && view && is_active()) { if (accessibility_mode.has_mode(AccessibilityMode::kNativeAPIs)) @@ -2642,7 +2656,7 @@ if (IsBrowserSideNavigationEnabled() && !for_navigation) { // Cancel any pending navigations, to avoid their navigation commit/fail // event from wiping out the is_waiting_for_beforeunload_ack_ state. - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); } // TODO(creis): Support beforeunload on subframes. For now just pretend that @@ -2853,7 +2867,7 @@ // An error page is expected to commit, hence why is_loading_ is set to true. is_loading_ = true; - frame_tree_node_->ResetNavigationRequest(true); + frame_tree_node_->ResetNavigationRequest(true, true); } void RenderFrameHostImpl::SetUpMojoIfNeeded() {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index a81ad3d..ab4d825 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -749,6 +749,7 @@ void OnUpdateEncoding(const std::string& encoding); void OnBeginNavigation(const CommonNavigationParams& common_params, const BeginNavigationParams& begin_params); + void OnAbortNavigation(); void OnDispatchLoad(); void OnAccessibilityEvents( const std::vector<AccessibilityHostMsg_EventParams>& params,
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc index 3a98b03f..7d69b4f3 100644 --- a/content/browser/frame_host/render_frame_host_manager.cc +++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -468,7 +468,7 @@ // commit call below. CommitPending(); if (IsBrowserSideNavigationEnabled()) - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); } else if (render_frame_host == render_frame_host_.get()) { // A same-process navigation committed while a simultaneous cross-process // navigation is still ongoing. @@ -484,7 +484,7 @@ if (was_caused_by_user_gesture) { if (IsBrowserSideNavigationEnabled()) { CleanUpNavigation(); - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); } else { CancelPending(); } @@ -1003,7 +1003,7 @@ else if (render_frame_host == speculative_render_frame_host_.get()) { // TODO(nasko, clamy): This should just clean up the speculative RFH // without canceling the request. See https://crbug.com/636119. - frame_tree_node_->ResetNavigationRequest(false); + frame_tree_node_->ResetNavigationRequest(false, true); } }
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index 2fa1c86..4105aed1 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -71,7 +71,7 @@ #include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_registry.h" #include "services/service_manager/runner/common/client_util.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/events/latency_info.h" #include "ui/gfx/switches.h" #include "ui/gl/gl_switches.h" @@ -102,6 +102,10 @@ #include "gpu/ipc/common/gpu_surface_tracker.h" #endif +#if defined(OS_MACOSX) +#include "ui/base/ui_base_switches.h" +#endif + namespace content { bool GpuProcessHost::gpu_enabled_ = true;
diff --git a/content/browser/media/media_canplaytype_browsertest.cc b/content/browser/media/media_canplaytype_browsertest.cc index ec109a7..52d137f 100644 --- a/content/browser/media/media_canplaytype_browsertest.cc +++ b/content/browser/media/media_canplaytype_browsertest.cc
@@ -14,7 +14,7 @@ #include "content/shell/browser/shell.h" #include "media/base/media_switches.h" #include "media/media_features.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #if defined(OS_ANDROID) #include "base/android/build_info.h"
diff --git a/content/browser/pointer_lock_browsertest.cc b/content/browser/pointer_lock_browsertest.cc index cf1a792e..f1853c0 100644 --- a/content/browser/pointer_lock_browsertest.cc +++ b/content/browser/pointer_lock_browsertest.cc
@@ -315,4 +315,115 @@ web_contents()->GetMouseLockWidget()); } +IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockWheelEventRouting) { + GURL main_url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + EXPECT_TRUE(NavigateToURL(shell(), main_url)); + + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + FrameTreeNode* child = root->child_at(0); + RenderWidgetHostInputEventRouter* router = + web_contents()->GetInputEventRouter(); + RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>( + root->current_frame_host()->GetView()); + RenderWidgetHostViewBase* child_view = static_cast<RenderWidgetHostViewBase*>( + child->current_frame_host()->GetView()); + + // Request a pointer lock on the root frame's body. + EXPECT_TRUE(ExecuteScript(root, "document.body.requestPointerLock()")); + + // Root frame should have been granted pointer lock. + bool locked = false; + EXPECT_TRUE(ExecuteScriptAndExtractBool(root, + "window.domAutomationController.send(" + "document.pointerLockElement == " + "document.body);", + &locked)); + EXPECT_TRUE(locked); + + // Add a mouse move wheel event listener to the root frame. + EXPECT_TRUE(ExecuteScript( + root, + "var x; var y; var mX; var mY; document.addEventListener('mousewheel', " + "function(e) {x = e.x; y = e.y; dX = e.deltaX; dY = e.deltaY;});")); + MainThreadFrameObserver root_observer(root_view->GetRenderWidgetHost()); + root_observer.Wait(); + + blink::WebMouseWheelEvent wheel_event( + blink::WebInputEvent::MouseWheel, blink::WebInputEvent::NoModifiers, + blink::WebInputEvent::TimeStampForTesting); + wheel_event.x = 10; + wheel_event.y = 11; + wheel_event.deltaX = -12; + wheel_event.deltaY = -13; + router->RouteMouseWheelEvent(root_view, &wheel_event, ui::LatencyInfo()); + + // Make sure that the renderer handled the input event. + root_observer.Wait(); + + int x, y, deltaX, deltaY; + EXPECT_TRUE(ExecuteScriptAndExtractInt( + root, "window.domAutomationController.send(x);", &x)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + root, "window.domAutomationController.send(y);", &y)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + root, "window.domAutomationController.send(dX);", &deltaX)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + root, "window.domAutomationController.send(dY);", &deltaY)); + EXPECT_EQ(10, x); + EXPECT_EQ(11, y); + EXPECT_EQ(12, deltaX); + EXPECT_EQ(13, deltaY); + + // Release pointer lock on root frame. + EXPECT_TRUE(ExecuteScript(root, "document.exitPointerLock()")); + + // Request a pointer lock on the child frame's body. + EXPECT_TRUE(ExecuteScript(child, "document.body.requestPointerLock()")); + + // Child frame should have been granted pointer lock. + EXPECT_TRUE(ExecuteScriptAndExtractBool(child, + "window.domAutomationController.send(" + "document.pointerLockElement == " + "document.body);", + &locked)); + EXPECT_TRUE(locked); + + // Add a mouse move event listener to the child frame. + EXPECT_TRUE(ExecuteScript( + child, + "var x; var y; var mX; var mY; document.addEventListener('mousewheel', " + "function(e) {x = e.x; y = e.y; dX = e.deltaX; dY = e.deltaY;});")); + MainThreadFrameObserver child_observer(child_view->GetRenderWidgetHost()); + child_observer.Wait(); + + gfx::Point transformed_point; + root_view->TransformPointToCoordSpaceForView(gfx::Point(0, 0), child_view, + &transformed_point); + + wheel_event.x = -transformed_point.x() + 14; + wheel_event.y = -transformed_point.y() + 15; + wheel_event.deltaX = -16; + wheel_event.deltaY = -17; + // We use root_view intentionally as the RenderWidgetHostInputEventRouter is + // responsible for correctly routing the event to the child frame. + router->RouteMouseWheelEvent(root_view, &wheel_event, ui::LatencyInfo()); + + // Make sure that the renderer handled the input event. + child_observer.Wait(); + + EXPECT_TRUE(ExecuteScriptAndExtractInt( + child, "window.domAutomationController.send(x);", &x)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + child, "window.domAutomationController.send(y);", &y)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + child, "window.domAutomationController.send(dX);", &deltaX)); + EXPECT_TRUE(ExecuteScriptAndExtractInt( + child, "window.domAutomationController.send(dY);", &deltaY)); + EXPECT_EQ(14, x); + EXPECT_EQ(15, y); + EXPECT_EQ(16, deltaX); + EXPECT_EQ(17, deltaY); +} + } // namespace content
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc index bb8a938..b63f065 100644 --- a/content/browser/renderer_host/ime_adapter_android.cc +++ b/content/browser/renderer_host/ime_adapter_android.cc
@@ -312,7 +312,7 @@ RenderWidgetHostImpl* rwhi = GetFocusedWidget(); if (!rwhi) return; - rwhi->Send(new InputMsg_RequestCompositionUpdate( + rwhi->Send(new InputMsg_RequestCompositionUpdates( rwhi->GetRoutingID(), immediate_request, monitor_request)); }
diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.mm b/content/browser/renderer_host/input/web_input_event_builders_mac.mm index 1d82c12..d18a5ceb 100644 --- a/content/browser/renderer_host/input/web_input_event_builders_mac.mm +++ b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
@@ -318,26 +318,16 @@ result.button = button; SetWebEventLocationFromEventInView(&result, event, view); - // For NSMouseExited and NSMouseEntered events, they do not have a subtype. - // We decide their pointer types by checking if we recevied a - // NSTabletProximity event. - if (type == NSMouseExited || type == NSMouseEntered) { - result.pointerType = pointerType; - return result; - } - - // For other mouse events and touchpad events, the pointer type is mouse. - // For all other tablet events, the pointer type will be just pen. - NSEventSubtype subtype = [event subtype]; - if (subtype != NSTabletPointEventSubtype && - subtype != NSTabletProximityEventSubtype) { - result.pointerType = blink::WebPointerProperties::PointerType::Mouse; + result.pointerType = pointerType; + if ((type == NSMouseExited || type == NSMouseEntered) || + ([event subtype] != NSTabletPointEventSubtype && + [event subtype] != NSTabletProximityEventSubtype)) { return result; } // Set stylus properties for events with a subtype of // NSTabletPointEventSubtype. - result.pointerType = blink::WebPointerProperties::PointerType::Pen; + NSEventSubtype subtype = [event subtype]; result.id = [event deviceID]; if (subtype == NSTabletPointEventSubtype) { result.force = [event pressure];
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/content/browser/renderer_host/media/audio_output_authorization_handler.cc index 3ed7c30..607b92db 100644 --- a/content/browser/renderer_host/media/audio_output_authorization_handler.cc +++ b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
@@ -114,6 +114,8 @@ // Check security origin if nondefault device is requested. if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin)) { + cb.Run(media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED, false, + media::AudioParameters::UnavailableDeviceParams(), std::string()); bad_message::ReceivedBadMessage(render_process_id_, bad_message::AOAH_UNAUTHORIZED_URL); return;
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.h b/content/browser/renderer_host/media/audio_output_authorization_handler.h index d7c99fb5..be56e14 100644 --- a/content/browser/renderer_host/media/audio_output_authorization_handler.h +++ b/content/browser/renderer_host/media/audio_output_authorization_handler.h
@@ -53,7 +53,8 @@ // Checks authorization of the device with the hashed id |device_id| for the // given render frame id and security origin, or uses |session_id| for // authorization. Looks up device id (if |session_id| is used for device - // selection) and default device parameters. + // selection) and default device parameters. This function will always call + // |cb|, even if a bad message if received. void RequestDeviceAuthorization(int render_frame_id, int session_id, const std::string& device_id,
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc b/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc index c6631d2c..ba65fcd0 100644 --- a/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc +++ b/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc
@@ -296,7 +296,8 @@ GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt); EXPECT_EQ(RPH->bad_msg_count(), 0); - EXPECT_CALL(listener, Run(_, _, _, _)).Times(0); + // We must still get a callback by the contract of RequestDeviceAuthorization. + EXPECT_CALL(listener, Run(_, _, _, _)).Times(1); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index b008fd7..e5b897f5 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -166,7 +166,6 @@ #include "content/public/common/sandboxed_process_launcher_delegate.h" #include "content/public/common/service_names.mojom.h" #include "content/public/common/url_constants.h" -#include "device/battery/battery_monitor_impl.h" #include "device/gamepad/gamepad_monitor.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gpu_switches.h" @@ -1209,9 +1208,6 @@ base::Bind(&IndexedDBDispatcherHost::AddBinding, indexed_db_factory_)); #if defined(OS_ANDROID) - AddUIThreadInterface(registry.get(), - GetGlobalJavaInterfaces() - ->CreateInterfaceFactory<device::BatteryMonitor>()); AddUIThreadInterface( registry.get(), GetGlobalJavaInterfaces() ->CreateInterfaceFactory< @@ -1226,8 +1222,6 @@ ->CreateInterfaceFactory<shape_detection::mojom::TextDetection>()); #else AddUIThreadInterface( - registry.get(), base::Bind(&device::BatteryMonitorImpl::Create)); - AddUIThreadInterface( registry.get(), base::Bind(&ForwardShapeDetectionRequest< shape_detection::mojom::BarcodeDetectionRequest>)); @@ -1862,6 +1856,7 @@ #if BUILDFLAG(ENABLE_WEBRTC) switches::kDisableWebRtcHWDecoding, switches::kDisableWebRtcHWEncoding, + switches::kEnableWebRtcSrtpAesGcm, switches::kEnableWebRtcStunOrigin, switches::kEnforceWebRtcIPPermissionCheck, switches::kForceWebRtcIPHandlingPolicy, @@ -2275,6 +2270,14 @@ pending_views_--; } +void RenderProcessHostImpl::AddWidget(RenderWidgetHost* widget) { + widgets_.insert(static_cast<RenderWidgetHostImpl*>(widget)); +} + +void RenderProcessHostImpl::RemoveWidget(RenderWidgetHost* widget) { + widgets_.erase(static_cast<RenderWidgetHostImpl*>(widget)); +} + void RenderProcessHostImpl::SetSuddenTerminationAllowed(bool enabled) { sudden_termination_allowed_ = enabled; } @@ -3047,17 +3050,11 @@ void RenderProcessHostImpl::RecomputeAndUpdateWebKitPreferences() { // We are updating all widgets including swapped out ones. - std::unique_ptr<RenderWidgetHostIterator> widgets( - RenderWidgetHostImpl::GetAllRenderWidgetHosts()); - while (RenderWidgetHost* widget = widgets->GetNextHost()) { + for (auto* widget : widgets_) { RenderViewHost* rvh = RenderViewHost::From(widget); if (!rvh) continue; - // Skip widgets in other processes. - if (rvh->GetProcess()->GetID() != GetID()) - continue; - rvh->OnWebkitPreferencesChanged(); } }
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index cef2679..b7bc733 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -11,6 +11,7 @@ #include <map> #include <memory> #include <queue> +#include <set> #include <string> #include "base/macros.h" @@ -70,6 +71,7 @@ class RenderFrameMessageFilter; class RenderWidgetHelper; class RenderWidgetHost; +class RenderWidgetHostImpl; class ResourceMessageFilter; class StoragePartition; class StoragePartitionImpl; @@ -139,6 +141,8 @@ void Cleanup() override; void AddPendingView() override; void RemovePendingView() override; + void AddWidget(RenderWidgetHost* widget) override; + void RemoveWidget(RenderWidgetHost* widget) override; void SetSuddenTerminationAllowed(bool enabled) override; bool SuddenTerminationAllowed() const override; IPC::ChannelProxy* GetChannel() override; @@ -461,6 +465,9 @@ // backgrounded. int32_t visible_widgets_; + // The set of widgets in this RenderProcessHostImpl. + std::set<RenderWidgetHostImpl*> widgets_; + // Whether this process currently has backgrounded priority. Tracked so that // UpdateProcessPriority() can avoid redundantly setting the priority. bool is_process_backgrounded_;
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 27f9a45f..9e99f32b 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -86,6 +86,7 @@ #include "ui/base/device_form_factor.h" #include "ui/base/touch/touch_device.h" #include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/gfx/animation/animation.h" #include "ui/gfx/color_space.h" #include "ui/gfx/image/image_skia.h"
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 9914db5c..12e99a82 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -82,7 +82,7 @@ #include "storage/browser/fileapi/isolated_context.h" #include "third_party/WebKit/public/web/WebCompositionUnderline.h" #include "ui/base/clipboard/clipboard.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/events/blink/web_input_event_traits.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -294,6 +294,7 @@ new_content_rendering_delay_( base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), current_content_source_id_(0), + monitoring_composition_info_(false), weak_factory_(this) { CHECK(delegate_); CHECK_NE(MSG_ROUTING_NONE, routing_id_); @@ -315,6 +316,7 @@ RenderWidgetHostID(process->GetID(), routing_id_), this)); CHECK(result.second) << "Inserting a duplicate item!"; process_->AddRoute(routing_id_, this); + process_->AddWidget(this); // If we're initially visible, tell the process host that we're alive. // Otherwise we'll notify the process host when we are first shown. @@ -1560,6 +1562,10 @@ if (!renderer_initialized_) return; + // Clear this flag so that we can ask the next renderer for composition + // updates. + monitoring_composition_info_ = false; + // Clearing this flag causes us to re-create the renderer when recovering // from a crashed renderer. renderer_initialized_ = false; @@ -1693,6 +1699,7 @@ view_.reset(); } + process_->RemoveWidget(this); process_->RemoveRoute(routing_id_); g_routing_id_widget_map.Get().erase( RenderWidgetHostID(process_->GetID(), routing_id_)); @@ -2621,4 +2628,13 @@ } } +void RenderWidgetHostImpl::RequestCompositionUpdates(bool immediate_request, + bool monitor_updates) { + if (!immediate_request && monitor_updates == monitoring_composition_info_) + return; + monitoring_composition_info_ = monitor_updates; + Send(new InputMsg_RequestCompositionUpdates(routing_id_, immediate_request, + monitor_updates)); +} + } // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 2ecbba20..7459527 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -573,6 +573,17 @@ return weak_factory_.GetWeakPtr(); } + // Request composition updates from RenderWidget. If |immediate_request| is + // true, RenderWidget will respond immediately. If |monitor_updates| is true, + // then RenderWidget sends updates for each compositor frame when there are + // changes, or when the text selection changes inside a frame. If both fields + // are false, RenderWidget will not send any updates. To avoid sending + // unnecessary IPCs to RenderWidget (e.g., asking for monitor updates while + // we are already receiving updates), when + // |monitoring_composition_info_| == |monitor_updates| no IPC is sent to the + // renderer unless it is for an immediate request. + void RequestCompositionUpdates(bool immediate_request, bool monitor_updates); + protected: // --------------------------------------------------------------------------- // The following method is overridden by RenderViewHost to send upwards to @@ -903,6 +914,11 @@ // are available in the renderer process. See https://crbug.com/695579. uint32_t current_content_source_id_; + // When true, the RenderWidget is regularly sending updates regarding + // composition info. It should only be true when there is a focused editable + // node. + bool monitoring_composition_info_; + #if defined(OS_MACOSX) std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_; #endif
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc index 2b0afcb..2ff6b89 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -263,18 +263,22 @@ RenderWidgetHostViewBase* root_view, blink::WebMouseWheelEvent* event, const ui::LatencyInfo& latency) { + RenderWidgetHostViewBase* target = nullptr; + gfx::Point transformed_point; + if (root_view->IsMouseLocked()) { - RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) - ->delegate() - ->GetMouseLockWidget() - ->GetView() - ->ProcessMouseEvent(*event, latency); - return; + target = RenderWidgetHostImpl::From(root_view->GetRenderWidgetHost()) + ->delegate() + ->GetMouseLockWidget() + ->GetView(); + if (!root_view->TransformPointToCoordSpaceForView( + gfx::Point(event->x, event->y), target, &transformed_point)) + return; + } else { + target = FindEventTarget(root_view, gfx::Point(event->x, event->y), + &transformed_point); } - gfx::Point transformed_point; - RenderWidgetHostViewBase* target = FindEventTarget( - root_view, gfx::Point(event->x, event->y), &transformed_point); if (!target) return;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 391cc67279..354177ed 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -55,7 +55,6 @@ #include "content/public/browser/overscroll_configuration.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/user_metrics.h" -#include "content/public/common/child_process_host.h" #include "content/public/common/content_switches.h" #include "gpu/ipc/common/gpu_messages.h" #include "media/base/video_frame.h" @@ -63,6 +62,7 @@ #include "services/ui/public/interfaces/window_manager_constants.mojom.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/web/WebCompositionUnderline.h" +#include "ui/accessibility/platform/aura_window_properties.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/client/cursor_client_observer.h" @@ -396,8 +396,6 @@ has_snapped_to_boundary_(false), is_guest_view_hack_(is_guest_view_hack), device_scale_factor_(0.0f), - last_active_widget_process_id_(ChildProcessHost::kInvalidUniqueID), - last_active_widget_routing_id_(MSG_ROUTING_NONE), event_handler_(new RenderWidgetHostViewEventHandler(host_, this, this)), weak_ptr_factory_(this) { if (!is_guest_view_hack_) @@ -1151,6 +1149,11 @@ return NULL; } +void RenderWidgetHostViewAura::SetMainFrameAXTreeID( + ui::AXTreeIDRegistry::AXTreeID id) { + window_->SetProperty(ui::kChildAXTreeID, id); +} + bool RenderWidgetHostViewAura::LockMouse() { return event_handler_->LockMouse(); } @@ -2300,28 +2303,13 @@ GetInputMethod()->ShowImeIfNeeded(); } - if (state && state->type != ui::TEXT_INPUT_TYPE_NONE) { - // Start monitoring the composition information if the focused node is - // editable. - RenderWidgetHostImpl* last_active_widget = - text_input_manager_->GetActiveWidget(); - last_active_widget_routing_id_ = last_active_widget->GetRoutingID(); - last_active_widget_process_id_ = last_active_widget->GetProcess()->GetID(); - last_active_widget->Send(new InputMsg_RequestCompositionUpdate( - last_active_widget->GetRoutingID(), false /* immediate request */, - true /* monitor request */)); - } else { - // Stop monitoring the composition information if the focused node is not - // editable. - RenderWidgetHostImpl* last_active_widget = RenderWidgetHostImpl::FromID( - last_active_widget_process_id_, last_active_widget_routing_id_); - if (last_active_widget) { - last_active_widget->Send(new InputMsg_RequestCompositionUpdate( - last_active_widget->GetRoutingID(), false /* immediate request */, - false /* monitor request */)); - } - last_active_widget_routing_id_ = MSG_ROUTING_NONE; - last_active_widget_process_id_ = ChildProcessHost::kInvalidUniqueID; + if (auto* render_widget_host = + RenderWidgetHostImpl::From(updated_view->GetRenderWidgetHost())) { + // Monitor the composition information if there is a focused editable node. + render_widget_host->RequestCompositionUpdates( + false /* immediate_request */, + state && + (state->type != ui::TEXT_INPUT_TYPE_NONE) /* monitor_updates */); } }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 3456a0b..f9e1cdce 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -77,7 +77,6 @@ class RenderWidgetHostImpl; class RenderWidgetHostView; class TouchSelectionControllerClientAura; -struct TextInputState; // RenderWidgetHostView class hierarchy described in render_widget_host_view.h. class CONTENT_EXPORT RenderWidgetHostViewAura @@ -163,6 +162,7 @@ BrowserAccessibilityDelegate* delegate, bool for_root_frame) override; gfx::AcceleratedWidget AccessibilityGetAcceleratedWidget() override; gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override; + void SetMainFrameAXTreeID(ui::AXTreeIDRegistry::AXTreeID id) override; bool LockMouse() override; void UnlockMouse() override; void OnSwapCompositorFrame(uint32_t compositor_frame_sink_id, @@ -577,11 +577,6 @@ float device_scale_factor_; - // The routing and process IDs for the last RenderWidgetHost which had a - // TextInputState of non-NONE. - int32_t last_active_widget_process_id_; - int32_t last_active_widget_routing_id_; - // While this is a ui::EventHandler for targetting, |event_handler_| actually // provides an implementation, and directs events to |host_|. std::unique_ptr<RenderWidgetHostViewEventHandler> event_handler_;
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index ce1a78f..26b0244 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -31,6 +31,7 @@ #include "third_party/WebKit/public/web/WebPopupType.h" #include "third_party/WebKit/public/web/WebTextDirection.h" #include "third_party/skia/include/core/SkImageInfo.h" +#include "ui/accessibility/ax_tree_id_registry.h" #include "ui/base/ime/text_input_mode.h" #include "ui/base/ime/text_input_type.h" #include "ui/display/display.h" @@ -214,7 +215,7 @@ virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds); virtual gfx::AcceleratedWidget AccessibilityGetAcceleratedWidget(); virtual gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible(); - + virtual void SetMainFrameAXTreeID(ui::AXTreeIDRegistry::AXTreeID id) {} // Informs that the focused DOM node has changed. virtual void FocusedNodeChanged(bool is_editable_node, const gfx::Rect& node_bounds_in_screen) {}
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index 043bcf5..86b1b0b 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -200,6 +200,7 @@ - (void)updateCursor:(NSCursor*)cursor; - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange actualRange:(NSRangePointer)actualRange; +- (void)tabletEvent:(NSEvent*)theEvent; - (void)quickLookWithEvent:(NSEvent*)event; - (void)showLookUpDictionaryOverlayAtPoint:(NSPoint)point; - (void)showLookUpDictionaryOverlayFromRange:(NSRange)range
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 210f2c2..832a4cb 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -909,7 +909,8 @@ // |updated_view| is the last view to change its TextInputState which can be // used to start/stop monitoring composition info when it has a focused // editable text input field. - RenderWidgetHost* widgetHost = updated_view->GetRenderWidgetHost(); + RenderWidgetHostImpl* widgetHost = + RenderWidgetHostImpl::From(updated_view->GetRenderWidgetHost()); // We might end up here when |updated_view| has had active TextInputState and // then got destroyed. In that case, |updated_view->GetRenderWidgetHost()| @@ -923,9 +924,8 @@ bool need_monitor_composition = has_focus && state && state->type != ui::TEXT_INPUT_TYPE_NONE; - widgetHost->Send(new InputMsg_RequestCompositionUpdate( - widgetHost->GetRoutingID(), false /* immediate request */, - need_monitor_composition)); + widgetHost->RequestCompositionUpdates(false /* immediate_request */, + need_monitor_composition); if (has_focus) { SetTextInputActive(true); @@ -1904,11 +1904,21 @@ // Set the pointer type when we are receiving a NSMouseEntered event and the // following NSMouseExited event should have the same pointer type. + // For NSMouseExited and NSMouseEntered events, they do not have a subtype. + // We decide their pointer types by checking if we recevied a + // NSTabletProximity event. NSEventType type = [theEvent type]; - if (type == NSMouseEntered) { + if (type == NSMouseEntered || type == NSMouseExited) { pointerType_ = isStylusEnteringProximity_ - ? blink::WebPointerProperties::PointerType::Pen + ? pointerType_ : blink::WebPointerProperties::PointerType::Mouse; + } else { + NSEventSubtype subtype = [theEvent subtype]; + // For other mouse events and touchpad events, the pointer type is mouse. + if (subtype != NSTabletPointEventSubtype && + subtype != NSTabletProximityEventSubtype) { + pointerType_ = blink::WebPointerProperties::PointerType::Mouse; + } } if ([self shouldIgnoreMouseEvent:theEvent]) { @@ -1981,8 +1991,14 @@ } - (void)tabletEvent:(NSEvent*)theEvent { - if ([theEvent type] == NSTabletProximity) + if ([theEvent type] == NSTabletProximity) { isStylusEnteringProximity_ = [theEvent isEnteringProximity]; + NSPointingDeviceType deviceType = [theEvent pointingDeviceType]; + // For all tablet events, the pointer type will be pen or eraser. + pointerType_ = deviceType == NSEraserPointingDevice + ? blink::WebPointerProperties::PointerType::Eraser + : blink::WebPointerProperties::PointerType::Pen; + } } - (BOOL)performKeyEquivalent:(NSEvent*)theEvent {
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm index 593a8294..1131e57 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -124,6 +124,51 @@ return result; } +blink::WebPointerProperties::PointerType GetInputMessagePointerTypes( + MockRenderProcessHost* process) { + blink::WebPointerProperties::PointerType pointer_type; + DCHECK_LE(process->sink().message_count(), 1U); + for (size_t i = 0; i < process->sink().message_count(); ++i) { + const IPC::Message* message = process->sink().GetMessageAt(i); + EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type()); + InputMsg_HandleInputEvent::Param params; + EXPECT_TRUE(InputMsg_HandleInputEvent::Read(message, ¶ms)); + const blink::WebInputEvent* event = std::get<0>(params); + if (blink::WebInputEvent::isMouseEventType(event->type())) { + pointer_type = + static_cast<const blink::WebMouseEvent*>(event)->pointerType; + } + } + process->sink().ClearMessages(); + return pointer_type; +} + +NSEvent* MockTabletEventWithParams(CGEventType type, + bool is_entering_proximity, + NSPointingDeviceType device_type) { + CGEventRef cg_event = CGEventCreate(NULL); + CGEventSetType(cg_event, type); + CGEventSetIntegerValueField(cg_event, kCGTabletProximityEventEnterProximity, + is_entering_proximity); + CGEventSetIntegerValueField(cg_event, kCGTabletProximityEventPointerType, + device_type); + NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; + CFRelease(cg_event); + return event; +} + +NSEvent* MockMouseEventWithParams(CGEventType mouse_type, + CGPoint location, + CGMouseButton button, + CGEventMouseSubtype subtype) { + CGEventRef cg_event = + CGEventCreateMouseEvent(NULL, mouse_type, location, button); + CGEventSetIntegerValueField(cg_event, kCGMouseEventSubtype, subtype); + NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; + CFRelease(cg_event); + return event; +} + id MockGestureEvent(NSEventType type, double magnification) { id event = [OCMockObject mockForClass:[NSEvent class]]; NSPoint locationInWindow = NSMakePoint(0, 0); @@ -1005,6 +1050,101 @@ host->ShutdownAndDestroyWidget(true); } +TEST_F(RenderWidgetHostViewMacTest, PointerEventWithEraserType) { + // Initialize the view associated with a MockRenderWidgetHostImpl, rather than + // the MockRenderProcessHost that is set up by the test harness which mocks + // out |OnMessageReceived()|. + TestBrowserContext browser_context; + MockRenderProcessHost* process_host = + new MockRenderProcessHost(&browser_context); + process_host->Init(); + MockRenderWidgetHostDelegate delegate; + int32_t routing_id = process_host->GetNextRoutingID(); + MockRenderWidgetHostImpl* host = + new MockRenderWidgetHostImpl(&delegate, process_host, routing_id); + RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host, false); + process_host->sink().ClearMessages(); + + // Send a NSEvent of NSTabletProximity type which has a device type of eraser. + NSEvent* event = MockTabletEventWithParams(kCGEventTabletProximity, true, + NSEraserPointingDevice); + [view->cocoa_view() tabletEvent:event]; + // Flush and clear other messages (e.g. begin frames) the RWHVMac also sends. + base::RunLoop().RunUntilIdle(); + process_host->sink().ClearMessages(); + + event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0, + kCGEventMouseSubtypeTabletPoint); + [view->cocoa_view() mouseEvent:event]; + ASSERT_EQ(1U, process_host->sink().message_count()); + EXPECT_EQ(blink::WebPointerProperties::PointerType::Eraser, + GetInputMessagePointerTypes(process_host)); + + // Clean up. + host->ShutdownAndDestroyWidget(true); +} + +TEST_F(RenderWidgetHostViewMacTest, PointerEventWithPenType) { + // Initialize the view associated with a MockRenderWidgetHostImpl, rather than + // the MockRenderProcessHost that is set up by the test harness which mocks + // out |OnMessageReceived()|. + TestBrowserContext browser_context; + MockRenderProcessHost* process_host = + new MockRenderProcessHost(&browser_context); + process_host->Init(); + MockRenderWidgetHostDelegate delegate; + int32_t routing_id = process_host->GetNextRoutingID(); + MockRenderWidgetHostImpl* host = + new MockRenderWidgetHostImpl(&delegate, process_host, routing_id); + RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host, false); + process_host->sink().ClearMessages(); + + // Send a NSEvent of NSTabletProximity type which has a device type of pen. + NSEvent* event = MockTabletEventWithParams(kCGEventTabletProximity, true, + NSPenPointingDevice); + [view->cocoa_view() tabletEvent:event]; + // Flush and clear other messages (e.g. begin frames) the RWHVMac also sends. + base::RunLoop().RunUntilIdle(); + process_host->sink().ClearMessages(); + + event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0, + kCGEventMouseSubtypeTabletPoint); + [view->cocoa_view() mouseEvent:event]; + ASSERT_EQ(1U, process_host->sink().message_count()); + EXPECT_EQ(blink::WebPointerProperties::PointerType::Pen, + GetInputMessagePointerTypes(process_host)); + + // Clean up. + host->ShutdownAndDestroyWidget(true); +} + +TEST_F(RenderWidgetHostViewMacTest, PointerEventWithMouseType) { + // Initialize the view associated with a MockRenderWidgetHostImpl, rather than + // the MockRenderProcessHost that is set up by the test harness which mocks + // out |OnMessageReceived()|. + TestBrowserContext browser_context; + MockRenderProcessHost* process_host = + new MockRenderProcessHost(&browser_context); + process_host->Init(); + MockRenderWidgetHostDelegate delegate; + int32_t routing_id = process_host->GetNextRoutingID(); + MockRenderWidgetHostImpl* host = + new MockRenderWidgetHostImpl(&delegate, process_host, routing_id); + RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host, false); + process_host->sink().ClearMessages(); + + // Send a NSEvent of a mouse type. + NSEvent* event = MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, 0, + kCGEventMouseSubtypeDefault); + [view->cocoa_view() mouseEvent:event]; + ASSERT_EQ(1U, process_host->sink().message_count()); + EXPECT_EQ(blink::WebPointerProperties::PointerType::Mouse, + GetInputMessagePointerTypes(process_host)); + + // Clean up. + host->ShutdownAndDestroyWidget(true); +} + TEST_F(RenderWidgetHostViewMacTest, IgnoreEmptyUnhandledWheelEventWithWheelGestures) { // Initialize the view associated with a MockRenderWidgetHostImpl, rather than @@ -1582,13 +1722,13 @@ // The tab's widget must have received an IPC regarding composition updates. const IPC::Message* composition_request_msg_for_tab = tab_sink().GetUniqueMessageMatching( - InputMsg_RequestCompositionUpdate::ID); + InputMsg_RequestCompositionUpdates::ID); EXPECT_TRUE(composition_request_msg_for_tab); // The message should ask for monitoring updates, but no immediate update. - InputMsg_RequestCompositionUpdate::Param tab_msg_params; - InputMsg_RequestCompositionUpdate::Read(composition_request_msg_for_tab, - &tab_msg_params); + InputMsg_RequestCompositionUpdates::Param tab_msg_params; + InputMsg_RequestCompositionUpdates::Read(composition_request_msg_for_tab, + &tab_msg_params); bool is_tab_msg_for_immediate_request = std::get<0>(tab_msg_params); bool is_tab_msg_for_monitor_request = std::get<1>(tab_msg_params); EXPECT_FALSE(is_tab_msg_for_immediate_request); @@ -1601,13 +1741,13 @@ // The tab should receive another IPC for composition updates. composition_request_msg_for_tab = tab_sink().GetUniqueMessageMatching( - InputMsg_RequestCompositionUpdate::ID); + InputMsg_RequestCompositionUpdates::ID); EXPECT_TRUE(composition_request_msg_for_tab); // This time, the tab should have been asked to stop monitoring (and no // immediate updates). - InputMsg_RequestCompositionUpdate::Read(composition_request_msg_for_tab, - &tab_msg_params); + InputMsg_RequestCompositionUpdates::Read(composition_request_msg_for_tab, + &tab_msg_params); is_tab_msg_for_immediate_request = std::get<0>(tab_msg_params); is_tab_msg_for_monitor_request = std::get<1>(tab_msg_params); EXPECT_FALSE(is_tab_msg_for_immediate_request); @@ -1617,14 +1757,14 @@ // The child too must have received an IPC for composition updates. const IPC::Message* composition_request_msg_for_child = child_sink().GetUniqueMessageMatching( - InputMsg_RequestCompositionUpdate::ID); + InputMsg_RequestCompositionUpdates::ID); EXPECT_TRUE(composition_request_msg_for_child); // Verify that the message is asking for monitoring to start; but no immediate // updates. - InputMsg_RequestCompositionUpdate::Param child_msg_params; - InputMsg_RequestCompositionUpdate::Read(composition_request_msg_for_child, - &child_msg_params); + InputMsg_RequestCompositionUpdates::Param child_msg_params; + InputMsg_RequestCompositionUpdates::Read(composition_request_msg_for_child, + &child_msg_params); bool is_child_msg_for_immediate_request = std::get<0>(child_msg_params); bool is_child_msg_for_monitor_request = std::get<1>(child_msg_params); EXPECT_FALSE(is_child_msg_for_immediate_request); @@ -1636,12 +1776,12 @@ // Verify that the child received another IPC for composition updates. composition_request_msg_for_child = child_sink().GetUniqueMessageMatching( - InputMsg_RequestCompositionUpdate::ID); + InputMsg_RequestCompositionUpdates::ID); EXPECT_TRUE(composition_request_msg_for_child); // Verify that this IPC is asking for no monitoring or immediate updates. - InputMsg_RequestCompositionUpdate::Read(composition_request_msg_for_child, - &child_msg_params); + InputMsg_RequestCompositionUpdates::Read(composition_request_msg_for_child, + &child_msg_params); is_child_msg_for_immediate_request = std::get<0>(child_msg_params); is_child_msg_for_monitor_request = std::get<1>(child_msg_params); EXPECT_FALSE(is_child_msg_for_immediate_request);
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc index 9202ef8..d8a667c5 100644 --- a/content/browser/service_worker/service_worker_dispatcher_host.cc +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/debug/crash_logging.h" -#include "base/debug/dump_without_crashing.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/ptr_util.h" @@ -1017,14 +1016,15 @@ if (navigation_handle_core != nullptr) provider_host = navigation_handle_core->RetrievePreCreatedHost(); - // If no host is found, the navigation has been cancelled in the meantime. - // Just return as the navigation will be stopped in the renderer as well. + // If no host is found, create one. if (provider_host == nullptr) { - // TODO(clamy): remove this Dump when the root cause for crbug.com/703972 - // has been found. - base::debug::DumpWithoutCrashing(); + GetContext()->AddProviderHost( + ServiceWorkerProviderHost::Create(render_process_id_, std::move(info), + GetContext()->AsWeakPtr(), this)); return; } + + // Otherwise, completed the initialization of the pre-created host. DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, info.type); provider_host->CompleteNavigationInitialized(render_process_id_, info.route_id, this);
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index 4b8efbd..033dcee 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc
@@ -131,7 +131,7 @@ const gfx::Rect& absolute_rect = node->GetPageBoundsRect(); gfx::Rect parent_relative_rect = absolute_rect; - bool is_root = node->GetParent() == nullptr; + bool is_root = node->PlatformGetParent() == nullptr; if (!is_root) { parent_relative_rect.Offset(-parent_rect.OffsetFromOrigin()); }
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index b165369..a0cd5e0 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -556,7 +556,7 @@ // PlzNavigate: clear up state specific to browser-side navigation. if (IsBrowserSideNavigationEnabled()) { // Do not update state as the WebContents is being destroyed. - frame_tree_.root()->ResetNavigationRequest(true); + frame_tree_.root()->ResetNavigationRequest(true, true); if (root->speculative_frame_host()) { root->speculative_frame_host()->SetRenderFrameCreated(false); root->speculative_frame_host()->SetNavigationHandle(
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index 27e78bd..2ef0497 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -703,10 +703,9 @@ : screen->GetPrimaryDisplay(); results->rect = display.bounds(); results->available_rect = display.work_area(); - // TODO(derat|oshima): Don't hardcode this. Get this from display object. - results->depth = 24; - results->depth_per_component = 8; - results->is_monochrome = false; + results->depth = display.color_depth(); + results->depth_per_component = display.depth_per_component(); + results->is_monochrome = display.is_monochrome(); results->device_scale_factor = display.device_scale_factor(); results->icc_profile = gfx::ICCProfile::FromBestMonitor(); if (!results->icc_profile.IsValid())
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc index 504ac2b..97ad227 100644 --- a/content/browser/web_contents/web_contents_view_aura_unittest.cc +++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -4,16 +4,19 @@ #include "content/browser/web_contents/web_contents_view_aura.h" +#include "base/command_line.h" +#include "base/test/scoped_command_line.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/test/test_renderer_host.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/display/display_switches.h" namespace content { class WebContentsViewAuraTest : public RenderViewHostTestHarness { public: - WebContentsViewAuraTest() {} - ~WebContentsViewAuraTest() override {} + WebContentsViewAuraTest() = default; + ~WebContentsViewAuraTest() override = default; WebContentsViewAura* view() { WebContentsImpl* contents = static_cast<WebContentsImpl*>(web_contents()); @@ -29,4 +32,39 @@ EXPECT_TRUE(wcva->navigation_overlay_); } +TEST_F(WebContentsViewAuraTest, ScreenInfoColorDepth) { + WebContentsView* web_contents_view = view(); + + ScreenInfo screen_info; + web_contents_view->GetScreenInfo(&screen_info); + EXPECT_EQ(24u, screen_info.depth); + EXPECT_EQ(8u, screen_info.depth_per_component); +} + +// This test class is used when we want to have the kEnableHDROutput flag on. +class WebContentsViewAuraHDRTest : public WebContentsViewAuraTest { + public: + WebContentsViewAuraHDRTest() = default; + ~WebContentsViewAuraHDRTest() override = default; + + void SetUp() override { + base::CommandLine* command_line = + scoped_command_line_.GetProcessCommandLine(); + command_line->AppendSwitch(switches::kEnableHDR); + WebContentsViewAuraTest::SetUp(); + } + + private: + base::test::ScopedCommandLine scoped_command_line_; +}; + +TEST_F(WebContentsViewAuraHDRTest, ScreenInfoColorDepth) { + WebContentsView* web_contents_view = view(); + + ScreenInfo screen_info; + web_contents_view->GetScreenInfo(&screen_info); + EXPECT_EQ(48u, screen_info.depth); + EXPECT_EQ(16u, screen_info.depth_per_component); +} + } // namespace content
diff --git a/content/child/blink_platform_impl.cc b/content/child/blink_platform_impl.cc index e00332a..b756a30 100644 --- a/content/child/blink_platform_impl.cc +++ b/content/child/blink_platform_impl.cc
@@ -50,8 +50,6 @@ #include "content/public/common/content_client.h" #include "content/public/common/service_manager_connection.h" #include "net/base/net_errors.h" -#include "services/service_manager/public/cpp/connector.h" -#include "services/service_manager/public/interfaces/connector.mojom.h" #include "third_party/WebKit/public/platform/WebData.h" #include "third_party/WebKit/public/platform/WebFloatPoint.h" #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" @@ -786,19 +784,6 @@ return false; } -void BlinkPlatformImpl::bindServiceConnector( - mojo::ScopedMessagePipeHandle remote_handle) { - if (!ChildThreadImpl::current()) - return; - - service_manager::mojom::ConnectorRequest chromium_request; - chromium_request.Bind(std::move(remote_handle)); - ChildThreadImpl::current() - ->GetServiceManagerConnection() - ->GetConnector() - ->BindConnectorRequest(std::move(chromium_request)); -} - size_t BlinkPlatformImpl::actualMemoryUsageMB() { return GetMemoryUsageKB() >> 10; }
diff --git a/content/child/blink_platform_impl.h b/content/child/blink_platform_impl.h index 5952773..ca22738 100644 --- a/content/child/blink_platform_impl.h +++ b/content/child/blink_platform_impl.h
@@ -75,9 +75,6 @@ size_t actualMemoryUsageMB() override; size_t numberOfProcessors() override; - void bindServiceConnector( - mojo::ScopedMessagePipeHandle remote_handle) override; - size_t maxDecodedImageBytes() override; uint32_t getUniqueIdForProcess() override; blink::WebString userAgent() override;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 72d0afe..2bbc8ab 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -261,8 +261,8 @@ if (command_line.HasSwitch(switches::kEnableSlimmingPaintV2)) WebRuntimeFeatures::enableSlimmingPaintV2(true); - WebRuntimeFeatures::enableSlimmingPaintInvalidation( - base::FeatureList::IsEnabled(features::kSlimmingPaintInvalidation)); + if (base::FeatureList::IsEnabled(features::kSlimmingPaintInvalidation)) + WebRuntimeFeatures::enableSlimmingPaintInvalidation(true); if (command_line.HasSwitch(switches::kEnableSlimmingPaintInvalidation)) WebRuntimeFeatures::enableSlimmingPaintInvalidation(true);
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index d235508b..59417970 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -1511,6 +1511,11 @@ content::CommonNavigationParams, content::BeginNavigationParams) +// PlzNavigate +// Tells the browser to abort an ongoing renderer-initiated navigation. This is +// used when the page calls document.open. +IPC_MESSAGE_ROUTED0(FrameHostMsg_AbortNavigation) + // Sent as a response to FrameMsg_VisualStateRequest. // The message is delivered using RenderWidget::QueueMessage. IPC_MESSAGE_ROUTED1(FrameHostMsg_VisualStateResponse, uint64_t /* id */)
diff --git a/content/common/input_messages.h b/content/common/input_messages.h index 62b876e..cf5458ca 100644 --- a/content/common/input_messages.h +++ b/content/common/input_messages.h
@@ -289,10 +289,15 @@ IPC_MESSAGE_ROUTED0(InputMsg_RequestTextInputStateUpdate) #endif -// Request from browser to update the cursor and composition information. -IPC_MESSAGE_ROUTED2(InputMsg_RequestCompositionUpdate, - bool /* immediate request */, - bool /* monitor request */) +// Request from browser to update the cursor and composition information which +// will be sent through InputHostMsg_ImeCompositionRangeChanged. Setting +// |immediate_request| to true will lead to an immediate update. If +// |monitor_updates| is set to true then changes to text selection or regular +// updates in each compositor frame (when there is a change in composition info) +// will lead to updates being sent to the browser. +IPC_MESSAGE_ROUTED2(InputMsg_RequestCompositionUpdates, + bool /* immediate_request */, + bool /* monitor_updates */) IPC_MESSAGE_ROUTED0(InputMsg_SyntheticGestureCompleted)
diff --git a/content/common/navigation_params.cc b/content/common/navigation_params.cc index b36b744b..16ddaf7 100644 --- a/content/common/navigation_params.cc +++ b/content/common/navigation_params.cc
@@ -12,6 +12,7 @@ #include "content/public/common/url_constants.h" #include "url/gurl.h" #include "url/url_constants.h" +#include "url/url_util.h" namespace content { @@ -19,11 +20,19 @@ bool ShouldMakeNetworkRequestForURL(const GURL& url) { CHECK(IsBrowserSideNavigationEnabled()); - // Javascript URLs, about:blank, srcdoc should not send a request - // to the network stack. - return !url.IsAboutBlank() && !url.SchemeIs(url::kJavaScriptScheme) && - !url.is_empty() && !url.SchemeIs(url::kContentIDScheme) && - url != content::kAboutSrcDocURL; + // Javascript URLs, srcdoc, schemes that don't load data should not send a + // request to the network stack. + if (url.SchemeIs(url::kJavaScriptScheme) || url.is_empty() || + url.SchemeIs(url::kContentIDScheme) || url == content::kAboutSrcDocURL) { + return false; + } + + for (const auto& scheme : url::GetEmptyDocumentSchemes()) { + if (url.SchemeIs(scheme)) + return false; + } + + return true; } SourceLocation::SourceLocation() : line_number(0), column_number(0) {}
diff --git a/content/common/url_schemes.cc b/content/common/url_schemes.cc index 29a3c85..6667cb1 100644 --- a/content/common/url_schemes.cc +++ b/content/common/url_schemes.cc
@@ -68,6 +68,9 @@ for (auto& scheme : schemes.csp_bypassing_schemes) url::AddCSPBypassingScheme(scheme.c_str()); + for (auto& scheme : schemes.empty_document_schemes) + url::AddEmptyDocumentScheme(scheme.c_str()); + // Prevent future modification of the scheme lists. This is to prevent // accidental creation of data races in the program. Add*Scheme aren't // threadsafe so must be called when GURL isn't used on any other thread. This
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index 090d3fa..c615be41 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -35,8 +35,6 @@ deps = [ ":content_java_resources", "//base:base_java", - "//device/battery:mojo_bindings_java", - "//device/battery/android:battery_monitor_java", "//device/bluetooth:java", "//device/gamepad:java", "//device/generic_sensor:java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java index 2433d7f0..1bf229e5 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -45,7 +45,7 @@ * Code can run on these threads: UI, Launcher, async thread pool, binder, and one-off * background threads. */ -@JNINamespace("content") +@JNINamespace("content::internal") public class ChildProcessLauncher { private static final String TAG = "ChildProcLauncher"; @@ -814,7 +814,7 @@ Log.d(TAG, "stopping child connection: pid=%d", pid); ChildProcessConnection connection = sServiceMap.remove(pid); if (connection == null) { - logPidWarning(pid, "Tried to stop non-existent connection"); + // Can happen for single process. return; } sBindingManager.clearConnection(pid); @@ -829,13 +829,6 @@ return callbackType == CALLBACK_FOR_GPU_PROCESS ? new GpuProcessCallback() : null; } - static void logPidWarning(int pid, String message) { - // This class is effectively a no-op in single process mode, so don't log warnings there. - if (pid > 0 && !nativeIsSingleProcess()) { - Log.w(TAG, "%s, pid=%d", message, pid); - } - } - @VisibleForTesting public static ChildProcessConnection startForTesting(Context context, String[] commandLine, FileDescriptorInfo[] filesToMap, ChildProcessCreationParams params) { @@ -938,5 +931,4 @@ } private static native void nativeOnChildProcessStarted(long clientContext, int pid); - private static native boolean nativeIsSingleProcess(); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java b/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java index 680e9d47..0591425 100644 --- a/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/InterfaceRegistrarImpl.java
@@ -14,8 +14,6 @@ import org.chromium.content_public.browser.InterfaceRegistrar; import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.WebContents; -import org.chromium.device.BatteryMonitor; -import org.chromium.device.battery.BatteryMonitorFactory; import org.chromium.device.mojom.VibrationManager; import org.chromium.device.nfc.mojom.Nfc; import org.chromium.device.vibration.VibrationManagerImpl; @@ -74,8 +72,6 @@ InterfaceRegistry registry, final Context applicationContext) { registry.addInterface( VibrationManager.MANAGER, new VibrationManagerImpl.Factory(applicationContext)); - registry.addInterface( - BatteryMonitor.MANAGER, new BatteryMonitorFactory(applicationContext)); registry.addInterface(FaceDetectionProvider.MANAGER, new FaceDetectionProviderImpl.Factory(applicationContext)); registry.addInterface(AndroidOverlayProvider.MANAGER,
diff --git a/content/public/app/mojo/content_browser_manifest.json b/content/public/app/mojo/content_browser_manifest.json index 2e55161..7389e4cd 100644 --- a/content/public/app/mojo/content_browser_manifest.json +++ b/content/public/app/mojo/content_browser_manifest.json
@@ -31,7 +31,6 @@ "content::mojom::StoragePartitionService", "content::mojom::URLLoaderFactory", "content::mojom::VideoCaptureHost", - "device::BatteryMonitor", "device::mojom::GamepadMonitor", "discardable_memory::mojom::DiscardableSharedMemoryManager", "media::mojom::ImageCapture",
diff --git a/content/public/app/mojo/content_renderer_manifest.json b/content/public/app/mojo/content_renderer_manifest.json index 8102e47..b2c4ae0 100644 --- a/content/public/app/mojo/content_renderer_manifest.json +++ b/content/public/app/mojo/content_renderer_manifest.json
@@ -20,6 +20,7 @@ "requires": { "content_browser": [ "renderer" ], "device": [ + "device:battery_monitor", "device:power_monitor", "device:screen_orientation", "device:sensors",
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index c7b5451..f45033d 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -40,6 +40,7 @@ class BrowserContext; class BrowserMessageFilter; class RenderProcessHostObserver; +class RenderWidgetHost; class StoragePartition; struct GlobalRequestID; @@ -215,6 +216,10 @@ virtual void AddPendingView() = 0; virtual void RemovePendingView() = 0; + // Adds and removes the widgets owned by this process. + virtual void AddWidget(RenderWidgetHost* widget) = 0; + virtual void RemoveWidget(RenderWidgetHost* widget) = 0; + // Sets a flag indicating that the process can be abnormally terminated. virtual void SetSuddenTerminationAllowed(bool allowed) = 0; // Returns true if the process can be abnormally terminated.
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h index 84fdf4d..f1e3984 100644 --- a/content/public/common/content_client.h +++ b/content/public/common/content_client.h
@@ -107,14 +107,24 @@ // Additional schemes that should be allowed to register service workers. // Only secure and trustworthy schemes should be added. std::vector<std::string> service_worker_schemes; - // For the following three, see the documentation in WebSecurityPolicy. + // Registers a URL scheme to be treated as a local scheme (i.e., with the + // same security rules as those applied to "file" URLs). This means that + // normal pages cannot link to or access URLs of this scheme. std::vector<std::string> local_schemes; + // Registers a URL scheme to be treated as a noAccess scheme. This means + // that pages loaded with this URL scheme always have an opaque origin. std::vector<std::string> no_access_schemes; + // Registers a non-HTTP URL scheme which can be sent CORS requests. std::vector<std::string> cors_enabled_schemes; + // Registers a URL scheme whose resources can be loaded regardless of a + // page's Content Security Policy. std::vector<std::string> csp_bypassing_schemes; // See https://www.w3.org/TR/powerful-features/#is-origin-trustworthy. std::vector<std::string> secure_schemes; std::vector<GURL> secure_origins; + // Registers a URL scheme as strictly empty documents, allowing them to + // commit synchronously. + std::vector<std::string> empty_document_schemes; }; virtual void AddAdditionalSchemes(Schemes* schemes) {}
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 9c78c025..a7fcfae 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -190,7 +190,7 @@ // Paint invalidation based on slimming paint. See https://goo.gl/eQczQW const base::Feature kSlimmingPaintInvalidation{ - "SlimmingPaintInvalidation", base::FEATURE_ENABLED_BY_DEFAULT}; + "SlimmingPaintInvalidation", base::FEATURE_DISABLED_BY_DEFAULT}; // Speculatively launches Service Workers on mouse/touch events. const base::Feature kSpeculativeLaunchServiceWorker{
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index be4ed50..630ab7d 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -921,6 +921,10 @@ // Disables HW VP8 encode acceleration for WebRTC. const char kDisableWebRtcHWVP8Encoding[] = "disable-webrtc-hw-vp8-encoding"; +// Enables negotiation of GCM cipher suites from RFC 7714 for SRTP in WebRTC. +// See https://tools.ietf.org/html/rfc7714 for further information. +const char kEnableWebRtcSrtpAesGcm[] = "enable-webrtc-srtp-aes-gcm"; + // Enables Origin header in Stun messages for WebRTC. const char kEnableWebRtcStunOrigin[] = "enable-webrtc-stun-origin";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index c8ceddb..e3468c0 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -265,6 +265,7 @@ CONTENT_EXPORT extern const char kDisableWebRtcHWDecoding[]; CONTENT_EXPORT extern const char kDisableWebRtcHWEncoding[]; CONTENT_EXPORT extern const char kDisableWebRtcHWVP8Encoding[]; +CONTENT_EXPORT extern const char kEnableWebRtcSrtpAesGcm[]; CONTENT_EXPORT extern const char kEnableWebRtcStunOrigin[]; CONTENT_EXPORT extern const char kEnforceWebRtcIPPermissionCheck[]; CONTENT_EXPORT extern const char kForceWebRtcIPHandlingPolicy[];
diff --git a/content/public/common/web_preferences.cc b/content/public/common/web_preferences.cc index 56093d39..147e3d1 100644 --- a/content/public/common/web_preferences.cc +++ b/content/public/common/web_preferences.cc
@@ -55,7 +55,6 @@ STATIC_ASSERT_ENUM(ui::POINTER_TYPE_FINE, blink::PointerTypeFine); STATIC_ASSERT_ENUM(ui::HOVER_TYPE_NONE, blink::HoverTypeNone); -STATIC_ASSERT_ENUM(ui::HOVER_TYPE_ON_DEMAND, blink::HoverTypeOnDemand); STATIC_ASSERT_ENUM(ui::HOVER_TYPE_HOVER, blink::HoverTypeHover); STATIC_ASSERT_ENUM(ViewportStyle::DEFAULT, blink::WebViewportStyle::Default);
diff --git a/content/public/renderer/media_stream_utils.cc b/content/public/renderer/media_stream_utils.cc index 2076259..6bfcb5eb 100644 --- a/content/public/renderer/media_stream_utils.cc +++ b/content/public/renderer/media_stream_utils.cc
@@ -25,6 +25,8 @@ bool AddVideoTrackToMediaStream( std::unique_ptr<media::VideoCapturerSource> video_source, + bool is_remote, + bool is_readonly, blink::WebMediaStream* web_media_stream) { DCHECK(video_source.get()); if (!web_media_stream || web_media_stream->isNull()) { @@ -39,7 +41,7 @@ const blink::WebString track_id = blink::WebString::fromUTF8(base::GenerateGUID()); web_media_stream_source.initialize( - track_id, blink::WebMediaStreamSource::TypeVideo, track_id); + track_id, blink::WebMediaStreamSource::TypeVideo, track_id, is_remote); // Takes ownership of |media_stream_source|. web_media_stream_source.setExtraData(media_stream_source); @@ -56,6 +58,8 @@ int sample_rate, media::ChannelLayout channel_layout, int frames_per_buffer, + bool is_remote, + bool is_readonly, blink::WebMediaStream* web_media_stream) { DCHECK(audio_source.get()); if (!web_media_stream || web_media_stream->isNull()) { @@ -75,10 +79,11 @@ const blink::WebString track_id = blink::WebString::fromUTF8(base::GenerateGUID()); web_media_stream_source.initialize( - track_id, blink::WebMediaStreamSource::TypeAudio, track_id); + track_id, blink::WebMediaStreamSource::TypeAudio, track_id, is_remote); MediaStreamAudioSource* const media_stream_source = new ExternalMediaStreamAudioSource(std::move(audio_source), sample_rate, - channel_layout, frames_per_buffer); + channel_layout, frames_per_buffer, + is_remote); // Takes ownership of |media_stream_source|. web_media_stream_source.setExtraData(media_stream_source);
diff --git a/content/public/renderer/media_stream_utils.h b/content/public/renderer/media_stream_utils.h index 57ab395..c1e0937 100644 --- a/content/public/renderer/media_stream_utils.h +++ b/content/public/renderer/media_stream_utils.h
@@ -27,8 +27,13 @@ // provided audio or video capturer source. A new WebMediaStreamTrack + // MediaStreamTrack pair is created, connected to the source and is plugged into // the WebMediaStream (|web_media_stream|). +// |is_remote| should be true if the source of the data is not a local device. +// |is_readonly| should be true if the format of the data cannot be changed by +// MediaTrackConstraints. CONTENT_EXPORT bool AddVideoTrackToMediaStream( std::unique_ptr<media::VideoCapturerSource> video_source, + bool is_remote, + bool is_readonly, blink::WebMediaStream* web_media_stream); // |sample_rate|, |channel_layout|, and |frames_per_buffer| specify the audio @@ -40,6 +45,8 @@ int sample_rate, media::ChannelLayout channel_layout, int frames_per_buffer, + bool is_remote, + bool is_readonly, blink::WebMediaStream* web_media_stream); // On success returns pointer to the current format of the given video track;
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc index 46443307..c39d7a1 100644 --- a/content/public/test/mock_render_process_host.cc +++ b/content/public/test/mock_render_process_host.cc
@@ -224,6 +224,12 @@ void MockRenderProcessHost::RemovePendingView() { } +void MockRenderProcessHost::AddWidget(RenderWidgetHost* widget) { +} + +void MockRenderProcessHost::RemoveWidget(RenderWidgetHost* widget) { +} + void MockRenderProcessHost::SetSuddenTerminationAllowed(bool allowed) { }
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h index 8126ff8..455953b 100644 --- a/content/public/test/mock_render_process_host.h +++ b/content/public/test/mock_render_process_host.h
@@ -74,6 +74,8 @@ void Cleanup() override; void AddPendingView() override; void RemovePendingView() override; + void AddWidget(RenderWidgetHost* widget) override; + void RemoveWidget(RenderWidgetHost* widget) override; void SetSuddenTerminationAllowed(bool allowed) override; bool SuddenTerminationAllowed() const override; BrowserContext* GetBrowserContext() const override;
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc index 0857ce4..cbed234 100644 --- a/content/public/test/text_input_test_utils.cc +++ b/content/public/test/text_input_test_utils.cc
@@ -252,8 +252,8 @@ if (!manager || !manager->GetActiveWidget()) return false; - manager->GetActiveWidget()->Send(new InputMsg_RequestCompositionUpdate( - manager->GetActiveWidget()->GetRoutingID(), true, false)); + manager->GetActiveWidget()->RequestCompositionUpdates( + true /* immediate_request */, false /* monitor_updates */); return true; }
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 8ba2036..3be5c8e 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -265,6 +265,10 @@ "media/webmediaplayer_ms_compositor.h", "menu_item_builder.cc", "menu_item_builder.h", + "mojo/blink_connector_impl.cc", + "mojo/blink_connector_impl.h", + "mojo/blink_connector_js_wrapper.cc", + "mojo/blink_connector_js_wrapper.h", "mojo/blink_interface_provider_impl.cc", "mojo/blink_interface_provider_impl.h", "mojo/blink_interface_registry_impl.cc", @@ -439,7 +443,6 @@ "//content/public/common:service_names", "//crypto:platform", "//device/base/synchronization", - "//device/battery:mojo_bindings", "//device/gamepad/public/interfaces", "//device/screen_orientation/public/interfaces", "//device/sensors/public/cpp:full",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS index b3e17be..d7bd36d 100644 --- a/content/renderer/DEPS +++ b/content/renderer/DEPS
@@ -11,7 +11,6 @@ "+content/public/child", "+content/public/renderer", "+content/child", - "+device/battery", # For battery status service. "+device/base/synchronization", "+device/gamepad/public/interfaces", "+device/screen_orientation/public/interfaces",
diff --git a/content/renderer/android/email_detector.cc b/content/renderer/android/email_detector.cc index 564f341..1a0db8b0 100644 --- a/content/renderer/android/email_detector.cc +++ b/content/renderer/android/email_detector.cc
@@ -62,8 +62,8 @@ DCHECK(U_SUCCESS(status)); icu::UnicodeString content_ustr(matcher->group(status)); DCHECK(U_SUCCESS(status)); - base::UTF16ToUTF8(content_ustr.getBuffer(), content_ustr.length(), - content_text); + content_text->clear(); + content_ustr.toUTF8String(*content_text); return true; }
diff --git a/content/renderer/device_sensors/device_motion_event_pump.cc b/content/renderer/device_sensors/device_motion_event_pump.cc index 2f7392a..a97e5ca 100644 --- a/content/renderer/device_sensors/device_motion_event_pump.cc +++ b/content/renderer/device_sensors/device_motion_event_pump.cc
@@ -20,7 +20,7 @@ void DeviceMotionEventPump::FireEvent() { DCHECK(listener()); device::MotionData data; - if (reader_->GetLatestData(&data) && data.allAvailableSensorsAreActive) + if (reader_->GetLatestData(&data) && data.all_available_sensors_are_active) listener()->didChangeDeviceMotion(data); }
diff --git a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc index c751903d..3b16e8f 100644 --- a/content/renderer/device_sensors/device_motion_event_pump_unittest.cc +++ b/content/renderer/device_sensors/device_motion_event_pump_unittest.cc
@@ -102,13 +102,13 @@ void InitBuffer(bool allAvailableSensorsActive) { device::MotionData& data = buffer()->data; - data.accelerationX = 1; - data.hasAccelerationX = true; - data.accelerationY = 2; - data.hasAccelerationY = true; - data.accelerationZ = 3; - data.hasAccelerationZ = true; - data.allAvailableSensorsAreActive = allAvailableSensorsActive; + data.acceleration_x = 1; + data.has_acceleration_x = true; + data.acceleration_y = 2; + data.has_acceleration_y = true; + data.acceleration_z = 3; + data.has_acceleration_z = true; + data.all_available_sensors_are_active = allAvailableSensorsActive; } MockDeviceMotionListener* listener() { return listener_.get(); } @@ -142,19 +142,19 @@ const device::MotionData& received_data = listener()->data(); EXPECT_TRUE(listener()->did_change_device_motion()); - EXPECT_TRUE(received_data.hasAccelerationX); - EXPECT_EQ(1, static_cast<double>(received_data.accelerationX)); - EXPECT_TRUE(received_data.hasAccelerationX); - EXPECT_EQ(2, static_cast<double>(received_data.accelerationY)); - EXPECT_TRUE(received_data.hasAccelerationY); - EXPECT_EQ(3, static_cast<double>(received_data.accelerationZ)); - EXPECT_TRUE(received_data.hasAccelerationZ); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityX); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityY); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityZ); - EXPECT_FALSE(received_data.hasRotationRateAlpha); - EXPECT_FALSE(received_data.hasRotationRateBeta); - EXPECT_FALSE(received_data.hasRotationRateGamma); + EXPECT_TRUE(received_data.has_acceleration_x); + EXPECT_EQ(1, static_cast<double>(received_data.acceleration_x)); + EXPECT_TRUE(received_data.has_acceleration_x); + EXPECT_EQ(2, static_cast<double>(received_data.acceleration_y)); + EXPECT_TRUE(received_data.has_acceleration_y); + EXPECT_EQ(3, static_cast<double>(received_data.acceleration_z)); + EXPECT_TRUE(received_data.has_acceleration_z); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_x); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_y); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_z); + EXPECT_FALSE(received_data.has_rotation_rate_alpha); + EXPECT_FALSE(received_data.has_rotation_rate_beta); + EXPECT_FALSE(received_data.has_rotation_rate_gamma); } TEST_F(DeviceMotionEventPumpTest, DidStartPollingNotAllSensorsActive) { @@ -166,18 +166,19 @@ base::RunLoop().Run(); const device::MotionData& received_data = listener()->data(); - // No change in device motion because allAvailableSensorsAreActive is false. + // No change in device motion because all_available_sensors_are_active is + // false. EXPECT_FALSE(listener()->did_change_device_motion()); - EXPECT_FALSE(received_data.hasAccelerationX); - EXPECT_FALSE(received_data.hasAccelerationX); - EXPECT_FALSE(received_data.hasAccelerationY); - EXPECT_FALSE(received_data.hasAccelerationZ); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityX); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityY); - EXPECT_FALSE(received_data.hasAccelerationIncludingGravityZ); - EXPECT_FALSE(received_data.hasRotationRateAlpha); - EXPECT_FALSE(received_data.hasRotationRateBeta); - EXPECT_FALSE(received_data.hasRotationRateGamma); + EXPECT_FALSE(received_data.has_acceleration_x); + EXPECT_FALSE(received_data.has_acceleration_x); + EXPECT_FALSE(received_data.has_acceleration_y); + EXPECT_FALSE(received_data.has_acceleration_z); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_x); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_y); + EXPECT_FALSE(received_data.has_acceleration_including_gravity_z); + EXPECT_FALSE(received_data.has_rotation_rate_alpha); + EXPECT_FALSE(received_data.has_rotation_rate_beta); + EXPECT_FALSE(received_data.has_rotation_rate_gamma); } // Confirm that the frequency of pumping events is not greater than 60Hz. A rate
diff --git a/content/renderer/device_sensors/device_orientation_event_pump.cc b/content/renderer/device_sensors/device_orientation_event_pump.cc index 7e8fa97..269eea72 100644 --- a/content/renderer/device_sensors/device_orientation_event_pump.cc +++ b/content/renderer/device_sensors/device_orientation_event_pump.cc
@@ -41,20 +41,20 @@ bool DeviceOrientationEventPumpBase::ShouldFireEvent( const device::OrientationData& data) const { - if (!data.allAvailableSensorsAreActive) + if (!data.all_available_sensors_are_active) return false; - if (!data.hasAlpha && !data.hasBeta && !data.hasGamma) { + if (!data.has_alpha && !data.has_beta && !data.has_gamma) { // no data can be provided, this is an all-null event. return true; } - return IsSignificantlyDifferent( - data_.hasAlpha, data_.alpha, data.hasAlpha, data.alpha) || - IsSignificantlyDifferent( - data_.hasBeta, data_.beta, data.hasBeta, data.beta) || - IsSignificantlyDifferent( - data_.hasGamma, data_.gamma, data.hasGamma, data.gamma); + return IsSignificantlyDifferent(data_.has_alpha, data_.alpha, data.has_alpha, + data.alpha) || + IsSignificantlyDifferent(data_.has_beta, data_.beta, data.has_beta, + data.beta) || + IsSignificantlyDifferent(data_.has_gamma, data_.gamma, data.has_gamma, + data.gamma); } bool DeviceOrientationEventPumpBase::InitializeReader(
diff --git a/content/renderer/device_sensors/device_orientation_event_pump_unittest.cc b/content/renderer/device_sensors/device_orientation_event_pump_unittest.cc index fda6372..ba1067c 100644 --- a/content/renderer/device_sensors/device_orientation_event_pump_unittest.cc +++ b/content/renderer/device_sensors/device_orientation_event_pump_unittest.cc
@@ -88,17 +88,17 @@ void InitBuffer() { device::OrientationData& data = buffer()->data; data.alpha = 1; - data.hasAlpha = true; + data.has_alpha = true; data.beta = 2; - data.hasBeta = true; + data.has_beta = true; data.gamma = 3; - data.hasGamma = true; - data.allAvailableSensorsAreActive = true; + data.has_gamma = true; + data.all_available_sensors_are_active = true; } void InitBufferNoData() { device::OrientationData& data = buffer()->data; - data.allAvailableSensorsAreActive = true; + data.all_available_sensors_are_active = true; } MockDeviceOrientationListener* listener() { return listener_.get(); } @@ -133,13 +133,13 @@ const device::OrientationData& received_data = listener()->data(); EXPECT_TRUE(listener()->did_change_device_orientation()); - EXPECT_TRUE(received_data.allAvailableSensorsAreActive); + EXPECT_TRUE(received_data.all_available_sensors_are_active); EXPECT_EQ(1, static_cast<double>(received_data.alpha)); - EXPECT_TRUE(received_data.hasAlpha); + EXPECT_TRUE(received_data.has_alpha); EXPECT_EQ(2, static_cast<double>(received_data.beta)); - EXPECT_TRUE(received_data.hasBeta); + EXPECT_TRUE(received_data.has_beta); EXPECT_EQ(3, static_cast<double>(received_data.gamma)); - EXPECT_TRUE(received_data.hasGamma); + EXPECT_TRUE(received_data.has_gamma); } TEST_F(DeviceOrientationEventPumpTest, FireAllNullEvent) { @@ -151,10 +151,10 @@ const device::OrientationData& received_data = listener()->data(); EXPECT_TRUE(listener()->did_change_device_orientation()); - EXPECT_TRUE(received_data.allAvailableSensorsAreActive); - EXPECT_FALSE(received_data.hasAlpha); - EXPECT_FALSE(received_data.hasBeta); - EXPECT_FALSE(received_data.hasGamma); + EXPECT_TRUE(received_data.all_available_sensors_are_active); + EXPECT_FALSE(received_data.has_alpha); + EXPECT_FALSE(received_data.has_beta); + EXPECT_FALSE(received_data.has_gamma); } TEST_F(DeviceOrientationEventPumpTest, UpdateRespectsOrientationThreshold) { @@ -166,13 +166,13 @@ const device::OrientationData& received_data = listener()->data(); EXPECT_TRUE(listener()->did_change_device_orientation()); - EXPECT_TRUE(received_data.allAvailableSensorsAreActive); + EXPECT_TRUE(received_data.all_available_sensors_are_active); EXPECT_EQ(1, static_cast<double>(received_data.alpha)); - EXPECT_TRUE(received_data.hasAlpha); + EXPECT_TRUE(received_data.has_alpha); EXPECT_EQ(2, static_cast<double>(received_data.beta)); - EXPECT_TRUE(received_data.hasBeta); + EXPECT_TRUE(received_data.has_beta); EXPECT_EQ(3, static_cast<double>(received_data.gamma)); - EXPECT_TRUE(received_data.hasGamma); + EXPECT_TRUE(received_data.has_gamma); buffer()->data.alpha = 1 + DeviceOrientationEventPump::kOrientationThreshold / 2.0; @@ -187,13 +187,13 @@ base::RunLoop().Run(); EXPECT_FALSE(listener()->did_change_device_orientation()); - EXPECT_TRUE(received_data.allAvailableSensorsAreActive); + EXPECT_TRUE(received_data.all_available_sensors_are_active); EXPECT_EQ(1, static_cast<double>(received_data.alpha)); - EXPECT_TRUE(received_data.hasAlpha); + EXPECT_TRUE(received_data.has_alpha); EXPECT_EQ(2, static_cast<double>(received_data.beta)); - EXPECT_TRUE(received_data.hasBeta); + EXPECT_TRUE(received_data.has_beta); EXPECT_EQ(3, static_cast<double>(received_data.gamma)); - EXPECT_TRUE(received_data.hasGamma); + EXPECT_TRUE(received_data.has_gamma); buffer()->data.alpha = 1 + DeviceOrientationEventPump::kOrientationThreshold;
diff --git a/content/renderer/media/external_media_stream_audio_source.cc b/content/renderer/media/external_media_stream_audio_source.cc index 1d4d49f..56bc5178 100644 --- a/content/renderer/media/external_media_stream_audio_source.cc +++ b/content/renderer/media/external_media_stream_audio_source.cc
@@ -10,8 +10,9 @@ scoped_refptr<media::AudioCapturerSource> source, int sample_rate, media::ChannelLayout channel_layout, - int frames_per_buffer) - : MediaStreamAudioSource(false), + int frames_per_buffer, + bool is_remote) + : MediaStreamAudioSource(!is_remote), source_(std::move(source)), was_started_(false) { DVLOG(1)
diff --git a/content/renderer/media/external_media_stream_audio_source.h b/content/renderer/media/external_media_stream_audio_source.h index adefe6f..f520ae09 100644 --- a/content/renderer/media/external_media_stream_audio_source.h +++ b/content/renderer/media/external_media_stream_audio_source.h
@@ -24,7 +24,8 @@ scoped_refptr<media::AudioCapturerSource> source, int sample_rate, media::ChannelLayout channel_layout, - int frames_per_buffer); + int frames_per_buffer, + bool is_remote); ~ExternalMediaStreamAudioSource() final;
diff --git a/content/renderer/media/media_stream_audio_source.h b/content/renderer/media/media_stream_audio_source.h index 2d029c9..392dac04 100644 --- a/content/renderer/media/media_stream_audio_source.h +++ b/content/renderer/media/media_stream_audio_source.h
@@ -143,8 +143,6 @@ // True if the source of audio is a local device. False if the source is // remote (e.g., streamed-in from a server). - // TODO(crbug.com/598704): This variable is not likely to be used anymore. - // The remote option was erased by crbug.com/598704. const bool is_local_source_; // Set to true once this source has been permanently stopped.
diff --git a/content/renderer/media/media_stream_audio_unittest.cc b/content/renderer/media/media_stream_audio_unittest.cc index c138e11e..7026025e 100644 --- a/content/renderer/media/media_stream_audio_unittest.cc +++ b/content/renderer/media/media_stream_audio_unittest.cc
@@ -243,7 +243,8 @@ void SetUp() override { blink_audio_source_.initialize(blink::WebString::fromUTF8("audio_id"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("audio_track")); + blink::WebString::fromUTF8("audio_track"), + false /* remote */); blink_audio_track_.initialize(blink_audio_source_.id(), blink_audio_source_); }
diff --git a/content/renderer/media/media_stream_video_capturer_source_unittest.cc b/content/renderer/media/media_stream_video_capturer_source_unittest.cc index 2d57bd7..8912961 100644 --- a/content/renderer/media/media_stream_video_capturer_source_unittest.cc +++ b/content/renderer/media/media_stream_video_capturer_source_unittest.cc
@@ -85,7 +85,8 @@ webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); webkit_source_.setExtraData(source_); webkit_source_id_ = webkit_source_.id(); } @@ -299,7 +300,8 @@ std::move(delegate)); webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); webkit_source_.setExtraData(source_); webkit_source_id_ = webkit_source_.id();
diff --git a/content/renderer/media/media_stream_video_renderer_sink_unittest.cc b/content/renderer/media/media_stream_video_renderer_sink_unittest.cc index 52fa677b..b4343c1c 100644 --- a/content/renderer/media/media_stream_video_renderer_sink_unittest.cc +++ b/content/renderer/media/media_stream_video_renderer_sink_unittest.cc
@@ -38,7 +38,8 @@ mock_source_(new MockMediaStreamVideoSource(false)) { blink_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); blink_source_.setExtraData(mock_source_); blink::WebMediaConstraints constraints; constraints.initialize();
diff --git a/content/renderer/media/media_stream_video_source_unittest.cc b/content/renderer/media/media_stream_video_source_unittest.cc index 49bbc08b..9f21b460 100644 --- a/content/renderer/media/media_stream_video_source_unittest.cc +++ b/content/renderer/media/media_stream_video_source_unittest.cc
@@ -52,7 +52,8 @@ mock_source_->SetSupportedFormats(formats); webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); webkit_source_.setExtraData(mock_source_); }
diff --git a/content/renderer/media/media_stream_video_track_unittest.cc b/content/renderer/media/media_stream_video_track_unittest.cc index a36b256..f071e08 100644 --- a/content/renderer/media/media_stream_video_track_unittest.cc +++ b/content/renderer/media/media_stream_video_track_unittest.cc
@@ -36,7 +36,8 @@ source_started_(false) { blink_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); blink_source_.setExtraData(mock_source_); } @@ -86,7 +87,8 @@ mock_source_ = new MockMediaStreamVideoSource(false, true); blink_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + false /* remote */); blink_source_.setExtraData(mock_source_); }
diff --git a/content/renderer/media/mock_media_stream_registry.cc b/content/renderer/media/mock_media_stream_registry.cc index 4ad5342..32f23f3 100644 --- a/content/renderer/media/mock_media_stream_registry.cc +++ b/content/renderer/media/mock_media_stream_registry.cc
@@ -61,7 +61,7 @@ blink::WebMediaStreamSource blink_source; blink_source.initialize("mock video source id", blink::WebMediaStreamSource::TypeVideo, - "mock video source name"); + "mock video source name", false /* remote */); MockMediaStreamVideoSource* native_source = new MockMediaStreamVideoSource(false /* manual get supported formats */); blink_source.setExtraData(native_source); @@ -85,7 +85,7 @@ blink::WebMediaStreamSource blink_source; blink_source.initialize("mock audio source id", blink::WebMediaStreamSource::TypeAudio, - "mock audio source name"); + "mock audio source name", false /* remote */); MediaStreamAudioSource* const source = new MockCDQualityAudioSource(); blink_source.setExtraData(source); // Takes ownership.
diff --git a/content/renderer/media/pepper_to_video_track_adapter.cc b/content/renderer/media/pepper_to_video_track_adapter.cc index 3e003c0..5282026a 100644 --- a/content/renderer/media/pepper_to_video_track_adapter.cc +++ b/content/renderer/media/pepper_to_video_track_adapter.cc
@@ -258,7 +258,8 @@ blink::WebMediaStreamSource::Type type = blink::WebMediaStreamSource::TypeVideo; blink::WebString webkit_track_id = blink::WebString::fromUTF8(track_id); - webkit_source.initialize(webkit_track_id, type, webkit_track_id); + webkit_source.initialize(webkit_track_id, type, webkit_track_id, + false /* remote */); webkit_source.setExtraData(writer); blink::WebMediaConstraints constraints;
diff --git a/content/renderer/media/remote_media_stream_impl.cc b/content/renderer/media/remote_media_stream_impl.cc index 70ff0b2..b56c2ab 100644 --- a/content/renderer/media/remote_media_stream_impl.cc +++ b/content/renderer/media/remote_media_stream_impl.cc
@@ -102,7 +102,8 @@ blink::WebString webkit_track_id(blink::WebString::fromUTF8(id_)); blink::WebMediaStreamSource webkit_source; - webkit_source.initialize(webkit_track_id, type, webkit_track_id); + webkit_source.initialize(webkit_track_id, type, webkit_track_id, + true /* remote */); webkit_track_.initialize(webkit_track_id, webkit_source); DCHECK(!webkit_track_.isNull()); }
diff --git a/content/renderer/media/render_media_client.cc b/content/renderer/media/render_media_client.cc index 48c1558e..4343171c 100644 --- a/content/renderer/media/render_media_client.cc +++ b/content/renderer/media/render_media_client.cc
@@ -11,7 +11,7 @@ #include "content/public/renderer/content_renderer_client.h" #include "media/base/media_switches.h" #include "media/base/video_color_space.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" namespace content {
diff --git a/content/renderer/media/render_media_client_unittest.cc b/content/renderer/media/render_media_client_unittest.cc index d88b26f4..77a6669 100644 --- a/content/renderer/media/render_media_client_unittest.cc +++ b/content/renderer/media/render_media_client_unittest.cc
@@ -183,7 +183,7 @@ TEST_F(RenderMediaClientTest, IsSupportedVideoConfigBasics) { // Default to common 709. - const media::VideoColorSpace kColorSpace = media::VideoColorSpace::BT709(); + const media::VideoColorSpace kColorSpace = media::VideoColorSpace::REC709(); // Some codecs do not have a notion of level. const int kUnspecifiedLevel = 0; @@ -234,7 +234,7 @@ for (int i = 0; i <= (1 << (8 * sizeof(media::VideoColorSpace::TransferID))); i++) { - media::VideoColorSpace color_space = media::VideoColorSpace::BT709(); + media::VideoColorSpace color_space = media::VideoColorSpace::REC709(); color_space.transfer = media::VideoColorSpace::GetTransferID(i); bool found = kSupportedTransfers.find(color_space.transfer) != kSupportedTransfers.end(); @@ -260,7 +260,7 @@ for (int i = 0; i <= (1 << (8 * sizeof(media::VideoColorSpace::PrimaryID))); i++) { - media::VideoColorSpace color_space = media::VideoColorSpace::BT709(); + media::VideoColorSpace color_space = media::VideoColorSpace::REC709(); color_space.primaries = media::VideoColorSpace::GetPrimaryID(i); bool found = kSupportedPrimaries.find(color_space.primaries) != kSupportedPrimaries.end(); @@ -286,7 +286,7 @@ for (int i = 0; i <= (1 << (8 * sizeof(media::VideoColorSpace::MatrixID))); i++) { - media::VideoColorSpace color_space = media::VideoColorSpace::BT709(); + media::VideoColorSpace color_space = media::VideoColorSpace::REC709(); color_space.matrix = media::VideoColorSpace::GetMatrixID(i); bool found = kSupportedMatrix.find(color_space.matrix) != kSupportedMatrix.end();
diff --git a/content/renderer/media/rtc_peer_connection_handler_unittest.cc b/content/renderer/media/rtc_peer_connection_handler_unittest.cc index f4c9c55..7d44b983 100644 --- a/content/renderer/media/rtc_peer_connection_handler_unittest.cc +++ b/content/renderer/media/rtc_peer_connection_handler_unittest.cc
@@ -292,7 +292,8 @@ blink::WebMediaStreamSource blink_audio_source; blink_audio_source.initialize(blink::WebString::fromUTF8(audio_track_label), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("audio_track")); + blink::WebString::fromUTF8("audio_track"), + false /* remote */); ProcessedLocalAudioSource* const audio_source = new ProcessedLocalAudioSource( -1 /* consumer_render_frame_id is N/A for non-browser tests */, @@ -310,7 +311,8 @@ blink::WebMediaStreamSource video_source; video_source.initialize(blink::WebString::fromUTF8(video_track_label), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromUTF8("video_track")); + blink::WebString::fromUTF8("video_track"), + false /* remote */); MockMediaStreamVideoSource* native_video_source = new MockMediaStreamVideoSource(false); video_source.setExtraData(native_video_source);
diff --git a/content/renderer/media/speech_recognition_audio_sink_unittest.cc b/content/renderer/media/speech_recognition_audio_sink_unittest.cc index 59fb114..e121e8ef 100644 --- a/content/renderer/media/speech_recognition_audio_sink_unittest.cc +++ b/content/renderer/media/speech_recognition_audio_sink_unittest.cc
@@ -291,7 +291,8 @@ blink::WebMediaStreamSource blink_source; blink_source.initialize(blink::WebString::fromUTF8("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("dummy_source_name")); + blink::WebString::fromUTF8("dummy_source_name"), + false /* remote */); TestDrivenAudioSource* const audio_source = new TestDrivenAudioSource(); audio_source->SetDeviceInfo( StreamDeviceInfo(device_type, "Mock device", "mock_device_id"));
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc index a05ad28..e5f01d8 100644 --- a/content/renderer/media/user_media_client_impl.cc +++ b/content/renderer/media/user_media_client_impl.cc
@@ -1100,7 +1100,8 @@ blink::WebMediaStreamSource source; source.initialize(blink::WebString::fromUTF8(device.device.id), type, - blink::WebString::fromUTF8(device.device.name)); + blink::WebString::fromUTF8(device.device.name), + false /* remote */); DVLOG(1) << "Initialize source object :" << "id = " << source.id().utf8()
diff --git a/content/renderer/media/webmediaplayer_ms_compositor.cc b/content/renderer/media/webmediaplayer_ms_compositor.cc index 763b183..5244efd1 100644 --- a/content/renderer/media/webmediaplayer_ms_compositor.cc +++ b/content/renderer/media/webmediaplayer_ms_compositor.cc
@@ -145,9 +145,11 @@ if (!web_stream.isNull()) web_stream.videoTracks(video_tracks); - if (video_tracks.size() > 0 && - !base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableRTCSmoothnessAlgorithm)) { + const bool remote_video = + video_tracks.size() && video_tracks[0].source().remote(); + + if (remote_video && !base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableRTCSmoothnessAlgorithm)) { base::AutoLock auto_lock(current_frame_lock_); rendering_frame_buffer_.reset(new media::VideoRendererAlgorithm( base::Bind(&WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks, @@ -157,7 +159,8 @@ // Just for logging purpose. std::string stream_id = web_stream.isNull() ? std::string() : web_stream.id().utf8(); - serial_ = base::Hash(stream_id);; + const uint32_t hash_value = base::Hash(stream_id); + serial_ = (hash_value << 1) | (remote_video ? 1 : 0); } WebMediaPlayerMSCompositor::~WebMediaPlayerMSCompositor() {
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc index c30e7a0..6752973 100644 --- a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc +++ b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
@@ -49,7 +49,8 @@ number_of_failed_constraints_applied_(0) { webkit_source_.initialize(blink::WebString::fromASCII("dummy_source_id"), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII("dummy_source_name")); + blink::WebString::fromASCII("dummy_source_name"), + true /* remote */); webkit_source_.setExtraData(remote_source_); }
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index 6789d072..82033935 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -261,7 +261,8 @@ factory_options.disable_sctp_data_channels = false; factory_options.disable_encryption = cmd_line->HasSwitch(switches::kDisableWebRtcEncryption); - + factory_options.crypto_options.enable_gcm_crypto_suites = + cmd_line->HasSwitch(switches::kEnableWebRtcSrtpAesGcm); pc_factory_->SetOptions(factory_options); event->Signal();
diff --git a/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc b/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc index be5f470c..390aeafa 100644 --- a/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc +++ b/content/renderer/media/webrtc/processed_local_audio_source_unittest.cc
@@ -83,7 +83,8 @@ void SetUp() override { blink_audio_source_.initialize(blink::WebString::fromUTF8("audio_label"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("audio_track")); + blink::WebString::fromUTF8("audio_track"), + false /* remote */); blink_audio_track_.initialize(blink_audio_source_.id(), blink_audio_source_); }
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc index 04cf203f..d494250 100644 --- a/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc +++ b/content/renderer/media/webrtc/webrtc_media_stream_adapter_unittest.cc
@@ -48,7 +48,7 @@ if (audio) { blink::WebMediaStreamSource audio_source; audio_source.initialize("audio", blink::WebMediaStreamSource::TypeAudio, - "audio"); + "audio", false /* remote */); ProcessedLocalAudioSource* const source = new ProcessedLocalAudioSource( -1 /* consumer_render_frame_id is N/A for non-browser tests */, StreamDeviceInfo(MEDIA_DEVICE_AUDIO_CAPTURE, "Mock audio device", @@ -77,7 +77,7 @@ if (video) { blink::WebMediaStreamSource video_source; video_source.initialize("video", blink::WebMediaStreamSource::TypeVideo, - "video"); + "video", false /* remote */); MediaStreamVideoSource* native_source = new MockMediaStreamVideoSource(false); video_source.setExtraData(native_source); @@ -139,7 +139,8 @@ // Create a blink MediaStream description. blink::WebMediaStreamSource audio_source; audio_source.initialize("audio source", - blink::WebMediaStreamSource::TypeAudio, "something"); + blink::WebMediaStreamSource::TypeAudio, "something", + false /* remote */); blink::WebVector<blink::WebMediaStreamTrack> audio_tracks( static_cast<size_t>(1));
diff --git a/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc index 78f09046..b4013097 100644 --- a/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc +++ b/content/renderer/media/webrtc_local_audio_source_provider_unittest.cc
@@ -29,7 +29,8 @@ blink::WebMediaStreamSource audio_source; audio_source.initialize(blink::WebString::fromUTF8("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("dummy_source_name")); + blink::WebString::fromUTF8("dummy_source_name"), + false /* remote */); blink_track_.initialize(blink::WebString::fromUTF8("audio_track"), audio_source); blink_track_.setTrackData(new MediaStreamAudioTrack(true));
diff --git a/content/renderer/media_capture_from_element/canvas_capture_handler.cc b/content/renderer/media_capture_from_element/canvas_capture_handler.cc index d9318f6..92737980 100644 --- a/content/renderer/media_capture_from_element/canvas_capture_handler.cc +++ b/content/renderer/media_capture_from_element/canvas_capture_handler.cc
@@ -267,7 +267,7 @@ new MediaStreamVideoCapturerSource( MediaStreamSource::SourceStoppedCallback(), std::move(source))); webkit_source.initialize(track_id, blink::WebMediaStreamSource::TypeVideo, - track_id); + track_id, false); webkit_source.setExtraData(media_stream_source.get()); web_track->initialize(webkit_source);
diff --git a/content/renderer/media_capture_from_element/html_audio_element_capturer_source_unittest.cc b/content/renderer/media_capture_from_element/html_audio_element_capturer_source_unittest.cc index 8133a09..ce3a94d8a5 100644 --- a/content/renderer/media_capture_from_element/html_audio_element_capturer_source_unittest.cc +++ b/content/renderer/media_capture_from_element/html_audio_element_capturer_source_unittest.cc
@@ -80,7 +80,8 @@ blink_audio_source_.initialize(blink::WebString::fromUTF8("audio_id"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("audio_track")); + blink::WebString::fromUTF8("audio_track"), + false /* remote */); blink_audio_track_.initialize(blink_audio_source_.id(), blink_audio_source_);
diff --git a/content/renderer/media_recorder/audio_track_recorder_unittest.cc b/content/renderer/media_recorder/audio_track_recorder_unittest.cc index 5502c66..6929364c 100644 --- a/content/renderer/media_recorder/audio_track_recorder_unittest.cc +++ b/content/renderer/media_recorder/audio_track_recorder_unittest.cc
@@ -217,7 +217,8 @@ blink::WebMediaStreamSource audio_source; audio_source.initialize(blink::WebString::fromUTF8("dummy_source_id"), blink::WebMediaStreamSource::TypeAudio, - blink::WebString::fromUTF8("dummy_source_name")); + blink::WebString::fromUTF8("dummy_source_name"), + false /* remote */); audio_source.setExtraData(new MediaStreamAudioSource(true)); blink_track_.initialize(blink::WebString::fromUTF8("audio_track"), audio_source);
diff --git a/content/renderer/mojo/blink_connector_impl.cc b/content/renderer/mojo/blink_connector_impl.cc new file mode 100644 index 0000000..c2f8856f --- /dev/null +++ b/content/renderer/mojo/blink_connector_impl.cc
@@ -0,0 +1,90 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/mojo/blink_connector_impl.h" + +#include <utility> + +#include "base/bind.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" +#include "services/service_manager/public/cpp/identity.h" +#include "services/service_manager/public/cpp/interface_provider.h" + +namespace content { + +BlinkConnectorImpl::BlinkConnectorImpl( + std::unique_ptr<service_manager::Connector> connector) + : connector_(std::move(connector)), + main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), + weak_ptr_factory_(this) {} + +BlinkConnectorImpl::~BlinkConnectorImpl() = default; + +void BlinkConnectorImpl::bindInterface(const char* service_name, + const char* interface_name, + mojo::ScopedMessagePipeHandle handle) { + // |connector_| is null in some testing contexts. + if (!connector_) + return; + + if (!main_thread_task_runner_->BelongsToCurrentThread()) { + main_thread_task_runner_->PostTask( + FROM_HERE, + base::Bind(&BlinkConnectorImpl::bindInterface, GetWeakPtr(), + service_name, interface_name, base::Passed(&handle))); + return; + } + + // Tests might have overridden this interface with a local implementation. + InterfaceBinderMap* overrides_for_service = + GetOverridesForService(service_name); + if (overrides_for_service) { + auto it = overrides_for_service->find(std::string(interface_name)); + if (it != overrides_for_service->end()) { + it->second.Run(std::move(handle)); + return; + } + } + + service_manager::Identity service_identity( + service_name, service_manager::mojom::kInheritUserID); + connector_->BindInterface(service_identity, interface_name, + std::move(handle)); +} + +void BlinkConnectorImpl::AddOverrideForTesting( + const std::string& service_name, + const std::string& interface_name, + const base::Callback<void(mojo::ScopedMessagePipeHandle)>& binder) { + if (service_binders_.find(service_name) == service_binders_.end()) + service_binders_[service_name] = base::MakeUnique<InterfaceBinderMap>(); + + (*(service_binders_[service_name]))[interface_name] = binder; +} + +void BlinkConnectorImpl::ClearOverridesForTesting() { + service_binders_.clear(); +} + +base::WeakPtr<BlinkConnectorImpl> BlinkConnectorImpl::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + +BlinkConnectorImpl::InterfaceBinderMap* +BlinkConnectorImpl::GetOverridesForService(const char* service_name) { + // Short-circuit out in the case where there are no overrides (always true in + // production). + if (service_binders_.empty()) + return nullptr; + + auto it = service_binders_.find(std::string(service_name)); + + if (it != service_binders_.end()) + return it->second.get(); + + return nullptr; +} + +} // namespace content
diff --git a/content/renderer/mojo/blink_connector_impl.h b/content/renderer/mojo/blink_connector_impl.h new file mode 100644 index 0000000..7b35ee538 --- /dev/null +++ b/content/renderer/mojo/blink_connector_impl.h
@@ -0,0 +1,73 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_IMPL_H_ +#define CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_IMPL_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "content/common/content_export.h" +#include "mojo/public/cpp/system/message_pipe.h" +#include "services/service_manager/public/cpp/connector.h" +#include "third_party/WebKit/public/platform/Connector.h" + +namespace base { +class SingleThreadTaskRunner; +} + +namespace content { + +// An implementation of blink::Connector that forwards to a +// service_manager::Connector. +class CONTENT_EXPORT BlinkConnectorImpl : public blink::Connector { + public: + explicit BlinkConnectorImpl( + std::unique_ptr<service_manager::Connector> connector); + ~BlinkConnectorImpl(); + + // blink::Connector override. + void bindInterface(const char* service_name, + const char* interface_name, + mojo::ScopedMessagePipeHandle handle) override; + + void AddOverrideForTesting( + const std::string& service_name, + const std::string& interface_name, + const base::Callback<void(mojo::ScopedMessagePipeHandle)>& binder); + + void ClearOverridesForTesting(); + + void SetConnector(std::unique_ptr<service_manager::Connector> connector) { + connector_ = std::move(connector); + } + + base::WeakPtr<BlinkConnectorImpl> GetWeakPtr(); + + private: + using Binder = base::Callback<void(mojo::ScopedMessagePipeHandle)>; + using InterfaceBinderMap = std::map<std::string, Binder>; + using ServiceBinderMap = + std::map<std::string, std::unique_ptr<InterfaceBinderMap>>; + + // Returns a pointer to the InterfaceBinderMap in action for |service_name|, + // or nullptr if |service_name| has no overrides in action. + InterfaceBinderMap* GetOverridesForService(const char* service_name); + + // Maps service names to the per-interface overrides that have been set for + // that service. + ServiceBinderMap service_binders_; + + std::unique_ptr<service_manager::Connector> connector_; + + scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_; + + base::WeakPtrFactory<BlinkConnectorImpl> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(BlinkConnectorImpl); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_IMPL_H_
diff --git a/content/renderer/mojo/blink_connector_impl_unittest.cc b/content/renderer/mojo/blink_connector_impl_unittest.cc new file mode 100644 index 0000000..e30a3bb --- /dev/null +++ b/content/renderer/mojo/blink_connector_impl_unittest.cc
@@ -0,0 +1,158 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/mojo/blink_connector_impl.h" + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/message_loop/message_loop.h" +#include "services/service_manager/public/cpp/connector.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { + +namespace { +class MockConnector : public service_manager::Connector { + public: + MockConnector(int* foo_baz_impl_requests, int* bar_baz_impl_requests) + : foo_baz_impl_requests_(foo_baz_impl_requests), + bar_baz_impl_requests_(bar_baz_impl_requests), + weak_factory_(this) {} + + // Connector: + void StartService(const service_manager::Identity& identity, + service_manager::mojom::ServicePtr service, + service_manager::mojom::PIDReceiverRequest + pid_receiver_request) override {} + std::unique_ptr<service_manager::Connection> Connect( + const std::string& name) override { + return nullptr; + } + std::unique_ptr<service_manager::Connection> Connect( + const service_manager::Identity& target) override { + return nullptr; + } + void BindInterface(const service_manager::Identity& target, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe) override; + std::unique_ptr<Connector> Clone() override { return nullptr; } + void BindConnectorRequest( + service_manager::mojom::ConnectorRequest request) override {} + base::WeakPtr<Connector> GetWeakPtr() override { + return weak_factory_.GetWeakPtr(); + } + + protected: + void OverrideBinderForTesting(const std::string& interface_name, + const TestApi::Binder& binder) override {} + void ClearBinderOverrides() override {} + + private: + int* foo_baz_impl_requests_; + int* bar_baz_impl_requests_; + base::WeakPtrFactory<MockConnector> weak_factory_; +}; + +void MockConnector::BindInterface( + const service_manager::Identity& target, + const std::string& interface_name, + mojo::ScopedMessagePipeHandle interface_pipe) { + if (target.name() == "foo" && interface_name == "baz") { + (*foo_baz_impl_requests_)++; + return; + } + + if (target.name() == "bar" && interface_name == "baz") { + (*bar_baz_impl_requests_)++; + return; + } + + NOTREACHED(); +} + +} // namespace + +class BlinkConnectorImplTest : public testing::Test { + public: + BlinkConnectorImplTest() + : foo_baz_impl_requests_(0), + bar_baz_impl_requests_(0), + foo_baz_override_requests_(0), + bar_baz_override_requests_(0), + connector_(base::MakeUnique<MockConnector>(&foo_baz_impl_requests_, + &bar_baz_impl_requests_)) {} + + void OverrideFooBaz(mojo::ScopedMessagePipeHandle interface_pipe) { + foo_baz_override_requests_++; + } + + void OverrideBarBaz(mojo::ScopedMessagePipeHandle interface_pipe) { + bar_baz_override_requests_++; + } + + protected: + BlinkConnectorImpl* connector() { return &connector_; } + int foo_baz_impl_requests() { return foo_baz_impl_requests_; } + int bar_baz_impl_requests() { return bar_baz_impl_requests_; } + int foo_baz_override_requests() { return foo_baz_override_requests_; } + int bar_baz_override_requests() { return bar_baz_override_requests_; } + + private: + base::MessageLoop loop_; + int foo_baz_impl_requests_; + int bar_baz_impl_requests_; + int foo_baz_override_requests_; + int bar_baz_override_requests_; + BlinkConnectorImpl connector_; + + DISALLOW_COPY_AND_ASSIGN(BlinkConnectorImplTest); +}; + +TEST_F(BlinkConnectorImplTest, Basic) { + EXPECT_EQ(0, foo_baz_impl_requests()); + EXPECT_EQ(0, bar_baz_impl_requests()); + + mojo::MessagePipe pipe1; + connector()->bindInterface("foo", "baz", std::move(pipe1.handle0)); + EXPECT_EQ(1, foo_baz_impl_requests()); + EXPECT_EQ(0, bar_baz_impl_requests()); + + mojo::MessagePipe pipe2; + connector()->bindInterface("bar", "baz", std::move(pipe2.handle0)); + EXPECT_EQ(1, foo_baz_impl_requests()); + EXPECT_EQ(1, bar_baz_impl_requests()); +} + +TEST_F(BlinkConnectorImplTest, Override) { + EXPECT_EQ(0, foo_baz_impl_requests()); + EXPECT_EQ(0, foo_baz_override_requests()); + EXPECT_EQ(0, bar_baz_impl_requests()); + + connector()->AddOverrideForTesting( + "foo", "baz", + base::Bind(&BlinkConnectorImplTest::OverrideFooBaz, + base::Unretained(this))); + + mojo::MessagePipe pipe1; + connector()->bindInterface("foo", "baz", std::move(pipe1.handle0)); + EXPECT_EQ(0, foo_baz_impl_requests()); + EXPECT_EQ(1, foo_baz_override_requests()); + EXPECT_EQ(0, bar_baz_impl_requests()); + + mojo::MessagePipe pipe2; + connector()->bindInterface("bar", "baz", std::move(pipe2.handle0)); + EXPECT_EQ(0, foo_baz_impl_requests()); + EXPECT_EQ(1, foo_baz_override_requests()); + EXPECT_EQ(1, bar_baz_impl_requests()); + + connector()->ClearOverridesForTesting(); + + mojo::MessagePipe pipe3; + connector()->bindInterface("foo", "baz", std::move(pipe3.handle0)); + EXPECT_EQ(1, foo_baz_impl_requests()); + EXPECT_EQ(1, foo_baz_override_requests()); + EXPECT_EQ(1, bar_baz_impl_requests()); +} + +} // namespace content
diff --git a/content/renderer/mojo/blink_connector_js_wrapper.cc b/content/renderer/mojo/blink_connector_js_wrapper.cc new file mode 100644 index 0000000..f4eba82 --- /dev/null +++ b/content/renderer/mojo/blink_connector_js_wrapper.cc
@@ -0,0 +1,104 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/mojo/blink_connector_js_wrapper.h" + +#include <memory> +#include <utility> + +#include "content/renderer/mojo/blink_connector_impl.h" +#include "mojo/edk/js/handle.h" +#include "third_party/WebKit/public/web/WebLocalFrame.h" + +namespace content { + +gin::WrapperInfo BlinkConnectorJsWrapper::kWrapperInfo = { + gin::kEmbedderNativeGin}; +const char BlinkConnectorJsWrapper::kModuleName[] = + "content/public/renderer/connector"; + +BlinkConnectorJsWrapper::~BlinkConnectorJsWrapper() {} + +// static +gin::Handle<BlinkConnectorJsWrapper> BlinkConnectorJsWrapper::Create( + v8::Isolate* isolate, + v8::Handle<v8::Context> context, + BlinkConnectorImpl* connector) { + return gin::CreateHandle( + isolate, + new BlinkConnectorJsWrapper(isolate, context, connector->GetWeakPtr())); +} + +gin::ObjectTemplateBuilder BlinkConnectorJsWrapper::GetObjectTemplateBuilder( + v8::Isolate* isolate) { + return Wrappable<BlinkConnectorJsWrapper>::GetObjectTemplateBuilder(isolate) + .SetMethod("bindInterface", &BlinkConnectorJsWrapper::BindInterface) + .SetMethod("addInterfaceOverrideForTesting", + &BlinkConnectorJsWrapper::AddOverrideForTesting) + .SetMethod("clearInterfaceOverridesForTesting", + &BlinkConnectorJsWrapper::ClearOverridesForTesting); +} + +mojo::Handle BlinkConnectorJsWrapper::BindInterface( + const std::string& service_name, + const std::string& interface_name) { + mojo::MessagePipe pipe; + if (connector_) { + connector_->bindInterface(service_name.c_str(), interface_name.c_str(), + std::move(pipe.handle0)); + } + return pipe.handle1.release(); +} + +void BlinkConnectorJsWrapper::AddOverrideForTesting( + const std::string& service_name, + const std::string& interface_name, + v8::Local<v8::Function> service_factory) { + ScopedJsFactory factory(v8::Isolate::GetCurrent(), service_factory); + connector_->AddOverrideForTesting( + service_name, interface_name, + base::Bind(&BlinkConnectorJsWrapper::CallJsFactory, + weak_factory_.GetWeakPtr(), factory)); +} + +void BlinkConnectorJsWrapper::ClearOverridesForTesting() { + connector_->ClearOverridesForTesting(); +} + +BlinkConnectorJsWrapper::BlinkConnectorJsWrapper( + v8::Isolate* isolate, + v8::Handle<v8::Context> context, + base::WeakPtr<BlinkConnectorImpl> connector) + : isolate_(isolate), + context_(isolate, context), + connector_(connector), + weak_factory_(this) { + context_.SetWeak(this, &BlinkConnectorJsWrapper::ClearContext, + v8::WeakCallbackType::kParameter); +} + +void BlinkConnectorJsWrapper::CallJsFactory( + const ScopedJsFactory& factory, + mojo::ScopedMessagePipeHandle pipe) { + if (context_.IsEmpty()) + return; + + v8::HandleScope handle_scope(isolate_); + v8::Handle<v8::Context> context = context_.Get(isolate_); + v8::Context::Scope context_scope(context); + v8::Local<v8::Value> argv[] = { + gin::ConvertToV8(isolate_, mojo::Handle(pipe.release().value()))}; + blink::WebLocalFrame::frameForContext(context) + ->callFunctionEvenIfScriptDisabled(factory.Get(isolate_), + v8::Undefined(isolate_), 1, argv); +} + +// static +void BlinkConnectorJsWrapper::ClearContext( + const v8::WeakCallbackInfo<BlinkConnectorJsWrapper>& data) { + BlinkConnectorJsWrapper* registry = data.GetParameter(); + registry->context_.Reset(); +} + +} // namespace content
diff --git a/content/renderer/mojo/blink_connector_js_wrapper.h b/content/renderer/mojo/blink_connector_js_wrapper.h new file mode 100644 index 0000000..198c91233 --- /dev/null +++ b/content/renderer/mojo/blink_connector_js_wrapper.h
@@ -0,0 +1,73 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_JS_WRAPPER_H_ +#define CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_JS_WRAPPER_H_ + +#include <string> + +#include "base/macros.h" +#include "content/common/content_export.h" +#include "gin/handle.h" +#include "gin/object_template_builder.h" +#include "gin/wrappable.h" +#include "mojo/public/cpp/system/message_pipe.h" +#include "v8/include/v8.h" + +namespace content { + +class BlinkConnectorImpl; + +// A JS wrapper around blink::Connector that allows connecting to remote +// services. +class CONTENT_EXPORT BlinkConnectorJsWrapper + : public gin::Wrappable<BlinkConnectorJsWrapper> { + public: + ~BlinkConnectorJsWrapper() override; + static gin::Handle<BlinkConnectorJsWrapper> Create( + v8::Isolate* isolate, + v8::Handle<v8::Context> context, + BlinkConnectorImpl* remote_interfaces); + + // gin::Wrappable<BlinkConnectorJsWrapper> overrides. + gin::ObjectTemplateBuilder GetObjectTemplateBuilder( + v8::Isolate* isolate) override; + + // JS interface implementation. + void AddOverrideForTesting(const std::string& service_name, + const std::string& interface_name, + v8::Local<v8::Function> interface_factory); + void ClearOverridesForTesting(); + mojo::Handle BindInterface(const std::string& service_name, + const std::string& interface_name); + + static gin::WrapperInfo kWrapperInfo; + static const char kModuleName[]; + + private: + using ScopedJsFactory = + v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function>>; + + BlinkConnectorJsWrapper(v8::Isolate* isolate, + v8::Handle<v8::Context> context, + base::WeakPtr<BlinkConnectorImpl> connector); + + void CallJsFactory(const ScopedJsFactory& factory, + mojo::ScopedMessagePipeHandle pipe); + + static void ClearContext( + const v8::WeakCallbackInfo<BlinkConnectorJsWrapper>& data); + + v8::Isolate* isolate_; + v8::Global<v8::Context> context_; + base::WeakPtr<BlinkConnectorImpl> connector_; + + base::WeakPtrFactory<BlinkConnectorJsWrapper> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(BlinkConnectorJsWrapper); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_MOJO_BLINK_CONNECTOR_JS_WRAPPER_H_
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc index 7b4e70e..bbded169a 100644 --- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc +++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
@@ -515,7 +515,8 @@ blink::WebMediaStreamSource webkit_source; webkit_source.initialize(blink::WebString::fromASCII(source_id), blink::WebMediaStreamSource::TypeVideo, - blink::WebString::fromASCII(kPepperVideoSourceName)); + blink::WebString::fromASCII(kPepperVideoSourceName), + false /* remote */); MediaStreamVideoSource* const source = new VideoSource(weak_factory_.GetWeakPtr()); webkit_source.setExtraData(source); // Takes ownership of |source|.
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 52404ecc..859f129 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -121,6 +121,8 @@ #include "content/renderer/media/user_media_client_impl.h" #include "content/renderer/media/web_media_element_source_utils.h" #include "content/renderer/media/webmediaplayer_ms.h" +#include "content/renderer/mojo/blink_connector_impl.h" +#include "content/renderer/mojo/blink_connector_js_wrapper.h" #include "content/renderer/mojo/blink_interface_registry_impl.h" #include "content/renderer/mojo/interface_provider_js_wrapper.h" #include "content/renderer/mojo_bindings_controller.h" @@ -134,6 +136,7 @@ #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" #include "content/renderer/render_widget_fullscreen_pepper.h" +#include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/renderer_webapplicationcachehost_impl.h" #include "content/renderer/renderer_webcolorchooser_impl.h" #include "content/renderer/savable_resources.h" @@ -2651,6 +2654,12 @@ InterfaceProviderJsWrapper::Create(isolate, context, RenderThread::Get()->GetConnector()) .ToV8()); + registry->AddBuiltinModule( + isolate, BlinkConnectorJsWrapper::kModuleName, + BlinkConnectorJsWrapper::Create( + isolate, context, + RenderThreadImpl::current()->blink_platform_impl()->connector()) + .ToV8()); } void RenderFrameImpl::AddMessageToConsole(ConsoleMessageLevel level, @@ -4121,6 +4130,10 @@ return effective_connection_type_; } +void RenderFrameImpl::abortClientNavigation() { + Send(new FrameHostMsg_AbortNavigation(routing_id_)); +} + void RenderFrameImpl::didChangeSelection(bool is_empty_selection) { if (!GetRenderWidget()->input_handler().handling_input_event() && !handling_select_range_)
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 3ddeaae..5bc63af 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -597,6 +597,7 @@ void didChangeThemeColor() override; void dispatchLoad() override; blink::WebEffectiveConnectionType getEffectiveConnectionType() override; + void abortClientNavigation() override; void didChangeSelection(bool is_empty_selection) override; bool handleCurrentKeyboardEvent() override; blink::WebColorChooser* createColorChooser(
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index fc83bd7..2bb9b82 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -169,6 +169,7 @@ #include "third_party/skia/include/core/SkGraphics.h" #include "ui/base/layout.h" #include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/gl/gl_switches.h" #if defined(OS_ANDROID)
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 9f0ba35..6be17703 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -625,8 +625,8 @@ OnSetViewportIntersection) IPC_MESSAGE_HANDLER(ViewMsg_WaitForNextFrameForTests, OnWaitNextFrameForTests) - IPC_MESSAGE_HANDLER(InputMsg_RequestCompositionUpdate, - OnRequestCompositionUpdate) + IPC_MESSAGE_HANDLER(InputMsg_RequestCompositionUpdates, + OnRequestCompositionUpdates) IPC_MESSAGE_HANDLER(DragMsg_TargetDragEnter, OnDragTargetDragEnter) IPC_MESSAGE_HANDLER(DragMsg_TargetDragOver, OnDragTargetDragOver) IPC_MESSAGE_HANDLER(DragMsg_TargetDragLeave, OnDragTargetDragLeave) @@ -1880,9 +1880,9 @@ } #endif -void RenderWidget::OnRequestCompositionUpdate(bool immediate_request, - bool monitor_request) { - monitor_composition_info_ = monitor_request; +void RenderWidget::OnRequestCompositionUpdates(bool immediate_request, + bool monitor_updates) { + monitor_composition_info_ = monitor_updates; if (!immediate_request) return; UpdateCompositionInfo(true /* immediate request */);
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index c4ad5558..036e250 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -547,8 +547,14 @@ #endif // Called by the browser process to update the cursor and composition - // information. - void OnRequestCompositionUpdate(bool immediate_request, bool monitor_request); + // information by sending InputHostMsg_ImeCompositionRangeChanged. If + // |immediate_request| is true, an IPC is sent back with current state. + // When |monitor_update| is true, then RenderWidget will send the updates + // in each compositor frame when there are changes. Outside of compositor + // frame updates, a change in text selection might also lead to an update for + // composition info (when in monitor mode). + void OnRequestCompositionUpdates(bool immediate_request, + bool monitor_updates); // Notify the compositor about a change in viewport size. This should be // used only with auto resize mode WebWidgets, as normal WebWidgets should
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index d6acf4d..6593467 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -42,6 +42,7 @@ #include "content/common/frame_messages.h" #include "content/common/render_process_messages.h" #include "content/public/common/content_switches.h" +#include "content/public/common/service_manager_connection.h" #include "content/public/common/webplugininfo.h" #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/media_stream_utils.h" @@ -78,6 +79,7 @@ #include "media/blink/webcontentdecryptionmodule_impl.h" #include "media/filters/stream_parser_factory.h" #include "ppapi/features/features.h" +#include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" #include "storage/common/database/database_identifier.h" @@ -249,6 +251,7 @@ loading_task_runner_(renderer_scheduler->LoadingTaskRunner()), web_scrollbar_behavior_(new WebScrollbarBehaviorImpl), renderer_scheduler_(renderer_scheduler), + blink_connector_(new BlinkConnectorImpl(nullptr)), blink_interface_provider_(new BlinkInterfaceProviderImpl(connector)) { #if !defined(OS_ANDROID) && !defined(OS_WIN) if (g_sandbox_enabled && sandboxEnabled()) { @@ -260,6 +263,10 @@ // RenderThread may not exist in some tests. if (RenderThreadImpl::current()) { + blink_connector_->SetConnector(RenderThreadImpl::current() + ->GetServiceManagerConnection() + ->GetConnector() + ->Clone()); sync_message_filter_ = RenderThreadImpl::current()->sync_message_filter(); thread_safe_sender_ = RenderThreadImpl::current()->thread_safe_sender(); quota_message_filter_ = RenderThreadImpl::current()->quota_message_filter(); @@ -856,6 +863,8 @@ AddVideoTrackToMediaStream( HtmlVideoElementCapturerSource::CreateFromWebMediaPlayerImpl( web_media_player, content::RenderThread::Get()->GetIOTaskRunner()), + false, // is_remote + false, // is_readonly web_media_stream); #endif } @@ -871,8 +880,9 @@ blink::WebMediaStreamTrack web_media_stream_track; const WebString track_id = WebString::fromUTF8(base::GenerateGUID()); - web_media_stream_source.initialize( - track_id, blink::WebMediaStreamSource::TypeAudio, track_id); + web_media_stream_source.initialize(track_id, + blink::WebMediaStreamSource::TypeAudio, + track_id, false /* is_remote */); web_media_stream_track.initialize(web_media_stream_source); MediaStreamAudioSource* const media_stream_source = @@ -1151,6 +1161,10 @@ platform_event_observers_.AddWithID(std::move(observer), type); } +BlinkConnectorImpl* RendererBlinkPlatformImpl::connector() { + return blink_connector_.get(); +} + blink::InterfaceProvider* RendererBlinkPlatformImpl::interfaceProvider() { return blink_interface_provider_.get(); }
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index c532325..fbff08a 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -19,6 +19,7 @@ #include "content/child/child_shared_bitmap_manager.h" #include "content/common/content_export.h" #include "content/common/url_loader_factory.mojom.h" +#include "content/renderer/mojo/blink_connector_impl.h" #include "content/renderer/origin_trials/web_trial_token_validator_impl.h" #include "content/renderer/top_level_blame_context.h" #include "content/renderer/webpublicsuffixlist_impl.h" @@ -52,6 +53,7 @@ } namespace content { +class BlinkConnectorImpl; class BlinkInterfaceProviderImpl; class LocalStorageCachedAreas; class PlatformEventObserverBase; @@ -185,6 +187,7 @@ const blink::WebSize& size) override; blink::WebCompositorSupport* compositorSupport() override; blink::WebString convertIDNToUnicode(const blink::WebString& host) override; + BlinkConnectorImpl* connector() override; blink::InterfaceProvider* interfaceProvider() override; void startListening(blink::WebPlatformEventType, blink::WebPlatformEventListener*) override; @@ -297,6 +300,8 @@ std::unique_ptr<LocalStorageCachedAreas> local_storage_cached_areas_; + std::unique_ptr<BlinkConnectorImpl> blink_connector_; + std::unique_ptr<BlinkInterfaceProviderImpl> blink_interface_provider_; mojom::URLLoaderFactoryAssociatedPtr url_loader_factory_;
diff --git a/content/shell/android/BUILD.gn b/content/shell/android/BUILD.gn index e1e5ef9..0fe04016 100644 --- a/content/shell/android/BUILD.gn +++ b/content/shell/android/BUILD.gn
@@ -236,6 +236,7 @@ sources = [ "linker_test_apk/chromium_linker_test_android.cc", "linker_test_apk/chromium_linker_test_linker_tests.cc", + "linker_test_apk/chromium_linker_test_linker_tests.h", ] deps = [
diff --git a/content/shell/renderer/layout_test/blink_test_runner.cc b/content/shell/renderer/layout_test/blink_test_runner.cc index 199726f7..7701e5a 100644 --- a/content/shell/renderer/layout_test/blink_test_runner.cc +++ b/content/shell/renderer/layout_test/blink_test_runner.cc
@@ -761,6 +761,8 @@ DCHECK(stream); #if BUILDFLAG(ENABLE_WEBRTC) return AddVideoTrackToMediaStream(base::MakeUnique<MockVideoCapturerSource>(), + false, // is_remote + false, // is_readonly stream); #else return false; @@ -775,7 +777,9 @@ make_scoped_refptr(new MockAudioCapturerSource()), 48000, // sample rate media::CHANNEL_LAYOUT_STEREO, - 480, // sample frames per buffer + 480, // sample frames per buffer + false, // is_remote + false, // is_readonly stream); #else return false;
diff --git a/content/shell/test_runner/mock_web_user_media_client.cc b/content/shell/test_runner/mock_web_user_media_client.cc index 5ac567e0..19e514f 100644 --- a/content/shell/test_runner/mock_web_user_media_client.cc +++ b/content/shell/test_runner/mock_web_user_media_client.cc
@@ -63,7 +63,7 @@ !delegate_->AddMediaStreamAudioSourceAndTrack(&stream)) { WebMediaStreamSource source; source.initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, - "Mock audio device"); + "Mock audio device", false /* remote */); WebMediaStreamTrack web_track; web_track.initialize(source); stream.addTrack(web_track); @@ -73,7 +73,7 @@ !delegate_->AddMediaStreamVideoSourceAndTrack(&stream)) { WebMediaStreamSource source; source.initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, - "Mock video device"); + "Mock video device", false /* remote */); WebMediaStreamTrack web_track; web_track.initialize(source); stream.addTrack(web_track);
diff --git a/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc b/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc index 078ceaf4..c2f4f10 100644 --- a/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc +++ b/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc
@@ -405,7 +405,7 @@ blink::WebMediaStreamSource webkit_source; webkit_source.initialize(local_audio_tracks[i].id(), blink::WebMediaStreamSource::TypeAudio, - local_audio_tracks[i].id()); + local_audio_tracks[i].id(), true /* remote */); remote_audio_tracks[i].initialize(webkit_source); } @@ -417,7 +417,7 @@ blink::WebMediaStreamSource webkit_source; webkit_source.initialize(local_video_tracks[i].id(), blink::WebMediaStreamSource::TypeVideo, - local_video_tracks[i].id()); + local_video_tracks[i].id(), true /* remote */); remote_video_tracks[i].initialize(webkit_source); }
diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc index fa647f66..9d2f76f 100644 --- a/content/shell/test_runner/test_runner.cc +++ b/content/shell/test_runner/test_runner.cc
@@ -2245,31 +2245,31 @@ device::MotionData motion; // acceleration - motion.hasAccelerationX = has_acceleration_x; - motion.accelerationX = acceleration_x; - motion.hasAccelerationY = has_acceleration_y; - motion.accelerationY = acceleration_y; - motion.hasAccelerationZ = has_acceleration_z; - motion.accelerationZ = acceleration_z; + motion.has_acceleration_x = has_acceleration_x; + motion.acceleration_x = acceleration_x; + motion.has_acceleration_y = has_acceleration_y; + motion.acceleration_y = acceleration_y; + motion.has_acceleration_z = has_acceleration_z; + motion.acceleration_z = acceleration_z; // accelerationIncludingGravity - motion.hasAccelerationIncludingGravityX = + motion.has_acceleration_including_gravity_x = has_acceleration_including_gravity_x; - motion.accelerationIncludingGravityX = acceleration_including_gravity_x; - motion.hasAccelerationIncludingGravityY = + motion.acceleration_including_gravity_x = acceleration_including_gravity_x; + motion.has_acceleration_including_gravity_y = has_acceleration_including_gravity_y; - motion.accelerationIncludingGravityY = acceleration_including_gravity_y; - motion.hasAccelerationIncludingGravityZ = + motion.acceleration_including_gravity_y = acceleration_including_gravity_y; + motion.has_acceleration_including_gravity_z = has_acceleration_including_gravity_z; - motion.accelerationIncludingGravityZ = acceleration_including_gravity_z; + motion.acceleration_including_gravity_z = acceleration_including_gravity_z; // rotationRate - motion.hasRotationRateAlpha = has_rotation_rate_alpha; - motion.rotationRateAlpha = rotation_rate_alpha; - motion.hasRotationRateBeta = has_rotation_rate_beta; - motion.rotationRateBeta = rotation_rate_beta; - motion.hasRotationRateGamma = has_rotation_rate_gamma; - motion.rotationRateGamma = rotation_rate_gamma; + motion.has_rotation_rate_alpha = has_rotation_rate_alpha; + motion.rotation_rate_alpha = rotation_rate_alpha; + motion.has_rotation_rate_beta = has_rotation_rate_beta; + motion.rotation_rate_beta = rotation_rate_beta; + motion.has_rotation_rate_gamma = has_rotation_rate_gamma; + motion.rotation_rate_gamma = rotation_rate_gamma; // interval motion.interval = interval; @@ -2287,15 +2287,15 @@ device::OrientationData orientation; // alpha - orientation.hasAlpha = has_alpha; + orientation.has_alpha = has_alpha; orientation.alpha = alpha; // beta - orientation.hasBeta = has_beta; + orientation.has_beta = has_beta; orientation.beta = beta; // gamma - orientation.hasGamma = has_gamma; + orientation.has_gamma = has_gamma; orientation.gamma = gamma; // absolute
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index f5aefba..c535971a 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -40,6 +40,7 @@ "../browser/service_worker/embedded_worker_test_helper.cc", "../browser/service_worker/embedded_worker_test_helper.h", "../browser/service_worker/service_worker_test_utils.cc", + "../browser/service_worker/service_worker_test_utils.h", "../public/test/async_file_test_helper.cc", "../public/test/async_file_test_helper.h", "../public/test/background_sync_test_util.cc", @@ -587,7 +588,6 @@ "../browser/accessibility/touch_accessibility_aura_browsertest.cc", "../browser/background_sync/background_sync_browsertest.cc", "../browser/battery_status/battery_monitor_impl_browsertest.cc", - "../browser/battery_status/battery_monitor_integration_browsertest.cc", "../browser/blob_storage/blob_storage_browsertest.cc", "../browser/blob_storage/blob_url_browsertest.cc", "../browser/bookmarklet_browsertest.cc", @@ -928,7 +928,9 @@ if (enable_plugins) { sources += [ "../renderer/pepper/fake_pepper_plugin_instance.cc", + "../renderer/pepper/fake_pepper_plugin_instance.h", "../renderer/pepper/mock_renderer_ppapi_host.cc", + "../renderer/pepper/mock_renderer_ppapi_host.h", "../renderer/pepper/pepper_device_enumeration_host_helper_unittest.cc", "../renderer/pepper/pepper_file_chooser_host_unittest.cc", "../renderer/pepper/pepper_graphics_2d_host_unittest.cc", @@ -1421,6 +1423,7 @@ "../renderer/media/video_capture_impl_manager_unittest.cc", "../renderer/media/video_capture_impl_unittest.cc", "../renderer/media/webmediaplayer_ms_unittest.cc", + "../renderer/mojo/blink_connector_impl_unittest.cc", "../renderer/peripheral_content_heuristic_unittest.cc", "../renderer/presentation/presentation_connection_proxy_unittest.cc", "../renderer/presentation/presentation_dispatcher_unittest.cc", @@ -1618,6 +1621,7 @@ "../renderer/media/media_stream_video_source_unittest.cc", "../renderer/media/media_stream_video_track_unittest.cc", "../renderer/media/mock_constraint_factory.cc", + "../renderer/media/mock_constraint_factory.h", "../renderer/media/mock_media_stream_registry.cc", "../renderer/media/mock_media_stream_registry.h", "../renderer/media/mock_media_stream_video_sink.cc",
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py index 8a97b9fe9..c2e59da 100755 --- a/content/test/gpu/generate_buildbot_json.py +++ b/content/test/gpu/generate_buildbot_json.py
@@ -516,19 +516,6 @@ 'swarming': False, 'os_type': 'linux', }, - 'Linux Release (AMD R5 230)': { - 'swarming_dimensions': [ - { - 'gpu': '1002:6779', - 'os': 'Ubuntu' - }, - ], - 'build_config': 'Release', - # This bot is a one-off and doesn't have similar slaves in the - # swarming pool. - 'swarming': False, - 'os_type': 'linux', - }, 'Linux Release (NVIDIA GeForce 730)': { 'swarming_dimensions': [ { @@ -1255,11 +1242,6 @@ 'Android Release (Nexus 5)', 'Android Release (Nexus 6)', 'Android Release (Nexus 9)', - - # These tests are flaky on old AMD. - # TODO(jmadill): Enably flaky test retries only on this config. - # TODO(kbr): revisit this entry now that GPU has been updated. - 'Win7 Release (AMD R7 240)', ], }, ],
diff --git a/content/test/gpu/gpu_tests/maps_integration_test.py b/content/test/gpu/gpu_tests/maps_integration_test.py index 7ae3bfc..f505da1 100644 --- a/content/test/gpu/gpu_tests/maps_integration_test.py +++ b/content/test/gpu/gpu_tests/maps_integration_test.py
@@ -109,7 +109,7 @@ action_runner = tab.action_runner action_runner.Navigate(url) action_runner.WaitForJavaScriptCondition( - 'window.testDone', timeout=180) + 'window.testDone', timeout=320) # TODO(kbr): This should not be necessary, but it's not clear if the test # is failing on the bots in its absence. Remove once we can verify that
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py index 457efd2..b766c33 100644 --- a/content/test/gpu/gpu_tests/pixel_expectations.py +++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -49,28 +49,3 @@ self.Flaky('Pixel_OffscreenCanvas2DResizeOnWorker', ['win10', ('intel', 0x1912)], bug=690663) - - # TODO(kainino): temporary expectations due to expected result changes - # http://crrev.com/2707623002 - self.Fail('Pixel_2DCanvasWebGL', ['android']) - self.Fail('Pixel_CSS3DBlueBox', ['android']) - self.Fail('Pixel_Canvas2DRedBox', ['android']) - self.Fail('Pixel_CanvasDisplayLinearRGBAccelerated2D', ['android']) - self.Fail('Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing', ['android']) - self.Fail('Pixel_OffscreenCanvas2DResizeOnWorker', ['android']) - self.Fail('Pixel_OffscreenCanvasAccelerated2D', ['android']) - self.Fail('Pixel_OffscreenCanvasAccelerated2DWorker', ['android']) - self.Fail('Pixel_OffscreenCanvasTransferAfterStyleResize', ['android']) - self.Fail('Pixel_OffscreenCanvasTransferBeforeStyleResize', ['android']) - self.Fail('Pixel_OffscreenCanvasTransferToImageBitmap', ['android']) - self.Fail('Pixel_OffscreenCanvasTransferToImageBitmapWorker', ['android']) - self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing', ['android']) - self.Fail('Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker', ['android']) - self.Fail('Pixel_OffscreenCanvasWebGLDefault', ['android']) - self.Fail('Pixel_OffscreenCanvasWebGLDefaultWorker', ['android']) - self.Fail('Pixel_OffscreenCanvasWebglResizeOnWorker', ['android']) - self.Fail('Pixel_WebGLGreenTriangle_AA_Alpha', ['android']) - self.Fail('Pixel_WebGLGreenTriangle_AA_NoAlpha', ['android']) - self.Fail('Pixel_WebGLGreenTriangle_NoAA_Alpha', ['android']) - self.Fail('Pixel_WebGLGreenTriangle_NoAA_NoAlpha', ['android']) - self.Fail('Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear', ['android'])
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index ee77d73..5159d4b5 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc
@@ -235,7 +235,7 @@ } else if (IsBrowserSideNavigationEnabled()) { // Even if the RenderFrameHost is not loading, there may still be an // ongoing navigation in the FrameTreeNode. Cancel this one as well. - frame_tree_node()->ResetNavigationRequest(false); + frame_tree_node()->ResetNavigationRequest(false, true); } }
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 4ad5661..d4b43c9e 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -260,7 +260,7 @@ node->render_manager()->speculative_frame_host(); if (speculative_frame_host) speculative_frame_host->ResetLoadingState(); - node->ResetNavigationRequest(false); + node->ResetNavigationRequest(false, true); } else { RenderFrameHostImpl* pending_frame_host = node->render_manager()->pending_frame_host();
diff --git a/courgette/BUILD.gn b/courgette/BUILD.gn index 65a2c5d0..8e3d30f 100644 --- a/courgette/BUILD.gn +++ b/courgette/BUILD.gn
@@ -38,6 +38,7 @@ "ensemble_apply.cc", "ensemble_create.cc", "image_utils.h", + "instruction_utils.h", "label_manager.cc", "label_manager.h", "memory_allocator.cc",
diff --git a/courgette/adjustment_method_unittest.cc b/courgette/adjustment_method_unittest.cc index e3134438..b60af9c8 100644 --- a/courgette/adjustment_method_unittest.cc +++ b/courgette/adjustment_method_unittest.cc
@@ -52,8 +52,8 @@ Label* labelA = prog->FindAbs32Label(kRvaA); Label* labelB = prog->FindAbs32Label(kRvaB); - AssemblyProgram::InstructionGenerator gen = base::Bind( - [](Label* labelA, Label* labelB, AssemblyProgram* prog, + InstructionGenerator gen = base::Bind( + [](Label* labelA, Label* labelB, InstructionReceptor* receptor) -> CheckBool { EXPECT_TRUE(receptor->EmitAbs32(labelA)); EXPECT_TRUE(receptor->EmitAbs32(labelA));
diff --git a/courgette/assembly_program.cc b/courgette/assembly_program.cc index 77d73b9..fdd312a5 100644 --- a/courgette/assembly_program.cc +++ b/courgette/assembly_program.cc
@@ -309,14 +309,14 @@ const InstructionGenerator& gen) { // Pass 1: Count the space needed to store instructions. InstructionCountReceptor count_receptor; - if (!gen.Run(this, &count_receptor)) + if (!gen.Run(&count_receptor)) return false; // Pass 2: Emit all instructions to preallocated buffer (uses Phase 1 count). InstructionStoreReceptor store_receptor(this); - // TODO(huangs): 2016/11: Pass |count_receptor_->size()| to |store_receptor_| + // TODO(huangs): 2017/03: Pass |count_receptor->size()| to |store_receptor_| // to reserve space for raw data. - return gen.Run(this, &store_receptor); + return gen.Run(&store_receptor); } CheckBool AssemblyProgram::Emit(ScopedInstruction instruction) {
diff --git a/courgette/assembly_program.h b/courgette/assembly_program.h index a3bab07..9eb693e 100644 --- a/courgette/assembly_program.h +++ b/courgette/assembly_program.h
@@ -16,6 +16,7 @@ #include "base/memory/free_deleter.h" #include "courgette/courgette.h" #include "courgette/image_utils.h" +#include "courgette/instruction_utils.h" #include "courgette/label_manager.h" #include "courgette/memory_allocator.h" @@ -55,49 +56,6 @@ DISALLOW_COPY_AND_ASSIGN(Instruction); }; -// An interface to receive emitted instructions parsed from an executable. -class InstructionReceptor { - public: - InstructionReceptor() = default; - virtual ~InstructionReceptor() = default; - - // Generates an entire base relocation table. - virtual CheckBool EmitPeRelocs() = 0; - - // Generates an ELF style relocation table for X86. - virtual CheckBool EmitElfRelocation() = 0; - - // Generates an ELF style relocation table for ARM. - virtual CheckBool EmitElfARMRelocation() = 0; - - // Following instruction will be assembled at address 'rva'. - virtual CheckBool EmitOrigin(RVA rva) = 0; - - // Generates a single byte of data or machine instruction. - virtual CheckBool EmitSingleByte(uint8_t byte) = 0; - - // Generates multiple bytes of data or machine instructions. - virtual CheckBool EmitMultipleBytes(const uint8_t* bytes, size_t len) = 0; - - // Generates a 4-byte relative reference to address of 'label'. - virtual CheckBool EmitRel32(Label* label) = 0; - - // Generates a 4-byte relative reference to address of 'label' for ARM. - virtual CheckBool EmitRel32ARM(uint16_t op, - Label* label, - const uint8_t* arm_op, - uint16_t op_size) = 0; - - // Generates a 4-byte absolute reference to address of 'label'. - virtual CheckBool EmitAbs32(Label* label) = 0; - - // Generates an 8-byte absolute reference to address of 'label'. - virtual CheckBool EmitAbs64(Label* label) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(InstructionReceptor); -}; - // An AssemblyProgram is the result of disassembling an executable file. // // * The disassembler creates labels in the AssemblyProgram and emits @@ -122,14 +80,6 @@ using LabelHandler = base::Callback<void(Label*)>; using LabelHandlerMap = std::map<OP, LabelHandler>; - // A callback for GenerateInstructions() to emit instructions. The first - // argument (AssemblyProgram*) is provided for Label-related feature access. - // The second argument (InstructionReceptor*) is a receptor for instructions. - // The callback (which gets called in 2 passes) should return true on success, - // and false otherwise. - using InstructionGenerator = - base::Callback<CheckBool(AssemblyProgram*, InstructionReceptor*)>; - AssemblyProgram(ExecutableType kind, uint64_t image_base); ~AssemblyProgram();
diff --git a/courgette/disassembler.cc b/courgette/disassembler.cc index 9407f6da..31c23f1f6 100644 --- a/courgette/disassembler.cc +++ b/courgette/disassembler.cc
@@ -4,9 +4,8 @@ #include "courgette/disassembler.h" -#include <memory> - #include "base/logging.h" +#include "base/memory/ptr_util.h" #include "courgette/assembly_program.h" namespace courgette { @@ -38,9 +37,9 @@ start_ = start; length_ = length; end_ = start_ + length_; -}; +} -Disassembler::~Disassembler() {}; +Disassembler::~Disassembler() {} const uint8_t* Disassembler::FileOffsetToPointer(FileOffset file_offset) const { CHECK_LE(file_offset, static_cast<FileOffset>(end_ - start_)); @@ -55,6 +54,23 @@ return FileOffsetToPointer(file_offset); } +std::unique_ptr<AssemblyProgram> Disassembler::Disassemble() { + if (!ok() || !ExtractAbs32Locations() || !ExtractRel32Locations()) + return nullptr; + + std::unique_ptr<AssemblyProgram> program = + base::MakeUnique<AssemblyProgram>(kind(), image_base()); + + PrecomputeLabels(program.get()); + RemoveUnusedRel32Locations(program.get()); + + if (!program->GenerateInstructions(GetInstructionGenerator(program.get()))) + return nullptr; + + program->DefaultAssignIndexes(); + return program; +} + bool Disassembler::Good() { failure_reason_ = nullptr; return true;
diff --git a/courgette/disassembler.h b/courgette/disassembler.h index ff2dd69..379a75a 100644 --- a/courgette/disassembler.h +++ b/courgette/disassembler.h
@@ -7,11 +7,13 @@ #include <stdint.h> +#include <memory> #include <vector> #include "base/macros.h" #include "courgette/courgette.h" #include "courgette/image_utils.h" +#include "courgette/instruction_utils.h" namespace courgette { @@ -66,6 +68,12 @@ // general case of 64-bit architectures. virtual uint64_t image_base() const = 0; + // Extracts and stores locations of abs32 references from the image file. + virtual bool ExtractAbs32Locations() = 0; + + // Extracts and stores locations of rel32 references from the image file. + virtual bool ExtractRel32Locations() = 0; + // Returns a caller-owned new RvaVisitor to iterate through abs32 target RVAs. virtual RvaVisitor* CreateAbs32TargetRvaVisitor() = 0; @@ -74,16 +82,18 @@ // Removes unused rel32 locations (architecture-specific). This is needed // because we may remove rel32 Labels along the way. As a result the matching - // matching rel32 addresses become unused. Removing them saves space. + // rel32 addresses become unused. Removing them saves space. virtual void RemoveUnusedRel32Locations(AssemblyProgram* program) = 0; - // Returns true if the buffer appears to be a valid executable of the expected - // type, and false otherwise. This needs not be called before Disassemble(). + // Extracts structural data from the main image. Returns true if the image + // appears to be a valid executable of the expected type, or false otherwise. + // This needs to be called before Disassemble(). virtual bool ParseHeader() = 0; - // Disassembles the item passed to the factory method into the output - // parameter 'program'. - virtual bool Disassemble(AssemblyProgram* program) = 0; + // Extracts and stores references from the main image. Returns a new + // AssemblyProgram initialized using data parsed from the main image, or null + // on failure. + std::unique_ptr<AssemblyProgram> Disassemble(); // ok() may always be called but returns true only after ParseHeader() // succeeds. @@ -112,6 +122,11 @@ // (or realloc) any memory. Usually only called via ParseHeader(). void ReduceLength(size_t reduced_length); + // Returns a generator that emits instructions to a given receptor. |program| + // is required as helper. + virtual InstructionGenerator GetInstructionGenerator( + AssemblyProgram* program) = 0; + private: const char* failure_reason_;
diff --git a/courgette/disassembler_elf_32.cc b/courgette/disassembler_elf_32.cc index e35a3af..14f0383 100644 --- a/courgette/disassembler_elf_32.cc +++ b/courgette/disassembler_elf_32.cc
@@ -163,28 +163,6 @@ return Good(); } -bool DisassemblerElf32::Disassemble(AssemblyProgram* program) { - if (!ok()) - return false; - - if (!ParseAbs32Relocs()) - return false; - - if (!ParseRel32RelocsFromSections()) // Does not sort rel32 locations. - return false; - - PrecomputeLabels(program); - RemoveUnusedRel32Locations(program); - - if (!program->GenerateInstructions( - base::Bind(&DisassemblerElf32::ParseFile, base::Unretained(this)))) { - return false; - } - - program->DefaultAssignIndexes(); - return true; -} - CheckBool DisassemblerElf32::IsValidTargetRVA(RVA rva) const { if (rva == kUnassignedRVA) return false; @@ -316,7 +294,7 @@ return true; } -CheckBool DisassemblerElf32::ParseAbs32Relocs() { +bool DisassemblerElf32::ExtractAbs32Locations() { abs32_locations_.clear(); // Loop through sections for relocation sections @@ -350,7 +328,7 @@ return true; } -CheckBool DisassemblerElf32::ParseRel32RelocsFromSections() { +bool DisassemblerElf32::ExtractRel32Locations() { rel32_locations_.clear(); bool found_rel32 = false; @@ -411,6 +389,12 @@ rel32_locations_.resize(std::distance(rel32_locations_.begin(), tail_it)); } +InstructionGenerator DisassemblerElf32::GetInstructionGenerator( + AssemblyProgram* program) { + return base::Bind(&DisassemblerElf32::ParseFile, base::Unretained(this), + program); +} + CheckBool DisassemblerElf32::ParseFile(AssemblyProgram* program, InstructionReceptor* receptor) const { // Walk all the bytes in the file, whether or not in a section.
diff --git a/courgette/disassembler_elf_32.h b/courgette/disassembler_elf_32.h index fbd8a59..a75773d 100644 --- a/courgette/disassembler_elf_32.h +++ b/courgette/disassembler_elf_32.h
@@ -15,13 +15,13 @@ #include "base/macros.h" #include "courgette/disassembler.h" #include "courgette/image_utils.h" +#include "courgette/instruction_utils.h" #include "courgette/memory_allocator.h" #include "courgette/types_elf.h" namespace courgette { class AssemblyProgram; -class InstructionReceptor; // A Courgette disassembler for 32-bit ELF files. This is only a partial // implementation that admits subclasses for the architecture-specific parts of @@ -106,7 +106,6 @@ ExecutableType kind() const override = 0; uint64_t image_base() const override { return 0; } bool ParseHeader() override; - bool Disassemble(AssemblyProgram* program) override; virtual e_machine_values ElfEM() const = 0; @@ -170,7 +169,7 @@ CheckBool RVAsToFileOffsets( std::vector<std::unique_ptr<TypedRVA>>* typed_rvas) const; - // Parsing code for Disassemble(). + // Helpers for ParseFile(). virtual CheckBool ParseRelocationSection(const Elf32_Shdr* section_header, InstructionReceptor* receptor) const @@ -185,9 +184,13 @@ CheckBool ParseRel32RelocsFromSections() WARN_UNUSED_RESULT; // Disassembler interfaces. + bool ExtractAbs32Locations() override; + bool ExtractRel32Locations() override; RvaVisitor* CreateAbs32TargetRvaVisitor() override; RvaVisitor* CreateRel32TargetRvaVisitor() override; void RemoveUnusedRel32Locations(AssemblyProgram* program) override; + InstructionGenerator GetInstructionGenerator( + AssemblyProgram* program) override; CheckBool ParseFile(AssemblyProgram* target, InstructionReceptor* receptor) const WARN_UNUSED_RESULT; @@ -225,9 +228,10 @@ const char* default_string_section_; size_t default_string_section_size_; - // Sorted abs32 and reel32 RVAs. These are mutable because ParseFile() needs - // to sort these by file offsets. - mutable std::vector<RVA> abs32_locations_; + // Sorted abs32 RVAs. + std::vector<RVA> abs32_locations_; + // Sorted rel32 RVAs. This is mutable because ParseFile() temporarily sorts + // these by file offsets. mutable std::vector<std::unique_ptr<TypedRVA>> rel32_locations_; private:
diff --git a/courgette/disassembler_elf_32_arm.cc b/courgette/disassembler_elf_32_arm.cc index 0d9f340b..bbd52f0 100644 --- a/courgette/disassembler_elf_32_arm.cc +++ b/courgette/disassembler_elf_32_arm.cc
@@ -366,7 +366,7 @@ match = false; if (!abs32_locations_.empty()) { - std::vector<RVA>::iterator reloc_iter = abs32_locations_.begin(); + std::vector<RVA>::const_iterator reloc_iter = abs32_locations_.begin(); for (uint32_t i = 0; i < section_relocs_count; ++i) { if (section_relocs_iter->r_offset == *reloc_iter)
diff --git a/courgette/disassembler_elf_32_x86.cc b/courgette/disassembler_elf_32_x86.cc index a14475fc..b62b293f 100644 --- a/courgette/disassembler_elf_32_x86.cc +++ b/courgette/disassembler_elf_32_x86.cc
@@ -106,7 +106,7 @@ if (abs32_locations_.size() > section_relocs_count) match = false; - std::vector<RVA>::iterator reloc_iter = abs32_locations_.begin(); + std::vector<RVA>::const_iterator reloc_iter = abs32_locations_.begin(); while (match && (reloc_iter != abs32_locations_.end())) { if (section_relocs_iter->r_info != R_386_RELATIVE ||
diff --git a/courgette/disassembler_elf_32_x86_unittest.cc b/courgette/disassembler_elf_32_x86_unittest.cc index 902aeee..d42f7093 100644 --- a/courgette/disassembler_elf_32_x86_unittest.cc +++ b/courgette/disassembler_elf_32_x86_unittest.cc
@@ -76,6 +76,8 @@ bool can_parse_header = disassembler->ParseHeader(); EXPECT_TRUE(can_parse_header); EXPECT_TRUE(disassembler->ok()); + EXPECT_EQ(EXE_ELF_32_X86, disassembler->kind()); + EXPECT_EQ(0U, disassembler->image_base()); // The length of the disassembled value will be slightly smaller than the // real file, since trailing debug info is not included @@ -89,9 +91,8 @@ EXPECT_EQ('L', offset_p[2]); EXPECT_EQ('F', offset_p[3]); - auto program = base::MakeUnique<AssemblyProgram>(EXE_ELF_32_X86, 0); - - EXPECT_TRUE(disassembler->Disassemble(program.get())); + std::unique_ptr<AssemblyProgram> program = disassembler->Disassemble(); + EXPECT_TRUE(nullptr != program.get()); const std::vector<RVA>& abs32_list = disassembler->Abs32Locations();
diff --git a/courgette/disassembler_win32.cc b/courgette/disassembler_win32.cc index f677a06..ec364852 100644 --- a/courgette/disassembler_win32.cc +++ b/courgette/disassembler_win32.cc
@@ -221,27 +221,6 @@ return Good(); } -bool DisassemblerWin32::Disassemble(AssemblyProgram* program) { - if (!ok()) - return false; - - if (!ParseAbs32Relocs()) - return false; - - ParseRel32RelocsFromSections(); - - PrecomputeLabels(program); - RemoveUnusedRel32Locations(program); - - if (!program->GenerateInstructions( - base::Bind(&DisassemblerWin32::ParseFile, base::Unretained(this)))) { - return false; - } - - program->DefaultAssignIndexes(); - return true; -} - //////////////////////////////////////////////////////////////////////////////// bool DisassemblerWin32::ParseRelocs(std::vector<RVA>* relocs) { @@ -365,7 +344,7 @@ return true; } -bool DisassemblerWin32::ParseAbs32Relocs() { +bool DisassemblerWin32::ExtractAbs32Locations() { abs32_locations_.clear(); if (!ParseRelocs(&abs32_locations_)) return false; @@ -380,7 +359,7 @@ return true; } -void DisassemblerWin32::ParseRel32RelocsFromSections() { +bool DisassemblerWin32::ExtractRel32Locations() { FileOffset file_offset = 0; while (file_offset < length()) { const Section* section = FindNextSection(file_offset); @@ -417,6 +396,7 @@ } VLOG(1) << "common " << common; #endif + return true; } RvaVisitor* DisassemblerWin32::CreateAbs32TargetRvaVisitor() { @@ -439,6 +419,12 @@ rel32_locations_.end()); } +InstructionGenerator DisassemblerWin32::GetInstructionGenerator( + AssemblyProgram* program) { + return base::Bind(&DisassemblerWin32::ParseFile, base::Unretained(this), + program); +} + CheckBool DisassemblerWin32::ParseFile(AssemblyProgram* program, InstructionReceptor* receptor) const { // Walk all the bytes in the file, whether or not in a section.
diff --git a/courgette/disassembler_win32.h b/courgette/disassembler_win32.h index c6d986f..d2df58c 100644 --- a/courgette/disassembler_win32.h +++ b/courgette/disassembler_win32.h
@@ -15,13 +15,13 @@ #include "base/macros.h" #include "courgette/disassembler.h" #include "courgette/image_utils.h" +#include "courgette/instruction_utils.h" #include "courgette/memory_allocator.h" #include "courgette/types_win_pe.h" namespace courgette { class AssemblyProgram; -class InstructionReceptor; class DisassemblerWin32 : public Disassembler { public: @@ -34,7 +34,6 @@ uint64_t image_base() const override { return image_base_; } RVA PointerToTargetRVA(const uint8_t* p) const override = 0; bool ParseHeader() override; - bool Disassemble(AssemblyProgram* program) override; // Exposed for test purposes bool has_text_section() const { return has_text_section_; } @@ -60,9 +59,13 @@ void ParseRel32RelocsFromSections(); // Disassembler interfaces. + bool ExtractAbs32Locations() override; + bool ExtractRel32Locations() override; RvaVisitor* CreateAbs32TargetRvaVisitor() override; RvaVisitor* CreateRel32TargetRvaVisitor() override; void RemoveUnusedRel32Locations(AssemblyProgram* program) override; + InstructionGenerator GetInstructionGenerator( + AssemblyProgram* program) override; DisassemblerWin32(const uint8_t* start, size_t length);
diff --git a/courgette/instruction_utils.h b/courgette/instruction_utils.h new file mode 100644 index 0000000..d7dfe97 --- /dev/null +++ b/courgette/instruction_utils.h
@@ -0,0 +1,66 @@ +// 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 COURGETTE_INSTRUCTION_UTILS_H_ +#define COURGETTE_INSTRUCTION_UTILS_H_ + +#include <stdint.h> + +#include "base/callback.h" +#include "base/macros.h" +#include "courgette/image_utils.h" +#include "courgette/memory_allocator.h" + +namespace courgette { + +// An interface to receive emitted instructions parsed from an executable. +class InstructionReceptor { + public: + InstructionReceptor() = default; + virtual ~InstructionReceptor() = default; + + // Generates an entire base relocation table. + virtual CheckBool EmitPeRelocs() = 0; + + // Generates an ELF style relocation table for X86. + virtual CheckBool EmitElfRelocation() = 0; + + // Generates an ELF style relocation table for ARM. + virtual CheckBool EmitElfARMRelocation() = 0; + + // Following instruction will be assembled at address 'rva'. + virtual CheckBool EmitOrigin(RVA rva) = 0; + + // Generates a single byte of data or machine instruction. + virtual CheckBool EmitSingleByte(uint8_t byte) = 0; + + // Generates multiple bytes of data or machine instructions. + virtual CheckBool EmitMultipleBytes(const uint8_t* bytes, size_t len) = 0; + + // Generates a 4-byte relative reference to address of 'label'. + virtual CheckBool EmitRel32(Label* label) = 0; + + // Generates a 4-byte relative reference to address of 'label' for ARM. + virtual CheckBool EmitRel32ARM(uint16_t op, + Label* label, + const uint8_t* arm_op, + uint16_t op_size) = 0; + + // Generates a 4-byte absolute reference to address of 'label'. + virtual CheckBool EmitAbs32(Label* label) = 0; + + // Generates an 8-byte absolute reference to address of 'label'. + virtual CheckBool EmitAbs64(Label* label) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(InstructionReceptor); +}; + +// A rerunable callback that emit instructions to a provided receptor. Returns +// true on success, and false otherwise. +using InstructionGenerator = base::Callback<CheckBool(InstructionReceptor*)>; + +} // namespace courgette + +#endif // COURGETTE_INSTRUCTION_UTILS_H_
diff --git a/courgette/program_detector.cc b/courgette/program_detector.cc index f024a36..d67dc23 100644 --- a/courgette/program_detector.cc +++ b/courgette/program_detector.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "base/memory/ptr_util.h" #include "courgette/assembly_program.h" #include "courgette/disassembler.h" #include "courgette/disassembler_elf_32_arm.h" @@ -77,10 +76,8 @@ if (!disassembler) return C_INPUT_NOT_RECOGNIZED; - auto program = base::MakeUnique<AssemblyProgram>(disassembler->kind(), - disassembler->image_base()); - - if (!disassembler->Disassemble(program.get())) + std::unique_ptr<AssemblyProgram> program = disassembler->Disassemble(); + if (!program.get()) return C_DISASSEMBLY_FAILED; *output = std::move(program);
diff --git a/crypto/signature_verifier.cc b/crypto/signature_verifier.cc index 852f822..2a9f087 100644 --- a/crypto/signature_verifier.cc +++ b/crypto/signature_verifier.cc
@@ -10,6 +10,7 @@ #include <vector> #include "base/logging.h" +#include "base/numerics/safe_conversions.h" #include "crypto/openssl_util.h" #include "third_party/boringssl/src/include/openssl/bytestring.h" #include "third_party/boringssl/src/include/openssl/digest.h" @@ -42,9 +43,9 @@ bool SignatureVerifier::VerifyInit(SignatureAlgorithm signature_algorithm, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len) { + size_t public_key_info_len) { int pkey_type = EVP_PKEY_NONE; const EVP_MD* digest = nullptr; switch (signature_algorithm) { @@ -70,11 +71,11 @@ bool SignatureVerifier::VerifyInitRSAPSS(HashAlgorithm hash_alg, HashAlgorithm mask_hash_alg, - int salt_len, + size_t salt_len, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len) { + size_t public_key_info_len) { OpenSSLErrStackTracer err_tracer(FROM_HERE); const EVP_MD* const digest = ToOpenSSLDigest(hash_alg); DCHECK(digest); @@ -97,15 +98,16 @@ return false; } return EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, mgf_digest) && - EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len); + EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, + base::checked_cast<int>(salt_len)); } void SignatureVerifier::VerifyUpdate(const uint8_t* data_part, - int data_part_len) { + size_t data_part_len) { DCHECK(verify_context_); OpenSSLErrStackTracer err_tracer(FROM_HERE); - int rv = EVP_DigestVerifyUpdate(verify_context_->ctx.get(), - data_part, data_part_len); + int rv = EVP_DigestVerifyUpdate(verify_context_->ctx.get(), data_part, + data_part_len); DCHECK_EQ(rv, 1); } @@ -122,9 +124,9 @@ bool SignatureVerifier::CommonInit(int pkey_type, const EVP_MD* digest, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len, + size_t public_key_info_len, EVP_PKEY_CTX** pkey_ctx) { if (verify_context_) return false;
diff --git a/crypto/signature_verifier.h b/crypto/signature_verifier.h index f1ea5806..e9d5fe7 100644 --- a/crypto/signature_verifier.h +++ b/crypto/signature_verifier.h
@@ -54,9 +54,9 @@ // subjectPublicKey BIT STRING } bool VerifyInit(SignatureAlgorithm signature_algorithm, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len); + size_t public_key_info_len); // Initiates a RSA-PSS signature verification operation. This should be // followed by one or more VerifyUpdate calls and a VerifyFinal call. @@ -76,14 +76,14 @@ // subjectPublicKey BIT STRING } bool VerifyInitRSAPSS(HashAlgorithm hash_alg, HashAlgorithm mask_hash_alg, - int salt_len, + size_t salt_len, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len); + size_t public_key_info_len); // Feeds a piece of the data to the signature verifier. - void VerifyUpdate(const uint8_t* data_part, int data_part_len); + void VerifyUpdate(const uint8_t* data_part, size_t data_part_len); // Concludes a signature verification operation. Returns true if the // signature is valid. Returns false if the signature is invalid or an @@ -94,9 +94,9 @@ bool CommonInit(int pkey_type, const EVP_MD* digest, const uint8_t* signature, - int signature_len, + size_t signature_len, const uint8_t* public_key_info, - int public_key_info_len, + size_t public_key_info_len, EVP_PKEY_CTX** pkey_ctx); void Reset();
diff --git a/device/BUILD.gn b/device/BUILD.gn index ba6692a1..08cb74dc 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -64,6 +64,7 @@ "bluetooth/test/test_bluetooth_adapter_observer.h", "bluetooth/test/test_bluetooth_local_gatt_service_delegate.cc", "bluetooth/test/test_bluetooth_local_gatt_service_delegate.h", + "bluetooth/uribeacon/uri_encoder_unittest.cc", "gamepad/gamepad_provider_unittest.cc", "gamepad/gamepad_service_unittest.cc", "gamepad/public/interfaces/gamepad_struct_traits_unittest.cc", @@ -87,6 +88,7 @@ "//device/bluetooth", "//device/bluetooth:mocks", "//device/bluetooth:mojo", + "//device/bluetooth/uribeacon", "//device/gamepad", "//device/gamepad:test_helpers", "//device/gamepad/public/interfaces", @@ -153,6 +155,7 @@ sources += [ "test/test_device_client.cc", "test/test_device_client.h", + "test/usb_test_gadget.h", "test/usb_test_gadget_impl.cc", "usb/mojo/device_impl_unittest.cc", "usb/mojo/device_manager_impl_unittest.cc", @@ -252,7 +255,10 @@ ] # Needed for "generic_sensor/platform_sensor_and_provider_unittest_win.cc" - libs = [ "sensorsapi.lib" ] + libs = [ + "propsys.lib", + "sensorsapi.lib", + ] } if (enable_vr) {
diff --git a/device/base/BUILD.gn b/device/base/BUILD.gn index 60fd3442..e1bf178 100644 --- a/device/base/BUILD.gn +++ b/device/base/BUILD.gn
@@ -8,6 +8,7 @@ output_name = "device_base" sources = [ + "device_base_export.h", "device_client.cc", "device_client.h", "device_info_query_win.cc",
diff --git a/device/battery/BUILD.gn b/device/battery/BUILD.gn index 468cc002..2647882 100644 --- a/device/battery/BUILD.gn +++ b/device/battery/BUILD.gn
@@ -14,6 +14,7 @@ "battery_export.h", "battery_monitor_impl.cc", "battery_monitor_impl.h", + "battery_status_manager.h", "battery_status_manager_chromeos.cc", "battery_status_manager_default.cc", "battery_status_manager_linux-inl.h",
diff --git a/device/battery/battery_monitor.mojom b/device/battery/battery_monitor.mojom index 1db7868..ec6bcbf 100644 --- a/device/battery/battery_monitor.mojom +++ b/device/battery/battery_monitor.mojom
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(blundell): Move module to device.mojom, and move the mojom files to +// //device/battery/public/interfaces. module device; import "device/battery/battery_status.mojom";
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn index 252fad6..1e89086 100644 --- a/device/bluetooth/BUILD.gn +++ b/device/bluetooth/BUILD.gn
@@ -83,6 +83,7 @@ "bluetooth_discovery_session.cc", "bluetooth_discovery_session.h", "bluetooth_discovery_session_outcome.h", + "bluetooth_export.h", "bluetooth_gatt_characteristic.cc", "bluetooth_gatt_characteristic.h", "bluetooth_gatt_connection.cc",
diff --git a/device/gamepad/BUILD.gn b/device/gamepad/BUILD.gn index 2285dd93..f9634734 100644 --- a/device/gamepad/BUILD.gn +++ b/device/gamepad/BUILD.gn
@@ -23,6 +23,7 @@ "gamepad_data_fetcher.h", "gamepad_data_fetcher_manager.cc", "gamepad_data_fetcher_manager.h", + "gamepad_export.h", "gamepad_monitor.cc", "gamepad_monitor.h", "gamepad_pad_state_provider.cc",
diff --git a/device/generic_sensor/BUILD.gn b/device/generic_sensor/BUILD.gn index 94b70e5..de71e31 100644 --- a/device/generic_sensor/BUILD.gn +++ b/device/generic_sensor/BUILD.gn
@@ -12,6 +12,7 @@ output_name = "generic_sensor" sources = [ "generic_sensor_consts.h", + "generic_sensor_export.h", "linux/sensor_data_linux.cc", "linux/sensor_data_linux.h", "platform_sensor.cc",
diff --git a/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc b/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc index 8f3eb36..da2f96381 100644 --- a/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc +++ b/device/generic_sensor/platform_sensor_and_provider_unittest_win.cc
@@ -3,13 +3,15 @@ // found in the LICENSE file. #include <SensorsApi.h> -#include <Sensors.h> // NOLINT +#include <Sensors.h> // NOLINT +#include <Propvarutil.h> // NOLINT #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/win/iunknown_impl.h" +#include "base/win/scoped_propvariant.h" #include "device/generic_sensor/generic_sensor_consts.h" #include "device/generic_sensor/platform_sensor_provider_win.h" #include "device/generic_sensor/public/interfaces/sensor_provider.mojom.h" @@ -333,7 +335,9 @@ return false; } }; - using SensorData = std::map<PROPERTYKEY, double, PropertyKeyCompare>; + + using SensorData = + std::map<PROPERTYKEY, const PROPVARIANT*, PropertyKeyCompare>; // Generates OnDataUpdated event and creates ISensorDataReport with fake // |value| for property with |key|. @@ -363,8 +367,7 @@ if (it == values.end()) return E_FAIL; - variant->vt = VT_R8; - variant->dblVal = it->second; + PropVariantCopy(variant, it->second); return S_OK; }))); @@ -479,7 +482,9 @@ EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); - GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, 3.14}}); + base::win::ScopedPropVariant pvLux; + InitPropVariantFromDouble(3.14, pvLux.Receive()); + GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, pvLux.ptr()}}); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); } @@ -567,9 +572,15 @@ double x_accel = 0.25; double y_accel = -0.25; double z_accel = -0.5; - GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_ACCELERATION_X_G, x_accel}, - {SENSOR_DATA_TYPE_ACCELERATION_Y_G, y_accel}, - {SENSOR_DATA_TYPE_ACCELERATION_Z_G, z_accel}}); + + base::win::ScopedPropVariant pvX, pvY, pvZ; + InitPropVariantFromDouble(x_accel, pvX.Receive()); + InitPropVariantFromDouble(y_accel, pvY.Receive()); + InitPropVariantFromDouble(z_accel, pvZ.Receive()); + + GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_ACCELERATION_X_G, pvX.ptr()}, + {SENSOR_DATA_TYPE_ACCELERATION_Y_G, pvY.ptr()}, + {SENSOR_DATA_TYPE_ACCELERATION_Z_G, pvZ.ptr()}}); base::RunLoop().RunUntilIdle(); SensorReadingSharedBuffer* buffer = @@ -601,10 +612,15 @@ double y_ang_accel = -1.8; double z_ang_accel = -98.7; + base::win::ScopedPropVariant pvX, pvY, pvZ; + InitPropVariantFromDouble(x_ang_accel, pvX.Receive()); + InitPropVariantFromDouble(y_ang_accel, pvY.Receive()); + InitPropVariantFromDouble(z_ang_accel, pvZ.Receive()); + GenerateDataUpdatedEvent( - {{SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGREES_PER_SECOND, x_ang_accel}, - {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGREES_PER_SECOND, y_ang_accel}, - {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGREES_PER_SECOND, z_ang_accel}}); + {{SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGREES_PER_SECOND, pvX.ptr()}, + {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGREES_PER_SECOND, pvY.ptr()}, + {SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGREES_PER_SECOND, pvZ.ptr()}}); base::RunLoop().RunUntilIdle(); SensorReadingSharedBuffer* buffer = @@ -636,10 +652,15 @@ double y_magn_field = -162.0; double z_magn_field = 457.0; + base::win::ScopedPropVariant pvX, pvY, pvZ; + InitPropVariantFromDouble(x_magn_field, pvX.Receive()); + InitPropVariantFromDouble(y_magn_field, pvY.Receive()); + InitPropVariantFromDouble(z_magn_field, pvZ.Receive()); + GenerateDataUpdatedEvent( - {{SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_X_MILLIGAUSS, x_magn_field}, - {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Y_MILLIGAUSS, y_magn_field}, - {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Z_MILLIGAUSS, z_magn_field}}); + {{SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_X_MILLIGAUSS, pvX.ptr()}, + {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Y_MILLIGAUSS, pvY.ptr()}, + {SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_Z_MILLIGAUSS, pvZ.ptr()}}); base::RunLoop().RunUntilIdle(); SensorReadingSharedBuffer* buffer = @@ -653,4 +674,51 @@ EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); } +// Tests that AbsoluteOrientation sensor readings are correctly converted. +TEST_F(PlatformSensorAndProviderTestWin, + CheckDeviceOrientationReadingConversion) { + mojo::ScopedSharedBufferHandle handle = + PlatformSensorProviderWin::GetInstance()->CloneSharedBufferHandle(); + mojo::ScopedSharedBufferMapping mapping = handle->MapAtOffset( + sizeof(SensorReadingSharedBuffer), + SensorReadingSharedBuffer::GetOffset(SensorType::ABSOLUTE_ORIENTATION)); + + SetSupportedSensor(SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION); + auto sensor = CreateSensor(SensorType::ABSOLUTE_ORIENTATION); + EXPECT_TRUE(sensor); + + auto client = base::MakeUnique<NiceMock<MockPlatformSensorClient>>(sensor); + PlatformSensorConfiguration configuration(10); + EXPECT_TRUE(StartListening(sensor, client.get(), configuration)); + EXPECT_CALL(*client, OnSensorReadingChanged()).Times(1); + + double x = -0.5; + double y = -0.5; + double z = 0.5; + double w = 0.5; + float quat_elements[4] = {x, y, z, w}; + + base::win::ScopedPropVariant pvQuat; + + // The SENSOR_DATA_TYPE_QUATERNION property has [VT_VECTOR | VT_UI1] type. + // https://msdn.microsoft.com/en-us/library/windows/hardware/dn265187(v=vs.85).aspx + // Helper functions e.g., InitVariantFromDoubleArray cannot be used for its + // intialization and the only way to initialize it, is to use + // InitPropVariantFromGUIDAsBuffer with quaternion format GUID. + InitPropVariantFromGUIDAsBuffer(SENSOR_DATA_TYPE_QUATERNION.fmtid, + pvQuat.Receive()); + memcpy(pvQuat.get().caub.pElems, &quat_elements, sizeof(quat_elements)); + GenerateDataUpdatedEvent({{SENSOR_DATA_TYPE_QUATERNION, pvQuat.ptr()}}); + + base::RunLoop().RunUntilIdle(); + SensorReadingSharedBuffer* buffer = + static_cast<SensorReadingSharedBuffer*>(mapping.get()); + + EXPECT_THAT(buffer->reading.values[0], -x); + EXPECT_THAT(buffer->reading.values[1], -y); + EXPECT_THAT(buffer->reading.values[2], -z); + EXPECT_THAT(buffer->reading.values[3], w); + EXPECT_TRUE(sensor->StopListening(client.get(), configuration)); +} + } // namespace device
diff --git a/device/generic_sensor/platform_sensor_reader_win.cc b/device/generic_sensor/platform_sensor_reader_win.cc index 5b77b6c8..814afd7 100644 --- a/device/generic_sensor/platform_sensor_reader_win.cc +++ b/device/generic_sensor/platform_sensor_reader_win.cc
@@ -11,6 +11,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/win/iunknown_impl.h" +#include "base/win/scoped_propvariant.h" #include "device/generic_sensor/generic_sensor_consts.h" #include "device/generic_sensor/public/cpp/platform_sensor_configuration.h" #include "device/generic_sensor/public/cpp/sensor_reading.h" @@ -38,12 +39,12 @@ ISensorDataReport& report, double* value) { DCHECK(value); - PROPVARIANT variant_value = {}; - if (SUCCEEDED(report.GetSensorValue(key, &variant_value))) { - if (variant_value.vt == VT_R8) - *value = variant_value.dblVal; - else if (variant_value.vt == VT_R4) - *value = variant_value.fltVal; + base::win::ScopedPropVariant variant_value; + if (SUCCEEDED(report.GetSensorValue(key, variant_value.Receive()))) { + if (variant_value.get().vt == VT_R8) + *value = variant_value.get().dblVal; + else if (variant_value.get().vt == VT_R4) + *value = variant_value.get().fltVal; else return false; return true; @@ -164,6 +165,34 @@ return params; } +// AbsoluteOrientation sensor reader initialization parameters. +std::unique_ptr<ReaderInitParams> CreateAbsoluteOrientationReaderInitParams() { + auto params = base::MakeUnique<ReaderInitParams>(); + params->sensor_type_id = SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION; + params->reader_func = + base::Bind([](ISensorDataReport& report, SensorReading& reading) { + base::win::ScopedPropVariant quat_variant; + HRESULT hr = report.GetSensorValue(SENSOR_DATA_TYPE_QUATERNION, + quat_variant.Receive()); + if (FAILED(hr) || quat_variant.get().vt != (VT_VECTOR | VT_UI1) || + quat_variant.get().caub.cElems < 16) { + return E_FAIL; + } + + float* quat = reinterpret_cast<float*>(quat_variant.get().caub.pElems); + + // Windows uses coordinate system where Z axis points down from device + // screen, therefore, using right hand notation, we have to reverse + // sign for each quaternion component. + reading.values[0] = -quat[0]; // x*sin(Theta/2) + reading.values[1] = -quat[1]; // y*sin(Theta/2) + reading.values[2] = -quat[2]; // z*sin(Theta/2) + reading.values[3] = quat[3]; // cos(Theta/2) + return S_OK; + }); + return params; +} + // Creates ReaderInitParams params structure. To implement support for new // sensor types, new switch case should be added and appropriate fields must // be set: @@ -181,6 +210,8 @@ return CreateGyroscopeReaderInitParams(); case mojom::SensorType::MAGNETOMETER: return CreateMagnetometerReaderInitParams(); + case mojom::SensorType::ABSOLUTE_ORIENTATION: + return CreateAbsoluteOrientationReaderInitParams(); default: NOTIMPLEMENTED(); return nullptr; @@ -305,11 +336,11 @@ if (!sensor) return nullptr; - PROPVARIANT variant = {}; - HRESULT hr = - sensor->GetProperty(SENSOR_PROPERTY_MIN_REPORT_INTERVAL, &variant); - if (SUCCEEDED(hr) && variant.vt == VT_UI4) - params->min_reporting_interval_ms = variant.ulVal; + base::win::ScopedPropVariant min_interval; + HRESULT hr = sensor->GetProperty(SENSOR_PROPERTY_MIN_REPORT_INTERVAL, + min_interval.Receive()); + if (SUCCEEDED(hr) && min_interval.get().vt == VT_UI4) + params->min_reporting_interval_ms = min_interval.get().ulVal; GUID interests[] = {SENSOR_EVENT_STATE_CHANGED, SENSOR_EVENT_DATA_UPDATED}; hr = sensor->SetEventInterest(interests, arraysize(interests));
diff --git a/device/power_save_blocker/BUILD.gn b/device/power_save_blocker/BUILD.gn index 0dfb683..93e01d4 100644 --- a/device/power_save_blocker/BUILD.gn +++ b/device/power_save_blocker/BUILD.gn
@@ -13,7 +13,9 @@ sources = [ "power_save_blocker.h", "power_save_blocker_android.cc", + "power_save_blocker_android.h", "power_save_blocker_chromeos.cc", + "power_save_blocker_export.h", "power_save_blocker_mac.cc", "power_save_blocker_ozone.cc", "power_save_blocker_win.cc",
diff --git a/device/sensors/data_fetcher_shared_memory_chromeos.cc b/device/sensors/data_fetcher_shared_memory_chromeos.cc index fc57ef1..ee12c57 100644 --- a/device/sensors/data_fetcher_shared_memory_chromeos.cc +++ b/device/sensors/data_fetcher_shared_memory_chromeos.cc
@@ -33,7 +33,8 @@ // implementation fire an all-null event to signal this to blink. orientation_absolute_buffer_->seqlock.WriteBegin(); orientation_absolute_buffer_->data.absolute = true; - orientation_absolute_buffer_->data.allAvailableSensorsAreActive = true; + orientation_absolute_buffer_->data.all_available_sensors_are_active = + true; orientation_absolute_buffer_->seqlock.WriteEnd(); return false; } @@ -54,7 +55,8 @@ case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: if (orientation_absolute_buffer_) { orientation_absolute_buffer_->seqlock.WriteBegin(); - orientation_absolute_buffer_->data.allAvailableSensorsAreActive = false; + orientation_absolute_buffer_->data.all_available_sensors_are_active = + false; orientation_absolute_buffer_->seqlock.WriteEnd(); orientation_absolute_buffer_ = nullptr; }
diff --git a/device/sensors/data_fetcher_shared_memory_default.cc b/device/sensors/data_fetcher_shared_memory_default.cc index 354879f..31bbd7a 100644 --- a/device/sensors/data_fetcher_shared_memory_default.cc +++ b/device/sensors/data_fetcher_shared_memory_default.cc
@@ -13,7 +13,7 @@ if (!buffer) return false; buffer->seqlock.WriteBegin(); - buffer->data.allAvailableSensorsAreActive = enabled; + buffer->data.all_available_sensors_are_active = enabled; buffer->seqlock.WriteEnd(); return true; } @@ -23,7 +23,7 @@ if (!buffer) return false; buffer->seqlock.WriteBegin(); - buffer->data.allAvailableSensorsAreActive = enabled; + buffer->data.all_available_sensors_are_active = enabled; buffer->seqlock.WriteEnd(); return true; }
diff --git a/device/sensors/data_fetcher_shared_memory_mac.cc b/device/sensors/data_fetcher_shared_memory_mac.cc index 3d89ebfe..b06c850c 100644 --- a/device/sensors/data_fetcher_shared_memory_mac.cc +++ b/device/sensors/data_fetcher_shared_memory_mac.cc
@@ -43,13 +43,13 @@ return; buffer->seqlock.WriteBegin(); - buffer->data.accelerationIncludingGravityX = axis_value[0] * kMeanGravity; - buffer->data.hasAccelerationIncludingGravityX = true; - buffer->data.accelerationIncludingGravityY = axis_value[1] * kMeanGravity; - buffer->data.hasAccelerationIncludingGravityY = true; - buffer->data.accelerationIncludingGravityZ = axis_value[2] * kMeanGravity; - buffer->data.hasAccelerationIncludingGravityZ = true; - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.acceleration_including_gravity_x = axis_value[0] * kMeanGravity; + buffer->data.has_acceleration_including_gravity_x = true; + buffer->data.acceleration_including_gravity_y = axis_value[1] * kMeanGravity; + buffer->data.has_acceleration_including_gravity_y = true; + buffer->data.acceleration_including_gravity_z = axis_value[2] * kMeanGravity; + buffer->data.has_acceleration_including_gravity_z = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } @@ -103,10 +103,10 @@ buffer->seqlock.WriteBegin(); buffer->data.beta = beta; - buffer->data.hasBeta = true; + buffer->data.has_beta = true; buffer->data.gamma = gamma; - buffer->data.hasGamma = true; - buffer->data.allAvailableSensorsAreActive = true; + buffer->data.has_gamma = true; + buffer->data.all_available_sensors_are_active = true; buffer->seqlock.WriteEnd(); } @@ -149,7 +149,7 @@ if (!sudden_motion_sensor_available) { // No motion sensor available, fire an all-null event. motion_buffer_->seqlock.WriteBegin(); - motion_buffer_->data.allAvailableSensorsAreActive = true; + motion_buffer_->data.all_available_sensors_are_active = true; motion_buffer_->seqlock.WriteEnd(); } return sudden_motion_sensor_available; @@ -172,7 +172,7 @@ } else { // No motion sensor available, fire an all-null event. orientation_buffer_->seqlock.WriteBegin(); - orientation_buffer_->data.allAvailableSensorsAreActive = true; + orientation_buffer_->data.all_available_sensors_are_active = true; orientation_buffer_->seqlock.WriteEnd(); } return sudden_motion_sensor_available; @@ -184,7 +184,8 @@ // implementation fire an all-null event to signal this to blink. orientation_absolute_buffer_->seqlock.WriteBegin(); orientation_absolute_buffer_->data.absolute = true; - orientation_absolute_buffer_->data.allAvailableSensorsAreActive = true; + orientation_absolute_buffer_->data.all_available_sensors_are_active = + true; orientation_absolute_buffer_->seqlock.WriteEnd(); return false; } @@ -215,7 +216,7 @@ case CONSUMER_TYPE_MOTION: if (motion_buffer_) { motion_buffer_->seqlock.WriteBegin(); - motion_buffer_->data.allAvailableSensorsAreActive = false; + motion_buffer_->data.all_available_sensors_are_active = false; motion_buffer_->seqlock.WriteEnd(); motion_buffer_ = nullptr; } @@ -223,7 +224,7 @@ case CONSUMER_TYPE_ORIENTATION: if (orientation_buffer_) { orientation_buffer_->seqlock.WriteBegin(); - orientation_buffer_->data.allAvailableSensorsAreActive = false; + orientation_buffer_->data.all_available_sensors_are_active = false; orientation_buffer_->seqlock.WriteEnd(); orientation_buffer_ = nullptr; } @@ -231,7 +232,8 @@ case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: if (orientation_absolute_buffer_) { orientation_absolute_buffer_->seqlock.WriteBegin(); - orientation_absolute_buffer_->data.allAvailableSensorsAreActive = false; + orientation_absolute_buffer_->data.all_available_sensors_are_active = + false; orientation_absolute_buffer_->seqlock.WriteEnd(); orientation_absolute_buffer_ = nullptr; }
diff --git a/device/sensors/data_fetcher_shared_memory_win.cc b/device/sensors/data_fetcher_shared_memory_win.cc index 4c3c09e..76aa7f5 100644 --- a/device/sensors/data_fetcher_shared_memory_win.cc +++ b/device/sensors/data_fetcher_shared_memory_win.cc
@@ -119,13 +119,13 @@ if (buffer_) { buffer_->seqlock.WriteBegin(); buffer_->data.alpha = alpha; - buffer_->data.hasAlpha = has_alpha; + buffer_->data.has_alpha = has_alpha; buffer_->data.beta = beta; - buffer_->data.hasBeta = has_beta; + buffer_->data.has_beta = has_beta; buffer_->data.gamma = gamma; - buffer_->data.hasGamma = has_gamma; + buffer_->data.has_gamma = has_gamma; buffer_->data.absolute = has_alpha || has_beta || has_gamma; - buffer_->data.allAvailableSensorsAreActive = true; + buffer_->data.all_available_sensors_are_active = true; buffer_->seqlock.WriteEnd(); } @@ -172,21 +172,21 @@ if (buffer_) { buffer_->seqlock.WriteBegin(); - buffer_->data.accelerationIncludingGravityX = + buffer_->data.acceleration_including_gravity_x = -acceleration_including_gravity_x * kMeanGravity; - buffer_->data.hasAccelerationIncludingGravityX = + buffer_->data.has_acceleration_including_gravity_x = has_acceleration_including_gravity_x; - buffer_->data.accelerationIncludingGravityY = + buffer_->data.acceleration_including_gravity_y = -acceleration_including_gravity_y * kMeanGravity; - buffer_->data.hasAccelerationIncludingGravityY = + buffer_->data.has_acceleration_including_gravity_y = has_acceleration_including_gravity_y; - buffer_->data.accelerationIncludingGravityZ = + buffer_->data.acceleration_including_gravity_z = -acceleration_including_gravity_z * kMeanGravity; - buffer_->data.hasAccelerationIncludingGravityZ = + buffer_->data.has_acceleration_including_gravity_z = has_acceleration_including_gravity_z; // TODO(timvolodine): consider setting this after all // sensors have fired. - buffer_->data.allAvailableSensorsAreActive = true; + buffer_->data.all_available_sensors_are_active = true; buffer_->seqlock.WriteEnd(); } @@ -203,13 +203,13 @@ if (buffer_) { buffer_->seqlock.WriteBegin(); - buffer_->data.rotationRateAlpha = alpha; - buffer_->data.hasRotationRateAlpha = has_alpha; - buffer_->data.rotationRateBeta = beta; - buffer_->data.hasRotationRateBeta = has_beta; - buffer_->data.rotationRateGamma = gamma; - buffer_->data.hasRotationRateGamma = has_gamma; - buffer_->data.allAvailableSensorsAreActive = true; + buffer_->data.rotation_rate_alpha = alpha; + buffer_->data.has_rotation_rate_alpha = has_alpha; + buffer_->data.rotation_rate_beta = beta; + buffer_->data.has_rotation_rate_beta = has_beta; + buffer_->data.rotation_rate_gamma = gamma; + buffer_->data.has_rotation_rate_gamma = has_gamma; + buffer_->data.all_available_sensors_are_active = true; buffer_->seqlock.WriteEnd(); } } @@ -455,14 +455,14 @@ case CONSUMER_TYPE_ORIENTATION: if (orientation_buffer_) { orientation_buffer_->seqlock.WriteBegin(); - orientation_buffer_->data.allAvailableSensorsAreActive = enabled; + orientation_buffer_->data.all_available_sensors_are_active = enabled; orientation_buffer_->seqlock.WriteEnd(); } break; case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: if (orientation_absolute_buffer_) { orientation_absolute_buffer_->seqlock.WriteBegin(); - orientation_absolute_buffer_->data.allAvailableSensorsAreActive = + orientation_absolute_buffer_->data.all_available_sensors_are_active = enabled; orientation_absolute_buffer_->seqlock.WriteEnd(); } @@ -470,7 +470,7 @@ case CONSUMER_TYPE_MOTION: if (motion_buffer_) { motion_buffer_->seqlock.WriteBegin(); - motion_buffer_->data.allAvailableSensorsAreActive = enabled; + motion_buffer_->data.all_available_sensors_are_active = enabled; motion_buffer_->seqlock.WriteEnd(); } break;
diff --git a/device/sensors/public/cpp/motion_data.h b/device/sensors/public/cpp/motion_data.h index 42a3402..6b5d5abe 100644 --- a/device/sensors/public/cpp/motion_data.h +++ b/device/sensors/public/cpp/motion_data.h
@@ -15,33 +15,33 @@ MotionData(const MotionData& other); ~MotionData() {} - double accelerationX; - double accelerationY; - double accelerationZ; + double acceleration_x; + double acceleration_y; + double acceleration_z; - double accelerationIncludingGravityX; - double accelerationIncludingGravityY; - double accelerationIncludingGravityZ; + double acceleration_including_gravity_x; + double acceleration_including_gravity_y; + double acceleration_including_gravity_z; - double rotationRateAlpha; - double rotationRateBeta; - double rotationRateGamma; + double rotation_rate_alpha; + double rotation_rate_beta; + double rotation_rate_gamma; double interval; - bool hasAccelerationX : 1; - bool hasAccelerationY : 1; - bool hasAccelerationZ : 1; + bool has_acceleration_x : 1; + bool has_acceleration_y : 1; + bool has_acceleration_z : 1; - bool hasAccelerationIncludingGravityX : 1; - bool hasAccelerationIncludingGravityY : 1; - bool hasAccelerationIncludingGravityZ : 1; + bool has_acceleration_including_gravity_x : 1; + bool has_acceleration_including_gravity_y : 1; + bool has_acceleration_including_gravity_z : 1; - bool hasRotationRateAlpha : 1; - bool hasRotationRateBeta : 1; - bool hasRotationRateGamma : 1; + bool has_rotation_rate_alpha : 1; + bool has_rotation_rate_beta : 1; + bool has_rotation_rate_gamma : 1; - bool allAvailableSensorsAreActive : 1; + bool all_available_sensors_are_active : 1; }; static_assert(sizeof(MotionData) == (10 * sizeof(double) + 2 * sizeof(char)),
diff --git a/device/sensors/public/cpp/orientation_data.h b/device/sensors/public/cpp/orientation_data.h index e81bf8a..22cc965 100644 --- a/device/sensors/public/cpp/orientation_data.h +++ b/device/sensors/public/cpp/orientation_data.h
@@ -18,13 +18,13 @@ double beta; double gamma; - bool hasAlpha : 1; - bool hasBeta : 1; - bool hasGamma : 1; + bool has_alpha : 1; + bool has_beta : 1; + bool has_gamma : 1; bool absolute : 1; - bool allAvailableSensorsAreActive : 1; + bool all_available_sensors_are_active : 1; }; static_assert(sizeof(OrientationData) ==
diff --git a/device/sensors/sensor_manager_android.cc b/device/sensors/sensor_manager_android.cc index a9c19d9..7571c56 100644 --- a/device/sensors/sensor_manager_android.cc +++ b/device/sensors/sensor_manager_android.cc
@@ -32,11 +32,11 @@ double gamma) { buffer->seqlock.WriteBegin(); buffer->data.alpha = alpha; - buffer->data.hasAlpha = true; + buffer->data.has_alpha = true; buffer->data.beta = beta; - buffer->data.hasBeta = true; + buffer->data.has_beta = true; buffer->data.gamma = gamma; - buffer->data.hasGamma = true; + buffer->data.has_gamma = true; buffer->seqlock.WriteEnd(); } @@ -45,7 +45,7 @@ bool absolute) { buffer->seqlock.WriteBegin(); buffer->data.absolute = absolute; - buffer->data.allAvailableSensorsAreActive = ready; + buffer->data.all_available_sensors_are_active = ready; buffer->seqlock.WriteEnd(); } @@ -132,12 +132,12 @@ return; device_motion_buffer_->seqlock.WriteBegin(); - device_motion_buffer_->data.accelerationX = x; - device_motion_buffer_->data.hasAccelerationX = true; - device_motion_buffer_->data.accelerationY = y; - device_motion_buffer_->data.hasAccelerationY = true; - device_motion_buffer_->data.accelerationZ = z; - device_motion_buffer_->data.hasAccelerationZ = true; + device_motion_buffer_->data.acceleration_x = x; + device_motion_buffer_->data.has_acceleration_x = true; + device_motion_buffer_->data.acceleration_y = y; + device_motion_buffer_->data.has_acceleration_y = true; + device_motion_buffer_->data.acceleration_z = z; + device_motion_buffer_->data.has_acceleration_z = true; device_motion_buffer_->seqlock.WriteEnd(); if (!motion_buffer_initialized_) { @@ -158,12 +158,12 @@ return; device_motion_buffer_->seqlock.WriteBegin(); - device_motion_buffer_->data.accelerationIncludingGravityX = x; - device_motion_buffer_->data.hasAccelerationIncludingGravityX = true; - device_motion_buffer_->data.accelerationIncludingGravityY = y; - device_motion_buffer_->data.hasAccelerationIncludingGravityY = true; - device_motion_buffer_->data.accelerationIncludingGravityZ = z; - device_motion_buffer_->data.hasAccelerationIncludingGravityZ = true; + device_motion_buffer_->data.acceleration_including_gravity_x = x; + device_motion_buffer_->data.has_acceleration_including_gravity_x = true; + device_motion_buffer_->data.acceleration_including_gravity_y = y; + device_motion_buffer_->data.has_acceleration_including_gravity_y = true; + device_motion_buffer_->data.acceleration_including_gravity_z = z; + device_motion_buffer_->data.has_acceleration_including_gravity_z = true; device_motion_buffer_->seqlock.WriteEnd(); if (!motion_buffer_initialized_) { @@ -183,12 +183,12 @@ return; device_motion_buffer_->seqlock.WriteBegin(); - device_motion_buffer_->data.rotationRateAlpha = alpha; - device_motion_buffer_->data.hasRotationRateAlpha = true; - device_motion_buffer_->data.rotationRateBeta = beta; - device_motion_buffer_->data.hasRotationRateBeta = true; - device_motion_buffer_->data.rotationRateGamma = gamma; - device_motion_buffer_->data.hasRotationRateGamma = true; + device_motion_buffer_->data.rotation_rate_alpha = alpha; + device_motion_buffer_->data.has_rotation_rate_alpha = true; + device_motion_buffer_->data.rotation_rate_beta = beta; + device_motion_buffer_->data.has_rotation_rate_beta = true; + device_motion_buffer_->data.rotation_rate_gamma = gamma; + device_motion_buffer_->data.has_rotation_rate_gamma = true; device_motion_buffer_->seqlock.WriteEnd(); if (!motion_buffer_initialized_) { @@ -355,7 +355,7 @@ void SensorManagerAndroid::SetMotionBufferReadyStatus(bool ready) { device_motion_buffer_->seqlock.WriteBegin(); - device_motion_buffer_->data.allAvailableSensorsAreActive = ready; + device_motion_buffer_->data.all_available_sensors_are_active = ready; device_motion_buffer_->seqlock.WriteEnd(); motion_buffer_initialized_ = ready; }
diff --git a/device/sensors/sensor_manager_android_unittest.cc b/device/sensors/sensor_manager_android_unittest.cc index b584eed..fc45d51 100644 --- a/device/sensors/sensor_manager_android_unittest.cc +++ b/device/sensors/sensor_manager_android_unittest.cc
@@ -55,13 +55,13 @@ double alpha, double beta, double gamma) { - ASSERT_TRUE(buffer->data.allAvailableSensorsAreActive); + ASSERT_TRUE(buffer->data.all_available_sensors_are_active); ASSERT_EQ(alpha, buffer->data.alpha); - ASSERT_TRUE(buffer->data.hasAlpha); + ASSERT_TRUE(buffer->data.has_alpha); ASSERT_EQ(beta, buffer->data.beta); - ASSERT_TRUE(buffer->data.hasBeta); + ASSERT_TRUE(buffer->data.has_beta); ASSERT_EQ(gamma, buffer->data.gamma); - ASSERT_TRUE(buffer->data.hasGamma); + ASSERT_TRUE(buffer->data.has_gamma); } std::unique_ptr<DeviceLightHardwareBuffer> light_buffer_; @@ -77,39 +77,39 @@ sensorManager.SetNumberActiveDeviceMotionSensors(3); sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get()); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); sensorManager.GotAcceleration(nullptr, nullptr, 1, 2, 3); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); - ASSERT_EQ(1, motion_buffer_->data.accelerationX); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationX); - ASSERT_EQ(2, motion_buffer_->data.accelerationY); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationY); - ASSERT_EQ(3, motion_buffer_->data.accelerationZ); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationZ); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); + ASSERT_EQ(1, motion_buffer_->data.acceleration_x); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_x); + ASSERT_EQ(2, motion_buffer_->data.acceleration_y); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_y); + ASSERT_EQ(3, motion_buffer_->data.acceleration_z); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_z); sensorManager.GotAccelerationIncludingGravity(nullptr, nullptr, 4, 5, 6); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); - ASSERT_EQ(4, motion_buffer_->data.accelerationIncludingGravityX); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityX); - ASSERT_EQ(5, motion_buffer_->data.accelerationIncludingGravityY); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityY); - ASSERT_EQ(6, motion_buffer_->data.accelerationIncludingGravityZ); - ASSERT_TRUE(motion_buffer_->data.hasAccelerationIncludingGravityZ); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); + ASSERT_EQ(4, motion_buffer_->data.acceleration_including_gravity_x); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_x); + ASSERT_EQ(5, motion_buffer_->data.acceleration_including_gravity_y); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_y); + ASSERT_EQ(6, motion_buffer_->data.acceleration_including_gravity_z); + ASSERT_TRUE(motion_buffer_->data.has_acceleration_including_gravity_z); sensorManager.GotRotationRate(nullptr, nullptr, 7, 8, 9); - ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive); - ASSERT_EQ(7, motion_buffer_->data.rotationRateAlpha); - ASSERT_TRUE(motion_buffer_->data.hasRotationRateAlpha); - ASSERT_EQ(8, motion_buffer_->data.rotationRateBeta); - ASSERT_TRUE(motion_buffer_->data.hasRotationRateBeta); - ASSERT_EQ(9, motion_buffer_->data.rotationRateGamma); - ASSERT_TRUE(motion_buffer_->data.hasRotationRateGamma); + ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active); + ASSERT_EQ(7, motion_buffer_->data.rotation_rate_alpha); + ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_alpha); + ASSERT_EQ(8, motion_buffer_->data.rotation_rate_beta); + ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_beta); + ASSERT_EQ(9, motion_buffer_->data.rotation_rate_gamma); + ASSERT_TRUE(motion_buffer_->data.has_rotation_rate_gamma); ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000., motion_buffer_->data.interval); sensorManager.StopFetchingDeviceMotionData(); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); } TEST_F(AndroidSensorManagerTest, TwoDeviceMotionSensorsActive) { @@ -118,18 +118,18 @@ sensorManager.SetNumberActiveDeviceMotionSensors(2); sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get()); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); sensorManager.GotAcceleration(nullptr, nullptr, 1, 2, 3); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); sensorManager.GotAccelerationIncludingGravity(nullptr, nullptr, 1, 2, 3); - ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active); ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000., motion_buffer_->data.interval); sensorManager.StopFetchingDeviceMotionData(); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); } TEST_F(AndroidSensorManagerTest, ZeroDeviceMotionSensorsActive) { @@ -138,12 +138,12 @@ sensorManager.SetNumberActiveDeviceMotionSensors(0); sensorManager.StartFetchingDeviceMotionData(motion_buffer_.get()); - ASSERT_TRUE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_TRUE(motion_buffer_->data.all_available_sensors_are_active); ASSERT_EQ(kDeviceSensorIntervalMicroseconds / 1000., motion_buffer_->data.interval); sensorManager.StopFetchingDeviceMotionData(); - ASSERT_FALSE(motion_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(motion_buffer_->data.all_available_sensors_are_active); } TEST_F(AndroidSensorManagerTest, DeviceOrientationSensorsActive) { @@ -151,13 +151,13 @@ FakeSensorManagerAndroid sensorManager; sensorManager.StartFetchingDeviceOrientationData(orientation_buffer_.get()); - ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active); sensorManager.GotOrientation(nullptr, nullptr, 1, 2, 3); VerifyOrientationBufferValues(orientation_buffer_.get(), 1, 2, 3); sensorManager.StopFetchingDeviceOrientationData(); - ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active); } TEST_F(AndroidSensorManagerTest, DeviceOrientationAbsoluteSensorsActive) { @@ -166,13 +166,13 @@ sensorManager.StartFetchingDeviceOrientationAbsoluteData( orientation_absolute_buffer_.get()); - ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active); sensorManager.GotOrientationAbsolute(nullptr, nullptr, 4, 5, 6); VerifyOrientationBufferValues(orientation_absolute_buffer_.get(), 4, 5, 6); sensorManager.StopFetchingDeviceOrientationData(); - ASSERT_FALSE(orientation_buffer_->data.allAvailableSensorsAreActive); + ASSERT_FALSE(orientation_buffer_->data.all_available_sensors_are_active); } // DeviceLight
diff --git a/device/sensors/sensor_manager_chromeos.cc b/device/sensors/sensor_manager_chromeos.cc index 9cb940b3..f9b591d 100644 --- a/device/sensors/sensor_manager_chromeos.cc +++ b/device/sensors/sensor_manager_chromeos.cc
@@ -48,7 +48,7 @@ // Make sure to indicate that the sensor data is no longer available. motion_buffer_->seqlock.WriteBegin(); - motion_buffer_->data.allAvailableSensorsAreActive = false; + motion_buffer_->data.all_available_sensors_are_active = false; motion_buffer_->seqlock.WriteEnd(); motion_buffer_ = nullptr; @@ -79,7 +79,7 @@ return false; // Make sure to indicate that the sensor data is no longer available. orientation_buffer_->seqlock.WriteBegin(); - orientation_buffer_->data.allAvailableSensorsAreActive = false; + orientation_buffer_->data.all_available_sensors_are_active = false; orientation_buffer_->seqlock.WriteEnd(); orientation_buffer_ = nullptr; @@ -120,13 +120,13 @@ return; motion_buffer_->seqlock.WriteBegin(); - motion_buffer_->data.accelerationIncludingGravityX = x; - motion_buffer_->data.hasAccelerationIncludingGravityX = true; - motion_buffer_->data.accelerationIncludingGravityY = y; - motion_buffer_->data.hasAccelerationIncludingGravityY = true; - motion_buffer_->data.accelerationIncludingGravityZ = z; - motion_buffer_->data.hasAccelerationIncludingGravityZ = true; - motion_buffer_->data.allAvailableSensorsAreActive = true; + motion_buffer_->data.acceleration_including_gravity_x = x; + motion_buffer_->data.has_acceleration_including_gravity_x = true; + motion_buffer_->data.acceleration_including_gravity_y = y; + motion_buffer_->data.has_acceleration_including_gravity_y = true; + motion_buffer_->data.acceleration_including_gravity_z = z; + motion_buffer_->data.has_acceleration_including_gravity_z = true; + motion_buffer_->data.all_available_sensors_are_active = true; motion_buffer_->seqlock.WriteEnd(); } @@ -156,10 +156,10 @@ gamma = -90.0f; orientation_buffer_->seqlock.WriteBegin(); orientation_buffer_->data.beta = beta; - orientation_buffer_->data.hasBeta = true; + orientation_buffer_->data.has_beta = true; orientation_buffer_->data.gamma = gamma; - orientation_buffer_->data.hasGamma = true; - orientation_buffer_->data.allAvailableSensorsAreActive = true; + orientation_buffer_->data.has_gamma = true; + orientation_buffer_->data.all_available_sensors_are_active = true; orientation_buffer_->seqlock.WriteEnd(); }
diff --git a/device/sensors/sensor_manager_chromeos_unittest.cc b/device/sensors/sensor_manager_chromeos_unittest.cc index db10215d..5ea42ebc 100644 --- a/device/sensors/sensor_manager_chromeos_unittest.cc +++ b/device/sensors/sensor_manager_chromeos_unittest.cc
@@ -87,50 +87,50 @@ TEST_F(SensorManagerChromeOSTest, MotionBuffer) { DeviceMotionHardwareBuffer* buffer = motion_buffer(); EXPECT_FLOAT_EQ(100.0f, buffer->data.interval); - EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityX); - EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityY); - EXPECT_FALSE(buffer->data.hasAccelerationIncludingGravityZ); - EXPECT_FALSE(buffer->data.hasAccelerationX); - EXPECT_FALSE(buffer->data.hasAccelerationY); - EXPECT_FALSE(buffer->data.hasAccelerationZ); - EXPECT_FALSE(buffer->data.hasRotationRateAlpha); - EXPECT_FALSE(buffer->data.hasRotationRateBeta); - EXPECT_FALSE(buffer->data.hasRotationRateGamma); + EXPECT_FALSE(buffer->data.has_acceleration_including_gravity_x); + EXPECT_FALSE(buffer->data.has_acceleration_including_gravity_y); + EXPECT_FALSE(buffer->data.has_acceleration_including_gravity_z); + EXPECT_FALSE(buffer->data.has_acceleration_x); + EXPECT_FALSE(buffer->data.has_acceleration_y); + EXPECT_FALSE(buffer->data.has_acceleration_z); + EXPECT_FALSE(buffer->data.has_rotation_rate_alpha); + EXPECT_FALSE(buffer->data.has_rotation_rate_beta); + EXPECT_FALSE(buffer->data.has_rotation_rate_gamma); OnAccelerationIncludingGravity(0.0f, 0.0f, 1.0f); - EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityX); - EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityY); - EXPECT_TRUE(buffer->data.hasAccelerationIncludingGravityZ); - EXPECT_FALSE(buffer->data.hasAccelerationX); - EXPECT_FALSE(buffer->data.hasAccelerationY); - EXPECT_FALSE(buffer->data.hasAccelerationZ); - EXPECT_FALSE(buffer->data.hasRotationRateAlpha); - EXPECT_FALSE(buffer->data.hasRotationRateBeta); - EXPECT_FALSE(buffer->data.hasRotationRateGamma); - EXPECT_TRUE(buffer->data.allAvailableSensorsAreActive); + EXPECT_TRUE(buffer->data.has_acceleration_including_gravity_x); + EXPECT_TRUE(buffer->data.has_acceleration_including_gravity_y); + EXPECT_TRUE(buffer->data.has_acceleration_including_gravity_z); + EXPECT_FALSE(buffer->data.has_acceleration_x); + EXPECT_FALSE(buffer->data.has_acceleration_y); + EXPECT_FALSE(buffer->data.has_acceleration_z); + EXPECT_FALSE(buffer->data.has_rotation_rate_alpha); + EXPECT_FALSE(buffer->data.has_rotation_rate_beta); + EXPECT_FALSE(buffer->data.has_rotation_rate_gamma); + EXPECT_TRUE(buffer->data.all_available_sensors_are_active); sensor_manager()->StopFetchingDeviceMotionData(); - EXPECT_FALSE(buffer->data.allAvailableSensorsAreActive); + EXPECT_FALSE(buffer->data.all_available_sensors_are_active); } // Tests that starting to process orientation data will update the associated // buffer. TEST_F(SensorManagerChromeOSTest, OrientationBuffer) { DeviceOrientationHardwareBuffer* buffer = orientation_buffer(); - EXPECT_FALSE(buffer->data.hasAlpha); - EXPECT_FALSE(buffer->data.hasBeta); - EXPECT_FALSE(buffer->data.hasGamma); - EXPECT_FALSE(buffer->data.allAvailableSensorsAreActive); + EXPECT_FALSE(buffer->data.has_alpha); + EXPECT_FALSE(buffer->data.has_beta); + EXPECT_FALSE(buffer->data.has_gamma); + EXPECT_FALSE(buffer->data.all_available_sensors_are_active); OnAccelerationIncludingGravity(0.0f, 0.0f, 1.0f); EXPECT_FLOAT_EQ(0.0f, buffer->data.alpha); - EXPECT_FALSE(buffer->data.hasAlpha); - EXPECT_TRUE(buffer->data.hasBeta); - EXPECT_TRUE(buffer->data.hasGamma); - EXPECT_TRUE(buffer->data.allAvailableSensorsAreActive); + EXPECT_FALSE(buffer->data.has_alpha); + EXPECT_TRUE(buffer->data.has_beta); + EXPECT_TRUE(buffer->data.has_gamma); + EXPECT_TRUE(buffer->data.all_available_sensors_are_active); sensor_manager()->StopFetchingDeviceOrientationData(); - EXPECT_FALSE(buffer->data.allAvailableSensorsAreActive); + EXPECT_FALSE(buffer->data.all_available_sensors_are_active); } // Tests a device resting flat. @@ -138,9 +138,9 @@ OnAccelerationIncludingGravity(0.0f, 0.0f, -kMeanGravity); DeviceMotionHardwareBuffer* motion = motion_buffer(); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); - EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.accelerationIncludingGravityZ); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_x); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_y); + EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); @@ -153,9 +153,9 @@ OnAccelerationIncludingGravity(0.0f, 0.0f, kMeanGravity); DeviceMotionHardwareBuffer* motion = motion_buffer(); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); - EXPECT_FLOAT_EQ(kMeanGravity, motion->data.accelerationIncludingGravityZ); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_x); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_y); + EXPECT_FLOAT_EQ(kMeanGravity, motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(-180.0f, orientation->data.beta); @@ -168,11 +168,11 @@ kMeanGravity / 2.0f); DeviceMotionHardwareBuffer* motion = motion_buffer(); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityX); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_x); EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f, - motion->data.accelerationIncludingGravityY); + motion->data.acceleration_including_gravity_y); EXPECT_FLOAT_EQ(kMeanGravity / 2.0f, - motion->data.accelerationIncludingGravityZ); + motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(135.0f, orientation->data.beta); @@ -184,9 +184,9 @@ OnAccelerationIncludingGravity(-kMeanGravity, 0.0f, 0.0f); DeviceMotionHardwareBuffer* motion = motion_buffer(); - EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.accelerationIncludingGravityX); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityZ); + EXPECT_FLOAT_EQ(-kMeanGravity, motion->data.acceleration_including_gravity_x); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_y); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); @@ -199,9 +199,9 @@ OnAccelerationIncludingGravity(kMeanGravity, 0.0f, 0.0f); DeviceMotionHardwareBuffer* motion = motion_buffer(); - EXPECT_FLOAT_EQ(kMeanGravity, motion->data.accelerationIncludingGravityX); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityZ); + EXPECT_FLOAT_EQ(kMeanGravity, motion->data.acceleration_including_gravity_x); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_y); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(0.0f, orientation->data.beta); @@ -216,10 +216,10 @@ DeviceMotionHardwareBuffer* motion = motion_buffer(); EXPECT_FLOAT_EQ(kMeanGravity / 2.0f, - motion->data.accelerationIncludingGravityX); - EXPECT_FLOAT_EQ(0.0f, motion->data.accelerationIncludingGravityY); + motion->data.acceleration_including_gravity_x); + EXPECT_FLOAT_EQ(0.0f, motion->data.acceleration_including_gravity_y); EXPECT_FLOAT_EQ(-kMeanGravity / 2.0f, - motion->data.accelerationIncludingGravityZ); + motion->data.acceleration_including_gravity_z); DeviceOrientationHardwareBuffer* orientation = orientation_buffer(); EXPECT_FLOAT_EQ(0.0f, orientation->data.beta);
diff --git a/device/serial/serial_service_unittest.cc b/device/serial/serial_service_unittest.cc deleted file mode 100644 index 01120eb..0000000 --- a/device/serial/serial_service_unittest.cc +++ /dev/null
@@ -1,151 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <memory> -#include <utility> - -#include "base/bind.h" -#include "base/macros.h" -#include "base/memory/ptr_util.h" -#include "base/message_loop/message_loop.h" -#include "base/run_loop.h" -#include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" -#include "device/serial/serial.mojom.h" -#include "device/serial/serial_service_impl.h" -#include "device/serial/test_serial_io_handler.h" -#include "mojo/public/cpp/bindings/interface_ptr.h" -#include "mojo/public/cpp/bindings/interface_request.h" -#include "mojo/public/cpp/bindings/strong_binding.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace device { -namespace { - -class FakeSerialDeviceEnumerator : public SerialDeviceEnumerator { - std::vector<serial::DeviceInfoPtr> GetDevices() override { - std::vector<serial::DeviceInfoPtr> devices(1); - devices[0] = serial::DeviceInfo::New(); - devices[0]->path = "device"; - return devices; - } -}; - -class FailToOpenIoHandler : public TestSerialIoHandler { - public: - void Open(const std::string& port, - const serial::ConnectionOptions& options, - const OpenCompleteCallback& callback) override { - callback.Run(false); - } - - protected: - ~FailToOpenIoHandler() override {} -}; - -} // namespace - -class SerialServiceTest : public testing::Test { - public: - SerialServiceTest() : connected_(false), expecting_error_(false) {} - - void StoreDevices(std::vector<serial::DeviceInfoPtr> devices) { - devices_ = std::move(devices); - StopMessageLoop(); - } - - void OnConnectionError() { - StopMessageLoop(); - EXPECT_TRUE(expecting_error_); - } - - void RunMessageLoop() { - run_loop_.reset(new base::RunLoop); - run_loop_->Run(); - } - - void StopMessageLoop() { - ASSERT_TRUE(run_loop_); - message_loop_.task_runner()->PostTask(FROM_HERE, run_loop_->QuitClosure()); - } - - void OnGotInfo(serial::ConnectionInfoPtr options) { - connected_ = true; - StopMessageLoop(); - } - - scoped_refptr<SerialIoHandler> ReturnIoHandler() { return io_handler_; } - - void RunConnectTest(const std::string& path, bool expecting_success) { - if (!io_handler_.get()) - io_handler_ = new TestSerialIoHandler; - mojo::InterfacePtr<serial::SerialService> service; - mojo::MakeStrongBinding( - base::MakeUnique<SerialServiceImpl>( - new SerialConnectionFactory( - base::Bind(&SerialServiceTest::ReturnIoHandler, - base::Unretained(this)), - base::ThreadTaskRunnerHandle::Get()), - base::MakeUnique<FakeSerialDeviceEnumerator>()), - mojo::MakeRequest(&service)); - mojo::InterfacePtr<serial::Connection> connection; - mojo::InterfacePtr<serial::DataSink> sink; - mojo::InterfacePtr<serial::DataSource> source; - mojo::InterfacePtr<serial::DataSourceClient> source_client; - mojo::MakeRequest(&source_client); - service->Connect(path, serial::ConnectionOptions::New(), - mojo::MakeRequest(&connection), mojo::MakeRequest(&sink), - mojo::MakeRequest(&source), std::move(source_client)); - connection.set_connection_error_handler(base::Bind( - &SerialServiceTest::OnConnectionError, base::Unretained(this))); - expecting_error_ = !expecting_success; - connection->GetInfo( - base::Bind(&SerialServiceTest::OnGotInfo, base::Unretained(this))); - RunMessageLoop(); - EXPECT_EQ(!expecting_success, connection.encountered_error()); - EXPECT_EQ(expecting_success, connected_); - connection.reset(); - } - - base::MessageLoop message_loop_; - std::unique_ptr<base::RunLoop> run_loop_; - std::vector<serial::DeviceInfoPtr> devices_; - scoped_refptr<TestSerialIoHandler> io_handler_; - bool connected_; - bool expecting_error_; - serial::ConnectionInfoPtr info_; - - private: - DISALLOW_COPY_AND_ASSIGN(SerialServiceTest); -}; - -TEST_F(SerialServiceTest, GetDevices) { - mojo::InterfacePtr<serial::SerialService> service; - SerialServiceImpl::Create(NULL, NULL, mojo::MakeRequest(&service)); - service.set_connection_error_handler(base::Bind( - &SerialServiceTest::OnConnectionError, base::Unretained(this))); - std::vector<serial::DeviceInfoPtr> result; - service->GetDevices( - base::Bind(&SerialServiceTest::StoreDevices, base::Unretained(this))); - RunMessageLoop(); - - // Because we're running on unknown hardware, only check that we received a - // non-null result. - EXPECT_TRUE(devices_); -} - -TEST_F(SerialServiceTest, Connect) { - RunConnectTest("device", true); -} - -TEST_F(SerialServiceTest, ConnectInvalidPath) { - RunConnectTest("invalid_path", false); -} - -TEST_F(SerialServiceTest, ConnectOpenFailed) { - io_handler_ = new FailToOpenIoHandler; - RunConnectTest("device", false); -} - -} // namespace device
diff --git a/device/u2f/u2f_hid_device.cc b/device/u2f/u2f_hid_device.cc index 7bebafb1..c313b96e 100644 --- a/device/u2f/u2f_hid_device.cc +++ b/device/u2f/u2f_hid_device.cc
@@ -197,15 +197,14 @@ bool success, scoped_refptr<net::IOBuffer> buf, size_t size) { - if (!success) { + if (!success || !buf) { std::move(callback).Run(success, nullptr); return; } - scoped_refptr<net::IOBufferWithSize> buffer(new net::IOBufferWithSize(size)); - memcpy(buffer->data(), buf->data(), size); + std::vector<uint8_t> read_buffer(buf->data(), buf->data() + size); std::unique_ptr<U2fMessage> read_message = - U2fMessage::CreateFromSerializedData(buffer); + U2fMessage::CreateFromSerializedData(read_buffer); if (!read_message) { std::move(callback).Run(false, nullptr); @@ -236,14 +235,13 @@ bool success, scoped_refptr<net::IOBuffer> buf, size_t size) { - if (!success) { + if (!success || !buf) { std::move(callback).Run(success, nullptr); return; } - scoped_refptr<net::IOBufferWithSize> buffer(new net::IOBufferWithSize(size)); - memcpy(buffer->data(), buf->data(), size); - message->AddContinuationPacket(buffer); + std::vector<uint8_t> read_buffer(buf->data(), buf->data() + size); + message->AddContinuationPacket(read_buffer); if (message->MessageComplete()) { std::move(callback).Run(success, std::move(message)); return;
diff --git a/device/u2f/u2f_message.cc b/device/u2f/u2f_message.cc index 8cf2281..0778025 100644 --- a/device/u2f/u2f_message.cc +++ b/device/u2f/u2f_message.cc
@@ -23,11 +23,9 @@ // static std::unique_ptr<U2fMessage> U2fMessage::CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf) { + const std::vector<uint8_t>& buf) { size_t remaining_size = 0; - if (buf == nullptr || - static_cast<size_t>(buf->size()) > U2fPacket::kPacketSize || - static_cast<size_t>(buf->size()) < kInitPacketHeader) + if (buf.size() > U2fPacket::kPacketSize || buf.size() < kInitPacketHeader) return nullptr; std::unique_ptr<U2fInitPacket> init_packet = @@ -95,16 +93,16 @@ scoped_refptr<net::IOBufferWithSize> U2fMessage::PopNextPacket() { if (NumPackets() > 0) { - scoped_refptr<net::IOBufferWithSize> buf = - packets_.front()->GetSerializedBuffer(); + scoped_refptr<net::IOBufferWithSize> data = + packets_.front()->GetSerializedData(); + packets_.pop_front(); - return buf; + return data; } return nullptr; } -bool U2fMessage::AddContinuationPacket( - scoped_refptr<net::IOBufferWithSize> buf) { +bool U2fMessage::AddContinuationPacket(const std::vector<uint8_t>& buf) { size_t remaining_size = remaining_size_; std::unique_ptr<U2fContinuationPacket> cont_packet = U2fContinuationPacket::CreateFromSerializedData(buf, &remaining_size);
diff --git a/device/u2f/u2f_message.h b/device/u2f/u2f_message.h index 17e8c2d..a5cb3dc6 100644 --- a/device/u2f/u2f_message.h +++ b/device/u2f/u2f_message.h
@@ -40,12 +40,12 @@ const std::vector<uint8_t>& data); // Reconstruct a message from serialized message data static std::unique_ptr<U2fMessage> CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf); + const std::vector<uint8_t>& buf); // Pop front of queue with next packet scoped_refptr<net::IOBufferWithSize> PopNextPacket(); // Adds a continuation packet to the packet list, from the serialized // response value - bool AddContinuationPacket(scoped_refptr<net::IOBufferWithSize> packet_buf); + bool AddContinuationPacket(const std::vector<uint8_t>& packet_buf); size_t NumPackets(); // Returns entire message payload std::vector<uint8_t> GetMessagePayload() const;
diff --git a/device/u2f/u2f_message_fuzzer.cc b/device/u2f/u2f_message_fuzzer.cc index 2d0c0d8..bdc159d 100644 --- a/device/u2f/u2f_message_fuzzer.cc +++ b/device/u2f/u2f_message_fuzzer.cc
@@ -5,17 +5,17 @@ #include <stddef.h> #include <stdint.h> #include <algorithm> +#include <vector> #include "net/base/io_buffer.h" #include "u2f_message.h" extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { size_t packet_size = 65; size_t remaining_buffer = size; - uint8_t* start = const_cast<uint8_t*>(data); + const uint8_t* start = data; - scoped_refptr<net::IOBufferWithSize> buf( - new net::IOBufferWithSize(packet_size)); - memcpy(buf->data(), start, std::min(packet_size, remaining_buffer)); + std::vector<uint8_t> buf(start, + start + std::min(packet_size, remaining_buffer)); std::unique_ptr<device::U2fMessage> msg = device::U2fMessage::CreateFromSerializedData(buf); @@ -24,9 +24,7 @@ while (remaining_buffer > 0) { size_t buffer_size = std::min(packet_size, remaining_buffer); - scoped_refptr<net::IOBufferWithSize> tmp_buf( - new net::IOBufferWithSize(buffer_size)); - memcpy(tmp_buf->data(), start, buffer_size); + std::vector<uint8_t> tmp_buf(start, start + buffer_size); msg->AddContinuationPacket(tmp_buf); remaining_buffer -= std::min(remaining_buffer, buffer_size); start += buffer_size;
diff --git a/device/u2f/u2f_message_unittest.cc b/device/u2f/u2f_message_unittest.cc index 947eb787..59f52c55 100644 --- a/device/u2f/u2f_message_unittest.cc +++ b/device/u2f/u2f_message_unittest.cc
@@ -19,11 +19,11 @@ auto init_packet = base::MakeUnique<U2fInitPacket>(channel_id, 0, data, data.size()); - EXPECT_EQ(65, init_packet->GetSerializedBuffer()->size()); + EXPECT_EQ(65, init_packet->GetSerializedData()->size()); auto continuation_packet = base::MakeUnique<U2fContinuationPacket>(channel_id, 0, data); - EXPECT_EQ(65, continuation_packet->GetSerializedBuffer()->size()); + EXPECT_EQ(65, continuation_packet->GetSerializedData()->size()); } /* @@ -44,34 +44,27 @@ base::MakeUnique<U2fInitPacket>(channel_id, cmd, data, data.size()); int index = 0; - EXPECT_EQ(0, init_packet->GetSerializedBuffer()->data()[index++]); + scoped_refptr<net::IOBufferWithSize> serialized = + init_packet->GetSerializedData(); + EXPECT_EQ(0, serialized->data()[index++]); EXPECT_EQ((channel_id >> 24) & 0xff, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); + static_cast<uint8_t>(serialized->data()[index++])); EXPECT_EQ((channel_id >> 16) & 0xff, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); + static_cast<uint8_t>(serialized->data()[index++])); EXPECT_EQ((channel_id >> 8) & 0xff, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); + static_cast<uint8_t>(serialized->data()[index++])); EXPECT_EQ(channel_id & 0xff, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); - EXPECT_EQ(cmd, static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); + static_cast<uint8_t>(serialized->data()[index++])); + EXPECT_EQ(cmd, static_cast<uint8_t>(serialized->data()[index++])); EXPECT_EQ(data.size() >> 8, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); + static_cast<uint8_t>(serialized->data()[index++])); EXPECT_EQ(data.size() & 0xff, - static_cast<uint8_t>( - init_packet->GetSerializedBuffer()->data()[index++])); - EXPECT_EQ(data.at(0), init_packet->GetSerializedBuffer()->data()[index++]); - EXPECT_EQ(data.at(1), init_packet->GetSerializedBuffer()->data()[index++]); - for (; index < init_packet->GetSerializedBuffer()->size(); index++) { - EXPECT_EQ(0, init_packet->GetSerializedBuffer()->data()[index]) - << "mismatch at index " << index; - } + static_cast<uint8_t>(serialized->data()[index++])); + EXPECT_EQ(data[0], serialized->data()[index++]); + EXPECT_EQ(data[1], serialized->data()[index++]); + for (; index < serialized->size(); index++) + EXPECT_EQ(0, serialized->data()[index]) << "mismatch at index " << index; } TEST_F(U2fMessageTest, TestPacketConstructors) { @@ -82,9 +75,12 @@ base::MakeUnique<U2fInitPacket>(channel_id, cmd, data, data.size()); size_t payload_length = static_cast<size_t>(orig_packet->payload_length()); + scoped_refptr<net::IOBufferWithSize> buffer = + orig_packet->GetSerializedData(); + std::vector<uint8_t> orig_data(buffer->data(), + buffer->data() + buffer->size()); std::unique_ptr<U2fInitPacket> reconstructed_packet = - U2fInitPacket::CreateFromSerializedData( - orig_packet->GetSerializedBuffer(), &payload_length); + U2fInitPacket::CreateFromSerializedData(orig_data, &payload_length); EXPECT_EQ(orig_packet->command(), reconstructed_packet->command()); EXPECT_EQ(orig_packet->payload_length(), reconstructed_packet->payload_length()); @@ -93,15 +89,15 @@ EXPECT_EQ(channel_id, reconstructed_packet->channel_id()); - ASSERT_EQ(orig_packet->GetSerializedBuffer()->size(), - reconstructed_packet->GetSerializedBuffer()->size()); - for (size_t i = 0; - i < static_cast<size_t>(orig_packet->GetSerializedBuffer()->size()); - ++i) { - EXPECT_EQ(orig_packet->GetSerializedBuffer()->data()[i], - reconstructed_packet->GetSerializedBuffer()->data()[i]); + ASSERT_EQ(orig_packet->GetSerializedData()->size(), + reconstructed_packet->GetSerializedData()->size()); + for (int index = 0; index < orig_packet->GetSerializedData()->size(); + ++index) { + EXPECT_EQ(orig_packet->GetSerializedData()->data()[index], + reconstructed_packet->GetSerializedData()->data()[index]) + << "mismatch at index " << index; } -} + } TEST_F(U2fMessageTest, TestMaxLengthPacketConstructors) { uint32_t channel_id = 0xAAABACAD; @@ -113,12 +109,18 @@ std::unique_ptr<U2fMessage> orig_msg = U2fMessage::Create(channel_id, cmd, data); auto it = orig_msg->begin(); - std::unique_ptr<U2fMessage> new_msg = - U2fMessage::CreateFromSerializedData((*it)->GetSerializedBuffer()); - it++; - for (; it != orig_msg->end(); ++it) - new_msg->AddContinuationPacket((*it)->GetSerializedBuffer()); + scoped_refptr<net::IOBufferWithSize> buffer = (*it)->GetSerializedData(); + std::vector<uint8_t> msg_data(buffer->data(), + buffer->data() + buffer->size()); + std::unique_ptr<U2fMessage> new_msg = + U2fMessage::CreateFromSerializedData(msg_data); + it++; + for (; it != orig_msg->end(); ++it) { + buffer = (*it)->GetSerializedData(); + msg_data.assign(buffer->data(), buffer->data() + buffer->size()); + new_msg->AddContinuationPacket(msg_data); + } auto orig_it = orig_msg->begin(); auto new_it = new_msg->begin(); @@ -130,13 +132,13 @@ EXPECT_EQ((*orig_it)->channel_id(), (*new_it)->channel_id()); - ASSERT_EQ((*orig_it)->GetSerializedBuffer()->size(), - (*new_it)->GetSerializedBuffer()->size()); - for (size_t i = 0; - i < static_cast<size_t>((*new_it)->GetSerializedBuffer()->size()); - ++i) { - EXPECT_EQ((*orig_it)->GetSerializedBuffer()->data()[i], - (*new_it)->GetSerializedBuffer()->data()[i]); + ASSERT_EQ((*orig_it)->GetSerializedData()->size(), + (*new_it)->GetSerializedData()->size()); + for (int index = 0; index < (*orig_it)->GetSerializedData()->size(); + ++index) { + EXPECT_EQ((*orig_it)->GetSerializedData()->data()[index], + (*new_it)->GetSerializedData()->data()[index]) + << "mismatch at index " << index; } } } @@ -187,12 +189,14 @@ scoped_refptr<net::IOBufferWithSize> buf = orig_message->PopNextPacket(); orig_list.push_back(buf); + std::vector<uint8_t> message_data(buf->data(), buf->data() + buf->size()); std::unique_ptr<U2fMessage> new_message = - U2fMessage::CreateFromSerializedData(buf); + U2fMessage::CreateFromSerializedData(message_data); while (!new_message->MessageComplete()) { buf = orig_message->PopNextPacket(); orig_list.push_back(buf); - new_message->AddContinuationPacket(buf); + message_data.assign(buf->data(), buf->data() + buf->size()); + new_message->AddContinuationPacket(message_data); } while ((buf = new_message->PopNextPacket())) {
diff --git a/device/u2f/u2f_packet.cc b/device/u2f/u2f_packet.cc index 76dbefb..15eb47c 100644 --- a/device/u2f/u2f_packet.cc +++ b/device/u2f/u2f_packet.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <cstring> + #include "base/memory/ptr_util.h" #include "net/base/io_buffer.h" @@ -9,20 +11,13 @@ namespace device { -U2fPacket::U2fPacket(const std::vector<uint8_t> data, const uint32_t channel_id) +U2fPacket::U2fPacket(const std::vector<uint8_t>& data, uint32_t channel_id) : data_(data), channel_id_(channel_id) {} U2fPacket::U2fPacket() {} U2fPacket::~U2fPacket() {} -scoped_refptr<net::IOBufferWithSize> U2fPacket::GetSerializedBuffer() { - if (serialized_) - return serialized_; - else - return make_scoped_refptr(new net::IOBufferWithSize(0)); -} - std::vector<uint8_t> U2fPacket::GetPacketPayload() const { return data_; } @@ -34,69 +29,67 @@ // 5 1 High order packet payload size // 6 1 Low order packet payload size // 7 (s-7) Payload data -U2fInitPacket::U2fInitPacket(const uint32_t channel_id, - const uint8_t cmd, - const std::vector<uint8_t> data, - const uint16_t payload_length) - : U2fPacket(data, channel_id), command_(cmd) { - serialized_ = new net::IOBufferWithSize(kPacketSize); +U2fInitPacket::U2fInitPacket(uint32_t channel_id, + uint8_t cmd, + const std::vector<uint8_t>& data, + uint16_t payload_length) + : U2fPacket(data, channel_id), + command_(cmd), + payload_length_(payload_length) {} + +scoped_refptr<net::IOBufferWithSize> U2fInitPacket::GetSerializedData() { + auto serialized = make_scoped_refptr(new net::IOBufferWithSize(kPacketSize)); size_t index = 0; // Byte at offset 0 is the report ID, which is always 0 - serialized_->data()[index++] = 0; + serialized->data()[index++] = 0; + serialized->data()[index++] = (channel_id_ >> 24) & 0xff; + serialized->data()[index++] = (channel_id_ >> 16) & 0xff; + serialized->data()[index++] = (channel_id_ >> 8) & 0xff; + serialized->data()[index++] = channel_id_ & 0xff; - serialized_->data()[index++] = (channel_id_ >> 24) & 0xff; - serialized_->data()[index++] = (channel_id_ >> 16) & 0xff; - serialized_->data()[index++] = (channel_id_ >> 8) & 0xff; - serialized_->data()[index++] = channel_id_ & 0xff; + serialized->data()[index++] = command_; + serialized->data()[index++] = (payload_length_ >> 8) & 0xff; + serialized->data()[index++] = payload_length_ & 0xff; + std::memcpy(&serialized->data()[index], data_.data(), data_.size()); + index += data_.size(); - serialized_->data()[index++] = command_; - payload_length_ = payload_length; - serialized_->data()[index++] = (payload_length >> 8) & 0xff; - serialized_->data()[index++] = payload_length & 0xff; - for (size_t data_idx = 0; data_idx < data_.size(); ++data_idx) - serialized_->data()[index++] = data_.at(data_idx); - while (static_cast<int>(index) < serialized_->size()) - serialized_->data()[index++] = 0; + std::memset(&serialized->data()[index], 0, serialized->size() - index); + return serialized; } // static std::unique_ptr<U2fInitPacket> U2fInitPacket::CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf, + const std::vector<uint8_t>& serialized, size_t* remaining_size) { - if (buf == nullptr || remaining_size == nullptr || buf->size() != kPacketSize) + if (remaining_size == nullptr || serialized.size() != kPacketSize) return nullptr; - return base::MakeUnique<U2fInitPacket>(buf, remaining_size); + return base::MakeUnique<U2fInitPacket>(serialized, remaining_size); } -U2fInitPacket::U2fInitPacket(scoped_refptr<net::IOBufferWithSize> buf, +U2fInitPacket::U2fInitPacket(const std::vector<uint8_t>& serialized, size_t* remaining_size) { // Report ID is at index 0, so start at index 1 for channel ID size_t index = 1; uint16_t payload_size = 0; - uint16_t data_size = 0; - channel_id_ = (buf->data()[index++] & 0xff) << 24; - channel_id_ |= (buf->data()[index++] & 0xff) << 16; - channel_id_ |= (buf->data()[index++] & 0xff) << 8; - channel_id_ |= buf->data()[index++] & 0xff; - command_ = buf->data()[index++]; - payload_size = buf->data()[index++] << 8; - payload_size |= static_cast<uint8_t>(buf->data()[index++]); + channel_id_ = (serialized[index++] & 0xff) << 24; + channel_id_ |= (serialized[index++] & 0xff) << 16; + channel_id_ |= (serialized[index++] & 0xff) << 8; + channel_id_ |= serialized[index++] & 0xff; + command_ = serialized[index++]; + payload_size = serialized[index++] << 8; + payload_size |= serialized[index++]; payload_length_ = payload_size; // Check to see if payload is less than maximum size and padded with 0s - data_size = + uint16_t data_size = std::min(payload_size, static_cast<uint16_t>(kPacketSize - index)); // Update remaining size to determine the payload size of follow on packets *remaining_size = payload_size - data_size; - data_.insert(data_.end(), &buf->data()[index], - &buf->data()[index + data_size]); - - for (int i = index + data_size; i < buf->size(); ++i) - buf->data()[i] = 0; - serialized_ = buf; + data_.insert(data_.end(), serialized.begin() + index, + serialized.begin() + index + data_size); } U2fInitPacket::~U2fInitPacket() {} @@ -108,60 +101,57 @@ // 5 (s-5) Payload data U2fContinuationPacket::U2fContinuationPacket(const uint32_t channel_id, const uint8_t sequence, - std::vector<uint8_t> data) - : U2fPacket(data, channel_id), sequence_(sequence) { - serialized_ = new net::IOBufferWithSize(kPacketSize); + const std::vector<uint8_t>& data) + : U2fPacket(data, channel_id), sequence_(sequence) {} + +scoped_refptr<net::IOBufferWithSize> +U2fContinuationPacket::GetSerializedData() { + auto serialized = make_scoped_refptr(new net::IOBufferWithSize(kPacketSize)); size_t index = 0; // Byte at offset 0 is the report ID, which is always 0 - serialized_->data()[index++] = 0; + serialized->data()[index++] = 0; + serialized->data()[index++] = (channel_id_ >> 24) & 0xff; + serialized->data()[index++] = (channel_id_ >> 16) & 0xff; + serialized->data()[index++] = (channel_id_ >> 8) & 0xff; + serialized->data()[index++] = channel_id_ & 0xff; - serialized_->data()[index++] = (channel_id_ >> 24) & 0xff; - serialized_->data()[index++] = (channel_id_ >> 16) & 0xff; - serialized_->data()[index++] = (channel_id_ >> 8) & 0xff; - serialized_->data()[index++] = channel_id_ & 0xff; + serialized->data()[index++] = sequence_; + std::memcpy(&serialized->data()[index], data_.data(), data_.size()); + index += data_.size(); - serialized_->data()[index++] = sequence_; - for (size_t idx = 0; idx < data_.size(); ++idx) - serialized_->data()[index++] = data_.at(idx); - - while (static_cast<int>(index) < serialized_->size()) - serialized_->data()[index++] = 0; + std::memset(&serialized->data()[index], 0, serialized->size() - index); + return serialized; } // static std::unique_ptr<U2fContinuationPacket> U2fContinuationPacket::CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf, + const std::vector<uint8_t>& serialized, size_t* remaining_size) { - if (buf == nullptr || remaining_size == nullptr || buf->size() != kPacketSize) + if (remaining_size == nullptr || serialized.size() != kPacketSize) return nullptr; - return base::MakeUnique<U2fContinuationPacket>(buf, remaining_size); + return base::MakeUnique<U2fContinuationPacket>(serialized, remaining_size); } U2fContinuationPacket::U2fContinuationPacket( - scoped_refptr<net::IOBufferWithSize> buf, + const std::vector<uint8_t>& serialized, size_t* remaining_size) { // Report ID is at index 0, so start at index 1 for channel ID size_t index = 1; size_t data_size; - channel_id_ = (buf->data()[index++] & 0xff) << 24; - channel_id_ |= (buf->data()[index++] & 0xff) << 16; - channel_id_ |= (buf->data()[index++] & 0xff) << 8; - channel_id_ |= buf->data()[index++] & 0xff; - sequence_ = buf->data()[index++]; + channel_id_ = (serialized[index++] & 0xff) << 24; + channel_id_ |= (serialized[index++] & 0xff) << 16; + channel_id_ |= (serialized[index++] & 0xff) << 8; + channel_id_ |= serialized[index++] & 0xff; + sequence_ = serialized[index++]; // Check to see if packet payload is less than maximum size and padded with 0s data_size = std::min(*remaining_size, kPacketSize - index); *remaining_size -= data_size; - data_.insert(std::end(data_), &buf->data()[index], - &buf->data()[index + data_size]); - - // Incoming buffer may not be padded with 0's, so manually update buffer - for (int i = index + data_size; i < buf->size(); ++i) - buf->data()[i] = 0; - serialized_ = buf; + data_.insert(data_.end(), serialized.begin() + index, + serialized.begin() + index + data_size); } U2fContinuationPacket::~U2fContinuationPacket() {}
diff --git a/device/u2f/u2f_packet.h b/device/u2f/u2f_packet.h index 97fd1156..ee023b6 100644 --- a/device/u2f/u2f_packet.h +++ b/device/u2f/u2f_packet.h
@@ -25,10 +25,10 @@ // payload information is stored in U2fContinuationPackets. class U2fPacket { public: - U2fPacket(const std::vector<uint8_t> data, uint32_t channel_id); + U2fPacket(const std::vector<uint8_t>& data, uint32_t channel_id); virtual ~U2fPacket(); - scoped_refptr<net::IOBufferWithSize> GetSerializedBuffer(); + virtual scoped_refptr<net::IOBufferWithSize> GetSerializedData() = 0; std::vector<uint8_t> GetPacketPayload() const; uint32_t channel_id() { return channel_id_; } @@ -39,7 +39,6 @@ static constexpr size_t kPacketSize = 65; std::vector<uint8_t> data_; uint32_t channel_id_; - scoped_refptr<net::IOBufferWithSize> serialized_; private: friend class U2fMessage; @@ -55,10 +54,9 @@ public: U2fInitPacket(uint32_t channel_id, uint8_t cmd, - const std::vector<uint8_t> data, + const std::vector<uint8_t>& data, uint16_t payload_length); - U2fInitPacket(scoped_refptr<net::IOBufferWithSize> buf, - size_t* remaining_size); + U2fInitPacket(const std::vector<uint8_t>& serialized, size_t* remaining_size); ~U2fInitPacket() final; // Creates a packet from the serialized data of an initialization packet. As @@ -66,8 +64,9 @@ // included within the serialized data. Remaining size will be returned to // inform the callee how many additional packets to expect. static std::unique_ptr<U2fInitPacket> CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf, + const std::vector<uint8_t>& serialized, size_t* remaining_size); + scoped_refptr<net::IOBufferWithSize> GetSerializedData() final; uint8_t command() { return command_; } uint16_t payload_length() { return payload_length_; } @@ -83,10 +82,10 @@ // 0x00 to 0x7f. class U2fContinuationPacket : public U2fPacket { public: - U2fContinuationPacket(const uint32_t channel_id, - const uint8_t sequence, - std::vector<uint8_t> data); - U2fContinuationPacket(scoped_refptr<net::IOBufferWithSize> buf, + U2fContinuationPacket(uint32_t channel_id, + uint8_t sequence, + const std::vector<uint8_t>& data); + U2fContinuationPacket(const std::vector<uint8_t>& serialized, size_t* remaining_size); ~U2fContinuationPacket() final; @@ -95,8 +94,9 @@ // the remaining size should be passed to inform the packet of how much data // to expect. static std::unique_ptr<U2fContinuationPacket> CreateFromSerializedData( - scoped_refptr<net::IOBufferWithSize> buf, + const std::vector<uint8_t>& serialized, size_t* remaining_size); + scoped_refptr<net::IOBufferWithSize> GetSerializedData() final; uint8_t sequence() { return sequence_; } private:
diff --git a/docs/android_build_instructions.md b/docs/android_build_instructions.md index a0f9541..edc51d77 100644 --- a/docs/android_build_instructions.md +++ b/docs/android_build_instructions.md
@@ -224,23 +224,16 @@ export CHROMIUM_OUT_DIR=out_android ``` -### Build WebView shell +### Build WebView [Android WebView](https://developer.android.com/reference/android/webkit/WebView.html) is a system framework component. Since Android KitKat, it is implemented using Chromium code (based off the [content module](https://dev.chromium.org/developers/content-module)). -It is possible to test modifications to WebView using a simple test shell. The -WebView shell is a view with a URL bar at the top (see [code](https://code.google.com/p/chromium/codesearch#chromium/src/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestContainerView.java)) -and is **independent** of the WebView **implementation in the Android system** ( -the WebView shell is essentially a standalone unbundled app). -As drawback, the shell runs in non-production rendering mode only. -```shell -ninja -C out/Release android_webview_apk -build/android/adb_install_apk.py out/Release/apks/AndroidWebView.apk -``` - -If, instead, you want to build the complete Android WebView framework component and test the effect of your chromium changes in other Android app using the WebView, you should follow the [Android AOSP + chromium WebView instructions](https://www.chromium.org/developers/how-tos/build-instructions-android-webview) +If you want to build the complete Android WebView framework component and test +the effect of your chromium changes in Android apps using WebView, you should +follow the [Android AOSP + chromium WebView +instructions](https://www.chromium.org/developers/how-tos/build-instructions-android-webview) ### Running @@ -258,12 +251,6 @@ build/android/adb_run_chrome_public http://example.com ``` -For Android WebView shell: - -```shell -build/android/adb_run_android_webview_shell http://example.com -``` - ### Logging and debugging Logging is often the easiest way to understand code flow. In C++ you can print @@ -284,7 +271,6 @@ ```shell build/android/adb_gdb_content_shell build/android/adb_gdb_chrome_public -build/android/adb_gdb_android_webview_shell http://example.com ``` See [Debugging Chromium on Android](https://www.chromium.org/developers/how-tos/debugging-on-android)
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index 0f74ef8..30ee025 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -402,6 +402,7 @@ "api/document_scan/document_scan_api_unittest.cc", "api/document_scan/document_scan_interface_chromeos_unittest.cc", "api/document_scan/mock_document_scan_interface.cc", + "api/document_scan/mock_document_scan_interface.h", "api/file_handlers/app_file_handler_util_unittest.cc", "api/file_handlers/directory_util_unittest.cc", "api/file_handlers/mime_util_unittest.cc",
diff --git a/extensions/browser/api/declarative/rules_registry_service.cc b/extensions/browser/api/declarative/rules_registry_service.cc index 37162a7..94c572f3 100644 --- a/extensions/browser/api/declarative/rules_registry_service.cc +++ b/extensions/browser/api/declarative/rules_registry_service.cc
@@ -20,8 +20,6 @@ #include "extensions/browser/api/web_request/web_request_api.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" -#include "extensions/common/features/feature_channel.h" -#include "extensions/common/features/feature_provider.h" namespace extensions { @@ -76,31 +74,24 @@ if (ContainsKey(rule_registries_, key)) return; - // Create a web request rules registry if declarative web request is enabled - // on the current channel. - const Feature* declarative_web_request = - FeatureProvider::GetAPIFeature("declarativeWebRequest"); - if (declarative_web_request->IsAvailableToChannel(GetCurrentChannel()) - .is_available()) { - // Only cache rules for regular pages. - RulesCacheDelegate* web_request_cache_delegate = nullptr; - if (rules_registry_id == kDefaultRulesRegistryID) { - // Create a RulesCacheDelegate. - web_request_cache_delegate = - new RulesCacheDelegate(true /*log_storage_init_delay*/); - cache_delegates_.push_back(base::WrapUnique(web_request_cache_delegate)); - } - scoped_refptr<WebRequestRulesRegistry> web_request_rules_registry( - new WebRequestRulesRegistry( - browser_context_, web_request_cache_delegate, rules_registry_id)); - - RegisterRulesRegistry(web_request_rules_registry); - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::Bind(&RegisterToExtensionWebRequestEventRouterOnIO, - browser_context_, rules_registry_id, - web_request_rules_registry)); + // Only cache rules for regular pages. + RulesCacheDelegate* web_request_cache_delegate = NULL; + if (rules_registry_id == kDefaultRulesRegistryID) { + // Create a RulesCacheDelegate. + web_request_cache_delegate = + new RulesCacheDelegate(true /*log_storage_init_delay*/); + cache_delegates_.push_back(base::WrapUnique(web_request_cache_delegate)); } + scoped_refptr<WebRequestRulesRegistry> web_request_rules_registry( + new WebRequestRulesRegistry(browser_context_, web_request_cache_delegate, + rules_registry_id)); + + RegisterRulesRegistry(web_request_rules_registry); + content::BrowserThread::PostTask( + content::BrowserThread::IO, FROM_HERE, + base::Bind(&RegisterToExtensionWebRequestEventRouterOnIO, + browser_context_, rules_registry_id, + web_request_rules_registry)); // Only create a ContentRulesRegistry for regular pages. if (rules_registry_id == kDefaultRulesRegistryID) {
diff --git a/extensions/browser/api/document_scan/BUILD.gn b/extensions/browser/api/document_scan/BUILD.gn index 9112924..8688bd3f 100644 --- a/extensions/browser/api/document_scan/BUILD.gn +++ b/extensions/browser/api/document_scan/BUILD.gn
@@ -9,6 +9,7 @@ "document_scan_interface.cc", "document_scan_interface.h", "document_scan_interface_chromeos.cc", + "document_scan_interface_chromeos.h", ] if (!is_chromeos) {
diff --git a/extensions/browser/api/networking_private/BUILD.gn b/extensions/browser/api/networking_private/BUILD.gn index a362879..70057df 100644 --- a/extensions/browser/api/networking_private/BUILD.gn +++ b/extensions/browser/api/networking_private/BUILD.gn
@@ -6,7 +6,8 @@ source_set("networking_private") { sources = [ - "networking_cast_delegate.h", + "networking_cast_private_delegate.cc", + "networking_cast_private_delegate.h", "networking_private_api.cc", "networking_private_api.h", "networking_private_chromeos.cc",
diff --git a/extensions/browser/api/networking_private/networking_cast_private_delegate.cc b/extensions/browser/api/networking_private/networking_cast_private_delegate.cc new file mode 100644 index 0000000..b290223d --- /dev/null +++ b/extensions/browser/api/networking_private/networking_cast_private_delegate.cc
@@ -0,0 +1,34 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/browser/api/networking_private/networking_cast_private_delegate.h" + +#include <utility> + +#include "base/strings/string_util.h" + +namespace extensions { + +NetworkingCastPrivateDelegate::Credentials::Credentials( + const std::string& certificate, + const std::vector<std::string>& intermediate_certificates, + const std::string& signed_data, + const std::string& device_ssid, + const std::string& device_serial, + const std::string& device_bssid, + const std::string& public_key, + const std::string& nonce) + : certificate_(certificate), + intermediate_certificates_(intermediate_certificates), + signed_data_(signed_data), + device_bssid_(device_bssid), + public_key_(public_key) { + std::vector<std::string> data_parts( + {device_ssid, device_serial, device_bssid, public_key, nonce}); + unsigned_data_ = base::JoinString(data_parts, ","); +} + +NetworkingCastPrivateDelegate::Credentials::~Credentials() {} + +} // namespace extensions
diff --git a/extensions/browser/api/networking_private/networking_cast_private_delegate.h b/extensions/browser/api/networking_private/networking_cast_private_delegate.h index a7704ac..d3de7d1 100644 --- a/extensions/browser/api/networking_private/networking_cast_private_delegate.h +++ b/extensions/browser/api/networking_private/networking_cast_private_delegate.h
@@ -5,9 +5,12 @@ #ifndef EXTENSIONS_BROWSER_API_NETWORKING_PRIVATE_NETWORKING_CAST_PRIVATE_DELEGATE_H_ #define EXTENSIONS_BROWSER_API_NETWORKING_PRIVATE_NETWORKING_CAST_PRIVATE_DELEGATE_H_ +#include <memory> #include <string> +#include <vector> #include "base/callback.h" +#include "base/macros.h" #include "extensions/common/api/networking_private.h" namespace extensions { @@ -28,28 +31,61 @@ using VerifiedCallback = base::Callback<void(bool is_valid)>; using DataCallback = base::Callback<void(const std::string& encrypted_data)>; - // Verifies that data provided in |properties| authenticates a cast device. - virtual void VerifyDestination( - const api::networking_private::VerificationProperties& properties, - const VerifiedCallback& success_callback, - const FailureCallback& failure_callback) = 0; + // API independent wrapper around cast device verification properties. + class Credentials { + public: + Credentials(const std::string& certificate, + const std::vector<std::string>& intermediate_certificates, + const std::string& signed_data, + const std::string& device_ssid, + const std::string& device_serial, + const std::string& device_bssid, + const std::string& public_key, + const std::string& nonce); + ~Credentials(); - // Verifies that data provided in |properties| authenticates a cast device. + const std::string& certificate() const { return certificate_; } + const std::vector<std::string>& intermediate_certificates() const { + return intermediate_certificates_; + } + const std::string& signed_data() const { return signed_data_; } + const std::string& unsigned_data() const { return unsigned_data_; } + const std::string& device_bssid() const { return device_bssid_; } + const std::string& public_key() const { return public_key_; } + + private: + std::string certificate_; + std::vector<std::string> intermediate_certificates_; + std::string signed_data_; + std::string unsigned_data_; + std::string device_bssid_; + std::string public_key_; + + private: + DISALLOW_COPY_AND_ASSIGN(Credentials); + }; + + // Verifies that data provided in |credentials| authenticates a cast device. + virtual void VerifyDestination(std::unique_ptr<Credentials> credentials, + const VerifiedCallback& success_callback, + const FailureCallback& failure_callback) = 0; + + // Verifies that data provided in |credentials| authenticates a cast device. // If the device is verified as a cast device, it fetches credentials of the // network identified with |network_guid| and returns the network credentials - // encrypted with a public key derived from |properties|. + // encrypted with a public key derived from |credentials|. virtual void VerifyAndEncryptCredentials( const std::string& network_guid, - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const DataCallback& encrypted_credetials_callback, const FailureCallback& failure_callback) = 0; - // Verifies that data provided in |properties| authenticates a cast device. + // Verifies that data provided in |credentials| authenticates a cast device. // If the device is verified as a cast device, it returns |data| encrypted - // with a public key derived from |properties|. + // with a public key derived from |credentials|. virtual void VerifyAndEncryptData( const std::string& data, - const api::networking_private::VerificationProperties& properties, + std::unique_ptr<Credentials> credentials, const DataCallback& enrypted_data_callback, const FailureCallback& failure_callback) = 0; };
diff --git a/extensions/browser/api/networking_private/networking_private_api.cc b/extensions/browser/api/networking_private/networking_private_api.cc index 34d172f..7929076 100644 --- a/extensions/browser/api/networking_private/networking_private_api.cc +++ b/extensions/browser/api/networking_private/networking_private_api.cc
@@ -9,7 +9,10 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" +#include "base/memory/ptr_util.h" #include "components/onc/onc_constants.h" +#include "extensions/browser/api/extensions_api_client.h" +#include "extensions/browser/api/networking_private/networking_cast_private_delegate.h" #include "extensions/browser/api/networking_private/networking_private_delegate.h" #include "extensions/browser/api/networking_private/networking_private_delegate_factory.h" #include "extensions/browser/extension_function_registry.h" @@ -49,6 +52,17 @@ #endif } +std::unique_ptr<NetworkingCastPrivateDelegate::Credentials> AsCastCredentials( + api::networking_private::VerificationProperties& properties) { + return base::MakeUnique<NetworkingCastPrivateDelegate::Credentials>( + properties.certificate, + properties.intermediate_certificates + ? *properties.intermediate_certificates + : std::vector<std::string>(), + properties.signed_data, properties.device_ssid, properties.device_serial, + properties.device_bssid, properties.public_key, properties.nonce); +} + } // namespace namespace private_api = api::networking_private; @@ -60,7 +74,6 @@ const char kErrorInvalidNetworkGuid[] = "Error.InvalidNetworkGuid"; const char kErrorInvalidNetworkOperation[] = "Error.InvalidNetworkOperation"; const char kErrorNetworkUnavailable[] = "Error.NetworkUnavailable"; -const char kErrorEncryptionError[] = "Error.EncryptionError"; const char kErrorNotReady[] = "Error.NotReady"; const char kErrorNotSupported[] = "Error.NotSupported"; const char kErrorPolicyControlled[] = "Error.PolicyControlled"; @@ -599,13 +612,15 @@ private_api::VerifyDestination::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params); - GetDelegate(browser_context()) - ->VerifyDestination( - params->properties, - base::Bind(&NetworkingPrivateVerifyDestinationFunction::Success, - this), - base::Bind(&NetworkingPrivateVerifyDestinationFunction::Failure, - this)); + NetworkingCastPrivateDelegate* delegate = + ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); + if (!delegate) + return RespondNow(Error("Not supported.")); + + delegate->VerifyDestination( + AsCastCredentials(params->properties), + base::Bind(&NetworkingPrivateVerifyDestinationFunction::Success, this), + base::Bind(&NetworkingPrivateVerifyDestinationFunction::Failure, this)); // Success() or Failure() might have been called synchronously at this point. // In that case this function has already called Respond(). Return // AlreadyResponded() in that case. @@ -643,15 +658,17 @@ private_api::VerifyAndEncryptCredentials::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params); - GetDelegate(browser_context()) - ->VerifyAndEncryptCredentials( - params->network_guid, params->properties, - base::Bind( - &NetworkingPrivateVerifyAndEncryptCredentialsFunction::Success, - this), - base::Bind( - &NetworkingPrivateVerifyAndEncryptCredentialsFunction::Failure, - this)); + NetworkingCastPrivateDelegate* delegate = + ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); + if (!delegate) + return RespondNow(Error("Not supported.")); + + delegate->VerifyAndEncryptCredentials( + params->network_guid, AsCastCredentials(params->properties), + base::Bind(&NetworkingPrivateVerifyAndEncryptCredentialsFunction::Success, + this), + base::Bind(&NetworkingPrivateVerifyAndEncryptCredentialsFunction::Failure, + this)); // Success() or Failure() might have been called synchronously at this point. // In that case this function has already called Respond(). Return // AlreadyResponded() in that case. @@ -690,13 +707,16 @@ private_api::VerifyAndEncryptData::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params); - GetDelegate(browser_context()) - ->VerifyAndEncryptData( - params->properties, params->data, - base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Success, - this), - base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Failure, - this)); + NetworkingCastPrivateDelegate* delegate = + ExtensionsAPIClient::Get()->GetNetworkingCastPrivateDelegate(); + if (!delegate) + return RespondNow(Error("Not supported.")); + + delegate->VerifyAndEncryptData( + params->data, AsCastCredentials(params->properties), + base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Success, this), + base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Failure, + this)); // Success() or Failure() might have been called synchronously at this point. // In that case this function has already called Respond(). Return // AlreadyResponded() in that case.
diff --git a/extensions/browser/api/networking_private/networking_private_api.h b/extensions/browser/api/networking_private/networking_private_api.h index 93b9e35..d34e229 100644 --- a/extensions/browser/api/networking_private/networking_private_api.h +++ b/extensions/browser/api/networking_private/networking_private_api.h
@@ -20,7 +20,6 @@ extern const char kErrorInvalidNetworkGuid[]; extern const char kErrorInvalidNetworkOperation[]; extern const char kErrorNetworkUnavailable[]; -extern const char kErrorEncryptionError[]; extern const char kErrorNotReady[]; extern const char kErrorNotSupported[]; extern const char kErrorPolicyControlled[];
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc index 129de04..5d84f0ba 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos.cc +++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -306,11 +306,8 @@ namespace extensions { NetworkingPrivateChromeOS::NetworkingPrivateChromeOS( - content::BrowserContext* browser_context, - std::unique_ptr<VerifyDelegate> verify_delegate) - : NetworkingPrivateDelegate(std::move(verify_delegate)), - browser_context_(browser_context), - weak_ptr_factory_(this) {} + content::BrowserContext* browser_context) + : browser_context_(browser_context), weak_ptr_factory_(this) {} NetworkingPrivateChromeOS::~NetworkingPrivateChromeOS() {}
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.h b/extensions/browser/api/networking_private/networking_private_chromeos.h index 8d3bb5bd..336bfbd 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos.h +++ b/extensions/browser/api/networking_private/networking_private_chromeos.h
@@ -27,8 +27,7 @@ class NetworkingPrivateChromeOS : public NetworkingPrivateDelegate { public: // |verify_delegate| is passed to NetworkingPrivateDelegate and may be NULL. - NetworkingPrivateChromeOS(content::BrowserContext* browser_context, - std::unique_ptr<VerifyDelegate> verify_delegate); + explicit NetworkingPrivateChromeOS(content::BrowserContext* browser_context); ~NetworkingPrivateChromeOS() override; // NetworkingPrivateApi
diff --git a/extensions/browser/api/networking_private/networking_private_delegate.cc b/extensions/browser/api/networking_private/networking_private_delegate.cc index 03be932..a6f12ea 100644 --- a/extensions/browser/api/networking_private/networking_private_delegate.cc +++ b/extensions/browser/api/networking_private/networking_private_delegate.cc
@@ -8,19 +8,11 @@ namespace extensions { -NetworkingPrivateDelegate::VerifyDelegate::VerifyDelegate() { -} - -NetworkingPrivateDelegate::VerifyDelegate::~VerifyDelegate() { -} - NetworkingPrivateDelegate::UIDelegate::UIDelegate() {} NetworkingPrivateDelegate::UIDelegate::~UIDelegate() {} -NetworkingPrivateDelegate::NetworkingPrivateDelegate( - std::unique_ptr<VerifyDelegate> verify_delegate) - : verify_delegate_(std::move(verify_delegate)) {} +NetworkingPrivateDelegate::NetworkingPrivateDelegate() {} NetworkingPrivateDelegate::~NetworkingPrivateDelegate() { } @@ -43,42 +35,4 @@ failure_callback.Run(networking_private::kErrorNotSupported); } -void NetworkingPrivateDelegate::VerifyDestination( - const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) { - if (!verify_delegate_) { - failure_callback.Run(networking_private::kErrorNotSupported); - return; - } - verify_delegate_->VerifyDestination(verification_properties, success_callback, - failure_callback); -} - -void NetworkingPrivateDelegate::VerifyAndEncryptCredentials( - const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, - const FailureCallback& failure_callback) { - if (!verify_delegate_) { - failure_callback.Run(networking_private::kErrorNotSupported); - return; - } - verify_delegate_->VerifyAndEncryptCredentials( - guid, verification_properties, success_callback, failure_callback); -} - -void NetworkingPrivateDelegate::VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) { - if (!verify_delegate_) { - failure_callback.Run(networking_private::kErrorNotSupported); - return; - } - verify_delegate_->VerifyAndEncryptData(verification_properties, data, - success_callback, failure_callback); -} - } // namespace extensions
diff --git a/extensions/browser/api/networking_private/networking_private_delegate.h b/extensions/browser/api/networking_private/networking_private_delegate.h index 5446b4b..133ad6a 100644 --- a/extensions/browser/api/networking_private/networking_private_delegate.h +++ b/extensions/browser/api/networking_private/networking_private_delegate.h
@@ -34,41 +34,6 @@ using FailureCallback = base::Callback<void(const std::string&)>; using DeviceStateList = std::vector< std::unique_ptr<api::networking_private::DeviceStateProperties>>; - using VerificationProperties = - api::networking_private::VerificationProperties; - - // The Verify* methods will be forwarded to a delegate implementation if - // provided, otherwise they will fail. A separate delegate it used so that the - // current Verify* implementations are not exposed outside of src/chrome. - class VerifyDelegate { - public: - typedef NetworkingPrivateDelegate::VerificationProperties - VerificationProperties; - typedef NetworkingPrivateDelegate::BoolCallback BoolCallback; - typedef NetworkingPrivateDelegate::StringCallback StringCallback; - typedef NetworkingPrivateDelegate::FailureCallback FailureCallback; - - VerifyDelegate(); - virtual ~VerifyDelegate(); - - virtual void VerifyDestination( - const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback) = 0; - virtual void VerifyAndEncryptCredentials( - const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, - const FailureCallback& failure_callback) = 0; - virtual void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(VerifyDelegate); - }; // Delegate for forwarding UI requests, e.g. for showing the account UI. class UIDelegate { @@ -89,10 +54,7 @@ DISALLOW_COPY_AND_ASSIGN(UIDelegate); }; - // If |verify_delegate| is not NULL, the Verify* methods will be forwarded - // to the delegate. Otherwise they will fail with a NotSupported error. - explicit NetworkingPrivateDelegate( - std::unique_ptr<VerifyDelegate> verify_delegate); + NetworkingPrivateDelegate(); ~NetworkingPrivateDelegate() override; void set_ui_delegate(std::unique_ptr<UIDelegate> ui_delegate) { @@ -193,25 +155,7 @@ virtual void AddObserver(NetworkingPrivateDelegateObserver* observer); virtual void RemoveObserver(NetworkingPrivateDelegateObserver* observer); - // Verify* methods are forwarded to |verify_delegate_| if not NULL. - void VerifyDestination(const VerificationProperties& verification_properties, - const BoolCallback& success_callback, - const FailureCallback& failure_callback); - void VerifyAndEncryptCredentials( - const std::string& guid, - const VerificationProperties& verification_properties, - const StringCallback& success_callback, - const FailureCallback& failure_callback); - void VerifyAndEncryptData( - const VerificationProperties& verification_properties, - const std::string& data, - const StringCallback& success_callback, - const FailureCallback& failure_callback); - private: - // Interface for Verify* methods. May be null. - std::unique_ptr<VerifyDelegate> verify_delegate_; - // Interface for UI methods. May be null. std::unique_ptr<UIDelegate> ui_delegate_;
diff --git a/extensions/browser/api/networking_private/networking_private_delegate_factory.cc b/extensions/browser/api/networking_private/networking_private_delegate_factory.cc index ff72530..c535981 100644 --- a/extensions/browser/api/networking_private/networking_private_delegate_factory.cc +++ b/extensions/browser/api/networking_private/networking_private_delegate_factory.cc
@@ -22,14 +22,6 @@ using content::BrowserContext; -NetworkingPrivateDelegateFactory::VerifyDelegateFactory:: - VerifyDelegateFactory() { -} - -NetworkingPrivateDelegateFactory::VerifyDelegateFactory:: - ~VerifyDelegateFactory() { -} - NetworkingPrivateDelegateFactory::UIDelegateFactory::UIDelegateFactory() {} NetworkingPrivateDelegateFactory::UIDelegateFactory::~UIDelegateFactory() {} @@ -57,11 +49,6 @@ NetworkingPrivateDelegateFactory::~NetworkingPrivateDelegateFactory() { } -void NetworkingPrivateDelegateFactory::SetVerifyDelegateFactory( - std::unique_ptr<VerifyDelegateFactory> factory) { - verify_factory_ = std::move(factory); -} - void NetworkingPrivateDelegateFactory::SetUIDelegateFactory( std::unique_ptr<UIDelegateFactory> factory) { ui_factory_ = std::move(factory); @@ -70,20 +57,15 @@ KeyedService* NetworkingPrivateDelegateFactory::BuildServiceInstanceFor( BrowserContext* browser_context) const { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> verify_delegate; - if (verify_factory_) - verify_delegate = verify_factory_->CreateDelegate(); NetworkingPrivateDelegate* delegate; #if defined(OS_CHROMEOS) - delegate = new NetworkingPrivateChromeOS(browser_context, - std::move(verify_delegate)); + delegate = new NetworkingPrivateChromeOS(browser_context); #elif defined(OS_LINUX) - delegate = new NetworkingPrivateLinux(std::move(verify_delegate)); + delegate = new NetworkingPrivateLinux(); #elif defined(OS_WIN) || defined(OS_MACOSX) std::unique_ptr<wifi::WiFiService> wifi_service(wifi::WiFiService::Create()); - delegate = new NetworkingPrivateServiceClient(std::move(wifi_service), - std::move(verify_delegate)); + delegate = new NetworkingPrivateServiceClient(std::move(wifi_service)); #else NOTREACHED(); delegate = nullptr;
diff --git a/extensions/browser/api/networking_private/networking_private_delegate_factory.h b/extensions/browser/api/networking_private/networking_private_delegate_factory.h index d172354..90927b5a7 100644 --- a/extensions/browser/api/networking_private/networking_private_delegate_factory.h +++ b/extensions/browser/api/networking_private/networking_private_delegate_factory.h
@@ -28,18 +28,6 @@ // already a singleton, it provides a good place to hold these delegate // factories. See NetworkingPrivateDelegate for the delegate declarations. - class VerifyDelegateFactory { - public: - VerifyDelegateFactory(); - virtual ~VerifyDelegateFactory(); - - virtual std::unique_ptr<NetworkingPrivateDelegate::VerifyDelegate> - CreateDelegate() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(VerifyDelegateFactory); - }; - class UIDelegateFactory { public: UIDelegateFactory(); @@ -53,7 +41,6 @@ }; // Provide optional factories for creating delegate instances. - void SetVerifyDelegateFactory(std::unique_ptr<VerifyDelegateFactory> factory); void SetUIDelegateFactory(std::unique_ptr<UIDelegateFactory> factory); static NetworkingPrivateDelegate* GetForBrowserContext( @@ -74,7 +61,6 @@ bool ServiceIsCreatedWithBrowserContext() const override; bool ServiceIsNULLWhileTesting() const override; - std::unique_ptr<VerifyDelegateFactory> verify_factory_; std::unique_ptr<UIDelegateFactory> ui_factory_; DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateDelegateFactory);
diff --git a/extensions/browser/api/networking_private/networking_private_linux.cc b/extensions/browser/api/networking_private/networking_private_linux.cc index f247c7a..0939d23 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.cc +++ b/extensions/browser/api/networking_private/networking_private_linux.cc
@@ -135,11 +135,8 @@ } // namespace -NetworkingPrivateLinux::NetworkingPrivateLinux( - std::unique_ptr<VerifyDelegate> verify_delegate) - : NetworkingPrivateDelegate(std::move(verify_delegate)), - dbus_thread_("Networking Private DBus"), - network_manager_proxy_(NULL) { +NetworkingPrivateLinux::NetworkingPrivateLinux() + : dbus_thread_("Networking Private DBus"), network_manager_proxy_(NULL) { base::Thread::Options thread_options(base::MessageLoop::Type::TYPE_IO, 0); dbus_thread_.StartWithOptions(thread_options);
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h index e392ffb1..8ac5d52 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.h +++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -33,8 +33,7 @@ typedef std::vector<std::string> GuidList; - explicit NetworkingPrivateLinux( - std::unique_ptr<VerifyDelegate> verify_delegate); + NetworkingPrivateLinux(); // NetworkingPrivateDelegate void GetProperties(const std::string& guid,
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc index 655fa9d..a88170f 100644 --- a/extensions/browser/api/networking_private/networking_private_service_client.cc +++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -41,11 +41,8 @@ } NetworkingPrivateServiceClient::NetworkingPrivateServiceClient( - std::unique_ptr<WiFiService> wifi_service, - std::unique_ptr<VerifyDelegate> verify_delegate) - : NetworkingPrivateDelegate(std::move(verify_delegate)), - wifi_service_(std::move(wifi_service)), - weak_factory_(this) { + std::unique_ptr<WiFiService> wifi_service) + : wifi_service_(std::move(wifi_service)), weak_factory_(this) { sequence_token_ = BrowserThread::GetBlockingPool()->GetNamedSequenceToken( kNetworkingPrivateSequenceTokenName); task_runner_ =
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.h b/extensions/browser/api/networking_private/networking_private_service_client.h index ca5a40c..4456b9d 100644 --- a/extensions/browser/api/networking_private/networking_private_service_client.h +++ b/extensions/browser/api/networking_private/networking_private_service_client.h
@@ -42,10 +42,8 @@ public: // Takes ownership of |wifi_service| which is accessed and deleted on the // worker thread. The deletion task is posted from the destructor. - // |verify_delegate| is passed to NetworkingPrivateDelegate and may be NULL. - NetworkingPrivateServiceClient( - std::unique_ptr<wifi::WiFiService> wifi_service, - std::unique_ptr<VerifyDelegate> verify_delegate); + explicit NetworkingPrivateServiceClient( + std::unique_ptr<wifi::WiFiService> wifi_service); // KeyedService void Shutdown() override;
diff --git a/extensions/browser/api/power/power_api.h b/extensions/browser/api/power/power_api.h index db79aca..2a19027 100644 --- a/extensions/browser/api/power/power_api.h +++ b/extensions/browser/api/power/power_api.h
@@ -66,6 +66,13 @@ // BrowserContextKeyedAPI implementation. static BrowserContextKeyedAPIFactory<PowerAPI>* GetFactoryInstance(); + // Map from extension ID to the corresponding level for each extension + // that has an outstanding request. + using ExtensionLevelMap = std::map<std::string, api::power::Level>; + const ExtensionLevelMap& extension_levels() const { + return extension_levels_; + } + // Adds an extension lock at |level| for |extension_id|, replacing the // extension's existing lock, if any. void AddRequest(const std::string& extension_id, api::power::Level level); @@ -113,9 +120,7 @@ // |power_save_blocker_| is NULL. api::power::Level current_level_; - // Map from extension ID to the corresponding level for each extension - // that has an outstanding request. - typedef std::map<std::string, api::power::Level> ExtensionLevelMap; + // Outstanding requests. ExtensionLevelMap extension_levels_; DISALLOW_COPY_AND_ASSIGN(PowerAPI);
diff --git a/extensions/browser/content_verifier_delegate.h b/extensions/browser/content_verifier_delegate.h index aae366f8..0eea3a2 100644 --- a/extensions/browser/content_verifier_delegate.h +++ b/extensions/browser/content_verifier_delegate.h
@@ -24,9 +24,10 @@ // A pointer to the bytes of a public key, and the number of bytes. struct ContentVerifierKey { const uint8_t* data; - int size; + size_t size; - ContentVerifierKey(const uint8_t* data, int size) : data(data), size(size) {} + ContentVerifierKey(const uint8_t* data, size_t size) + : data(data), size(size) {} }; // This is an interface for clients that want to use a ContentVerifier.
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc index dc3b5e71..6b781903 100644 --- a/extensions/browser/process_manager.cc +++ b/extensions/browser/process_manager.cc
@@ -106,7 +106,6 @@ static void CreateBackgroundHostForExtensionLoad( ProcessManager* manager, const Extension* extension) { - DVLOG(1) << "CreateBackgroundHostForExtensionLoad " << extension->id(); if (BackgroundInfo::HasPersistentBackgroundPage(extension)) manager->CreateBackgroundHost(extension, BackgroundInfo::GetBackgroundURL(extension)); @@ -365,13 +364,15 @@ // Don't create hosts if the embedder doesn't allow it. ProcessManagerDelegate* delegate = ExtensionsBrowserClient::Get()->GetProcessManagerDelegate(); - if (delegate && !delegate->IsBackgroundPageAllowed(browser_context_)) + if (delegate && + !delegate->IsExtensionBackgroundPageAllowed(browser_context_, *extension)) return false; // Don't create multiple background hosts for an extension. if (GetBackgroundHostForExtension(extension->id())) return true; // TODO(kalman): return false here? It might break things... + DVLOG(1) << "CreateBackgroundHost " << extension->id(); ExtensionHost* host = new ExtensionHost(extension, GetSiteInstanceForURL(url).get(), url, VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); @@ -387,7 +388,8 @@ // The embedder might disallow background pages entirely. ProcessManagerDelegate* delegate = ExtensionsBrowserClient::Get()->GetProcessManagerDelegate(); - if (delegate && !delegate->IsBackgroundPageAllowed(browser_context_)) + if (delegate && + !delegate->AreBackgroundPagesAllowedForContext(browser_context_)) return; // The embedder might want to defer background page loading. For example,
diff --git a/extensions/browser/process_manager_delegate.h b/extensions/browser/process_manager_delegate.h index 7cc48c0..31d17bdc 100644 --- a/extensions/browser/process_manager_delegate.h +++ b/extensions/browser/process_manager_delegate.h
@@ -11,6 +11,8 @@ namespace extensions { +class Extension; + // Customization of ProcessManager for the extension system embedder. class ProcessManagerDelegate { public: @@ -18,9 +20,15 @@ // Returns true if the embedder allows background pages for the given // |context|. - virtual bool IsBackgroundPageAllowed( + virtual bool AreBackgroundPagesAllowedForContext( content::BrowserContext* context) const = 0; + // Returns true if the embedder allows background pages for the given + // |context|, and a given |extension|. + virtual bool IsExtensionBackgroundPageAllowed( + content::BrowserContext* context, + const Extension& extension) const = 0; + // Returns true if the embedder wishes to defer starting up the renderers for // extension background pages. If the embedder returns true it must call // ProcessManager::MaybeCreateStartupBackgroundHosts() when it is ready. See
diff --git a/extensions/browser/process_manager_unittest.cc b/extensions/browser/process_manager_unittest.cc index 89d376a..25f6406 100644 --- a/extensions/browser/process_manager_unittest.cc +++ b/extensions/browser/process_manager_unittest.cc
@@ -46,7 +46,13 @@ ~TestProcessManagerDelegate() override {} // ProcessManagerDelegate implementation. - bool IsBackgroundPageAllowed(BrowserContext* context) const override { + bool AreBackgroundPagesAllowedForContext( + BrowserContext* context) const override { + return is_background_page_allowed_; + } + bool IsExtensionBackgroundPageAllowed( + BrowserContext* context, + const Extension& extension) const override { return is_background_page_allowed_; } bool DeferCreatingStartupBackgroundHosts(
diff --git a/extensions/browser/verified_contents.cc b/extensions/browser/verified_contents.cc index 7ae66762..fd60f313 100644 --- a/extensions/browser/verified_contents.cc +++ b/extensions/browser/verified_contents.cc
@@ -62,7 +62,7 @@ namespace extensions { VerifiedContents::VerifiedContents(const uint8_t* public_key, - int public_key_size) + size_t public_key_size) : public_key_(public_key), public_key_size_(public_key_size), valid_signature_(false), // Guilty until proven innocent.
diff --git a/extensions/browser/verified_contents.h b/extensions/browser/verified_contents.h index 9d0924a..6a44972 100644 --- a/extensions/browser/verified_contents.h +++ b/extensions/browser/verified_contents.h
@@ -24,7 +24,7 @@ class VerifiedContents { public: // Note: the public_key must remain valid for the lifetime of this object. - VerifiedContents(const uint8_t* public_key, int public_key_size); + VerifiedContents(const uint8_t* public_key, size_t public_key_size); ~VerifiedContents(); // Returns true if we successfully parsed the verified_contents.json file at @@ -59,7 +59,7 @@ // The public key we should use for signature verification. const uint8_t* public_key_; - const int public_key_size_; + const size_t public_key_size_; // Indicates whether the signature was successfully validated or not. bool valid_signature_;
diff --git a/extensions/common/constants.cc b/extensions/common/constants.cc index 948655d0..c569a2d 100644 --- a/extensions/common/constants.cc +++ b/extensions/common/constants.cc
@@ -80,7 +80,7 @@ 0x58, 0x34, 0xc8, 0x22, 0x2d, 0x2a, 0x65, 0x75, 0xa7, 0xd9, 0x08, 0x62, 0xcd, 0x02, 0x03, 0x01, 0x00, 0x01}; -const int kWebstoreSignaturesPublicKeySize = +const size_t kWebstoreSignaturesPublicKeySize = arraysize(kWebstoreSignaturesPublicKey); const char kMimeTypeJpeg[] = "image/jpeg";
diff --git a/extensions/common/constants.h b/extensions/common/constants.h index 4bf94c9..587299f 100644 --- a/extensions/common/constants.h +++ b/extensions/common/constants.h
@@ -111,7 +111,7 @@ // The key used for signing some pieces of data from the webstore. extern const uint8_t kWebstoreSignaturesPublicKey[]; -extern const int kWebstoreSignaturesPublicKeySize; +extern const size_t kWebstoreSignaturesPublicKeySize; // Enumeration of possible app launch sources. // This should be kept in sync with LaunchSource in
diff --git a/extensions/common/features/complex_feature.cc b/extensions/common/features/complex_feature.cc index 35680d1..ed129da 100644 --- a/extensions/common/features/complex_feature.cc +++ b/extensions/common/features/complex_feature.cc
@@ -98,24 +98,6 @@ return false; } -Feature::Availability ComplexFeature::IsAvailableToChannel( - version_info::Channel channel) const { - Feature::Availability first_availability = - features_[0]->IsAvailableToChannel(channel); - if (first_availability.is_available()) - return first_availability; - - for (FeatureList::const_iterator it = features_.begin() + 1; - it != features_.end(); ++it) { - Availability availability = (*it)->IsAvailableToChannel(channel); - if (availability.is_available()) - return availability; - } - // If none of the SimpleFeatures are available, we return the availability - // info of the first SimpleFeature that was not available. - return first_availability; -} - bool ComplexFeature::IsInternal() const { // Constructor verifies that composed features are consistent, thus we can // return just the first feature's value.
diff --git a/extensions/common/features/complex_feature.h b/extensions/common/features/complex_feature.h index c331901..9ccbd4f 100644 --- a/extensions/common/features/complex_feature.h +++ b/extensions/common/features/complex_feature.h
@@ -41,8 +41,6 @@ bool IsIdInBlacklist(const std::string& extension_id) const override; bool IsIdInWhitelist(const std::string& extension_id) const override; - Availability IsAvailableToChannel( - version_info::Channel channel) const override; protected: // Feature:
diff --git a/extensions/common/features/feature.h b/extensions/common/features/feature.h index 0664e173..d3179bb9 100644 --- a/extensions/common/features/feature.h +++ b/extensions/common/features/feature.h
@@ -10,7 +10,6 @@ #include "base/strings/string_piece.h" #include "base/values.h" -#include "components/version_info/version_info.h" #include "extensions/common/manifest.h" class GURL; @@ -137,12 +136,6 @@ const GURL& url, Platform platform) const = 0; - // Returns the availability of the feature on the given |channel|. The - // availability result will either be IS_AVAILABLE, UNSUPPORTED_CHANNEL or - // NOT_PRESENT. - virtual Availability IsAvailableToChannel( - version_info::Channel channel) const = 0; - // Returns true if the feature is available to the current environment, // without needing to know information about an Extension or any other // contextual information. Typically used when the Feature is purely
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc index 0f7675b1..d901cd9 100644 --- a/extensions/common/features/simple_feature.cc +++ b/extensions/common/features/simple_feature.cc
@@ -53,11 +53,6 @@ return feature->IsAvailableToContext(extension, context, url, platform); } -Feature::Availability IsAvailableToChannelForBind(version_info::Channel channel, - const Feature* feature) { - return feature->IsAvailableToChannel(channel); -} - // Gets a human-readable name for the given extension type, suitable for giving // to developers in an error message. std::string GetDisplayName(Manifest::Type type) { @@ -460,13 +455,6 @@ return IsIdInList(extension_id, whitelist_); } -Feature::Availability SimpleFeature::IsAvailableToChannel( - version_info::Channel channel) const { - if (channel_ && *channel_ < channel) - return CreateAvailability(UNSUPPORTED_CHANNEL, *channel_); - return CheckDependencies(base::Bind(&IsAvailableToChannelForBind, channel)); -} - // static bool SimpleFeature::IsIdInArray(const std::string& extension_id, const char* const array[],
diff --git a/extensions/common/features/simple_feature.h b/extensions/common/features/simple_feature.h index 117da20a..343282e 100644 --- a/extensions/common/features/simple_feature.h +++ b/extensions/common/features/simple_feature.h
@@ -76,8 +76,6 @@ bool IsInternal() const override; bool IsIdInBlacklist(const std::string& extension_id) const override; bool IsIdInWhitelist(const std::string& extension_id) const override; - Availability IsAvailableToChannel( - version_info::Channel channel) const override; static bool IsIdInArray(const std::string& extension_id, const char* const array[],
diff --git a/extensions/common/features/simple_feature_unittest.cc b/extensions/common/features/simple_feature_unittest.cc index e8f4c3c..a570248 100644 --- a/extensions/common/features/simple_feature_unittest.cc +++ b/extensions/common/features/simple_feature_unittest.cc
@@ -45,9 +45,15 @@ Feature::AvailabilityResult IsAvailableInChannel(Channel channel_for_feature, Channel channel_for_testing) { + ScopedCurrentChannel current_channel(channel_for_testing); + SimpleFeature feature; feature.set_channel(channel_for_feature); - return feature.IsAvailableToChannel(channel_for_testing).result(); + return feature + .IsAvailableToManifest("random-extension", Manifest::TYPE_UNKNOWN, + Manifest::INVALID_LOCATION, -1, + Feature::GetCurrentPlatform()) + .result(); } } // namespace @@ -756,6 +762,56 @@ IsAvailableInChannel(Channel::UNKNOWN, Channel::STABLE)); } +// Tests simple feature availability across channels. +TEST_F(SimpleFeatureTest, SimpleFeatureAvailability) { + std::unique_ptr<ComplexFeature> complex_feature; + { + std::unique_ptr<SimpleFeature> feature1(new SimpleFeature()); + feature1->channel_.reset(new Channel(Channel::BETA)); + feature1->extension_types_.push_back(Manifest::TYPE_EXTENSION); + std::unique_ptr<SimpleFeature> feature2(new SimpleFeature()); + feature2->channel_.reset(new Channel(Channel::BETA)); + feature2->extension_types_.push_back(Manifest::TYPE_LEGACY_PACKAGED_APP); + std::vector<Feature*> list; + list.push_back(feature1.release()); + list.push_back(feature2.release()); + complex_feature.reset(new ComplexFeature(&list)); + } + + Feature* feature = static_cast<Feature*>(complex_feature.get()); + // Make sure both rules are applied correctly. + { + ScopedCurrentChannel current_channel(Channel::BETA); + EXPECT_EQ( + Feature::IS_AVAILABLE, + feature->IsAvailableToManifest("1", + Manifest::TYPE_EXTENSION, + Manifest::INVALID_LOCATION, + Feature::UNSPECIFIED_PLATFORM).result()); + EXPECT_EQ( + Feature::IS_AVAILABLE, + feature->IsAvailableToManifest("2", + Manifest::TYPE_LEGACY_PACKAGED_APP, + Manifest::INVALID_LOCATION, + Feature::UNSPECIFIED_PLATFORM).result()); + } + { + ScopedCurrentChannel current_channel(Channel::STABLE); + EXPECT_NE( + Feature::IS_AVAILABLE, + feature->IsAvailableToManifest("1", + Manifest::TYPE_EXTENSION, + Manifest::INVALID_LOCATION, + Feature::UNSPECIFIED_PLATFORM).result()); + EXPECT_NE( + Feature::IS_AVAILABLE, + feature->IsAvailableToManifest("2", + Manifest::TYPE_LEGACY_PACKAGED_APP, + Manifest::INVALID_LOCATION, + Feature::UNSPECIFIED_PLATFORM).result()); + } +} + // Tests complex feature availability across channels. TEST_F(SimpleFeatureTest, ComplexFeatureAvailability) { std::unique_ptr<ComplexFeature> complex_feature; @@ -765,8 +821,8 @@ feature1->channel_.reset(new Channel(Channel::UNKNOWN)); feature1->extension_types_.push_back(Manifest::TYPE_EXTENSION); std::unique_ptr<SimpleFeature> feature2(new SimpleFeature()); - // Rule: "legacy_packaged_app", channel beta. - feature2->channel_.reset(new Channel(Channel::BETA)); + // Rule: "legacy_packaged_app", channel stable. + feature2->channel_.reset(new Channel(Channel::STABLE)); feature2->extension_types_.push_back(Manifest::TYPE_LEGACY_PACKAGED_APP); std::vector<Feature*> list; list.push_back(feature1.release()); @@ -774,18 +830,7 @@ complex_feature.reset(new ComplexFeature(&list)); } - Feature* feature = complex_feature.get(); - EXPECT_EQ(Feature::IS_AVAILABLE, - feature->IsAvailableToChannel(Channel::UNKNOWN).result()); - EXPECT_EQ(Feature::IS_AVAILABLE, - feature->IsAvailableToChannel(Channel::CANARY).result()); - EXPECT_EQ(Feature::IS_AVAILABLE, - feature->IsAvailableToChannel(Channel::DEV).result()); - EXPECT_EQ(Feature::IS_AVAILABLE, - feature->IsAvailableToChannel(Channel::BETA).result()); - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL, - feature->IsAvailableToChannel(Channel::STABLE).result()); - + Feature* feature = static_cast<Feature*>(complex_feature.get()); { ScopedCurrentChannel current_channel(Channel::UNKNOWN); EXPECT_EQ(Feature::IS_AVAILABLE, @@ -794,12 +839,6 @@ Manifest::INVALID_LOCATION, Feature::UNSPECIFIED_PLATFORM) .result()); - EXPECT_EQ(Feature::IS_AVAILABLE, - feature - ->IsAvailableToManifest( - "1", Manifest::TYPE_LEGACY_PACKAGED_APP, - Manifest::INVALID_LOCATION, Feature::UNSPECIFIED_PLATFORM) - .result()); } { ScopedCurrentChannel current_channel(Channel::BETA); @@ -809,21 +848,9 @@ "2", Manifest::TYPE_LEGACY_PACKAGED_APP, Manifest::INVALID_LOCATION, Feature::UNSPECIFIED_PLATFORM) .result()); - EXPECT_NE(Feature::IS_AVAILABLE, - feature - ->IsAvailableToManifest("1", Manifest::TYPE_EXTENSION, - Manifest::INVALID_LOCATION, - Feature::UNSPECIFIED_PLATFORM) - .result()); } { - ScopedCurrentChannel current_channel(Channel::STABLE); - EXPECT_NE(Feature::IS_AVAILABLE, - feature - ->IsAvailableToManifest( - "2", Manifest::TYPE_LEGACY_PACKAGED_APP, - Manifest::INVALID_LOCATION, Feature::UNSPECIFIED_PLATFORM) - .result()); + ScopedCurrentChannel current_channel(Channel::BETA); EXPECT_NE(Feature::IS_AVAILABLE, feature ->IsAvailableToManifest("1", Manifest::TYPE_EXTENSION,
diff --git a/extensions/renderer/BUILD.gn b/extensions/renderer/BUILD.gn index aa9371b..ba78806 100644 --- a/extensions/renderer/BUILD.gn +++ b/extensions/renderer/BUILD.gn
@@ -60,6 +60,8 @@ "context_menus_custom_bindings.h", "css_native_handler.cc", "css_native_handler.h", + "declarative_event.cc", + "declarative_event.h", "dispatcher.cc", "dispatcher.h", "dispatcher_delegate.h", @@ -125,6 +127,7 @@ "programmatic_script_injector.cc", "programmatic_script_injector.h", "render_frame_observer_natives.cc", + "render_frame_observer_natives.h", "renderer_extension_registry.cc", "renderer_extension_registry.h", "request_sender.cc", @@ -304,6 +307,7 @@ "api_test_base.h", "api_test_base_unittest.cc", "argument_spec_unittest.cc", + "declarative_event_unittest.cc", "event_unittest.cc", "gc_callback_unittest.cc", "json_schema_unittest.cc",
diff --git a/extensions/renderer/api_binding.cc b/extensions/renderer/api_binding.cc index 648e8a727..7016ec2 100644 --- a/extensions/renderer/api_binding.cc +++ b/extensions/renderer/api_binding.cc
@@ -18,8 +18,10 @@ #include "extensions/renderer/api_request_handler.h" #include "extensions/renderer/api_signature.h" #include "extensions/renderer/api_type_reference_map.h" +#include "extensions/renderer/declarative_event.h" #include "extensions/renderer/v8_helpers.h" #include "gin/arguments.h" +#include "gin/handle.h" #include "gin/per_context_data.h" #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" @@ -87,27 +89,45 @@ APIBinding::HandlerCallback callback; }; +// TODO(devlin): Maybe separate EventData into two classes? Rules, actions, and +// conditions should never be present on vanilla events. struct APIBinding::EventData { EventData(std::string exposed_name, std::string full_name, bool supports_filters, - APIEventHandler* event_handler) + bool supports_rules, + std::vector<std::string> actions, + std::vector<std::string> conditions, + APIBinding* binding) : exposed_name(std::move(exposed_name)), full_name(std::move(full_name)), supports_filters(supports_filters), - event_handler(event_handler) {} + supports_rules(supports_rules), + actions(std::move(actions)), + conditions(std::move(conditions)), + binding(binding) {} // The name of the event on the API object (e.g. onCreated). std::string exposed_name; + // The fully-specified name of the event (e.g. tabs.onCreated). std::string full_name; + // Whether the event supports filters. bool supports_filters; - // The associated event handler. This raw pointer is safe because the + + // Whether the event supports rules. + bool supports_rules; + + // The associated actions and conditions for declarative events. + std::vector<std::string> actions; + std::vector<std::string> conditions; + + // The associated APIBinding. This raw pointer is safe because the // EventData is only accessed from the callbacks associated with the // APIBinding, and both the APIBinding and APIEventHandler are owned by the // same object (the APIBindingsSystem). - APIEventHandler* event_handler; + APIBinding* binding; }; struct APIBinding::CustomPropertyData { @@ -143,6 +163,7 @@ binding_hooks_(std::move(binding_hooks)), type_refs_(type_refs), request_handler_(request_handler), + event_handler_(event_handler), weak_factory_(this) { // TODO(devlin): It might make sense to instantiate the object_template_ // directly here, which would avoid the need to hold on to @@ -221,9 +242,35 @@ const base::ListValue* filters = nullptr; bool supports_filters = event_dict->GetList("filters", &filters) && !filters->empty(); - events_.push_back( - base::MakeUnique<EventData>(std::move(name), std::move(full_name), - supports_filters, event_handler)); + + std::vector<std::string> rule_actions; + std::vector<std::string> rule_conditions; + const base::DictionaryValue* options = nullptr; + bool supports_rules = false; + if (event_dict->GetDictionary("options", &options) && + options->GetBoolean("supportsRules", &supports_rules) && + supports_rules) { + bool supports_listeners = false; + DCHECK(options->GetBoolean("supportsListeners", &supports_listeners)); + DCHECK(!supports_listeners) + << "Events cannot support rules and listeners."; + auto get_values = [options](base::StringPiece name, + std::vector<std::string>* out_value) { + const base::ListValue* list = nullptr; + CHECK(options->GetList(name, &list)); + for (const auto& entry : *list) { + DCHECK(entry->is_string()); + out_value->push_back(entry->GetString()); + } + }; + get_values("actions", &rule_actions); + get_values("conditions", &rule_conditions); + } + + events_.push_back(base::MakeUnique<EventData>( + std::move(name), std::move(full_name), supports_filters, + supports_rules, std::move(rule_actions), std::move(rule_conditions), + this)); } } } @@ -382,8 +429,19 @@ CHECK(info.Data()->IsExternal()); auto* event_data = static_cast<EventData*>(info.Data().As<v8::External>()->Value()); - info.GetReturnValue().Set(event_data->event_handler->CreateEventInstance( - event_data->full_name, event_data->supports_filters, context)); + v8::Local<v8::Value> retval; + if (event_data->supports_rules) { + gin::Handle<DeclarativeEvent> event = gin::CreateHandle( + isolate, new DeclarativeEvent( + event_data->full_name, event_data->binding->type_refs_, + event_data->binding->request_handler_, event_data->actions, + event_data->conditions)); + retval = event.ToV8(); + } else { + retval = event_data->binding->event_handler_->CreateEventInstance( + event_data->full_name, event_data->supports_filters, context); + } + info.GetReturnValue().Set(retval); } void APIBinding::GetCustomPropertyObject(
diff --git a/extensions/renderer/api_binding.h b/extensions/renderer/api_binding.h index 870f8c1..0fffaee 100644 --- a/extensions/renderer/api_binding.h +++ b/extensions/renderer/api_binding.h
@@ -134,12 +134,16 @@ std::unique_ptr<APIBindingHooks> binding_hooks_; // The reference map for all known types; required to outlive this object. - const APITypeReferenceMap* type_refs_; + APITypeReferenceMap* type_refs_; // The associated request handler, shared between this and other bindings. // Required to outlive this object. APIRequestHandler* request_handler_; + // The associated event handler, shared between this and other bindings. + // Required to outlive this object. + APIEventHandler* event_handler_; + // The template for this API. Note: some methods may only be available in // certain contexts, but this template contains all methods. Those that are // unavailable are removed after object instantiation.
diff --git a/extensions/renderer/api_bindings_system.cc b/extensions/renderer/api_bindings_system.cc index 64ba5864..706b1e2e 100644 --- a/extensions/renderer/api_bindings_system.cc +++ b/extensions/renderer/api_bindings_system.cc
@@ -85,7 +85,7 @@ // will also go away if/when we generate all these specifications. std::string::size_type dot = type_name.rfind('.'); // The type name should be fully qualified (include the API name). - DCHECK_NE(std::string::npos, dot); + DCHECK_NE(std::string::npos, dot) << type_name; DCHECK_LT(dot, type_name.size() - 1); std::string api_name = type_name.substr(0, dot); // If we've already instantiated the binding, the type should have been in
diff --git a/extensions/renderer/api_signature.cc b/extensions/renderer/api_signature.cc index 261775e5..a76d51bf 100644 --- a/extensions/renderer/api_signature.cc +++ b/extensions/renderer/api_signature.cc
@@ -226,6 +226,9 @@ } } +APISignature::APISignature(std::vector<std::unique_ptr<ArgumentSpec>> signature) + : signature_(std::move(signature)) {} + APISignature::~APISignature() {} bool APISignature::ParseArgumentsToV8(
diff --git a/extensions/renderer/api_signature.h b/extensions/renderer/api_signature.h index abc91e02..bbcb81e 100644 --- a/extensions/renderer/api_signature.h +++ b/extensions/renderer/api_signature.h
@@ -24,7 +24,8 @@ // ability to match provided arguments and convert them to base::Values. class APISignature { public: - APISignature(const base::ListValue& specification); + explicit APISignature(const base::ListValue& specification); + explicit APISignature(std::vector<std::unique_ptr<ArgumentSpec>> signature); ~APISignature(); // Parses |arguments| against this signature, and populates |args_out| with
diff --git a/extensions/renderer/api_type_reference_map.cc b/extensions/renderer/api_type_reference_map.cc index bc0b129..33898c09 100644 --- a/extensions/renderer/api_type_reference_map.cc +++ b/extensions/renderer/api_type_reference_map.cc
@@ -71,4 +71,9 @@ return iter == type_methods_.end() ? nullptr : iter->second.get(); } +bool APITypeReferenceMap::HasTypeMethodSignature( + const std::string& name) const { + return type_methods_.find(name) != type_methods_.end(); +} + } // namespace extensions
diff --git a/extensions/renderer/api_type_reference_map.h b/extensions/renderer/api_type_reference_map.h index f444332b..45a975a3 100644 --- a/extensions/renderer/api_type_reference_map.h +++ b/extensions/renderer/api_type_reference_map.h
@@ -52,6 +52,11 @@ // storage.StorageArea.get). const APISignature* GetTypeMethodSignature(const std::string& name) const; + // Returns true if the map has a signature for the given |name|. Unlike + // GetTypeMethodSignature(), this will not try to fetch the type by loading + // an API. + bool HasTypeMethodSignature(const std::string& name) const; + bool empty() const { return type_refs_.empty(); } size_t size() const { return type_refs_.size(); }
diff --git a/extensions/renderer/argument_spec.cc b/extensions/renderer/argument_spec.cc index c46d320..1a9b2cc 100644 --- a/extensions/renderer/argument_spec.cc +++ b/extensions/renderer/argument_spec.cc
@@ -42,6 +42,8 @@ InitializeType(dict); } +ArgumentSpec::ArgumentSpec(ArgumentType type) : type_(type), optional_(false) {} + void ArgumentSpec::InitializeType(const base::DictionaryValue* dict) { std::string ref_string; if (dict->GetString("$ref", &ref_string)) {
diff --git a/extensions/renderer/argument_spec.h b/extensions/renderer/argument_spec.h index f0d4c16..e566389 100644 --- a/extensions/renderer/argument_spec.h +++ b/extensions/renderer/argument_spec.h
@@ -13,6 +13,7 @@ #include "base/macros.h" #include "base/optional.h" +#include "base/strings/string_piece.h" #include "v8/include/v8.h" namespace base { @@ -40,10 +41,13 @@ // A description of a given Argument to an Extension. class ArgumentSpec { public: + using PropertiesMap = std::map<std::string, std::unique_ptr<ArgumentSpec>>; + // Reads the description from |value| and sets associated fields. // TODO(devlin): We should strongly think about generating these instead of // populating them at runtime. explicit ArgumentSpec(const base::Value& value); + explicit ArgumentSpec(ArgumentType type); ~ArgumentSpec(); // Returns true if the passed |value| matches this specification. If @@ -60,6 +64,27 @@ ArgumentType type() const { return type_; } const std::set<std::string>& enum_values() const { return enum_values_; } + void set_name(base::StringPiece name) { name_ = name.as_string(); } + void set_optional(bool optional) { optional_ = optional; } + void set_ref(base::StringPiece ref) { ref_ = ref.as_string(); } + void set_minimum(int minimum) { minimum_ = minimum; } + void set_properties(PropertiesMap properties) { + properties_ = std::move(properties); + } + void set_list_element_type(std::unique_ptr<ArgumentSpec> list_element_type) { + list_element_type_ = std::move(list_element_type); + } + void set_choices(std::vector<std::unique_ptr<ArgumentSpec>> choices) { + choices_ = std::move(choices); + } + void set_enum_values(std::set<std::string> enum_values) { + enum_values_ = std::move(enum_values); + } + void set_additional_properties( + std::unique_ptr<ArgumentSpec> additional_properties) { + additional_properties_ = std::move(additional_properties); + } + private: // Initializes this object according to |type_string| and |dict|. void InitializeType(const base::DictionaryValue* dict);
diff --git a/extensions/renderer/chrome_setting.cc b/extensions/renderer/chrome_setting.cc index b8830429..b543127 100644 --- a/extensions/renderer/chrome_setting.cc +++ b/extensions/renderer/chrome_setting.cc
@@ -104,10 +104,7 @@ void ChromeSetting::Set(gin::Arguments* arguments) { v8::Isolate* isolate = arguments->isolate(); v8::HandleScope handle_scope(isolate); - - v8::Local<v8::Object> holder; - CHECK(arguments->GetHolder(&holder)); - v8::Local<v8::Context> context = holder->CreationContext(); + v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); v8::Local<v8::Value> value = arguments->PeekNext(); // The set schema included in the Schema object is generic, since it varies @@ -129,9 +126,7 @@ v8::Local<v8::Value> ChromeSetting::GetOnChangeEvent( gin::Arguments* arguments) { v8::Isolate* isolate = arguments->isolate(); - v8::Local<v8::Object> holder; - CHECK(arguments->GetHolder(&holder)); - v8::Local<v8::Context> context = holder->CreationContext(); + v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); v8::Local<v8::Object> wrapper = GetWrapper(isolate); v8::Local<v8::Private> key = v8::Private::ForApi( isolate, gin::StringToSymbol(isolate, "onChangeEvent")); @@ -161,9 +156,7 @@ gin::Arguments* arguments) { v8::Isolate* isolate = arguments->isolate(); v8::HandleScope handle_scope(isolate); - v8::Local<v8::Object> holder; - CHECK(arguments->GetHolder(&holder)); - v8::Local<v8::Context> context = holder->CreationContext(); + v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); std::vector<v8::Local<v8::Value>> argument_list; if (arguments->Length() > 0) {
diff --git a/extensions/renderer/declarative_event.cc b/extensions/renderer/declarative_event.cc new file mode 100644 index 0000000..d8a79777 --- /dev/null +++ b/extensions/renderer/declarative_event.cc
@@ -0,0 +1,215 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/renderer/declarative_event.h" + +#include <algorithm> +#include <memory> + +#include "base/memory/ptr_util.h" +#include "base/strings/stringprintf.h" +#include "base/values.h" +#include "extensions/renderer/api_event_listeners.h" +#include "extensions/renderer/api_request_handler.h" +#include "extensions/renderer/api_signature.h" +#include "extensions/renderer/api_type_reference_map.h" +#include "extensions/renderer/argument_spec.h" +#include "gin/object_template_builder.h" +#include "gin/per_context_data.h" + +namespace extensions { + +namespace { + +// Builds an ArgumentSpec that accepts the given |choices| as references. +std::unique_ptr<ArgumentSpec> BuildChoicesSpec( + const std::vector<std::string>& choices_list) { + auto item_type = base::MakeUnique<ArgumentSpec>(ArgumentType::CHOICES); + std::vector<std::unique_ptr<ArgumentSpec>> choices; + choices.reserve(choices_list.size()); + for (const std::string& value : choices_list) { + auto choice = base::MakeUnique<ArgumentSpec>(ArgumentType::REF); + choice->set_ref(value); + choices.push_back(std::move(choice)); + } + item_type->set_choices(std::move(choices)); + return item_type; +} + +// Builds the ArgumentSpec for a events.Rule type, given a list of actions and +// conditions. It's insufficient to use the specification in events.Rule, since +// that provides argument types of "any" for actions and conditions, allowing +// individual APIs to specify them further. Alternatively, we could lookup the +// events.Rule spec and only override the actions and conditions properties, +// but that doesn't seem any less contrived and requires JSON parsing and +// complex spec initialization. +// TODO(devlin): Another target for generating these specs. Currently, the +// custom JS bindings do something similar, so this is no worse off, but that +// doesn't make it more desirable. +std::unique_ptr<ArgumentSpec> BuildRulesSpec( + const std::vector<std::string>& actions_list, + const std::vector<std::string>& conditions_list) { + auto rule_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::OBJECT); + ArgumentSpec::PropertiesMap properties; + { + auto id_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::STRING); + id_spec->set_optional(true); + properties["id"] = std::move(id_spec); + } + { + auto tags_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::LIST); + tags_spec->set_list_element_type( + base::MakeUnique<ArgumentSpec>(ArgumentType::STRING)); + tags_spec->set_optional(true); + properties["tags"] = std::move(tags_spec); + } + { + auto actions_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::LIST); + actions_spec->set_list_element_type(BuildChoicesSpec(actions_list)); + properties["actions"] = std::move(actions_spec); + } + { + auto conditions_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::LIST); + conditions_spec->set_list_element_type(BuildChoicesSpec(conditions_list)); + properties["conditions"] = std::move(conditions_spec); + } + { + auto priority_spec = base::MakeUnique<ArgumentSpec>(ArgumentType::INTEGER); + priority_spec->set_optional(true); + properties["priority"] = std::move(priority_spec); + } + rule_spec->set_properties(std::move(properties)); + return rule_spec; +} + +// Builds the signature for events.addRules using a specific rule. +std::unique_ptr<APISignature> BuildAddRulesSignature( + const std::string& rule_name) { + std::vector<std::unique_ptr<ArgumentSpec>> params; + params.push_back(base::MakeUnique<ArgumentSpec>(ArgumentType::STRING)); + params.push_back(base::MakeUnique<ArgumentSpec>(ArgumentType::INTEGER)); + { + auto rules = base::MakeUnique<ArgumentSpec>(ArgumentType::LIST); + auto ref = base::MakeUnique<ArgumentSpec>(ArgumentType::REF); + ref->set_ref(rule_name); + rules->set_list_element_type(std::move(ref)); + params.push_back(std::move(rules)); + } + { + auto callback = base::MakeUnique<ArgumentSpec>(ArgumentType::FUNCTION); + callback->set_optional(true); + params.push_back(std::move(callback)); + } + + return base::MakeUnique<APISignature>(std::move(params)); +} + +} // namespace + +gin::WrapperInfo DeclarativeEvent::kWrapperInfo = {gin::kEmbedderNativeGin}; + +DeclarativeEvent::DeclarativeEvent( + const std::string& name, + APITypeReferenceMap* type_refs, + APIRequestHandler* request_handler, + const std::vector<std::string>& actions_list, + const std::vector<std::string>& conditions_list) + : event_name_(name), + type_refs_(type_refs), + request_handler_(request_handler) { + // In declarative events, the specification of the rules can change. This only + // matters for the events.addRules function. Check whether or not a + // specialized version for this event exists, and, if not, create it. + std::string add_rules_name = name + ".addRules"; + if (!type_refs->HasTypeMethodSignature(add_rules_name)) { + // Create the specific rules spec and cache it under this type. This will + // result in e.g. declarativeContent.onPageChanged.Rule, since the Rule + // schema is only used for this event. + std::unique_ptr<ArgumentSpec> rules_spec = + BuildRulesSpec(actions_list, conditions_list); + std::string rule_type_name = name + ".Rule"; + type_refs->AddSpec(rule_type_name, std::move(rules_spec)); + // Build a custom signature for the method, since this would be different + // than adding rules for a different event. + std::unique_ptr<APISignature> rules_signature = + BuildAddRulesSignature(rule_type_name); + type_refs->AddTypeMethodSignature(add_rules_name, + std::move(rules_signature)); + } +} + +DeclarativeEvent::~DeclarativeEvent() {} + +gin::ObjectTemplateBuilder DeclarativeEvent::GetObjectTemplateBuilder( + v8::Isolate* isolate) { + return Wrappable<DeclarativeEvent>::GetObjectTemplateBuilder(isolate) + .SetMethod("addRules", &DeclarativeEvent::AddRules) + .SetMethod("removeRules", &DeclarativeEvent::RemoveRules) + .SetMethod("getRules", &DeclarativeEvent::GetRules); +} + +void DeclarativeEvent::AddRules(gin::Arguments* arguments) { + // When adding rules, we use the signature we built for this event (e.g. + // declarativeContent.onPageChanged.addRules). + HandleFunction(event_name_ + ".addRules", "events.addRules", arguments); +} + +void DeclarativeEvent::RemoveRules(gin::Arguments* arguments) { + // The signatures for removeRules are always the same (they don't use the + // event's Rule schema). + HandleFunction("events.Event.removeRules", "events.removeRules", arguments); +} + +void DeclarativeEvent::GetRules(gin::Arguments* arguments) { + // The signatures for getRules are always the same (they don't use the + // event's Rule schema). + HandleFunction("events.Event.getRules", "events.getRules", arguments); +} + +void DeclarativeEvent::HandleFunction(const std::string& signature_name, + const std::string& request_name, + gin::Arguments* arguments) { + v8::Isolate* isolate = arguments->isolate(); + v8::HandleScope handle_scope(isolate); + v8::Local<v8::Object> holder; + CHECK(arguments->GetHolder(&holder)); + v8::Local<v8::Context> context = holder->CreationContext(); + + // TODO(devlin): This pattern is getting common. We should probably pull it + // out somewhere. + std::vector<v8::Local<v8::Value>> argument_list; + if (arguments->Length() > 0) { + // Just copying handles should never fail. + CHECK(arguments->GetRemaining(&argument_list)); + } + + // The events API has two undocumented parameters for each function: the name + // of the event, and the "webViewInstanceId". Currently, stub 0 for webview + // instance id. + // TODO(devlin): We'll need to fix that to get it to work with webviews. + // Longer term, it would be *great* to just factor that out entirely (can we + // not get that information on the browser side? Investigate). + argument_list.insert(argument_list.begin(), + {gin::StringToSymbol(isolate, event_name_), + v8::Integer::New(isolate, 0)}); + + std::unique_ptr<base::ListValue> converted_arguments; + v8::Local<v8::Function> callback; + std::string error; + const APISignature* signature = + type_refs_->GetTypeMethodSignature(signature_name); + DCHECK(signature); + if (!signature->ParseArgumentsToJSON(context, argument_list, *type_refs_, + &converted_arguments, &callback, + &error)) { + arguments->ThrowTypeError("Invalid invocation"); + return; + } + + request_handler_->StartRequest(context, request_name, + std::move(converted_arguments), callback, + v8::Local<v8::Function>()); +} + +} // namespace extensions
diff --git a/extensions/renderer/declarative_event.h b/extensions/renderer/declarative_event.h new file mode 100644 index 0000000..f51eeba --- /dev/null +++ b/extensions/renderer/declarative_event.h
@@ -0,0 +1,60 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EXTENSIONS_RENDERER_DECLARATIVE_EVENT_H_ +#define EXTENSIONS_RENDERER_DECLARATIVE_EVENT_H_ + +#include <vector> + +#include "gin/wrappable.h" +#include "v8/include/v8.h" + +namespace gin { +class Arguments; +} + +namespace extensions { +class APIRequestHandler; +class APITypeReferenceMap; + +// A gin::Wrappable object for declarative events (i.e., events that support +// "rules"). Unlike regular events, these do not have associated listeners, and +// extensions register an action to perform when the event happens. +class DeclarativeEvent final : public gin::Wrappable<DeclarativeEvent> { + public: + DeclarativeEvent(const std::string& name, + APITypeReferenceMap* type_refs, + APIRequestHandler* request_handler, + const std::vector<std::string>& actions_list, + const std::vector<std::string>& conditions_list); + ~DeclarativeEvent() override; + + static gin::WrapperInfo kWrapperInfo; + + // gin::Wrappable: + gin::ObjectTemplateBuilder GetObjectTemplateBuilder( + v8::Isolate* isolate) final; + + private: + // Bound methods for the JS object. + void AddRules(gin::Arguments* arguments); + void RemoveRules(gin::Arguments* arguments); + void GetRules(gin::Arguments* arguments); + + void HandleFunction(const std::string& signature_name, + const std::string& request_name, + gin::Arguments* arguments); + + std::string event_name_; + + APITypeReferenceMap* type_refs_; + + APIRequestHandler* request_handler_; + + DISALLOW_COPY_AND_ASSIGN(DeclarativeEvent); +}; + +} // namespace extensions + +#endif // EXTENSIONS_RENDERER_DECLARATIVE_EVENT_H_
diff --git a/extensions/renderer/declarative_event_unittest.cc b/extensions/renderer/declarative_event_unittest.cc new file mode 100644 index 0000000..63784c55 --- /dev/null +++ b/extensions/renderer/declarative_event_unittest.cc
@@ -0,0 +1,262 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/renderer/declarative_event.h" + +#include <memory> + +#include "base/bind.h" +#include "base/memory/ptr_util.h" +#include "base/strings/stringprintf.h" +#include "base/values.h" +#include "extensions/common/extension_api.h" +#include "extensions/renderer/api_binding_test.h" +#include "extensions/renderer/api_binding_test_util.h" +#include "extensions/renderer/api_bindings_system.h" +#include "extensions/renderer/api_bindings_system_unittest.h" +#include "extensions/renderer/api_last_error.h" +#include "extensions/renderer/api_request_handler.h" +#include "extensions/renderer/api_type_reference_map.h" +#include "extensions/renderer/argument_spec.h" +#include "gin/handle.h" + +namespace extensions { + +namespace { + +const char kDeclarativeAPIName[] = "alpha"; +const char kDeclarativeAPISpec[] = + "{" + " 'types': [{" + " 'id': 'alpha.objRef'," + " 'type': 'object'," + " 'properties': {" + " 'prop1': {'type': 'string'}," + " 'prop2': {'type': 'integer', 'optional': true}" + " }" + " }, {" + " 'id': 'alpha.enumRef'," + " 'type': 'string'," + " 'enum': ['cat', 'dog']" + " }]," + " 'events': [{" + " 'name': 'declarativeEvent'," + " 'options': {" + " 'supportsRules': true," + " 'supportsListeners': false," + " 'actions': ['alpha.enumRef']," + " 'conditions': ['alpha.objRef']" + " }" + " }]" + "}"; + +bool AllowAllAPIs(const std::string& name) { + return true; +} + +} // namespace + +class DeclarativeEventTest : public APIBindingTest { + public: + DeclarativeEventTest() + : type_refs_(APITypeReferenceMap::InitializeTypeCallback()) {} + ~DeclarativeEventTest() override {} + + void OnRequest(std::unique_ptr<APIRequestHandler::Request> request, + v8::Local<v8::Context> context) { + last_request_ = std::move(request); + } + + APITypeReferenceMap* type_refs() { return &type_refs_; } + APIRequestHandler* request_handler() { return request_handler_.get(); } + APIRequestHandler::Request* last_request() { return last_request_.get(); } + void reset_last_request() { last_request_.reset(); } + + private: + void SetUp() override { + APIBindingTest::SetUp(); + + { + auto action1 = base::MakeUnique<ArgumentSpec>(ArgumentType::STRING); + action1->set_enum_values({"actionA"}); + type_refs_.AddSpec("action1", std::move(action1)); + auto action2 = base::MakeUnique<ArgumentSpec>(ArgumentType::STRING); + action2->set_enum_values({"actionB"}); + type_refs_.AddSpec("action2", std::move(action2)); + } + + { + auto condition = base::MakeUnique<ArgumentSpec>(ArgumentType::OBJECT); + auto prop = base::MakeUnique<ArgumentSpec>(ArgumentType::STRING); + ArgumentSpec::PropertiesMap props; + props["url"] = std::move(prop); + condition->set_properties(std::move(props)); + type_refs_.AddSpec("condition", std::move(condition)); + } + + request_handler_ = base::MakeUnique<APIRequestHandler>( + base::Bind(&DeclarativeEventTest::OnRequest, base::Unretained(this)), + base::Bind(&RunFunctionOnGlobalAndIgnoreResult), + APILastError(APILastError::GetParent())); + } + + void TearDown() override { + request_handler_.reset(); + APIBindingTest::TearDown(); + } + + APITypeReferenceMap type_refs_; + std::unique_ptr<APIRequestHandler> request_handler_; + std::unique_ptr<APIRequestHandler::Request> last_request_; + + DISALLOW_COPY_AND_ASSIGN(DeclarativeEventTest); +}; + +// Test that the rules schema behaves properly. This is designed to be more of +// a sanity check than a comprehensive test, since it mostly delegates the logic +// out to ArgumentSpec. +TEST_F(DeclarativeEventTest, TestRulesSchema) { + v8::HandleScope handle_scope(isolate()); + v8::Local<v8::Context> context = MainContext(); + + gin::Handle<DeclarativeEvent> emitter = gin::CreateHandle( + context->GetIsolate(), + new DeclarativeEvent("declEvent", type_refs(), request_handler(), + {"action1", "action2"}, {"condition"})); + + v8::Local<v8::Value> emitter_value = emitter.ToV8(); + + const char kAddRules[] = + "(function(event) {\n" + " var rules = %s;\n" + " event.addRules(rules);\n" + "})"; + + { + const char kGoodRules[] = + "[{id: 'rule', tags: ['tag']," + " actions: ['actionA']," + " conditions: [{url: 'example.com'}]," + " priority: 1}]"; + v8::Local<v8::Function> function = + FunctionFromString(context, base::StringPrintf(kAddRules, kGoodRules)); + v8::Local<v8::Value> args[] = {emitter_value}; + RunFunctionOnGlobal(function, context, arraysize(args), args); + + EXPECT_TRUE(last_request()); + reset_last_request(); + } + + { + // Invalid action. + const char kBadRules1[] = + "[{id: 'rule', tags: ['tag']," + " actions: ['notAnAction']," + " conditions: [{url: 'example.com'}]," + " priority: 1}]"; + // Missing required property: conditions. + const char kBadRules2[] = + "[{id: 'rule', tags: ['tag']," + " actions: ['actionA']," + " priority: 1}]"; + // Missing required property: actions. + const char kBadRules3[] = + "[{id: 'rule', tags: ['tag']," + " conditions: [{url: 'example.com'}]," + " priority: 1}]"; + for (const char* rules : {kBadRules1, kBadRules2, kBadRules3}) { + v8::Local<v8::Function> function = + FunctionFromString(context, base::StringPrintf(kAddRules, rules)); + v8::Local<v8::Value> args[] = {emitter_value}; + RunFunctionAndExpectError(function, context, arraysize(args), args, + "Uncaught TypeError: Invalid invocation"); + EXPECT_FALSE(last_request()) << rules; + reset_last_request(); + } + } +} + +class DeclarativeEventWithSchemaTest : public APIBindingsSystemTest { + protected: + DeclarativeEventWithSchemaTest() {} + ~DeclarativeEventWithSchemaTest() override {} + + std::vector<FakeSpec> GetAPIs() override { + // events.removeRules and events.getRules are specified in the events.json + // schema, so we need to load that. + base::StringPiece events_schema = + ExtensionAPI::GetSharedInstance()->GetSchemaStringPiece("events"); + return {{kDeclarativeAPIName, kDeclarativeAPISpec}, + {"events", events_schema.data()}}; + } +}; + +// Test all methods of declarative events. +TEST_F(DeclarativeEventWithSchemaTest, TestAllMethods) { + v8::HandleScope handle_scope(isolate()); + v8::Local<v8::Context> context = MainContext(); + + v8::Local<v8::Object> api = bindings_system()->CreateAPIInstance( + kDeclarativeAPIName, context, isolate(), base::Bind(&AllowAllAPIs), + nullptr); + ASSERT_FALSE(api.IsEmpty()); + + v8::Local<v8::Value> declarative_event = + GetPropertyFromObject(api, context, "declarativeEvent"); + ASSERT_FALSE(declarative_event.IsEmpty()); + ASSERT_TRUE(declarative_event->IsObject()); + v8::Local<v8::Value> add_rules = GetPropertyFromObject( + declarative_event.As<v8::Object>(), context, "addRules"); + ASSERT_FALSE(add_rules.IsEmpty()); + ASSERT_TRUE(add_rules->IsFunction()); + + v8::Local<v8::Value> args[] = {api}; + + { + const char kAddRules[] = + R"((function(obj) { + obj.declarativeEvent.addRules( + [{ + id: 'rule', + conditions: [{prop1: 'property'}], + actions: ['cat'], + }]); + }))"; + v8::Local<v8::Function> add_rules = FunctionFromString(context, kAddRules); + RunFunctionOnGlobal(add_rules, context, arraysize(args), args); + ValidateLastRequest("events.addRules", + "['alpha.declarativeEvent',0," + "[{'actions':['cat']," + "'conditions':[{'prop1':'property'}]," + "'id':'rule'}]]"); + reset_last_request(); + } + + { + const char kRemoveRules[] = + "(function(obj) {\n" + " obj.declarativeEvent.removeRules(['rule']);\n" + "})"; + v8::Local<v8::Function> remove_rules = + FunctionFromString(context, kRemoveRules); + RunFunctionOnGlobal(remove_rules, context, arraysize(args), args); + ValidateLastRequest("events.removeRules", + "['alpha.declarativeEvent',0,['rule']]"); + reset_last_request(); + } + + { + const char kGetRules[] = + "(function(obj) {\n" + " obj.declarativeEvent.getRules(function() {});\n" + "})"; + v8::Local<v8::Function> remove_rules = + FunctionFromString(context, kGetRules); + RunFunctionOnGlobal(remove_rules, context, arraysize(args), args); + ValidateLastRequest("events.getRules", "['alpha.declarativeEvent',0,null]"); + reset_last_request(); + } +} + +} // namespace extensions
diff --git a/gin/BUILD.gn b/gin/BUILD.gn index 6ad0eac4..c7d5ee44 100644 --- a/gin/BUILD.gn +++ b/gin/BUILD.gn
@@ -159,6 +159,7 @@ test("gin_unittests") { sources = [ + "arguments_unittest.cc", "converter_unittest.cc", "interceptor_unittest.cc", "modules/module_registry_unittest.cc",
diff --git a/gin/arguments.cc b/gin/arguments.cc index 8bd9930e..600a811 100644 --- a/gin/arguments.cc +++ b/gin/arguments.cc
@@ -32,6 +32,10 @@ return (*info_)[next_]; } +v8::Local<v8::Context> Arguments::GetHolderCreationContext() { + return info_->Holder()->CreationContext(); +} + std::string V8TypeAsString(v8::Local<v8::Value> value) { if (value.IsEmpty()) return "<empty handle>";
diff --git a/gin/arguments.h b/gin/arguments.h index 55f9f44..99a5d16d 100644 --- a/gin/arguments.h +++ b/gin/arguments.h
@@ -74,6 +74,9 @@ info_->GetReturnValue().Set(v8_value); } + // Returns the creation context of the Holder. + v8::Local<v8::Context> GetHolderCreationContext(); + // Always check the return value whether the handle is empty before // dereferencing the handle. v8::Local<v8::Value> PeekNext() const;
diff --git a/gin/arguments_unittest.cc b/gin/arguments_unittest.cc new file mode 100644 index 0000000..d2b5136 --- /dev/null +++ b/gin/arguments_unittest.cc
@@ -0,0 +1,67 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gin/arguments.h" + +#include "base/bind.h" +#include "gin/converter.h" +#include "gin/object_template_builder.h" +#include "gin/public/isolate_holder.h" +#include "gin/test/v8_test.h" +#include "v8/include/v8.h" + +namespace gin { + +using ArgumentsTest = V8Test; + +// Test that Arguments::GetHolderCreationContext returns the proper context. +TEST_F(ArgumentsTest, TestArgumentsHolderCreationContext) { + v8::Isolate* isolate = instance_->isolate(); + v8::HandleScope handle_scope(isolate); + + v8::Local<v8::Context> creation_context = context_.Get(instance_->isolate()); + + auto check_creation_context = [](v8::Local<v8::Context> expected_context, + gin::Arguments* arguments) { + EXPECT_EQ(expected_context, arguments->GetHolderCreationContext()); + }; + + // Create an object that will compare GetHolderCreationContext() with + // |creation_context|. + v8::Local<v8::ObjectTemplate> object_template = + ObjectTemplateBuilder(isolate) + .SetMethod("checkCreationContext", + base::Bind(check_creation_context, creation_context)) + .Build(); + + v8::Local<v8::Object> object = + object_template->NewInstance(creation_context).ToLocalChecked(); + + // Call checkCreationContext() on the generated object using the passed-in + // context as the current context. + auto test_context = [object, isolate](v8::Local<v8::Context> context) { + v8::Context::Scope context_scope(context); + const char kCallFunction[] = "(function(o) { o.checkCreationContext(); })"; + v8::Local<v8::Script> script = + v8::Script::Compile(context, StringToV8(isolate, kCallFunction)) + .ToLocalChecked(); + v8::Local<v8::Function> function; + ASSERT_TRUE(ConvertFromV8(isolate, script->Run(), &function)); + v8::Local<v8::Value> args[] = {object}; + function->Call(v8::Undefined(isolate), arraysize(args), args); + }; + + // Test calling in the creation context. + test_context(creation_context); + + { + // Create a second context, and test calling in that. The creation context + // should be the same (even though the current context has changed). + v8::Local<v8::Context> second_context = + v8::Context::New(isolate, nullptr, v8::Local<v8::ObjectTemplate>()); + test_context(second_context); + } +} + +} // namespace gin
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index e9d93dab..d726a63 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -107,7 +107,9 @@ "command_buffer/client/gles2_interface_stub.cc", "command_buffer/client/gles2_interface_stub.h", "command_buffer/service/error_state_mock.cc", + "command_buffer/service/error_state_mock.h", "command_buffer/service/gles2_cmd_decoder_mock.cc", + "command_buffer/service/gles2_cmd_decoder_mock.h", "test_message_loop_type.h", ]
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h index 4af50ad6..f4ba546 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -215,8 +215,6 @@ GLsizei count, const GLuint* indices, GLenum pname, - GLsizei bufSize, - GLsizei* length, GLint* params); error::Error DoGetAttachedShaders(GLuint program, GLsizei maxcount, @@ -358,7 +356,6 @@ GLsizei count, const char* const* names, GLsizei bufSize, - GLsizei* length, GLuint* indices); error::Error DoGetUniformLocation(GLuint program, const char* name,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc index b9da39a..fd136f5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -1015,7 +1015,24 @@ GLuint program, GLuint index, std::string* name) { - NOTIMPLEMENTED(); + FlushErrors(); + + GLuint program_service_id = GetProgramServiceID(program, resources_); + GLint max_name_length = 0; + glGetProgramiv(program_service_id, GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, + &max_name_length); + + if (FlushErrors()) { + return error::kNoError; + } + + std::vector<GLchar> buffer(max_name_length, 0); + GLsizei length = 0; + glGetActiveUniformBlockName(program_service_id, index, max_name_length, + &length, buffer.data()); + DCHECK(length <= max_name_length); + *name = length > 0 ? std::string(buffer.data(), length) : std::string(); + return error::kNoError; } @@ -1024,10 +1041,9 @@ GLsizei count, const GLuint* indices, GLenum pname, - GLsizei bufSize, - GLsizei* length, GLint* params) { - NOTIMPLEMENTED(); + glGetActiveUniformsiv(GetProgramServiceID(program, resources_), count, + indices, pname, params); return error::kNoError; } @@ -1036,7 +1052,8 @@ GLsizei maxcount, GLsizei* count, GLuint* shaders) { - NOTIMPLEMENTED(); + glGetAttachedShaders(GetProgramServiceID(program, resources_), maxcount, + count, shaders); return error::kNoError; } @@ -1214,14 +1231,21 @@ error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoLog( GLuint program, std::string* infolog) { + FlushErrors(); GLint info_log_len = 0; glGetProgramiv(GetProgramServiceID(program, resources_), GL_INFO_LOG_LENGTH, &info_log_len); + if (FlushErrors()) { + return error::kNoError; + } + std::vector<char> buffer(info_log_len, 0); + GLsizei length = 0; glGetProgramInfoLog(GetProgramServiceID(program, resources_), info_log_len, - nullptr, buffer.data()); - *infolog = info_log_len > 0 ? std::string(buffer.data()) : std::string(); + &length, buffer.data()); + DCHECK(length <= info_log_len); + *infolog = length > 0 ? std::string(buffer.data(), length) : std::string(); return error::kNoError; } @@ -1270,12 +1294,20 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderInfoLog( GLuint shader, std::string* infolog) { + FlushErrors(); + GLuint service_id = GetShaderServiceID(shader, resources_); GLint info_log_len = 0; glGetShaderiv(service_id, GL_INFO_LOG_LENGTH, &info_log_len); + if (FlushErrors()) { + return error::kNoError; + } + std::vector<char> buffer(info_log_len, 0); - glGetShaderInfoLog(service_id, info_log_len, nullptr, buffer.data()); - *infolog = info_log_len > 0 ? std::string(buffer.data()) : std::string(); + GLsizei length = 0; + glGetShaderInfoLog(service_id, info_log_len, &length, buffer.data()); + DCHECK(length <= info_log_len); + *infolog = length > 0 ? std::string(buffer.data(), length) : std::string(); return error::kNoError; } @@ -1294,7 +1326,23 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderSource( GLuint shader, std::string* source) { - NOTIMPLEMENTED(); + FlushErrors(); + + GLuint shader_service_id = GetShaderServiceID(shader, resources_); + GLint shader_source_length = 0; + glGetShaderiv(shader_service_id, GL_SHADER_SOURCE_LENGTH, + &shader_source_length); + if (FlushErrors()) { + return error::kNoError; + } + + std::vector<char> buffer(shader_source_length, 0); + GLsizei length = 0; + glGetShaderSource(shader_service_id, shader_source_length, &length, + buffer.data()); + DCHECK(length <= shader_source_length); + *source = shader_source_length > 0 ? std::string(buffer.data(), length) + : std::string(); return error::kNoError; } @@ -1376,7 +1424,8 @@ GLuint program, const char* name, GLint* index) { - NOTIMPLEMENTED(); + *index = + glGetUniformBlockIndex(GetProgramServiceID(program, resources_), name); return error::kNoError; } @@ -1421,9 +1470,9 @@ GLsizei count, const char* const* names, GLsizei bufSize, - GLsizei* length, GLuint* indices) { - NOTIMPLEMENTED(); + glGetUniformIndices(GetProgramServiceID(program, resources_), count, names, + indices); return error::kNoError; } @@ -1535,7 +1584,6 @@ error::Error GLES2DecoderPassthroughImpl::DoIsBuffer(GLuint buffer, uint32_t* result) { - NOTIMPLEMENTED(); *result = glIsBuffer(GetBufferServiceID(buffer, resources_, false)); return error::kNoError; } @@ -1561,7 +1609,6 @@ error::Error GLES2DecoderPassthroughImpl::DoIsRenderbuffer(GLuint renderbuffer, uint32_t* result) { - NOTIMPLEMENTED(); *result = glIsRenderbufferEXT( GetRenderbufferServiceID(renderbuffer, resources_, false)); return error::kNoError; @@ -1722,7 +1769,11 @@ GLenum binaryformat, const void* binary, GLsizei length) { - NOTIMPLEMENTED(); + std::vector<GLuint> service_shaders(n, 0); + for (GLsizei i = 0; i < n; i++) { + service_shaders[i] = GetShaderServiceID(shaders[i], resources_); + } + glShaderBinary(n, service_shaders.data(), binaryformat, binary, length); return error::kNoError; } @@ -2380,7 +2431,9 @@ GLuint texture, GLint level, GLsizei samples) { - NOTIMPLEMENTED(); + glFramebufferTexture2DMultisampleEXT( + target, attachment, textarget, + GetTextureServiceID(texture, resources_, false), level, samples); return error::kNoError; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc index 3e08b52..2989ccd 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers.cc
@@ -303,15 +303,13 @@ return error::kInvalidArguments; } - GLsizei bufsize = uniformCount; - GLsizei length = 0; - error::Error error = DoGetActiveUniformsiv(program, uniformCount, indices, - pname, bufsize, &length, params); + error::Error error = + DoGetActiveUniformsiv(program, uniformCount, indices, pname, params); if (error != error::kNoError) { return error; } - result->SetNumResults(length); + result->SetNumResults(uniformCount); return error::kNoError; } @@ -754,16 +752,12 @@ if (result->size != 0) { return error::kInvalidArguments; } - GLsizei length = 0; error::Error error = - DoGetUniformIndices(program, count, &names[0], count, &length, indices); + DoGetUniformIndices(program, count, &names[0], count, indices); if (error != error::kNoError) { return error; } - if (length != count) { - return error::kOutOfBounds; - } - result->SetNumResults(length); + result->SetNumResults(count); return error::kNoError; }
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn index 6debe2edbc..a6a47e7 100644 --- a/gpu/config/BUILD.gn +++ b/gpu/config/BUILD.gn
@@ -18,6 +18,16 @@ } } +# This needs to be a small target, because it links into both chrome.exe and +# chrome.dll targets. If this target grows, that will lead to a size regression. +# See https://crbug.com/703622 +source_set("crash_keys") { + sources = [ + "gpu_crash_keys.cc", + "gpu_crash_keys.h", + ] +} + source_set("config_sources") { # External code should depend on this via //gpu/config above rather than # depending on this directly or the component build will break. @@ -69,6 +79,7 @@ ] deps = [ + ":crash_keys", "//base", "//third_party/re2", "//ui/gl", @@ -92,13 +103,7 @@ ] } } - if (is_linux) { + if (is_linux || is_mac) { deps += [ "//third_party/angle:angle_gpu_info_util" ] } - if (is_mac) { - libs = [ - "IOKit.framework", - "CoreFoundation.framework", - ] - } }
diff --git a/gpu/config/gpu_crash_keys.cc b/gpu/config/gpu_crash_keys.cc new file mode 100644 index 0000000..427bb950 --- /dev/null +++ b/gpu/config/gpu_crash_keys.cc
@@ -0,0 +1,23 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/config/gpu_crash_keys.h" + +namespace gpu { +namespace crash_keys { +#if !defined(OS_ANDROID) +const char kGPUVendorID[] = "gpu-venid"; +const char kGPUDeviceID[] = "gpu-devid"; +#endif +const char kGPUDriverVersion[] = "gpu-driver"; +const char kGPUPixelShaderVersion[] = "gpu-psver"; +const char kGPUVertexShaderVersion[] = "gpu-vsver"; +#if defined(OS_MACOSX) +const char kGPUGLVersion[] = "gpu-glver"; +#elif defined(OS_POSIX) +const char kGPUVendor[] = "gpu-gl-vendor"; +const char kGPURenderer[] = "gpu-gl-renderer"; +#endif +} // namespace crash_keys +} // namespace gpu
diff --git a/gpu/config/gpu_crash_keys.h b/gpu/config/gpu_crash_keys.h new file mode 100644 index 0000000..b7ee75c --- /dev/null +++ b/gpu/config/gpu_crash_keys.h
@@ -0,0 +1,30 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_CONFIG_GPU_CRASH_KEYS_H_ +#define GPU_CONFIG_GPU_CRASH_KEYS_H_ + +#include "build/build_config.h" + +namespace gpu { +namespace crash_keys { + +// Keys that can be used for crash reporting. +#if !defined(OS_ANDROID) +extern const char kGPUVendorID[]; +extern const char kGPUDeviceID[]; +#endif +extern const char kGPUDriverVersion[]; +extern const char kGPUPixelShaderVersion[]; +extern const char kGPUVertexShaderVersion[]; +#if defined(OS_MACOSX) +extern const char kGPUGLVersion[]; +#elif defined(OS_POSIX) +extern const char kGPUVendor[]; +extern const char kGPURenderer[]; +#endif +} // namespace crash_keys +} // namespace gpu + +#endif // GPU_CONFIG_GPU_CRASH_KEYS_H_
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc index 6f8068e..5a77685 100644 --- a/gpu/config/gpu_info_collector.cc +++ b/gpu/config/gpu_info_collector.cc
@@ -307,11 +307,16 @@ void FillGPUInfoFromSystemInfo(GPUInfo* gpu_info, angle::SystemInfo* system_info) { + DCHECK(system_info->primaryGPUIndex >= 0); + angle::GPUDeviceInfo* primary = &system_info->gpus[system_info->primaryGPUIndex]; gpu_info->gpu.vendor_id = primary->vendorId; gpu_info->gpu.device_id = primary->deviceId; + if (system_info->primaryGPUIndex == system_info->activeGPUIndex) { + gpu_info->gpu.active = true; + } gpu_info->driver_vendor = std::move(primary->driverVendor); gpu_info->driver_version = std::move(primary->driverVersion); @@ -325,6 +330,9 @@ GPUInfo::GPUDevice device; device.vendor_id = system_info->gpus[i].vendorId; device.device_id = system_info->gpus[i].deviceId; + if (static_cast<int>(i) == system_info->activeGPUIndex) { + device.active = true; + } gpu_info->secondary_gpus.push_back(device); }
diff --git a/gpu/config/gpu_info_collector_linux.cc b/gpu/config/gpu_info_collector_linux.cc index fd440f3..a5d1b66 100644 --- a/gpu/config/gpu_info_collector_linux.cc +++ b/gpu/config/gpu_info_collector_linux.cc
@@ -2,29 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stddef.h> -#include <stdint.h> - -#include <vector> - #include "base/command_line.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "base/strings/string_piece.h" #include "base/strings/string_split.h" -#include "base/strings/string_tokenizer.h" -#include "base/strings/string_util.h" #include "base/trace_event/trace_event.h" #include "gpu/config/gpu_info_collector.h" #include "gpu/config/gpu_switches.h" #include "third_party/angle/src/gpu_info_util/SystemInfo.h" #include "third_party/re2/src/re2/re2.h" -#include "ui/gl/gl_bindings.h" -#include "ui/gl/gl_context.h" -#include "ui/gl/gl_implementation.h" -#include "ui/gl/gl_surface.h" -#include "ui/gl/gl_switches.h" namespace gpu {
diff --git a/gpu/config/gpu_info_collector_mac.mm b/gpu/config/gpu_info_collector_mac.mm index 7dcde19..ab6f732 100644 --- a/gpu/config/gpu_info_collector_mac.mm +++ b/gpu/config/gpu_info_collector_mac.mm
@@ -4,174 +4,11 @@ #include "gpu/config/gpu_info_collector.h" -#include <vector> - -#include "base/logging.h" -#include "base/mac/mac_util.h" -#include "base/mac/scoped_cftyperef.h" -#include "base/mac/scoped_ioobject.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_util.h" -#include "base/strings/sys_string_conversions.h" #include "base/trace_event/trace_event.h" -#include "ui/gl/gl_bindings.h" -#include "ui/gl/gl_context.h" -#include "ui/gl/gl_implementation.h" - -#import <Cocoa/Cocoa.h> -#import <Foundation/Foundation.h> -#import <IOKit/IOKitLib.h> -#include <stddef.h> -#include <stdint.h> +#include "third_party/angle/src/gpu_info_util/SystemInfo.h" namespace gpu { -namespace { - -const UInt32 kVendorIDIntel = 0x8086; -const UInt32 kVendorIDNVidia = 0x10de; -const UInt32 kVendorIDAMD = 0x1002; - -// Return 0 if we couldn't find the property. -// The property values we use should not be 0, so it's OK to use 0 as failure. -UInt32 GetEntryProperty(io_registry_entry_t entry, CFStringRef property_name) { - base::ScopedCFTypeRef<CFDataRef> data_ref( - static_cast<CFDataRef>(IORegistryEntrySearchCFProperty( - entry, - kIOServicePlane, - property_name, - kCFAllocatorDefault, - kIORegistryIterateRecursively | kIORegistryIterateParents))); - if (!data_ref) - return 0; - - UInt32 value = 0; - const UInt32* value_pointer = - reinterpret_cast<const UInt32*>(CFDataGetBytePtr(data_ref)); - if (value_pointer != NULL) - value = *value_pointer; - return value; -} - -// CGDisplayIOServicePort is deprecated as of macOS 10.9, but has no -// replacement. -// https://crbug.com/650837 -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - -// Find the info of the current GPU. -GPUInfo::GPUDevice GetActiveGPU() { - GPUInfo::GPUDevice gpu; - io_registry_entry_t dsp_port = CGDisplayIOServicePort(kCGDirectMainDisplay); - gpu.vendor_id = GetEntryProperty(dsp_port, CFSTR("vendor-id")); - gpu.device_id = GetEntryProperty(dsp_port, CFSTR("device-id")); - return gpu; -} - -#pragma clang diagnostic pop - -// Scan IO registry for PCI video cards. -CollectInfoResult CollectPCIVideoCardInfo(GPUInfo* gpu_info) { - DCHECK(gpu_info); - GPUInfo::GPUDevice active_gpu = GetActiveGPU(); - - // Collect all GPUs' info. - // match_dictionary will be consumed by IOServiceGetMatchingServices, no need - // to release it. - CFMutableDictionaryRef match_dictionary = IOServiceMatching("IOPCIDevice"); - io_iterator_t entry_iterator; - std::vector<GPUInfo::GPUDevice> gpu_list; - if (IOServiceGetMatchingServices(kIOMasterPortDefault, - match_dictionary, - &entry_iterator) == kIOReturnSuccess) { - - base::mac::ScopedIOObject<io_registry_entry_t> entry; - while (entry.reset(IOIteratorNext(entry_iterator)), entry) { - GPUInfo::GPUDevice gpu; - if (GetEntryProperty(entry, CFSTR("class-code")) != 0x30000) { - // 0x30000 : DISPLAY_VGA - continue; - } - gpu.vendor_id = GetEntryProperty(entry, CFSTR("vendor-id")); - gpu.device_id = GetEntryProperty(entry, CFSTR("device-id")); - if (gpu.vendor_id && gpu.device_id) { - if (gpu.vendor_id == active_gpu.vendor_id && - gpu.device_id == active_gpu.device_id) { - gpu.active = true; - } - gpu_list.push_back(gpu); - } - } - IOObjectRelease(entry_iterator); - } - - switch (gpu_list.size()) { - case 0: - return kCollectInfoNonFatalFailure; - case 1: - gpu_info->gpu = gpu_list[0]; - break; - case 2: - { - int integrated = -1; - int discrete = -1; - if (gpu_list[0].vendor_id == kVendorIDIntel) - integrated = 0; - else if (gpu_list[1].vendor_id == kVendorIDIntel) - integrated = 1; - if (integrated >= 0) { - switch (gpu_list[1 - integrated].vendor_id) { - case kVendorIDAMD: - gpu_info->amd_switchable = true; - discrete = 1 - integrated; - break; - case kVendorIDNVidia: - gpu_info->optimus = true; - discrete = 1 - integrated; - break; - default: - break; - } - } - if (integrated >= 0 && discrete >= 0) { - // We always put discrete GPU as primary for blacklisting purpose. - gpu_info->gpu = gpu_list[discrete]; - gpu_info->secondary_gpus.push_back(gpu_list[integrated]); - break; - } - // If it's not optimus or amd_switchable, we put the current GPU as - // primary. Fall through to default. - } - default: - { - size_t current = gpu_list.size(); - for (size_t i = 0; i < gpu_list.size(); ++i) { - if (gpu_list[i].active) { - current = i; - break; - } - } - if (current == gpu_list.size()) { - // If we fail to identify the current GPU, select any one as primary. - current = 0; - } - for (size_t i = 0; i < gpu_list.size(); ++i) { - if (i == current) - gpu_info->gpu = gpu_list[i]; - else - gpu_info->secondary_gpus.push_back(gpu_list[i]); - } - } - break; - } - if (gpu_info->gpu.vendor_id == 0 || gpu_info->gpu.device_id == 0) - return kCollectInfoNonFatalFailure; - return kCollectInfoSuccess; -} - -} // namespace anonymous - CollectInfoResult CollectContextGraphicsInfo(GPUInfo* gpu_info) { DCHECK(gpu_info); @@ -185,16 +22,15 @@ CollectInfoResult CollectBasicGraphicsInfo(GPUInfo* gpu_info) { DCHECK(gpu_info); - int32_t model_major = 0, model_minor = 0; - base::mac::ParseModelIdentifier(base::mac::GetModelIdentifier(), - &gpu_info->machine_model_name, - &model_major, &model_minor); - gpu_info->machine_model_version = - base::IntToString(model_major) + "." + base::IntToString(model_minor); + angle::SystemInfo system_info; + if (angle::GetSystemInfo(&system_info)) { + gpu_info->basic_info_state = kCollectInfoSuccess; + FillGPUInfoFromSystemInfo(gpu_info, &system_info); + } else { + gpu_info->basic_info_state = kCollectInfoNonFatalFailure; + } - CollectInfoResult result = CollectPCIVideoCardInfo(gpu_info); - gpu_info->basic_info_state = result; - return result; + return gpu_info->basic_info_state; } CollectInfoResult CollectDriverInfoGL(GPUInfo* gpu_info) {
diff --git a/gpu/config/gpu_util.cc b/gpu/config/gpu_util.cc index a305c29..da0d3a8 100644 --- a/gpu/config/gpu_util.cc +++ b/gpu/config/gpu_util.cc
@@ -8,13 +8,16 @@ #include <vector> #include "base/command_line.h" +#include "base/debug/crash_logging.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/sys_info.h" #include "gpu/config/gpu_blacklist.h" #include "gpu/config/gpu_control_list_jsons.h" +#include "gpu/config/gpu_crash_keys.h" #include "gpu/config/gpu_driver_bug_list.h" #include "gpu/config/gpu_feature_type.h" #include "gpu/config/gpu_finch_features.h" @@ -199,4 +202,27 @@ return gpu_feature_info; } +void SetKeysForCrashLogging(const GPUInfo& gpu_info) { +#if !defined(OS_ANDROID) + base::debug::SetCrashKeyValue( + crash_keys::kGPUVendorID, + base::StringPrintf("0x%04x", gpu_info.gpu.vendor_id)); + base::debug::SetCrashKeyValue( + crash_keys::kGPUDeviceID, + base::StringPrintf("0x%04x", gpu_info.gpu.device_id)); +#endif + base::debug::SetCrashKeyValue(crash_keys::kGPUDriverVersion, + gpu_info.driver_version); + base::debug::SetCrashKeyValue(crash_keys::kGPUPixelShaderVersion, + gpu_info.pixel_shader_version); + base::debug::SetCrashKeyValue(crash_keys::kGPUVertexShaderVersion, + gpu_info.vertex_shader_version); +#if defined(OS_MACOSX) + base::debug::SetCrashKeyValue(crash_keys::kGPUGLVersion, gpu_info.gl_version); +#elif defined(OS_POSIX) + base::debug::SetCrashKeyValue(crash_keys::kGPUVendor, gpu_info.gl_vendor); + base::debug::SetCrashKeyValue(crash_keys::kGPURenderer, gpu_info.gl_renderer); +#endif +} + } // namespace gpu
diff --git a/gpu/config/gpu_util.h b/gpu/config/gpu_util.h index f0cd179..b6aa37e 100644 --- a/gpu/config/gpu_util.h +++ b/gpu/config/gpu_util.h
@@ -47,6 +47,8 @@ GetGpuFeatureInfo(const GPUInfo& gpu_info, const base::CommandLine& command_line); +GPU_EXPORT void SetKeysForCrashLogging(const GPUInfo& gpu_info); + } // namespace gpu #endif // GPU_CONFIG_GPU_UTIL_H_
diff --git a/gpu/gles2_conform_support/BUILD.gn b/gpu/gles2_conform_support/BUILD.gn index 272f40bc..650aad5 100644 --- a/gpu/gles2_conform_support/BUILD.gn +++ b/gpu/gles2_conform_support/BUILD.gn
@@ -470,6 +470,7 @@ test("gles2_conform_test") { sources = [ "gles2_conform_test.cc", + "gles2_conform_test.h", ] deps = [ "//base",
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn index ce81b1693..4ff52b4 100644 --- a/gpu/ipc/service/BUILD.gn +++ b/gpu/ipc/service/BUILD.gn
@@ -61,6 +61,7 @@ "//base", "//ipc", "//ui/base", + "//ui/display", "//ui/events:events_base", "//ui/gfx", "//ui/gfx/geometry",
diff --git a/gpu/ipc/service/DEPS b/gpu/ipc/service/DEPS index 0461b20..6c2ec59e 100644 --- a/gpu/ipc/service/DEPS +++ b/gpu/ipc/service/DEPS
@@ -2,6 +2,7 @@ "+third_party/skia", "+ui/accelerated_widget_mac", "+ui/base", + "+ui/display", "+ui/events", "+ui/ozone", ]
diff --git a/gpu/ipc/service/child_window_surface_win.cc b/gpu/ipc/service/child_window_surface_win.cc index 3a44abf..93308d4d 100644 --- a/gpu/ipc/service/child_window_surface_win.cc +++ b/gpu/ipc/service/child_window_surface_win.cc
@@ -11,7 +11,7 @@ #include "gpu/ipc/common/gpu_messages.h" #include "gpu/ipc/service/gpu_channel_manager.h" #include "gpu/ipc/service/gpu_channel_manager_delegate.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/gfx/native_widget_types.h" #include "ui/gl/egl_util.h" #include "ui/gl/gl_context.h"
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc index 7f652134..f7caefec 100644 --- a/gpu/ipc/service/direct_composition_surface_win.cc +++ b/gpu/ipc/service/direct_composition_surface_win.cc
@@ -9,6 +9,7 @@ #include "gpu/ipc/service/gpu_channel_manager.h" #include "gpu/ipc/service/gpu_channel_manager_delegate.h" #include "gpu/ipc/service/switches.h" +#include "ui/display/display_switches.h" #include "ui/gfx/native_widget_types.h" #include "ui/gl/egl_util.h" #include "ui/gl/gl_angle_util_win.h" @@ -167,9 +168,13 @@ void DirectCompositionSurfaceWin::InitializeSurface() { DCHECK(!dcomp_surface_); DCHECK(!swap_chain_); + DXGI_FORMAT output_format = + base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR) + ? DXGI_FORMAT_R16G16B16A16_FLOAT + : DXGI_FORMAT_B8G8R8A8_UNORM; if (enable_dc_layers_) { HRESULT hr = dcomp_device_->CreateSurface( - size_.width(), size_.height(), DXGI_FORMAT_B8G8R8A8_UNORM, + size_.width(), size_.height(), output_format, DXGI_ALPHA_MODE_PREMULTIPLIED, dcomp_surface_.Receive()); has_been_rendered_to_ = false; CHECK(SUCCEEDED(hr)); @@ -184,7 +189,7 @@ DXGI_SWAP_CHAIN_DESC1 desc = {}; desc.Width = size_.width(); desc.Height = size_.height(); - desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.Format = output_format; desc.Stereo = FALSE; desc.SampleDesc.Count = 1; desc.BufferCount = 2;
diff --git a/gpu/tools/compositor_model_bench/BUILD.gn b/gpu/tools/compositor_model_bench/BUILD.gn index 94e57da..e6c89f1 100644 --- a/gpu/tools/compositor_model_bench/BUILD.gn +++ b/gpu/tools/compositor_model_bench/BUILD.gn
@@ -9,10 +9,15 @@ sources = [ "compositor_model_bench.cc", "forward_render_model.cc", + "forward_render_model.h", "render_model_utils.cc", + "render_model_utils.h", "render_models.cc", + "render_models.h", "render_tree.cc", + "render_tree.h", "shaders.cc", + "shaders.h", ] libs = [ "GL" ]
diff --git a/ios/build/bots/chromium.fyi/EarlGreyiOS.json b/ios/build/bots/chromium.fyi/EarlGreyiOS.json index 0bea78a..587f0da 100644 --- a/ios/build/bots/chromium.fyi/EarlGreyiOS.json +++ b/ios/build/bots/chromium.fyi/EarlGreyiOS.json
@@ -22,6 +22,16 @@ "xctest": true }, { + "app": "ios_chrome_reading_list_egtests", + "test args": [ + "--enable-reading-list" + ], + "device type": "iPhone 6s", + "os": "10.0", + "xcode version": "8.0", + "xctest": true + }, + { "app": "ios_chrome_settings_egtests", "device type": "iPhone 6s", "os": "10.0", @@ -71,6 +81,16 @@ "xctest": true }, { + "app": "ios_chrome_reading_list_egtests", + "test args": [ + "--enable-reading-list" + ], + "device type": "iPad Air 2", + "os": "10.0", + "xcode version": "8.0", + "xctest": true + }, + { "app": "ios_chrome_settings_egtests", "device type": "iPad Air 2", "os": "10.0",
diff --git a/ios/build/bots/chromium.mac/ios-simulator-eg.json b/ios/build/bots/chromium.mac/ios-simulator-eg.json index 110790c..2858cf773 100644 --- a/ios/build/bots/chromium.mac/ios-simulator-eg.json +++ b/ios/build/bots/chromium.mac/ios-simulator-eg.json
@@ -22,6 +22,16 @@ "xctest": true }, { + "app": "ios_chrome_reading_list_egtests", + "test args": [ + "--enable-reading-list" + ], + "device type": "iPhone 6s", + "os": "10.0", + "xcode version": "8.0", + "xctest": true + }, + { "app": "ios_chrome_settings_egtests", "device type": "iPhone 6s", "os": "10.0", @@ -71,6 +81,16 @@ "xctest": true }, { + "app": "ios_chrome_reading_list_egtests", + "test args": [ + "--enable-reading-list" + ], + "device type": "iPad Air 2", + "os": "10.0", + "xcode version": "8.0", + "xctest": true + }, + { "app": "ios_chrome_settings_egtests", "device type": "iPad Air 2", "os": "10.0",
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 8271931..3704c77 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -149,7 +149,6 @@ "//components/metrics", "//components/prefs", "//components/proxy_config", - "//components/reading_list/core", "//components/signin/core/browser", "//components/suggestions", "//components/sync",
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index b32b6e85..5d153bd 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -29,7 +29,6 @@ #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" #include "components/prefs/pref_change_registrar.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/signin/core/browser/signin_manager.h" #include "components/url_formatter/url_formatter.h" #include "components/web_resource/web_resource_pref_names.h" @@ -700,11 +699,9 @@ _spotlightManager.reset([[SpotlightManager spotlightManagerWithBrowserState:_mainBrowserState] retain]); - if (reading_list::switches::IsReadingListEnabled()) { - ShareExtensionService* service = - ShareExtensionServiceFactory::GetForBrowserState(_mainBrowserState); - service->Initialize(); - } + ShareExtensionService* service = + ShareExtensionServiceFactory::GetForBrowserState(_mainBrowserState); + service->Initialize(); // Before bringing up the UI, make sure the launch mode is correct, and // check for previous crashes.
diff --git a/ios/chrome/app/startup_tasks.mm b/ios/chrome/app/startup_tasks.mm index bbf847c..47eda0d 100644 --- a/ios/chrome/app/startup_tasks.mm +++ b/ios/chrome/app/startup_tasks.mm
@@ -9,7 +9,6 @@ #import "base/ios/weak_nsobject.h" #import "base/mac/bind_objc_block.h" #include "components/bookmarks/browser/startup_task_runner_service.h" -#include "components/reading_list/core/reading_list_switches.h" #import "ios/chrome/app/deferred_initialization_runner.h" #include "ios/chrome/app/tests_hook.h" #include "ios/chrome/browser/application_context.h" @@ -84,10 +83,8 @@ (ios::ChromeBrowserState*)browserState { ios::StartupTaskRunnerServiceFactory::GetForBrowserState(browserState) ->StartDeferredTaskRunners(); - if (reading_list::switches::IsReadingListEnabled()) { - ReadingListDownloadServiceFactory::GetForBrowserState(browserState) - ->Initialize(); - } + ReadingListDownloadServiceFactory::GetForBrowserState(browserState) + ->Initialize(); } - (void)applicationWillResignActiveNotification:(NSNotification*)notification {
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index c5b55c3..d1e940c 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -507,6 +507,9 @@ <message name="IDS_IOS_CLEAR_BUTTON" desc="Title for the button used to clear data. [Length: 20em] [iOS only]"> Clear Browsing Data </message> + <message name="IDS_IOS_CONFIRM_CLEAR_BUTTON" desc="Accessibility label for the button used to confirm clearing data. [iOS only]"> + Confirm Clear Browsing Data + </message> <message name="IDS_IOS_CLEAR_CACHE" desc="Label for the option in settings to clear the cache. In titlecase. [Length: 20em] [iOS only]"> Cached Images and Files </message>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 41a376d..a0361d2 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -84,7 +84,6 @@ "//components/pref_registry", "//components/prefs", "//components/proxy_config", - "//components/reading_list/core", "//components/reading_list/ios", "//components/search_engines", "//components/signin/core/browser",
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm index b89a3be..d29dc0f4 100644 --- a/ios/chrome/browser/about_flags.mm +++ b/ios/chrome/browser/about_flags.mm
@@ -26,7 +26,6 @@ #include "components/flags_ui/flags_storage.h" #include "components/flags_ui/flags_ui_switches.h" #include "components/ntp_tiles/switches.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/chrome_switches.h" #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/content_suggestions/BUILD.gn b/ios/chrome/browser/content_suggestions/BUILD.gn index 43cee92d..aae080b5 100644 --- a/ios/chrome/browser/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/content_suggestions/BUILD.gn
@@ -17,9 +17,11 @@ deps = [ "//base", "//components/ntp_snippets", + "//components/reading_list/core", "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/ntp_snippets", + "//ios/chrome/browser/reading_list", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/alert_coordinator", "//ios/chrome/browser/ui/content_suggestions",
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm index c350a4f..7f40bd73 100644 --- a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
@@ -5,11 +5,15 @@ #import "ios/chrome/browser/content_suggestions/content_suggestions_coordinator.h" #include "base/mac/scoped_nsobject.h" +#include "base/metrics/user_metrics.h" +#include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" #include "components/ntp_snippets/content_suggestions_service.h" #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h" +#include "components/reading_list/core/reading_list_model.h" #import "ios/chrome/browser/content_suggestions/content_suggestions_mediator.h" #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h" +#include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_article_item.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h" @@ -125,17 +129,17 @@ - (void)displayContextMenuForArticle:(ContentSuggestionsArticleItem*)articleItem atPoint:(CGPoint)touchLocation atIndexPath:(NSIndexPath*)indexPath { - NSString* urlString = base::SysUTF8ToNSString(articleItem.articleURL.spec()); self.alertCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self.navigationController - title:articleItem.title - message:urlString + title:nil + message:nil rect:CGRectMake(touchLocation.x, touchLocation.y, 0, 0) view:self.suggestionsViewController.collectionView]; __weak ContentSuggestionsCoordinator* weakSelf = self; GURL articleURL = articleItem.articleURL; + NSString* articleTitle = articleItem.title; __weak ContentSuggestionsArticleItem* weakArticle = articleItem; NSString* openInNewTabTitle = @@ -158,6 +162,28 @@ } style:UIAlertActionStyleDefault]; + NSString* readLaterTitle = + l10n_util::GetNSString(IDS_IOS_CONTENT_CONTEXT_ADDTOREADINGLIST); + [self.alertCoordinator + addItemWithTitle:readLaterTitle + action:^{ + ContentSuggestionsCoordinator* strongSelf = weakSelf; + if (!strongSelf) + return; + + base::RecordAction( + base::UserMetricsAction("MobileReadingListAdd")); + // TODO(crbug.com/691979): Add metrics. + + ReadingListModel* readingModel = + ReadingListModelFactory::GetForBrowserState( + strongSelf.browserState); + readingModel->AddEntry(articleURL, + base::SysNSStringToUTF8(articleTitle), + reading_list::ADDED_VIA_CURRENT_APP); + } + style:UIAlertActionStyleDefault]; + NSString* deleteTitle = l10n_util::GetNSString(IDS_IOS_CONTENT_SUGGESTIONS_DELETE); [self.alertCoordinator addItemWithTitle:deleteTitle
diff --git a/ios/chrome/browser/experimental_flags.h b/ios/chrome/browser/experimental_flags.h index b3b4af4d8..ed78641 100644 --- a/ios/chrome/browser/experimental_flags.h +++ b/ios/chrome/browser/experimental_flags.h
@@ -82,9 +82,6 @@ // Whether reader mode is enabled. bool IsReaderModeEnabled(); -// Whether the reading list is enabled. -bool IsReadingListEnabled(); - // Whether the Sign In Flow via SFSafariViewController is enabled. bool IsSafariVCSignInEnabled();
diff --git a/ios/chrome/browser/experimental_flags.mm b/ios/chrome/browser/experimental_flags.mm index 6d6ef708..0e11adb 100644 --- a/ios/chrome/browser/experimental_flags.mm +++ b/ios/chrome/browser/experimental_flags.mm
@@ -17,7 +17,6 @@ #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "components/autofill/core/common/autofill_switches.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/variations/variations_associated_data.h" #include "ios/chrome/browser/chrome_switches.h" #include "ios/web/public/web_view_creation_util.h" @@ -219,10 +218,6 @@ switches::kEnableReaderModeToolbarIcon); } -bool IsReadingListEnabled() { - return reading_list::switches::IsReadingListEnabled(); -} - bool IsSafariVCSignInEnabled() { return ![[NSUserDefaults standardUserDefaults] boolForKey:kSafariVCSignInDisabled];
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_util.mm b/ios/chrome/browser/native_app_launcher/native_app_navigation_util.mm index 072e0d8..a99d66b 100644 --- a/ios/chrome/browser/native_app_launcher/native_app_navigation_util.mm +++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_util.mm
@@ -18,7 +18,7 @@ bool IsLinkNavigation(web::WebState* web_state) { web::NavigationManager* navigationManager = web_state->GetNavigationManager(); DCHECK(navigationManager); - int index = navigationManager->GetCurrentItemIndex(); + int index = navigationManager->GetLastCommittedItemIndex(); // Walks backward on the navigation items list looking for the first item // that is not the result of a redirect. Check if user arrived at that // via link click or a suggestion on the UI.
diff --git a/ios/chrome/browser/notification_promo_unittest.cc b/ios/chrome/browser/notification_promo_unittest.cc index 830d9c5..d5356e8 100644 --- a/ios/chrome/browser/notification_promo_unittest.cc +++ b/ios/chrome/browser/notification_promo_unittest.cc
@@ -34,18 +34,14 @@ UErrorCode status = U_ZERO_ERROR; icu::SimpleDateFormat simple_formatter(icu::UnicodeString(kDateFormat), icu::Locale("en_US"), status); - if (!U_SUCCESS(status)) - return false; - icu::UnicodeString date_unicode_string; simple_formatter.format(static_cast<UDate>(*date_epoch * 1000), date_unicode_string, status); - if (!U_SUCCESS(status)) + if (U_FAILURE(status)) return false; - return base::UTF16ToUTF8(date_unicode_string.getBuffer(), - static_cast<size_t>(date_unicode_string.length()), - date_string); + date_unicode_string.toUTF8String(*date_string); + return true; } } // namespace
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn index 07d0054..2eb2aa26 100644 --- a/ios/chrome/browser/payments/BUILD.gn +++ b/ios/chrome/browser/payments/BUILD.gn
@@ -54,6 +54,7 @@ ] deps = [ ":injected_js", + ":payments_ui", "//base", "//components/autofill/core/browser", "//components/autofill/ios/browser", @@ -80,6 +81,33 @@ libs = [ "UIKit.framework" ] } +source_set("payments_ui") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "payment_request_edit_view_controller+internal.h", + "payment_request_edit_view_controller.h", + "payment_request_edit_view_controller.mm", + "payment_request_edit_view_controller_actions.h", + "payment_request_editor_field.h", + "payment_request_editor_field.mm", + ] + deps = [ + "//base", + "//components/autofill/core/browser", + "//components/strings", + "//ios/chrome/app/theme", + "//ios/chrome/browser/payments/cells", + "//ios/chrome/browser/ui", + "//ios/chrome/browser/ui/collection_view", + "//ios/chrome/browser/ui/colors", + "//ios/chrome/browser/ui/settings", + "//ios/chrome/browser/ui/settings/cells", + "//ios/third_party/material_components_ios", + "//ui/base", + ] + libs = [ "UIKit.framework" ] +} + source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true
diff --git a/ios/chrome/browser/payments/payment_request_edit_view_controller+internal.h b/ios/chrome/browser/payments/payment_request_edit_view_controller+internal.h new file mode 100644 index 0000000..c27ea2a --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_edit_view_controller+internal.h
@@ -0,0 +1,35 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_INTERNAL_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_INTERNAL_H_ + +#import "ios/chrome/browser/payments/payment_request_edit_view_controller.h" + +// Internal API for subclasses of PaymentRequestEditViewController. +@interface PaymentRequestEditViewController (Internal) + +// Validates each field. If there is a validation error, displays an error +// message item in the same section as the field and returns NO. Otherwise +// removes the error message item in that section if one exists and sets the +// value on the field. Returns YES if all the fields are validated successfully. +- (BOOL)validateForm; + +// Called after the editor field items have been added to the the collection +// view model. Subclasses override this method to add items after the editor +// fields. +- (void)loadFooterItems; + +// Returns the index path for the cell associated with the currently focused +// text field. +- (NSIndexPath*)indexPathForCurrentTextField; + +// Adds an error message item in the section |sectionIdentifier| if +// |errorMessage| is non-empty. Otherwise removes such an item if one exists. +- (void)addOrRemoveErrorMessage:(NSString*)errorMessage + inSectionWithIdentifier:(NSInteger)sectionIdentifier; + +@end + +#endif // IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_INTERNAL_H_
diff --git a/ios/chrome/browser/payments/payment_request_edit_view_controller.h b/ios/chrome/browser/payments/payment_request_edit_view_controller.h new file mode 100644 index 0000000..5aadbc7 --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_edit_view_controller.h
@@ -0,0 +1,74 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> +#include <vector> + +#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" + +@class EditorField; +@class PaymentRequestEditViewController; + +// Delegate protocol for PaymentRequestEditViewController. +@protocol PaymentRequestEditViewControllerDelegate<NSObject> + +// Notifies the delegate that the user has finished editing the fields supplied +// to the initializer. The value property of each field reflects the submitted +// value. +- (void)paymentRequestEditViewController: + (PaymentRequestEditViewController*)controller + didFinishEditingFields:(NSArray<EditorField*>*)fields; + +// Notifies the delegate that the user has chosen to return to the previous +// screen. +- (void)paymentRequestEditViewControllerDidReturn: + (PaymentRequestEditViewController*)controller; + +@end + +// Validator protocol for PaymentRequestEditViewController. +@protocol PaymentRequestEditViewControllerValidator<NSObject> + +// Returns the validation error string for |value|. |autofillType| corresponds +// to autofill::ServerFieldType. |required| indicates whether this is a required +// field. If there are no validation errors, an empty string is returned. +- (NSString*)paymentRequestEditViewController: + (PaymentRequestEditViewController*)controller + validateValue:(NSString*)value + autofillType:(NSInteger)autofillType + required:(BOOL)required; + +@end + +// The collection view controller for a generic Payment Request edit screen. It +// features sections for every EditorField supplied to the initializer. Each +// section has a text field as well as an error message item which is visible +// when the value of its respective text field is invalid. +@interface PaymentRequestEditViewController : CollectionViewController + +// The delegate to be notified when the user returns or finishes editing the +// fields. +@property(nonatomic, weak) id<PaymentRequestEditViewControllerDelegate> + editorDelegate; + +// The delegate to be called for validating the fields. By default, the +// controller is the validator. +@property(nonatomic, weak) id<PaymentRequestEditViewControllerValidator> + validatorDelegate; + +// Initializes this instance with a list of field definitions for the editor. +- (instancetype)initWithEditorFields:(NSArray<EditorField*>*)fields + NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithStyle:(CollectionViewControllerStyle)style + NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/payments/payment_request_edit_view_controller.mm b/ios/chrome/browser/payments/payment_request_edit_view_controller.mm new file mode 100644 index 0000000..dead8ee --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_edit_view_controller.mm
@@ -0,0 +1,494 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/payments/payment_request_edit_view_controller.h" + +#include "base/logging.h" +#import "base/mac/foundation_util.h" +#include "base/strings/sys_string_conversions.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/payments/cells/payments_text_item.h" +#import "ios/chrome/browser/payments/payment_request_edit_view_controller+internal.h" +#import "ios/chrome/browser/payments/payment_request_edit_view_controller_actions.h" +#import "ios/chrome/browser/payments/payment_request_editor_field.h" +#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" +#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" +#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#import "ios/chrome/browser/ui/settings/autofill_edit_accessory_view.h" +#import "ios/chrome/browser/ui/settings/cells/autofill_edit_item.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" +#include "ios/chrome/grit/ios_theme_resources.h" +#import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" +#include "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +NSString* const kPaymentRequestEditCollectionViewID = + @"kPaymentRequestEditCollectionViewID"; + +const CGFloat kSeparatorEdgeInset = 14; + +const CGFloat kFooterCellHorizontalPadding = 16; + +// Returns the AutofillEditCell that is the parent view of the |textField|. +AutofillEditCell* AutofillEditCellForTextField(UITextField* textField) { + for (UIView* view = textField; view; view = [view superview]) { + AutofillEditCell* cell = base::mac::ObjCCast<AutofillEditCell>(view); + if (cell) + return cell; + } + + // There has to be a cell associated with this text field. + NOTREACHED(); + return nil; +} + +typedef NS_ENUM(NSInteger, SectionIdentifier) { + SectionIdentifierFooter = kSectionIdentifierEnumZero, + SectionIdentifierFirstTextField, +}; + +typedef NS_ENUM(NSInteger, ItemType) { + ItemTypeFooter = kItemTypeEnumZero, + ItemTypeTextField, // This is a repeated item type. + ItemTypeErrorMessage, // This is a repeated item type. +}; + +} // namespace + +@interface PaymentRequestEditViewController ()< + AutofillEditAccessoryDelegate, + PaymentRequestEditViewControllerActions, + PaymentRequestEditViewControllerValidator, + UITextFieldDelegate> { + NSArray<EditorField*>* _fields; + + // The currently focused cell. May be nil. + __weak AutofillEditCell* _currentEditingCell; + + AutofillEditAccessoryView* _accessoryView; +} + +// Returns the indexPath for the same row as that of |indexPath| in a section +// with the given offset relative to that of |indexPath|. May return nil. +- (NSIndexPath*)indexPathWithSectionOffset:(NSInteger)offset + fromPath:(NSIndexPath*)indexPath; + +// Returns the text field with the given offset relative to the currently +// focused text field. May return nil. +- (AutofillEditCell*)nextTextFieldWithOffset:(NSInteger)offset; + +// Enables or disables the accessory view's previous and next buttons depending +// on whether there is a text field before and after the currently focused text +// field. +- (void)updateAccessoryViewButtonsStates; + +@end + +@implementation PaymentRequestEditViewController + +@synthesize editorDelegate = _editorDelegate; +@synthesize validatorDelegate = _validatorDelegate; + +- (instancetype)initWithEditorFields:(NSArray<EditorField*>*)fields { + self = [super initWithStyle:CollectionViewControllerStyleAppBar]; + if (self) { + _fields = fields; + + // Set self as the validator delegate. + _validatorDelegate = self; + + // Set up leading (cancel) button. + UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] + initWithTitle:l10n_util::GetNSString(IDS_CANCEL) + style:UIBarButtonItemStylePlain + target:nil + action:@selector(onReturn)]; + [cancelButton setTitleTextAttributes:@{ + NSForegroundColorAttributeName : [UIColor lightGrayColor] + } + forState:UIControlStateDisabled]; + [cancelButton + setAccessibilityLabel:l10n_util::GetNSString(IDS_ACCNAME_CANCEL)]; + [self navigationItem].leftBarButtonItem = cancelButton; + + // Set up trailing (done) button. + UIBarButtonItem* doneButton = + [[UIBarButtonItem alloc] initWithTitle:l10n_util::GetNSString(IDS_DONE) + style:UIBarButtonItemStylePlain + target:nil + action:@selector(onDone)]; + [doneButton setTitleTextAttributes:@{ + NSForegroundColorAttributeName : [UIColor lightGrayColor] + } + forState:UIControlStateDisabled]; + [doneButton setAccessibilityLabel:l10n_util::GetNSString(IDS_ACCNAME_DONE)]; + [self navigationItem].rightBarButtonItem = doneButton; + + _accessoryView = [[AutofillEditAccessoryView alloc] initWithDelegate:self]; + } + return self; +} + +#pragma mark - PaymentRequestEditViewControllerActions methods + +- (void)onReturn { + [_editorDelegate paymentRequestEditViewControllerDidReturn:self]; +} + +- (void)onDone { + if ([self validateForm]) { + [_editorDelegate paymentRequestEditViewController:self + didFinishEditingFields:_fields]; + } +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(keyboardDidShow) + name:UIKeyboardDidShowNotification + object:nil]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:UIKeyboardDidShowNotification + object:nil]; +} + +#pragma mark - CollectionViewController methods + +- (void)loadModel { + [super loadModel]; + CollectionViewModel* model = self.collectionViewModel; + + // Iterate over the fields and add the respective sections and items. + int sectionIdentifier = static_cast<int>(SectionIdentifierFirstTextField); + for (EditorField* field in _fields) { + [model addSectionWithIdentifier:sectionIdentifier]; + AutofillEditItem* item = + [[AutofillEditItem alloc] initWithType:ItemTypeTextField]; + item.textFieldName = field.label; + item.textFieldEnabled = YES; + item.textFieldValue = field.value; + item.required = field.isRequired; + item.autofillType = + static_cast<autofill::ServerFieldType>(field.autofillType); + [model addItem:item + toSectionWithIdentifier:static_cast<NSInteger>(sectionIdentifier)]; + field.item = item; + field.sectionIdentifier = static_cast<NSInteger>(sectionIdentifier); + ++sectionIdentifier; + } + + [self loadFooterItems]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.collectionView.accessibilityIdentifier = + kPaymentRequestEditCollectionViewID; + + // Customize collection view settings. + self.styler.cellStyle = MDCCollectionViewCellStyleCard; + self.styler.separatorInset = + UIEdgeInsetsMake(0, kSeparatorEdgeInset, 0, kSeparatorEdgeInset); +} + +#pragma mark - UITextFieldDelegate + +- (void)textFieldDidBeginEditing:(UITextField*)textField { + _currentEditingCell = AutofillEditCellForTextField(textField); + [textField setInputAccessoryView:_accessoryView]; + [self updateAccessoryViewButtonsStates]; +} + +- (void)textFieldDidEndEditing:(UITextField*)textField { + DCHECK(_currentEditingCell == AutofillEditCellForTextField(textField)); + + // Validate the text field. + CollectionViewModel* model = self.collectionViewModel; + + NSIndexPath* indexPath = [self indexPathForCurrentTextField]; + AutofillEditItem* item = base::mac::ObjCCastStrict<AutofillEditItem>( + [model itemAtIndexPath:indexPath]); + + NSString* errorMessage = + [_validatorDelegate paymentRequestEditViewController:self + validateValue:textField.text + autofillType:item.autofillType + required:item.required]; + NSInteger sectionIdentifier = + [model sectionIdentifierForSection:[indexPath section]]; + [self addOrRemoveErrorMessage:errorMessage + inSectionWithIdentifier:sectionIdentifier]; + + [textField setInputAccessoryView:nil]; + _currentEditingCell = nil; +} + +- (BOOL)textFieldShouldReturn:(UITextField*)textField { + DCHECK([_currentEditingCell textField] == textField); + AutofillEditCell* nextCell = [self nextTextFieldWithOffset:1]; + if (nextCell) + [self nextPressed]; + else + [self closePressed]; + + return NO; +} + +#pragma mark - AutofillEditAccessoryDelegate + +- (void)nextPressed { + AutofillEditCell* nextCell = [self nextTextFieldWithOffset:1]; + if (nextCell) + [nextCell.textField becomeFirstResponder]; +} + +- (void)previousPressed { + AutofillEditCell* previousCell = [self nextTextFieldWithOffset:-1]; + if (previousCell) + [previousCell.textField becomeFirstResponder]; +} + +- (void)closePressed { + [[_currentEditingCell textField] resignFirstResponder]; +} + +#pragma mark - UICollectionViewDataSource + +- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView + cellForItemAtIndexPath:(NSIndexPath*)indexPath { + UICollectionViewCell* cell = + [super collectionView:collectionView cellForItemAtIndexPath:indexPath]; + + CollectionViewItem* item = + [self.collectionViewModel itemAtIndexPath:indexPath]; + switch (item.type) { + case ItemTypeTextField: { + AutofillEditCell* autofillEditCell = + base::mac::ObjCCast<AutofillEditCell>(cell); + autofillEditCell.textField.delegate = self; + autofillEditCell.textField.clearButtonMode = UITextFieldViewModeNever; + autofillEditCell.textLabel.font = [MDCTypography body2Font]; + autofillEditCell.textLabel.textColor = [[MDCPalette greyPalette] tint900]; + autofillEditCell.textField.font = [MDCTypography body1Font]; + autofillEditCell.textField.textColor = + [[MDCPalette cr_bluePalette] tint600]; + break; + } + case ItemTypeErrorMessage: { + PaymentsTextCell* errorMessageCell = + base::mac::ObjCCastStrict<PaymentsTextCell>(cell); + errorMessageCell.textLabel.font = [MDCTypography body1Font]; + errorMessageCell.textLabel.textColor = + [[MDCPalette cr_redPalette] tint600]; + break; + } + case ItemTypeFooter: { + CollectionViewFooterCell* footerCell = + base::mac::ObjCCastStrict<CollectionViewFooterCell>(cell); + footerCell.textLabel.font = [MDCTypography body2Font]; + footerCell.textLabel.textColor = [[MDCPalette greyPalette] tint600]; + footerCell.textLabel.shadowColor = nil; // No shadow. + footerCell.horizontalPadding = kFooterCellHorizontalPadding; + break; + } + default: + break; + } + + return cell; +} + +#pragma mark MDCCollectionViewStylingDelegate + +- (CGFloat)collectionView:(UICollectionView*)collectionView + cellHeightAtIndexPath:(NSIndexPath*)indexPath { + CollectionViewItem* item = + [self.collectionViewModel itemAtIndexPath:indexPath]; + switch (item.type) { + case ItemTypeTextField: + case ItemTypeErrorMessage: + case ItemTypeFooter: + return [MDCCollectionViewCell + cr_preferredHeightForWidth:CGRectGetWidth(collectionView.bounds) + forItem:item]; + default: + NOTREACHED(); + return MDCCellDefaultOneLineHeight; + } +} + +- (BOOL)collectionView:(UICollectionView*)collectionView + hidesInkViewAtIndexPath:(NSIndexPath*)indexPath { + NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; + switch (type) { + case ItemTypeErrorMessage: + case ItemTypeFooter: + return YES; + default: + return NO; + } +} + +- (BOOL)collectionView:(UICollectionView*)collectionView + shouldHideItemBackgroundAtIndexPath:(NSIndexPath*)indexPath { + NSInteger type = [self.collectionViewModel itemTypeForIndexPath:indexPath]; + switch (type) { + case ItemTypeFooter: + return YES; + default: + return NO; + } +} + +#pragma mark - PaymentRequestEditViewControllerValidator + +- (NSString*)paymentRequestEditViewController: + (PaymentRequestEditViewController*)controller + validateValue:(NSString*)value + autofillType:(NSInteger)autofillType + required:(BOOL)required { + if (required && value.length == 0) { + return l10n_util::GetNSString( + IDS_PAYMENTS_FIELD_REQUIRED_VALIDATION_MESSAGE); + } + return @""; +} + +#pragma mark - Helper methods + +- (NSIndexPath*)indexPathWithSectionOffset:(NSInteger)offset + fromPath:(NSIndexPath*)indexPath { + DCHECK(indexPath); + DCHECK(offset); + NSInteger nextSection = [indexPath section] + offset; + if (nextSection >= 0 && + nextSection < [[self collectionView] numberOfSections]) { + return [NSIndexPath indexPathForRow:[indexPath row] inSection:nextSection]; + } + return nil; +} + +- (AutofillEditCell*)nextTextFieldWithOffset:(NSInteger)offset { + UICollectionView* collectionView = [self collectionView]; + NSIndexPath* currentCellPath = [self indexPathForCurrentTextField]; + DCHECK(currentCellPath); + NSIndexPath* nextCellPath = + [self indexPathWithSectionOffset:offset fromPath:currentCellPath]; + if (nextCellPath) { + id nextCell = [collectionView cellForItemAtIndexPath:nextCellPath]; + if ([nextCell isKindOfClass:[AutofillEditCell class]]) { + return base::mac::ObjCCastStrict<AutofillEditCell>( + [collectionView cellForItemAtIndexPath:nextCellPath]); + } + } + return nil; +} + +- (void)updateAccessoryViewButtonsStates { + AutofillEditCell* previousCell = [self nextTextFieldWithOffset:-1]; + [[_accessoryView previousButton] setEnabled:previousCell != nil]; + + AutofillEditCell* nextCell = [self nextTextFieldWithOffset:1]; + [[_accessoryView nextButton] setEnabled:nextCell != nil]; +} + +#pragma mark - Keyboard handling + +- (void)keyboardDidShow { + [self.collectionView + scrollToItemAtIndexPath:[self.collectionView + indexPathForCell:_currentEditingCell] + atScrollPosition:UICollectionViewScrollPositionCenteredVertically + animated:YES]; +} + +@end + +@implementation PaymentRequestEditViewController (Internal) + +- (BOOL)validateForm { + for (EditorField* field in _fields) { + AutofillEditItem* item = field.item; + + NSString* errorMessage = + [_validatorDelegate paymentRequestEditViewController:self + validateValue:item.textFieldValue + autofillType:field.autofillType + required:field.isRequired]; + [self addOrRemoveErrorMessage:errorMessage + inSectionWithIdentifier:field.sectionIdentifier]; + if (errorMessage.length != 0) { + return NO; + } + + field.value = item.textFieldValue; + } + return YES; +} + +- (void)loadFooterItems { + CollectionViewModel* model = self.collectionViewModel; + + [model addSectionWithIdentifier:SectionIdentifierFooter]; + CollectionViewFooterItem* footerItem = + [[CollectionViewFooterItem alloc] initWithType:ItemTypeFooter]; + footerItem.text = l10n_util::GetNSString(IDS_PAYMENTS_REQUIRED_FIELD_MESSAGE); + [model addItem:footerItem toSectionWithIdentifier:SectionIdentifierFooter]; +} + +- (NSIndexPath*)indexPathForCurrentTextField { + DCHECK(_currentEditingCell); + NSIndexPath* indexPath = + [[self collectionView] indexPathForCell:_currentEditingCell]; + DCHECK(indexPath); + return indexPath; +} + +- (void)addOrRemoveErrorMessage:(NSString*)errorMessage + inSectionWithIdentifier:(NSInteger)sectionIdentifier { + CollectionViewModel* model = self.collectionViewModel; + if ([model hasItemForItemType:ItemTypeErrorMessage + sectionIdentifier:sectionIdentifier]) { + NSIndexPath* indexPath = [model indexPathForItemType:ItemTypeErrorMessage + sectionIdentifier:sectionIdentifier]; + if (errorMessage.length == 0) { + // Remove the item at the index path. + [model removeItemWithType:ItemTypeErrorMessage + fromSectionWithIdentifier:sectionIdentifier]; + [self.collectionView deleteItemsAtIndexPaths:@[ indexPath ]]; + } else { + // Reload the item at the index path. + PaymentsTextItem* item = base::mac::ObjCCastStrict<PaymentsTextItem>( + [model itemAtIndexPath:indexPath]); + item.text = errorMessage; + [self.collectionView reloadItemsAtIndexPaths:@[ indexPath ]]; + } + } else if (errorMessage.length != 0) { + // Insert an item at the index path. + PaymentsTextItem* errorMessageItem = + [[PaymentsTextItem alloc] initWithType:ItemTypeErrorMessage]; + errorMessageItem.text = errorMessage; + errorMessageItem.image = NativeImage(IDR_IOS_PAYMENTS_WARNING); + [model addItem:errorMessageItem toSectionWithIdentifier:sectionIdentifier]; + NSIndexPath* indexPath = [model indexPathForItemType:ItemTypeErrorMessage + sectionIdentifier:sectionIdentifier]; + [self.collectionView insertItemsAtIndexPaths:@[ indexPath ]]; + } +} + +@end
diff --git a/ios/chrome/browser/payments/payment_request_edit_view_controller_actions.h b/ios/chrome/browser/payments/payment_request_edit_view_controller_actions.h new file mode 100644 index 0000000..93eb9ea --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_edit_view_controller_actions.h
@@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_ACTIONS_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_ACTIONS_H_ + +// Protocol handling the actions sent by the PaymentRequestEditViewController. +@protocol PaymentRequestEditViewControllerActions + +// Called when the user presses the return button. +- (void)onReturn; + +// Called when the user presses the done button. +- (void)onDone; + +@end + +#endif // IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDIT_VIEW_CONTROLLER_ACTIONS_H_
diff --git a/ios/chrome/browser/payments/payment_request_editor_field.h b/ios/chrome/browser/payments/payment_request_editor_field.h new file mode 100644 index 0000000..581de451 --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_editor_field.h
@@ -0,0 +1,36 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDITOR_FIELD_H_ +#define IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDITOR_FIELD_H_ + +#import <Foundation/Foundation.h> + +@class AutofillEditItem; + +// Field definition for an editor field. Used for building the UI and +// validation. +@interface EditorField : NSObject + +// Autofill type for the field. Corresponds to autofill::ServerFieldType +@property(nonatomic, assign) NSInteger autofillType; +// Label for the field. +@property(nonatomic, copy) NSString* label; +// Value of the field. May be nil. +@property(nonatomic, copy) NSString* value; +// Whether the field is required. +@property(nonatomic, getter=isRequired) BOOL required; +// The associated AutofillEditItem instance. May be nil. +@property(nonatomic, assign) AutofillEditItem* item; +// The section identifier for the associated AutofillEditItem. +@property(nonatomic, assign) NSInteger sectionIdentifier; + +- (instancetype)initWithAutofillType:(NSInteger)autofillType + label:(NSString*)label + value:(NSString*)value + required:(BOOL)required; + +@end + +#endif // IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_EDITOR_FIELD_H_
diff --git a/ios/chrome/browser/payments/payment_request_editor_field.mm b/ios/chrome/browser/payments/payment_request_editor_field.mm new file mode 100644 index 0000000..9f6b220c --- /dev/null +++ b/ios/chrome/browser/payments/payment_request_editor_field.mm
@@ -0,0 +1,34 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/payments/payment_request_editor_field.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation EditorField + +@synthesize autofillType = _autofillType; +@synthesize label = _label; +@synthesize value = _value; +@synthesize required = _required; +@synthesize item = _item; +@synthesize sectionIdentifier = _sectionIdentifier; + +- (instancetype)initWithAutofillType:(NSInteger)autofillType + label:(NSString*)label + value:(NSString*)value + required:(BOOL)required { + self = [super init]; + if (self) { + _autofillType = autofillType; + _label = label; + _value = value; + _required = required; + } + return self; +} + +@end
diff --git a/ios/chrome/browser/reading_list/BUILD.gn b/ios/chrome/browser/reading_list/BUILD.gn index c4b116b..6e44c010 100644 --- a/ios/chrome/browser/reading_list/BUILD.gn +++ b/ios/chrome/browser/reading_list/BUILD.gn
@@ -63,7 +63,7 @@ ] deps = [ "//base", - "//components/reading_list/ios", + "//components/reading_list/core", "//ios/chrome/browser/browser_state", ] } @@ -82,7 +82,7 @@ "//base", "//base/test:test_support", "//components/favicon/ios", - "//components/reading_list/ios", + "//components/reading_list/core", "//ios/chrome/browser", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/dom_distiller",
diff --git a/ios/chrome/browser/reading_list/offline_url_utils.cc b/ios/chrome/browser/reading_list/offline_url_utils.cc index 0626e50c..2964725 100644 --- a/ios/chrome/browser/reading_list/offline_url_utils.cc +++ b/ios/chrome/browser/reading_list/offline_url_utils.cc
@@ -9,7 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "components/reading_list/ios/offline_url_utils.h" +#include "components/reading_list/core/offline_url_utils.h" #include "ios/chrome/browser/chrome_url_constants.h" #include "net/base/url_util.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_download_service.cc b/ios/chrome/browser/reading_list/reading_list_download_service.cc index a79cca8a..2abb0c5 100644 --- a/ios/chrome/browser/reading_list/reading_list_download_service.cc +++ b/ios/chrome/browser/reading_list/reading_list_download_service.cc
@@ -13,9 +13,9 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" -#include "components/reading_list/ios/offline_url_utils.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/offline_url_utils.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/reading_list/reading_list_distiller_page_factory.h" #include "ios/web/public/web_thread.h" @@ -140,7 +140,7 @@ case ReadingListEntry::WILL_RETRY: unprocessed_entries.insert(url); break; - case ReadingListEntry::ERROR: + case ReadingListEntry::DISTILLATION_ERROR: break; } } @@ -175,7 +175,8 @@ void ReadingListDownloadService::ScheduleDownloadEntry(const GURL& url) { DCHECK(reading_list_model_->loaded()); const ReadingListEntry* entry = reading_list_model_->GetEntryByURL(url); - if (!entry || entry->DistilledState() == ReadingListEntry::ERROR || + if (!entry || + entry->DistilledState() == ReadingListEntry::DISTILLATION_ERROR || entry->DistilledState() == ReadingListEntry::PROCESSED || entry->IsRead()) return; GURL local_url(url); @@ -189,7 +190,8 @@ void ReadingListDownloadService::DownloadEntry(const GURL& url) { DCHECK(reading_list_model_->loaded()); const ReadingListEntry* entry = reading_list_model_->GetEntryByURL(url); - if (!entry || entry->DistilledState() == ReadingListEntry::ERROR || + if (!entry || + entry->DistilledState() == ReadingListEntry::DISTILLATION_ERROR || entry->DistilledState() == ReadingListEntry::PROCESSED || entry->IsRead()) return; @@ -275,8 +277,8 @@ } else { UMA_HISTOGRAM_ENUMERATION("ReadingList.Download.Status", FAILURE, STATUS_MAX); - reading_list_model_->SetEntryDistilledState(url, - ReadingListEntry::ERROR); + reading_list_model_->SetEntryDistilledState( + url, ReadingListEntry::DISTILLATION_ERROR); } break; }
diff --git a/ios/chrome/browser/reading_list/reading_list_download_service.h b/ios/chrome/browser/reading_list/reading_list_download_service.h index 97fc006e..3276b7a 100644 --- a/ios/chrome/browser/reading_list/reading_list_download_service.h +++ b/ios/chrome/browser/reading_list/reading_list_download_service.h
@@ -7,7 +7,7 @@ #include "base/macros.h" #include "components/keyed_service/core/keyed_service.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model_observer.h" #include "ios/chrome/browser/reading_list/url_downloader.h" #include "net/base/network_change_notifier.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.cc b/ios/chrome/browser/reading_list/reading_list_model_factory.cc index c225690..98e3eb8 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_factory.cc +++ b/ios/chrome/browser/reading_list/reading_list_model_factory.cc
@@ -13,10 +13,9 @@ #include "components/browser_sync/profile_sync_service.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" -#include "components/reading_list/core/reading_list_switches.h" -#include "components/reading_list/ios/reading_list_model_impl.h" -#include "components/reading_list/ios/reading_list_pref_names.h" -#include "components/reading_list/ios/reading_list_store.h" +#include "components/reading_list/core/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_pref_names.h" +#include "components/reading_list/core/reading_list_store.h" #include "components/sync/base/report_unrecoverable_error.h" #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -25,11 +24,6 @@ #include "ios/web/public/web_thread.h" // static -bool ReadingListModelFactory::IsReadingListEnabled() { - return reading_list::switches::IsReadingListEnabled(); -} - -// static ReadingListModel* ReadingListModelFactory::GetForBrowserState( ios::ChromeBrowserState* browser_state) { return static_cast<ReadingListModelImpl*>(
diff --git a/ios/chrome/browser/reading_list/reading_list_model_factory.h b/ios/chrome/browser/reading_list/reading_list_model_factory.h index 26ac158..6d18ef1 100644 --- a/ios/chrome/browser/reading_list/reading_list_model_factory.h +++ b/ios/chrome/browser/reading_list/reading_list_model_factory.h
@@ -24,8 +24,6 @@ // ios::ChromeBrowserState. class ReadingListModelFactory : public BrowserStateKeyedServiceFactory { public: - // Returns if Reading List is enabled on this device. - static bool IsReadingListEnabled(); static ReadingListModel* GetForBrowserState( ios::ChromeBrowserState* browser_state); static ReadingListModel* GetForBrowserStateIfExists(
diff --git a/ios/chrome/browser/reading_list/reading_list_remover_helper.cc b/ios/chrome/browser/reading_list/reading_list_remover_helper.cc index 7c6efc1..35ab24fd 100644 --- a/ios/chrome/browser/reading_list/reading_list_remover_helper.cc +++ b/ios/chrome/browser/reading_list/reading_list_remover_helper.cc
@@ -4,7 +4,7 @@ #include "ios/chrome/browser/reading_list/reading_list_remover_helper.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/reading_list/reading_list_download_service.h" #include "ios/chrome/browser/reading_list/reading_list_download_service_factory.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_remover_helper.h b/ios/chrome/browser/reading_list/reading_list_remover_helper.h index 2373de76..68a0c55 100644 --- a/ios/chrome/browser/reading_list/reading_list_remover_helper.h +++ b/ios/chrome/browser/reading_list/reading_list_remover_helper.h
@@ -7,7 +7,7 @@ #include "base/callback.h" #include "base/scoped_observer.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model_observer.h" namespace ios { class ChromeBrowserState;
diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer.h b/ios/chrome/browser/reading_list/reading_list_web_state_observer.h index f251eee0..349bdc0 100644 --- a/ios/chrome/browser/reading_list/reading_list_web_state_observer.h +++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer.h
@@ -7,7 +7,7 @@ #include "base/macros.h" #include "base/timer/timer.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model_observer.h" #include "ios/web/public/web_state/web_state_observer.h" #include "url/gurl.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm index 58ac2e8..c204d771 100644 --- a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm +++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm
@@ -8,7 +8,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/reading_list/offline_url_utils.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer_unittest.mm b/ios/chrome/browser/reading_list/reading_list_web_state_observer_unittest.mm index 3700543..397674e 100644 --- a/ios/chrome/browser/reading_list/reading_list_web_state_observer_unittest.mm +++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer_unittest.mm
@@ -6,7 +6,7 @@ #include "base/memory/ptr_util.h" #include "base/time/default_clock.h" -#include "components/reading_list/ios/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_model_impl.h" #include "ios/chrome/browser/reading_list/offline_url_utils.h" #import "ios/web/public/navigation_item.h" #include "ios/web/public/reload_type.h"
diff --git a/ios/chrome/browser/reading_list/url_downloader.cc b/ios/chrome/browser/reading_list/url_downloader.cc index 358015e..35c09342 100644 --- a/ios/chrome/browser/reading_list/url_downloader.cc +++ b/ios/chrome/browser/reading_list/url_downloader.cc
@@ -11,7 +11,7 @@ #include "base/files/file_util.h" #include "base/memory/ptr_util.h" #include "base/path_service.h" -#include "components/reading_list/ios/offline_url_utils.h" +#include "components/reading_list/core/offline_url_utils.h" #include "ios/chrome/browser/chrome_paths.h" #include "ios/chrome/browser/dom_distiller/distiller_viewer.h" #include "ios/chrome/browser/reading_list/reading_list_distiller_page.h"
diff --git a/ios/chrome/browser/reading_list/url_downloader_unittest.mm b/ios/chrome/browser/reading_list/url_downloader_unittest.mm index 665b8b2..b6090b6 100644 --- a/ios/chrome/browser/reading_list/url_downloader_unittest.mm +++ b/ios/chrome/browser/reading_list/url_downloader_unittest.mm
@@ -11,7 +11,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #import "base/test/ios/wait_util.h" -#include "components/reading_list/ios/offline_url_utils.h" +#include "components/reading_list/core/offline_url_utils.h" #include "ios/chrome/browser/chrome_paths.h" #include "ios/chrome/browser/dom_distiller/distiller_viewer.h" #include "ios/chrome/browser/reading_list/offline_url_utils.h"
diff --git a/ios/chrome/browser/share_extension/BUILD.gn b/ios/chrome/browser/share_extension/BUILD.gn index 632575c..9f28aa9 100644 --- a/ios/chrome/browser/share_extension/BUILD.gn +++ b/ios/chrome/browser/share_extension/BUILD.gn
@@ -17,7 +17,7 @@ "//components/bookmarks/browser", "//components/keyed_service/core", "//components/keyed_service/ios", - "//components/reading_list/ios", + "//components/reading_list/core", "//ios/chrome/browser", "//ios/chrome/browser/bookmarks", "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm index cd08ad6..d126542 100644 --- a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm +++ b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm
@@ -15,8 +15,8 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "components/bookmarks/browser/bookmark_model.h" -#include "components/reading_list/ios/reading_list_model.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model.h" +#include "components/reading_list/core/reading_list_model_observer.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/common/app_group/app_group_constants.h" #include "ios/web/public/web_thread.h"
diff --git a/ios/chrome/browser/share_extension/share_extension_service.h b/ios/chrome/browser/share_extension/share_extension_service.h index 1988966..b06af86 100644 --- a/ios/chrome/browser/share_extension/share_extension_service.h +++ b/ios/chrome/browser/share_extension/share_extension_service.h
@@ -7,7 +7,7 @@ #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/keyed_service/core/keyed_service.h" -#include "components/reading_list/ios/reading_list_model_observer.h" +#include "components/reading_list/core/reading_list_model_observer.h" namespace bookmarks { class BookmarkModel;
diff --git a/ios/chrome/browser/share_extension/share_extension_service.mm b/ios/chrome/browser/share_extension/share_extension_service.mm index 5471a425..a1f21c8 100644 --- a/ios/chrome/browser/share_extension/share_extension_service.mm +++ b/ios/chrome/browser/share_extension/share_extension_service.mm
@@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ios/chrome/browser/share_extension/share_extension_service.h" + #include "base/mac/scoped_nsobject.h" #include "components/bookmarks/browser/bookmark_model.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/share_extension/share_extension_item_receiver.h" -#include "ios/chrome/browser/share_extension/share_extension_service.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/sync/BUILD.gn b/ios/chrome/browser/sync/BUILD.gn index 14f9eed6..cd24a765 100644 --- a/ios/chrome/browser/sync/BUILD.gn +++ b/ios/chrome/browser/sync/BUILD.gn
@@ -32,7 +32,6 @@ "//components/password_manager/sync/browser", "//components/prefs", "//components/reading_list/core", - "//components/reading_list/ios", "//components/search_engines", "//components/sessions", "//components/signin/core/browser", @@ -113,7 +112,6 @@ ":sync", "//base", "//components/browser_sync", - "//components/reading_list/core", "//components/sync", "//ios/chrome/browser/browser_state:test_support", "//ios/web:test_support",
diff --git a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc index b82fa5c..f4bcf98 100644 --- a/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc +++ b/ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory_unittest.cc
@@ -11,7 +11,6 @@ #include "base/command_line.h" #include "components/browser_sync/browser_sync_switches.h" #include "components/browser_sync/profile_sync_service.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/sync/base/model_type.h" #include "components/sync/driver/data_type_controller.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" @@ -45,9 +44,7 @@ datatypes.push_back(syncer::PASSWORDS); datatypes.push_back(syncer::PREFERENCES); datatypes.push_back(syncer::PRIORITY_PREFERENCES); - if (reading_list::switches::IsReadingListEnabled()) { - datatypes.push_back(syncer::READING_LIST); - } + datatypes.push_back(syncer::READING_LIST); datatypes.push_back(syncer::SESSIONS); datatypes.push_back(syncer::PROXY_TABS); datatypes.push_back(syncer::TYPED_URLS);
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm index 741a522..0a61212 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -27,8 +27,7 @@ #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/sync/browser/password_model_worker.h" -#include "components/reading_list/core/reading_list_switches.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "components/search_engines/search_engine_data_type_controller.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/sync/base/report_unrecoverable_error.h" @@ -80,7 +79,13 @@ explicit SyncSessionsClientImpl(ios::ChromeBrowserState* browser_state) : browser_state_(browser_state), window_delegates_getter_( - base::MakeUnique<TabModelSyncedWindowDelegatesGetter>()) {} + base::MakeUnique<TabModelSyncedWindowDelegatesGetter>()), + local_session_event_router_( + base::MakeUnique<IOSChromeLocalSessionEventRouter>( + browser_state_, + this, + ios::sync_start_util::GetFlareForSyncableService( + browser_state_->GetStatePath()))) {} ~SyncSessionsClientImpl() override {} @@ -117,19 +122,17 @@ return window_delegates_getter_.get(); } - std::unique_ptr<sync_sessions::LocalSessionEventRouter> - GetLocalSessionEventRouter() override { - syncer::SyncableService::StartSyncFlare flare( - ios::sync_start_util::GetFlareForSyncableService( - browser_state_->GetStatePath())); - return base::MakeUnique<IOSChromeLocalSessionEventRouter>(browser_state_, - this, flare); + sync_sessions::LocalSessionEventRouter* GetLocalSessionEventRouter() + override { + return local_session_event_router_.get(); } private: ios::ChromeBrowserState* const browser_state_; const std::unique_ptr<sync_sessions::SyncedWindowDelegatesGetter> window_delegates_getter_; + const std::unique_ptr<IOSChromeLocalSessionEventRouter> + local_session_event_router_; DISALLOW_COPY_AND_ASSIGN(SyncSessionsClientImpl); }; @@ -352,7 +355,6 @@ ->GetDeviceInfoSyncBridge() ->AsWeakPtr(); case syncer::READING_LIST: { - DCHECK(reading_list::switches::IsReadingListEnabled()); ReadingListModel* reading_list_model = ReadingListModelFactory::GetForBrowserState(browser_state_); return reading_list_model->GetModelTypeSyncBridge()->AsWeakPtr();
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h index 2d59185..90887103 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h
@@ -25,6 +25,7 @@ SessionID::id_type GetWindowId() const override; SessionID::id_type GetSessionId() const override; bool IsBeingDestroyed() const override; + SessionID::id_type GetSourceTabID() const override; std::string GetExtensionAppId() const override; bool IsInitialBlankNavigation() const override; int GetCurrentEntryIndex() const override;
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm index 67a2936..8e7f12f 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -52,6 +52,12 @@ return web_state_->IsBeingDestroyed(); } +// todo(pnoland): add logic to store and return the source tab id on ios. +// http://crbug/695241 +SessionID::id_type IOSChromeSyncedTabDelegate::GetSourceTabID() const { + return sync_sessions::kInvalidTabID; +} + std::string IOSChromeSyncedTabDelegate::GetExtensionAppId() const { return std::string(); } @@ -61,7 +67,7 @@ } int IOSChromeSyncedTabDelegate::GetCurrentEntryIndex() const { - return web_state_->GetNavigationManager()->GetCurrentItemIndex(); + return web_state_->GetNavigationManager()->GetLastCommittedItemIndex(); } int IOSChromeSyncedTabDelegate::GetEntryCount() const {
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn index 37b9693..c3292843 100644 --- a/ios/chrome/browser/tabs/BUILD.gn +++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -51,7 +51,6 @@ "//components/navigation_metrics", "//components/prefs", "//components/reading_list/core", - "//components/reading_list/ios", "//components/search_engines", "//components/sessions", "//components/signin/core/browser", @@ -139,7 +138,6 @@ "//components/history/core/browser", "//components/history/ios/browser", "//components/keyed_service/core", - "//components/reading_list/core", "//components/signin/ios/browser", "//ios/chrome/browser", "//ios/chrome/browser/bookmarks",
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm index 99690a8..b5e12d3 100644 --- a/ios/chrome/browser/tabs/tab.mm +++ b/ios/chrome/browser/tabs/tab.mm
@@ -40,8 +40,7 @@ #include "components/navigation_metrics/navigation_metrics.h" #include "components/navigation_metrics/origins_seen_service.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/core/reading_list_switches.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "components/search_engines/template_url_service.h" #include "components/sessions/core/session_types.h" #include "components/sessions/ios/ios_serialized_navigation_builder.h" @@ -179,10 +178,6 @@ // serializable user data. NSString* const kOpenerNavigationIndexKey = @"OpenerNavigationIndex"; -// The key under which the last visited timestamp is stored in the WebState's -// serializable user data. -NSString* const kLastVisitedTimestampKey = @"LastVisitedTimestamp"; - // Name of histogram for recording the state of the tab when the renderer is // terminated. const char kRendererTerminationStateHistogram[] = @@ -232,6 +227,9 @@ // YES if the Tab needs to be reloaded after the app becomes active. BOOL requireReloadAfterBecomingActive_; + // Last visited timestamp. + double lastVisitedTimestamp_; + base::mac::ObjCPropertyReleaser propertyReleaser_Tab_; id<TabDelegate> delegate_; // weak @@ -257,6 +255,8 @@ base::WeakNSProtocol<id<OverscrollActionsControllerDelegate>> overscrollActionsControllerDelegate_; + base::scoped_nsobject<NSString> tabId_; + // Lightweight object dealing with various different UI behaviours when // opening a URL in an external application. base::scoped_nsobject<ExternalAppLauncher> externalAppLauncher_; @@ -527,10 +527,7 @@ [self.webController setDelegate:self]; - NSString* sessionID = self.tabId; - DCHECK(sessionID); snapshotManager_.reset([[SnapshotManager alloc] init]); - webControllerSnapshotHelper_.reset([[WebControllerSnapshotHelper alloc] initWithSnapshotManager:snapshotManager_ tab:self]); @@ -732,15 +729,22 @@ } - (NSString*)tabId { + if (tabId_) + return tabId_.get(); + DCHECK(self.webState); web::SerializableUserDataManager* userDataManager = web::SerializableUserDataManager::FromWebState(self.webState); - id<NSCoding> tabID = userDataManager->GetValueForSerializationKey(kTabIDKey); - if (!tabID) { - tabID = [[NSUUID UUID] UUIDString]; - userDataManager->AddSerializableData(tabID, kTabIDKey); + NSString* tabId = base::mac::ObjCCast<NSString>( + userDataManager->GetValueForSerializationKey(kTabIDKey)); + + if (!tabId || ![tabId length]) { + tabId = [[NSUUID UUID] UUIDString]; + userDataManager->AddSerializableData(tabId, kTabIDKey); } - return base::mac::ObjCCastStrict<NSString>(tabID); + + tabId_.reset([tabId copy]); + return tabId_.get(); } - (NSString*)openerID { @@ -910,9 +914,7 @@ initWithDelegate:fullScreenControllerDelegate navigationManager:self.navigationManager sessionID:self.tabId]); - if (fullScreenController_) { - [self.webController addObserver:fullScreenController_]; - } + [self.webController addObserver:fullScreenController_]; // If the content of the page was loaded without knowledge of the // toolbar position it will be misplaced under the toolbar instead of // right below. This happens e.g. in the case of preloading. This is to make @@ -1754,23 +1756,11 @@ } - (double)lastVisitedTimestamp { - DCHECK(self.webState); - web::SerializableUserDataManager* userDataManager = - web::SerializableUserDataManager::FromWebState(self.webState); - id<NSCoding> lastVisitedTimestamp = - userDataManager->GetValueForSerializationKey(kLastVisitedTimestampKey); - return lastVisitedTimestamp - ? base::mac::ObjCCastStrict<NSNumber>(lastVisitedTimestamp) - .doubleValue - : 0.; + return lastVisitedTimestamp_; } - (void)updateLastVisitedTimestamp { - DCHECK(self.webState); - web::SerializableUserDataManager* userDataManager = - web::SerializableUserDataManager::FromWebState(self.webState); - userDataManager->AddSerializableData(@([[NSDate date] timeIntervalSince1970]), - kLastVisitedTimestampKey); + lastVisitedTimestamp_ = [[NSDate date] timeIntervalSince1970]; } - (infobars::InfoBarManager*)infoBarManager {
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 4d54930..e277601e 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -12,7 +12,6 @@ #include "components/history/core/browser/top_sites.h" #import "components/history/ios/browser/web_state_top_sites_observer.h" #include "components/keyed_service/core/service_access_type.h" -#include "components/reading_list/core/reading_list_switches.h" #import "components/signin/ios/browser/account_consistency_service.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" @@ -56,11 +55,9 @@ FindTabHelper::CreateForWebState(web_state, tab.findInPageControllerDelegate); StoreKitTabHelper::CreateForWebState(web_state); - if (reading_list::switches::IsReadingListEnabled()) { - ReadingListModel* model = - ReadingListModelFactory::GetForBrowserState(browser_state); - ReadingListWebStateObserver::FromWebState(web_state, model); - } + ReadingListModel* model = + ReadingListModelFactory::GetForBrowserState(browser_state); + ReadingListWebStateObserver::FromWebState(web_state, model); if (AccountConsistencyService* account_consistency_service = ios::AccountConsistencyServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/ui/BUILD.gn b/ios/chrome/browser/ui/BUILD.gn index f762646..4b1a8cea 100644 --- a/ios/chrome/browser/ui/BUILD.gn +++ b/ios/chrome/browser/ui/BUILD.gn
@@ -245,7 +245,6 @@ "//components/infobars/core", "//components/prefs", "//components/reading_list/core", - "//components/reading_list/ios", "//components/search_engines", "//components/sessions", "//components/strings",
diff --git a/ios/chrome/browser/ui/activity_services/BUILD.gn b/ios/chrome/browser/ui/activity_services/BUILD.gn index ed901d2..e2e750cd 100644 --- a/ios/chrome/browser/ui/activity_services/BUILD.gn +++ b/ios/chrome/browser/ui/activity_services/BUILD.gn
@@ -54,7 +54,6 @@ ":assets", ":resources", "//base", - "//components/reading_list/core", "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/browser_state", @@ -83,7 +82,6 @@ ":activity_services", "//base", "//base/test:test_support", - "//components/reading_list/core", "//ios/chrome/app/strings", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/tabs",
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller.mm index 40d9182..190a962d 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_controller.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_controller.mm
@@ -8,7 +8,6 @@ #include "base/logging.h" #include "base/mac/foundation_util.h" -#include "components/reading_list/core/reading_list_switches.h" #import "ios/chrome/browser/ui/activity_services/activity_type_util.h" #import "ios/chrome/browser/ui/activity_services/appex_constants.h" #import "ios/chrome/browser/ui/activity_services/chrome_activity_item_source.h" @@ -218,8 +217,7 @@ [printActivity setResponder:controller]; [applicationActivities addObject:printActivity]; } - if (reading_list::switches::IsReadingListEnabled() && - data.url.SchemeIsHTTPOrHTTPS()) { + if (data.url.SchemeIsHTTPOrHTTPS()) { ReadingListActivity* readingListActivity = [[ReadingListActivity alloc] initWithURL:data.url title:data.title
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm index dc0e5b7f..1721c8bb 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
@@ -7,7 +7,6 @@ #import <MobileCoreServices/MobileCoreServices.h> #import "base/test/ios/wait_util.h" -#include "components/reading_list/core/reading_list_switches.h" #import "ios/chrome/browser/ui/activity_services/activity_type_util.h" #import "ios/chrome/browser/ui/activity_services/appex_constants.h" #import "ios/chrome/browser/ui/activity_services/chrome_activity_item_source.h" @@ -442,9 +441,7 @@ NSArray* items = [activityController applicationActivitiesForData:data controller:nil]; - NSUInteger expected_items_count = - reading_list::switches::IsReadingListEnabled() ? 2U : 1U; - ASSERT_EQ(expected_items_count, [items count]); + ASSERT_EQ(2U, [items count]); EXPECT_EQ([PrintActivity class], [[items objectAtIndex:0] class]); // Verify non-printable data. @@ -455,7 +452,7 @@ isPagePrintable:NO thumbnailGenerator:DummyThumbnailGeneratorBlock()]; items = [activityController applicationActivitiesForData:data controller:nil]; - EXPECT_EQ(expected_items_count - 1, [items count]); + EXPECT_EQ(1U, [items count]); } TEST_F(ActivityServiceControllerTest, FindLoginActionTypeConformsToPublicURL) {
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index f0d473f..78ab7e5a 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("bookmarks_arc") { +source_set("bookmarks") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ "bookmark_collection_cells.h", @@ -29,73 +29,9 @@ "bookmark_folder_view_controller.mm", "bookmark_home_handset_view_controller.h", "bookmark_home_handset_view_controller.mm", + "bookmark_home_primary_view.h", "bookmark_home_tablet_ntp_controller.h", "bookmark_home_tablet_ntp_controller.mm", - "bookmark_utils_ios.h", - "bookmark_utils_ios.mm", - ] - deps = [ - ":resources", - "//base", - "//base:i18n", - "//components/bookmarks/browser", - "//components/favicon/core", - "//components/favicon_base", - "//components/pref_registry", - "//components/prefs", - "//components/query_parser", - "//components/signin/core/browser", - "//components/strings", - "//components/undo", - "//components/url_formatter", - "//google_apis", - "//ios/chrome/app/strings", - "//ios/chrome/app/theme", - "//ios/chrome/browser", - "//ios/chrome/browser/bookmarks", - "//ios/chrome/browser/bookmarks:bookmarks_utils", - "//ios/chrome/browser/browser_state", - "//ios/chrome/browser/favicon", - "//ios/chrome/browser/metrics:metrics_internal", - "//ios/chrome/browser/signin", - "//ios/chrome/browser/tabs", - "//ios/chrome/browser/ui", - "//ios/chrome/browser/ui/alert_coordinator", - "//ios/chrome/browser/ui/bookmarks/bars", - "//ios/chrome/browser/ui/bookmarks/cells", - "//ios/chrome/browser/ui/collection_view", - "//ios/chrome/browser/ui/collection_view/cells", - "//ios/chrome/browser/ui/colors", - "//ios/chrome/browser/ui/commands", - "//ios/chrome/browser/ui/icons", - "//ios/chrome/browser/ui/keyboard", - "//ios/chrome/browser/ui/material_components", - "//ios/chrome/browser/ui/ntp", - "//ios/chrome/browser/undo", - "//ios/public/provider/chrome/browser", - "//ios/public/provider/chrome/browser/ui", - "//ios/third_party/material_components_ios", - "//ios/third_party/material_roboto_font_loader_ios", - "//ios/web", - "//skia", - "//ui/base", - "//ui/gfx", - "//url", - ] - allow_circular_includes_from = [ - "//ios/chrome/browser/ui/bookmarks/bars", - "//ios/chrome/browser/ui/bookmarks/cells", - ] - libs = [ - "CoreGraphics.framework", - "QuartzCore.framework", - "UIKit.framework", - ] -} - -source_set("bookmarks") { - sources = [ - "bookmark_home_primary_view.h", "bookmark_home_view_controller.h", "bookmark_home_view_controller.mm", "bookmark_home_waiting_view.h", @@ -120,6 +56,8 @@ "bookmark_promo_cell.mm", "bookmark_promo_controller.h", "bookmark_promo_controller.mm", + "bookmark_utils_ios.h", + "bookmark_utils_ios.mm", "undo_manager_bridge_observer.h", "undo_manager_bridge_observer.mm", "undo_manager_wrapper.h", @@ -173,13 +111,9 @@ "//ui/gfx", "//url", ] - public_deps = [ - ":bookmarks_arc", - ] allow_circular_includes_from = [ "//ios/chrome/browser/ui/bookmarks/bars", "//ios/chrome/browser/ui/bookmarks/cells", - ":bookmarks_arc", ] libs = [ "CoreGraphics.framework", @@ -192,6 +126,7 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ + "bookmark_ios_unittest.h", "bookmark_utils_ios_unittest.mm", ] deps = [
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h index 921d6f3..80032bf 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
@@ -51,16 +51,16 @@ #pragma mark - Properties Relevant To Presenters -@property(nonatomic, assign) id<BookmarkHomeViewControllerDelegate> delegate; +@property(nonatomic, weak) id<BookmarkHomeViewControllerDelegate> delegate; #pragma mark - Properties Relevant To Subclasses // Whether the view controller is in editing mode. @property(nonatomic, assign, readonly) BOOL editing; // The set of selected index paths for edition. -@property(nonatomic, retain, readonly) NSMutableArray* editIndexPaths; +@property(nonatomic, strong, readonly) NSMutableArray* editIndexPaths; @property(nonatomic, assign, readonly) bookmarks::BookmarkModel* bookmarks; -@property(nonatomic, assign, readonly) id<UrlLoader> loader; +@property(nonatomic, weak, readonly) id<UrlLoader> loader; @property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState; #pragma mark - Relevant Methods
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm index b22b6cc8..cd277517 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -4,8 +4,6 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/bookmarks/browser/bookmark_model.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" @@ -13,14 +11,16 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_collection_view.h" #import "ios/chrome/browser/ui/url_loader.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using bookmarks::BookmarkNode; -@interface BookmarkHomeViewController () { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkHomeViewController; -} +@interface BookmarkHomeViewController () // Redefined to be readwrite. -@property(nonatomic, retain, readwrite) NSMutableArray* editIndexPaths; +@property(nonatomic, strong, readwrite) NSMutableArray* editIndexPaths; // Returns the parent, if all the bookmarks are siblings. // Otherwise returns the mobile_node. @@ -42,9 +42,6 @@ DCHECK(browserState); self = [super initWithNibName:nil bundle:nil]; if (self) { - _propertyReleaser_BookmarkHomeViewController.Init( - self, [BookmarkHomeViewController class]); - _browserState = browserState->GetOriginalChromeBrowserState(); _loader = loader; @@ -58,8 +55,7 @@ - (void)loadView { CGRect frame = [[UIScreen mainScreen] bounds]; - self.view = - base::scoped_nsobject<UIView>([[UIView alloc] initWithFrame:frame]); + self.view = [[UIView alloc] initWithFrame:frame]; } - (void)resetEditNodes {
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm index 1125bb9..c26bb57 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
@@ -40,41 +40,43 @@ using BookmarkHomeViewControllerTest = BookmarkIOSUnitTest; TEST_F(BookmarkHomeViewControllerTest, DeleteNodesUpdatesEditNodes) { - const BookmarkNode* mobileNode = _bookmarkModel->mobile_node(); - const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); - const BookmarkNode* a = AddBookmark(mobileNode, @"a"); - const BookmarkNode* b = AddBookmark(mobileNode, @"b"); - const BookmarkNode* f2 = AddFolder(mobileNode, @"f2"); + @autoreleasepool { + const BookmarkNode* mobileNode = _bookmarkModel->mobile_node(); + const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); + const BookmarkNode* a = AddBookmark(mobileNode, @"a"); + const BookmarkNode* b = AddBookmark(mobileNode, @"b"); + const BookmarkNode* f2 = AddFolder(mobileNode, @"f2"); - const BookmarkNode* f1a = AddBookmark(f1, @"f1a"); - AddBookmark(f1, @"f1b"); - AddBookmark(f1, @"f1c"); - const BookmarkNode* f2a = AddBookmark(f2, @"f2a"); - AddBookmark(f2, @"f2b"); + const BookmarkNode* f1a = AddBookmark(f1, @"f1a"); + AddBookmark(f1, @"f1b"); + AddBookmark(f1, @"f1c"); + const BookmarkNode* f2a = AddBookmark(f2, @"f2a"); + AddBookmark(f2, @"f2b"); - std::set<const BookmarkNode*> toDelete; - toDelete.insert(b); - toDelete.insert(f1a); - toDelete.insert(f1); - toDelete.insert(f2a); + std::set<const BookmarkNode*> toDelete; + toDelete.insert(b); + toDelete.insert(f1a); + toDelete.insert(f1); + toDelete.insert(f2a); - base::scoped_nsobject<MockBookmarkHomeHandsetViewController> controller( - [[MockBookmarkHomeHandsetViewController alloc] - initWithLoader:nil - browserState:chrome_browser_state_.get()]); + base::scoped_nsobject<MockBookmarkHomeHandsetViewController> controller( + [[MockBookmarkHomeHandsetViewController alloc] + initWithLoader:nil + browserState:chrome_browser_state_.get()]); - [controller resetEditNodes]; - [controller insertEditNode:f1 atIndexPath:nil]; - [controller insertEditNode:a atIndexPath:nil]; - [controller insertEditNode:f2 atIndexPath:nil]; + [controller resetEditNodes]; + [controller insertEditNode:f1 atIndexPath:nil]; + [controller insertEditNode:a atIndexPath:nil]; + [controller insertEditNode:f2 atIndexPath:nil]; - bookmark_utils_ios::DeleteBookmarks(toDelete, _bookmarkModel); + bookmark_utils_ios::DeleteBookmarks(toDelete, _bookmarkModel); - // After the deletion, only 'a' and 'f2' should be left. - std::set<const BookmarkNode*> editingNodes = [controller editNodes]; - EXPECT_EQ(editingNodes.size(), 2u); - EXPECT_TRUE(editingNodes.find(a) != editingNodes.end()); - EXPECT_TRUE(editingNodes.find(f2) != editingNodes.end()); + // After the deletion, only 'a' and 'f2' should be left. + std::set<const BookmarkNode*> editingNodes = [controller editNodes]; + EXPECT_EQ(editingNodes.size(), 2u); + EXPECT_TRUE(editingNodes.find(a) != editingNodes.end()); + EXPECT_TRUE(editingNodes.find(f2) != editingNodes.end()); + } } } // anonymous namespace
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.mm index cdf3f04..6133d1ed 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.mm
@@ -4,16 +4,16 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_home_waiting_view.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/material_components/activity_indicator.h" #import "ios/chrome/browser/ui/rtl_geometry.h" #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h" -@interface BookmarkHomeWaitingView ()<MDCActivityIndicatorDelegate> { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkHomeWaitingView; -} +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface BookmarkHomeWaitingView ()<MDCActivityIndicatorDelegate> @property(nonatomic, retain) MDCActivityIndicator* activityIndicator; @property(nonatomic, copy) ProceduralBlock animateOutCompletionBlock; @end @@ -26,8 +26,6 @@ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - _propertyReleaser_BookmarkHomeWaitingView.Init( - self, [BookmarkHomeWaitingView class]); self.backgroundColor = bookmark_utils_ios::mainBackgroundColor(); self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; @@ -39,8 +37,8 @@ dispatch_time_t delayForIndicatorAppearance = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)); dispatch_after(delayForIndicatorAppearance, dispatch_get_main_queue(), ^{ - base::scoped_nsobject<MDCActivityIndicator> activityIndicator( - [[MDCActivityIndicator alloc] initWithFrame:CGRectMake(0, 0, 24, 24)]); + MDCActivityIndicator* activityIndicator = + [[MDCActivityIndicator alloc] initWithFrame:CGRectMake(0, 0, 24, 24)]; self.activityIndicator = activityIndicator; self.activityIndicator.delegate = self; self.activityIndicator.autoresizingMask =
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm index 50f0d08..44c9dd0d 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
@@ -6,11 +6,8 @@ #include <stdint.h> -#import "base/ios/weak_nsobject.h" #include "base/logging.h" #include "base/mac/bind_objc_block.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" @@ -37,6 +34,10 @@ #include "ios/web/public/referrer.h" #include "ui/base/l10n/l10n_util.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using bookmarks::BookmarkModel; using bookmarks::BookmarkNode; @@ -55,23 +56,20 @@ ios::ChromeBrowserState* _browserState; // weak // The designated url loader. - base::WeakNSProtocol<id<UrlLoader>> _loader; + __weak id<UrlLoader> _loader; // The parent controller on top of which the UI needs to be presented. - base::WeakNSObject<UIViewController> _parentController; - - base::mac::ObjCPropertyReleaser - _propertyReleaser_BookmarkInteractionController; + __weak UIViewController* _parentController; } // The bookmark model in use. @property(nonatomic, assign) BookmarkModel* bookmarkModel; // A reference to the potentially presented bookmark browser. -@property(nonatomic, retain) BookmarkHomeViewController* bookmarkBrowser; +@property(nonatomic, strong) BookmarkHomeViewController* bookmarkBrowser; // A reference to the potentially presented single bookmark editor. -@property(nonatomic, retain) BookmarkEditViewController* bookmarkEditor; +@property(nonatomic, strong) BookmarkEditViewController* bookmarkEditor; // The user wants to bookmark the current tab. - (void)addBookmarkForTab:(Tab*)tab; @@ -88,7 +86,6 @@ @end @implementation BookmarkInteractionController - @synthesize bookmarkBrowser = _bookmarkBrowser; @synthesize bookmarkEditor = _bookmarkEditor; @synthesize bookmarkModel = _bookmarkModel; @@ -129,14 +126,12 @@ parentController:(UIViewController*)parentController { self = [super init]; if (self) { - _propertyReleaser_BookmarkInteractionController.Init( - self, [BookmarkInteractionController class]); // Bookmarks are always opened with the main browser state, even in // incognito mode. _currentBrowserState = browserState; _browserState = browserState->GetOriginalChromeBrowserState(); - _loader.reset(loader); - _parentController.reset(parentController); + _loader = loader; + _parentController = parentController; _bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState(_browserState); DCHECK(_bookmarkModel); @@ -148,7 +143,6 @@ - (void)dealloc { _bookmarkBrowser.delegate = nil; _bookmarkEditor.delegate = nil; - [super dealloc]; } - (void)addBookmarkForTab:(Tab*)tab { @@ -158,13 +152,11 @@ self.bookmarkModel->AddURL(defaultFolder, defaultFolder->child_count(), base::SysNSStringToUTF16(tab.title), tab.url); - MDCSnackbarMessageAction* action = - [[[MDCSnackbarMessageAction alloc] init] autorelease]; - base::WeakNSObject<BookmarkInteractionController> weakSelf(self); - base::WeakNSObject<Tab> weakTab(tab); + MDCSnackbarMessageAction* action = [[MDCSnackbarMessageAction alloc] init]; + __weak BookmarkInteractionController* weakSelf = self; + __weak Tab* weakTab = tab; action.handler = ^{ - base::scoped_nsobject<BookmarkInteractionController> strongSelf( - [weakSelf retain]); + BookmarkInteractionController* strongSelf = weakSelf; if (!strongSelf || !weakTab) return; [strongSelf presentBookmarkForTab:weakTab]; @@ -198,15 +190,14 @@ [self dismissSnackbar]; - base::scoped_nsobject<BookmarkEditViewController> bookmarkEditor( + BookmarkEditViewController* bookmarkEditor = [[BookmarkEditViewController alloc] initWithBookmark:bookmark - browserState:_browserState]); + browserState:_browserState]; self.bookmarkEditor = bookmarkEditor; self.bookmarkEditor.delegate = self; - base::scoped_nsobject<UINavigationController> navController( - [[BookmarkNavigationController alloc] - initWithRootViewController:self.bookmarkEditor]); - navController.get().modalPresentationStyle = UIModalPresentationFormSheet; + UINavigationController* navController = [[BookmarkNavigationController alloc] + initWithRootViewController:self.bookmarkEditor]; + navController.modalPresentationStyle = UIModalPresentationFormSheet; [_parentController presentViewController:navController animated:YES completion:nil]; @@ -229,8 +220,8 @@ - (void)presentBookmarks { DCHECK(!self.bookmarkBrowser && !self.bookmarkEditor); - base::scoped_nsobject<BookmarkControllerFactory> bookmarkControllerFactory( - [[BookmarkControllerFactory alloc] init]); + BookmarkControllerFactory* bookmarkControllerFactory = + [[BookmarkControllerFactory alloc] init]; self.bookmarkBrowser = [bookmarkControllerFactory bookmarkControllerWithBrowserState:_currentBrowserState loader:_loader];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.h b/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.h index 37eb713..034265fb 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.h
@@ -14,7 +14,7 @@ @interface BookmarkMenuCell : UITableViewCell // The view used to display the ink effect. -@property(nonatomic, retain) MDCInkView* inkView; +@property(nonatomic, strong) MDCInkView* inkView; // Updates the UI of the cell to reflect the menu item. - (void)updateWithBookmarkMenuItem:(BookmarkMenuItem*)item
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.mm b/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.mm index 0882236..23ccdee 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.mm
@@ -4,8 +4,6 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_cell.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_item.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #include "ios/chrome/browser/ui/rtl_geometry.h" @@ -15,23 +13,25 @@ #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { CGFloat kTrailingMargin = 16.0; } // namespace -@interface BookmarkMenuCell () { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkMenuCell; -} +@interface BookmarkMenuCell () // Set to YES if the cell can be selected. @property(nonatomic, assign) BOOL isSelectable; // Set to YES if the cell should animate on selection. @property(nonatomic, assign) BOOL shouldAnimateHighlight; // Icon view. -@property(nonatomic, assign) UIImageView* iconView; +@property(nonatomic, weak) UIImageView* iconView; // Text label. -@property(nonatomic, assign) UILabel* itemLabel; +@property(nonatomic, weak) UILabel* itemLabel; // Separator view. Displayed at 1 pixel height on top for some cells. -@property(nonatomic, assign) UIView* separatorView; +@property(nonatomic, weak) UIView* separatorView; @end @implementation BookmarkMenuCell @@ -46,22 +46,20 @@ reuseIdentifier:(NSString*)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { - _propertyReleaser_BookmarkMenuCell.Init(self, [BookmarkMenuCell class]); - // Create icon view. - base::scoped_nsobject<UIImageView> iconView([[UIImageView alloc] init]); + UIImageView* iconView = [[UIImageView alloc] init]; _iconView = iconView; // Create item label. - base::scoped_nsobject<UILabel> itemLabel([[UILabel alloc] init]); + UILabel* itemLabel = [[UILabel alloc] init]; _itemLabel = itemLabel; self.contentView.layoutMargins = UIEdgeInsetsMakeDirected( 0, bookmark_utils_ios::menuMargin, 0, kTrailingMargin); // Create stack view. - UIStackView* contentStack = [[[UIStackView alloc] - initWithArrangedSubviews:@[ iconView, itemLabel ]] autorelease]; + UIStackView* contentStack = + [[UIStackView alloc] initWithArrangedSubviews:@[ iconView, itemLabel ]]; [self.contentView addSubview:contentStack]; contentStack.spacing = bookmark_utils_ios::titleToIconDistance; @@ -86,8 +84,7 @@ [self addSubview:_inkView]; // Add separator view. - base::scoped_nsobject<UIView> separatorView( - [[UIView alloc] initWithFrame:CGRectZero]); + UIView* separatorView = [[UIView alloc] initWithFrame:CGRectZero]; [self.contentView addSubview:separatorView]; _separatorView = separatorView;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_menu_item.mm b/ios/chrome/browser/ui/bookmarks/bookmark_menu_item.mm index b5920fe9..68b8712 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_menu_item.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_menu_item.mm
@@ -6,13 +6,16 @@ #include "base/hash.h" #include "base/logging.h" -#include "base/mac/objc_property_releaser.h" #include "base/strings/sys_string_conversions.h" #include "components/bookmarks/browser/bookmark_node.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using bookmarks::BookmarkNode; namespace bookmarks { @@ -32,9 +35,7 @@ } } // namespace bookmarks -@interface BookmarkMenuItem () { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkMenuItem; -} +@interface BookmarkMenuItem () // Redefined to be read-write. @property(nonatomic, assign) const BookmarkNode* folder; @property(nonatomic, assign) const BookmarkNode* rootAncestor; @@ -50,14 +51,6 @@ @synthesize sectionTitle = _sectionTitle; @synthesize type = _type; -- (instancetype)init { - self = [super init]; - if (self) { - _propertyReleaser_BookmarkMenuItem.Init(self, [BookmarkMenuItem class]); - } - return self; -} - - (UIAccessibilityTraits)accessibilityTraits { switch (self.type) { case bookmarks::MenuItemFolder: @@ -175,7 +168,7 @@ - (BookmarkMenuItem*)parentItem { if (self.type != bookmarks::MenuItemFolder) return self; - BookmarkMenuItem* item = [[[BookmarkMenuItem alloc] init] autorelease]; + BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; item.type = self.type; item.folder = self.rootAncestor; item.rootAncestor = self.rootAncestor; @@ -194,14 +187,14 @@ } + (BookmarkMenuItem*)dividerMenuItem { - BookmarkMenuItem* item = [[[BookmarkMenuItem alloc] init] autorelease]; + BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; item.type = bookmarks::MenuItemDivider; return item; } + (BookmarkMenuItem*)folderMenuItemForNode:(const BookmarkNode*)node rootAncestor:(const BookmarkNode*)ancestor { - BookmarkMenuItem* item = [[[BookmarkMenuItem alloc] init] autorelease]; + BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; item.type = bookmarks::MenuItemFolder; item.folder = node; item.rootAncestor = ancestor; @@ -209,7 +202,7 @@ } + (BookmarkMenuItem*)sectionMenuItemWithTitle:(NSString*)title { - BookmarkMenuItem* item = [[[BookmarkMenuItem alloc] init] autorelease]; + BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; item.type = bookmarks::MenuItemSectionHeader; item.sectionTitle = title; return item;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h b/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h index 3209d28..a35363c 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.h
@@ -22,8 +22,8 @@ // This view consists of a table view that shows all the relevant menu items. @interface BookmarkMenuView : UIView -@property(nonatomic, assign) id<BookmarkMenuViewDelegate> delegate; -@property(nonatomic, readonly) BookmarkMenuItem* defaultMenuItem; +@property(nonatomic, weak) id<BookmarkMenuViewDelegate> delegate; +@property(nonatomic, weak, readonly) BookmarkMenuItem* defaultMenuItem; // Designated initializer. - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.mm index dfbe201..106fadf0 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_menu_view.mm
@@ -7,8 +7,7 @@ #include <memory> #include "base/mac/foundation_util.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" + #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_model_observer.h" #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" @@ -26,6 +25,10 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/tree_node_iterator.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using bookmarks::BookmarkNode; @interface BookmarkMenuView ()<BookmarkModelBridgeObserver, @@ -34,17 +37,15 @@ UITableViewDelegate> { // A bridge to receive bookmark model observer callbacks. std::unique_ptr<bookmarks::BookmarkModelBridge> _modelBridge; - - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkMenuView; } @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarkModel; // This array directly represents the rows that show up in the table. -@property(nonatomic, retain) NSMutableArray* menuItems; +@property(nonatomic, strong) NSMutableArray* menuItems; // The primary menu item is blue instead of gray. -@property(nonatomic, retain) BookmarkMenuItem* primaryMenuItem; +@property(nonatomic, strong) BookmarkMenuItem* primaryMenuItem; @property(nonatomic, assign) ios::ChromeBrowserState* browserState; -@property(nonatomic, retain) UITableView* tableView; -@property(nonatomic, retain) MDCInkTouchController* inkTouchController; +@property(nonatomic, strong) UITableView* tableView; +@property(nonatomic, strong) MDCInkTouchController* inkTouchController; // Updates the data model, and the UI. - (void)reloadData; @@ -72,8 +73,6 @@ frame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - _propertyReleaser_BookmarkMenuView.Init(self, [BookmarkMenuView class]); - _browserState = browserState; // Set up connection to the BookmarkModel. @@ -93,13 +92,11 @@ - (void)dealloc { self.tableView.delegate = nil; self.tableView.dataSource = nil; - [super dealloc]; } - (void)createViews { // Make the table view. - self.tableView = base::scoped_nsobject<UITableView>( - [[UITableView alloc] initWithFrame:self.bounds]); + self.tableView = [[UITableView alloc] initWithFrame:self.bounds]; [self addSubview:self.tableView]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; self.tableView.delegate = self; @@ -108,8 +105,8 @@ [self reloadData]; // Set up ink touch controller. - base::scoped_nsobject<MDCInkTouchController> inkTouchController( - [[MDCInkTouchController alloc] initWithView:self.tableView]); + MDCInkTouchController* inkTouchController = + [[MDCInkTouchController alloc] initWithView:self.tableView]; self.inkTouchController = inkTouchController; self.inkTouchController.delegate = self; self.inkTouchController.delaysInkSpread = YES; @@ -133,8 +130,7 @@ const BookmarkNode* otherBookmarks = self.bookmarkModel->other_node(); // The first section is always visible. - base::scoped_nsobject<NSMutableArray> topSection( - [[NSMutableArray alloc] init]); + NSMutableArray* topSection = [[NSMutableArray alloc] init]; [self.menuItems addObject:topSection]; // Mobile bookmark is shown even if empty. @@ -155,8 +151,7 @@ // The second section contains all the top level folders (except for the // permanent nodes). - base::scoped_nsobject<NSMutableArray> folderSection( - [[NSMutableArray alloc] init]); + NSMutableArray* folderSection = [[NSMutableArray alloc] init]; std::vector<const BookmarkNode*> rootLevelFolders = RootLevelFolders(self.bookmarkModel); bookmark_utils_ios::SortFolders(&rootLevelFolders); @@ -312,9 +307,9 @@ BookmarkMenuCell* cell = [tableView dequeueReusableCellWithIdentifier:[BookmarkMenuCell reuseIdentifier]]; if (!cell) { - cell = [[[BookmarkMenuCell alloc] + cell = [[BookmarkMenuCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:[BookmarkMenuCell reuseIdentifier]] autorelease]; + reuseIdentifier:[BookmarkMenuCell reuseIdentifier]]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; BookmarkMenuItem* menuItem = [self menuItemAtIndexPath:indexPath]; @@ -371,12 +366,12 @@ - (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { - return [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; + return [[UIView alloc] initWithFrame:CGRectZero]; } - (UIView*)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section { - return [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; + return [[UIView alloc] initWithFrame:CGRectZero]; } #pragma mark MDCInkTouchControllerDelegate
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h b/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h index 36bdd1b..2766a4d 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h
@@ -69,8 +69,8 @@ void BookmarkAllUserNodesRemoved(BookmarkModel* model, const std::set<GURL>& removed_urls) override; - id<BookmarkModelBridgeObserver> observer_; // weak - BookmarkModel* model_; // weak + __weak id<BookmarkModelBridgeObserver> observer_; + BookmarkModel* model_; // weak }; } // namespace bookmarks
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.mm b/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.mm index 221b496..b8a40762 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.mm
@@ -9,6 +9,10 @@ #include "base/logging.h" #include "components/bookmarks/browser/bookmark_model.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace bookmarks { BookmarkModelBridge::BookmarkModelBridge(
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm index 4928dc8..c77d062 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm
@@ -4,9 +4,12 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h" -#include "base/mac/scoped_nsobject.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + @implementation BookmarkNavigationController - (id)initWithRootViewController:(UIViewController*)rootViewController {
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h b/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h index b48fa16..792ac9f 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h
@@ -42,12 +42,12 @@ // programmatic animation. - (BOOL)userDrivenAnimationInProgress; -@property(nonatomic, assign) id<BookmarkPanelViewDelegate> delegate; +@property(nonatomic, weak) id<BookmarkPanelViewDelegate> delegate; // These views should not be modified directly. Instead, subviews should be // added to each to create the desired UI. -@property(nonatomic, retain, readonly) UIView* contentView; -@property(nonatomic, retain, readonly) UIView* menuView; +@property(nonatomic, strong, readonly) UIView* contentView; +@property(nonatomic, strong, readonly) UIView* menuView; // Whether the menu is being shown. If a user-driven animation is in progress, // this property reflects the state of the menu at the beginning of the
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.mm index 35b355c..f9a2b77 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_panel_view.mm
@@ -5,32 +5,25 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_panel_view.h" #include "base/logging.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" + #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/rtl_geometry.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + // The position of the MenuViewWrapper doesn't change, but its subview menuView // can slide horizontally. This UIView subclass decides whether to swallow // touches based on the transform of its subview, since its subview might lie // outsides the bounds of itself. -@interface MenuViewWrapper : UIView { - base::mac::ObjCPropertyReleaser _propertyReleaser_MenuViewWrapper; -} -@property(nonatomic, retain) UIView* menuView; +@interface MenuViewWrapper : UIView +@property(nonatomic, strong) UIView* menuView; @end @implementation MenuViewWrapper @synthesize menuView = _menuView; -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _propertyReleaser_MenuViewWrapper.Init(self, [MenuViewWrapper class]); - } - return self; -} - - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event { return CGRectContainsPoint(self.menuView.frame, point); } @@ -38,26 +31,25 @@ @end @interface BookmarkPanelView ()<UIGestureRecognizerDelegate> { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkPanelView; } // The content view always has the same size as this view. // Redefined to be read-write. -@property(nonatomic, retain) UIView* contentView; +@property(nonatomic, strong) UIView* contentView; // When the menu is showing, the cover partially obscures the content view. -@property(nonatomic, retain) UIView* contentViewCover; +@property(nonatomic, strong) UIView* contentViewCover; // The menu view's frame never changes. Sliding it left and right is performed // by changing its transform property. // Redefined to be read-write. -@property(nonatomic, retain) UIView* menuView; +@property(nonatomic, strong) UIView* menuView; // The menu view's layout is adjusted by changing its transform property. // Changing the transform property results in a layoutSubviews call to the // parentView. To prevent confusion to the origin of the layoutSubview call, the // menu is placed inside a wrapper. The wrapper is always placed offscreen to // the left. It requires a UIView subclass to correctly decide whether touches // should make it to the menuView. -@property(nonatomic, retain) MenuViewWrapper* menuViewWrapper; +@property(nonatomic, strong) MenuViewWrapper* menuViewWrapper; @property(nonatomic, assign) CGFloat menuWidth; -@property(nonatomic, retain) UIPanGestureRecognizer* panRecognizer; +@property(nonatomic, strong) UIPanGestureRecognizer* panRecognizer; // This property corresponds to whether startPoint is valid. It also reflects // whether this class is responding to a user-driven animation. @@ -123,44 +115,38 @@ - (id)initWithFrame:(CGRect)frame menuViewWidth:(CGFloat)width { self = [super initWithFrame:frame]; if (self) { - _propertyReleaser_BookmarkPanelView.Init(self, [BookmarkPanelView class]); - DCHECK(width); _menuWidth = width; - self.contentView = base::scoped_nsobject<UIView>([[UIView alloc] init]); + self.contentView = [[UIView alloc] init]; self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [self addSubview:self.contentView]; - self.contentViewCover = - base::scoped_nsobject<UIView>([[UIView alloc] init]); + self.contentViewCover = [[UIView alloc] init]; [self addSubview:self.contentViewCover]; self.contentViewCover.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8]; self.contentViewCover.alpha = 0; - base::scoped_nsobject<UITapGestureRecognizer> tapRecognizer( - [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(contentViewCoverTapped)]); + UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] + initWithTarget:self + action:@selector(contentViewCoverTapped)]; [self.contentViewCover addGestureRecognizer:tapRecognizer]; self.contentViewCover.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - self.menuViewWrapper = - base::scoped_nsobject<MenuViewWrapper>([[MenuViewWrapper alloc] init]); + self.menuViewWrapper = [[MenuViewWrapper alloc] init]; self.menuViewWrapper.backgroundColor = [UIColor clearColor]; [self addSubview:self.menuViewWrapper]; - self.menuView = base::scoped_nsobject<UIView>([[UIView alloc] init]); + self.menuView = [[UIView alloc] init]; [self.menuViewWrapper addSubview:self.menuView]; self.menuViewWrapper.menuView = self.menuView; - self.panRecognizer = base::scoped_nsobject<UIPanGestureRecognizer>( - [[UIPanGestureRecognizer alloc] - initWithTarget:self - action:@selector(panRecognized:)]); + self.panRecognizer = [[UIPanGestureRecognizer alloc] + initWithTarget:self + action:@selector(panRecognized:)]; [self addGestureRecognizer:self.panRecognizer]; [self updateLayout];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_position_cache.mm b/ios/chrome/browser/ui/bookmarks/bookmark_position_cache.mm index 51fdd98..2d3372ec 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_position_cache.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_position_cache.mm
@@ -7,7 +7,6 @@ #include <stdint.h> #include "base/logging.h" -#include "base/mac/objc_property_releaser.h" namespace { // The current version of the cached position. This number should be incremented @@ -45,10 +44,10 @@ + (BookmarkPositionCache*)cacheForMenuItemFolderWithPosition:(CGFloat)position folderId:(int64_t)folderId { - return [[[BookmarkPositionCache alloc] + return [[BookmarkPositionCache alloc] initWithFolderId:folderId position:position - type:bookmarks::MenuItemFolder] autorelease]; + type:bookmarks::MenuItemFolder]; } #pragma mark - Designated Initializer @@ -103,17 +102,14 @@ int typeInt = [coder decodeIntForKey:kTypeKey]; if (version != kVersion) { - [self release]; return nil; } if (!bookmarks::NumberIsValidMenuItemType(typeInt)) { - [self release]; return nil; } if (typeInt == kMenuItemManaged) { - [self release]; return nil; }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h b/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h index 795c3ab..11e4c6f 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.h
@@ -23,7 +23,7 @@ + (NSString*)reuseIdentifier; -@property(nonatomic, assign) id<BookmarkPromoCellDelegate> delegate; +@property(nonatomic, weak) id<BookmarkPromoCellDelegate> delegate; @end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.mm b/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.mm index e2c031f3..6b2534dc 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_promo_cell.mm
@@ -7,8 +7,7 @@ #import <QuartzCore/QuartzCore.h> #include "base/logging.h" -#import "base/mac/objc_property_releaser.h" -#import "base/mac/scoped_nsobject.h" + #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" #import "ios/chrome/browser/ui/rtl_geometry.h" @@ -19,6 +18,10 @@ #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h" #import "ui/base/l10n/l10n_util_mac.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const CGFloat kPadding = 16; @@ -28,13 +31,13 @@ const CGFloat kButtonsSpace = 8; void SetTextWithLineHeight(UILabel* label, NSString* text, CGFloat lineHeight) { - base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( - [[NSMutableParagraphStyle alloc] init]); + NSMutableParagraphStyle* paragraphStyle = + [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setMinimumLineHeight:lineHeight]; [paragraphStyle setMaximumLineHeight:lineHeight]; NSDictionary* attributes = @{NSParagraphStyleAttributeName : paragraphStyle}; - base::scoped_nsobject<NSAttributedString> attributedString( - [[NSAttributedString alloc] initWithString:text attributes:attributes]); + NSAttributedString* attributedString = + [[NSAttributedString alloc] initWithString:text attributes:attributes]; label.attributedText = attributedString; } @@ -45,10 +48,10 @@ // differently within the BookmarkPromoCell. @interface BookmarkPromoView : UIView -@property(nonatomic, assign) UILabel* titleLabel; -@property(nonatomic, assign) UILabel* subtitleLabel; -@property(nonatomic, assign) MDCFlatButton* signInButton; -@property(nonatomic, assign) MDCFlatButton* dismissButton; +@property(nonatomic, weak) UILabel* titleLabel; +@property(nonatomic, weak) UILabel* subtitleLabel; +@property(nonatomic, weak) MDCFlatButton* signInButton; +@property(nonatomic, weak) MDCFlatButton* dismissButton; @end @@ -70,7 +73,8 @@ self.accessibilityIdentifier = @"promo_view"; // The title. - _titleLabel = [[[UILabel alloc] init] autorelease]; + UILabel* titleLabel = [[UILabel alloc] init]; + _titleLabel = titleLabel; _titleLabel.textColor = bookmark_utils_ios::darkTextColor(); _titleLabel.font = [[MDFRobotoFontLoader sharedInstance] mediumFontOfSize:16]; @@ -82,7 +86,8 @@ [self addSubview:_titleLabel]; // The subtitle. - _subtitleLabel = [[[UILabel alloc] init] autorelease]; + UILabel* subtitleLabel = [[UILabel alloc] init]; + _subtitleLabel = subtitleLabel; _subtitleLabel.textColor = bookmark_utils_ios::darkTextColor(); _subtitleLabel.font = [[MDFRobotoFontLoader sharedInstance] regularFontOfSize:14]; @@ -94,7 +99,8 @@ [self addSubview:_subtitleLabel]; // The sign-in button. - _signInButton = [[[MDCFlatButton alloc] init] autorelease]; + MDCFlatButton* signInButton = [[MDCFlatButton alloc] init]; + _signInButton = signInButton; [_signInButton setBackgroundColor:[[MDCPalette cr_bluePalette] tint500] forState:UIControlStateNormal]; _signInButton.customTitleColor = [UIColor whiteColor]; @@ -107,7 +113,8 @@ [self addSubview:_signInButton]; // The dismiss button. - _dismissButton = [[[MDCFlatButton alloc] init] autorelease]; + MDCFlatButton* dismissButton = [[MDCFlatButton alloc] init]; + _dismissButton = dismissButton; [_dismissButton setTitle:l10n_util::GetNSString(IDS_IOS_BOOKMARK_PROMO_DISMISS_BUTTON) forState:UIControlStateNormal]; @@ -152,11 +159,10 @@ @end @interface BookmarkPromoCell () { - base::mac::ObjCPropertyReleaser _propertyReleaser_BookmarkPromoCell; } -@property(nonatomic, assign) BookmarkPromoView* promoView; -@property(nonatomic, retain) NSArray* compactContentViewConstraints; -@property(nonatomic, retain) NSArray* regularContentViewConstraints; +@property(nonatomic, weak) BookmarkPromoView* promoView; +@property(nonatomic, strong) NSArray* compactContentViewConstraints; +@property(nonatomic, strong) NSArray* regularContentViewConstraints; @end @implementation BookmarkPromoCell @@ -177,10 +183,11 @@ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - _propertyReleaser_BookmarkPromoCell.Init(self, [BookmarkPromoCell class]); self.contentView.translatesAutoresizingMaskIntoConstraints = NO; - _promoView = [[[BookmarkPromoView alloc] initWithFrame:frame] autorelease]; + BookmarkPromoView* promoView = + [[BookmarkPromoView alloc] initWithFrame:frame]; + _promoView = promoView; [_promoView.signInButton addTarget:self action:@selector(signIn:) forControlEvents:UIControlEventTouchUpInside];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h index 65608847..7e72fef 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h
@@ -26,7 +26,7 @@ // and handles displaying the sign-in view controller. @interface BookmarkPromoController : NSObject -@property(nonatomic, assign) id<BookmarkPromoControllerDelegate> delegate; +@property(nonatomic, weak) id<BookmarkPromoControllerDelegate> delegate; // Holds the current state of the promo. When the promo state change, it will // call the promoStateChanged: selector on the delegate.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm index 49dbd24..688f89e5 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.mm
@@ -6,7 +6,6 @@ #include <memory> -#include "base/mac/scoped_nsobject.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -20,6 +19,10 @@ #import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/browser/ui/ui_util.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { // Enum is used to record the actions performed by the user on the promo cell. // |Stars.PromoActions|. @@ -86,8 +89,7 @@ } private: - // Weak - BookmarkPromoController* controller_; + __weak BookmarkPromoController* controller_; }; } // namespace @@ -128,7 +130,6 @@ ios::SigninManagerFactory::GetForBrowserState(_browserState); signinManager->RemoveObserver(_signinObserver.get()); } - [super dealloc]; } - (void)showSignIn { @@ -137,10 +138,10 @@ BOOKMARKS_PROMO_ACTION_COUNT); base::RecordAction( base::UserMetricsAction("Signin_Signin_FromBookmarkManager")); - base::scoped_nsobject<ShowSigninCommand> command([[ShowSigninCommand alloc] + ShowSigninCommand* command = [[ShowSigninCommand alloc] initWithOperation:AUTHENTICATION_OPERATION_SIGNIN signInAccessPoint:signin_metrics::AccessPoint:: - ACCESS_POINT_BOOKMARK_MANAGER]); + ACCESS_POINT_BOOKMARK_MANAGER]; [self chromeExecuteCommand:command]; }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm index 7edfa44..9154d4e 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" + #include <memory> #include <vector> @@ -12,7 +14,6 @@ #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_item.h" -#import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" #include "testing/gtest_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h index b7eb76d..0761fbb 100644 --- a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h +++ b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h
@@ -24,7 +24,7 @@ private: void OnUndoManagerStateChange() override; - id<UndoManagerBridgeObserver> observer_; + __weak id<UndoManagerBridgeObserver> observer_; }; } // namespace bookmarks
diff --git a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.mm b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.mm index 00e6370..08c7898 100644 --- a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.mm +++ b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.mm
@@ -6,6 +6,10 @@ #include "base/logging.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace bookmarks { UndoManagerBridge::UndoManagerBridge(id<UndoManagerBridgeObserver> observer) : observer_(observer) {
diff --git a/ios/chrome/browser/ui/bookmarks/undo_manager_wrapper.mm b/ios/chrome/browser/ui/bookmarks/undo_manager_wrapper.mm index 2dbe79f..e99489d 100644 --- a/ios/chrome/browser/ui/bookmarks/undo_manager_wrapper.mm +++ b/ios/chrome/browser/ui/bookmarks/undo_manager_wrapper.mm
@@ -12,6 +12,10 @@ #include "ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h" #include "ios/chrome/browser/undo/bookmark_undo_service_factory.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + @interface UndoManagerWrapper ()<UndoManagerBridgeObserver> { std::unique_ptr<bookmarks::UndoManagerBridge> _bridge; } @@ -42,7 +46,6 @@ - (void)dealloc { _undoManager->RemoveObserver(_bridge.get()); - [super dealloc]; } #pragma mark - Public Methods
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index 2646f9f..ef37466 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -41,8 +41,7 @@ #include "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h" #include "components/infobars/core/infobar_manager.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/core/reading_list_switches.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/template_url_service.h" #include "components/sessions/core/tab_restore_service_helper.h" @@ -2537,8 +2536,7 @@ [_contextMenuCoordinator addItemWithTitle:title action:action]; } } - if (link.SchemeIsHTTPOrHTTPS() && - reading_list::switches::IsReadingListEnabled()) { + if (link.SchemeIsHTTPOrHTTPS()) { NSString* innerText = params.link_text; if ([innerText length] > 0) { // Add to reading list. @@ -3356,14 +3354,12 @@ if (_isOffTheRecord) [configuration setInIncognito:YES]; - if (reading_list::switches::IsReadingListEnabled()) { - if (!_readingListMenuNotifier) { - _readingListMenuNotifier.reset([[ReadingListMenuNotifier alloc] - initWithReadingList:ReadingListModelFactory::GetForBrowserState( - _browserState)]); - } - [configuration setReadingListMenuNotifier:_readingListMenuNotifier]; + if (!_readingListMenuNotifier) { + _readingListMenuNotifier.reset([[ReadingListMenuNotifier alloc] + initWithReadingList:ReadingListModelFactory::GetForBrowserState( + _browserState)]); } + [configuration setReadingListMenuNotifier:_readingListMenuNotifier]; [configuration setUserAgentType:self.userAgentType]; @@ -3504,9 +3500,6 @@ } - (void)addToReadingListURL:(const GURL&)URL title:(NSString*)title { - if (!reading_list::switches::IsReadingListEnabled()) { - return; - } base::RecordAction(UserMetricsAction("MobileReadingListAdd")); ReadingListModel* readingModel = @@ -4073,7 +4066,6 @@ [self print]; break; case IDC_ADD_READING_LIST: { - DCHECK(reading_list::switches::IsReadingListEnabled()); ReadingListAddCommand* command = base::mac::ObjCCastStrict<ReadingListAddCommand>(sender); [self addToReadingListURL:[command URL] title:[command title]]; @@ -4083,7 +4075,6 @@ [self showRateThisAppDialog]; break; case IDC_SHOW_READING_LIST: - DCHECK(reading_list::switches::IsReadingListEnabled()); [self showReadingList]; break; case IDC_VOICE_SEARCH: @@ -4336,7 +4327,6 @@ } - (void)showReadingList { - DCHECK(reading_list::switches::IsReadingListEnabled()); _readingListCoordinator.reset([[ReadingListCoordinator alloc] initWithBaseViewController:self browserState:self.browserState
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm index a1fa661..77a830c 100644 --- a/ios/chrome/browser/ui/history/history_ui_egtest.mm +++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -130,6 +130,10 @@ id<GREYMatcher> ClearBrowsingDataButton() { return ButtonWithAccessibilityLabelId(IDS_IOS_CLEAR_BUTTON); } +// Matcher for the clear browsing data action sheet item. +id<GREYMatcher> ConfirmClearBrowsingDataButton() { + return ButtonWithAccessibilityLabelId(IDS_IOS_CONFIRM_CLEAR_BUTTON); +} // Sign in with a mock identity. void MockSignIn() { @@ -234,15 +238,13 @@ #pragma mark Tests // Tests that no history is shown if there has been no navigation. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testDisplayNoHistory { +- (void)testDisplayNoHistory { [self openHistoryPanel]; [self assertNoHistoryShown]; } // Tests that the history panel displays navigation history. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testDisplayHistory { +- (void)testDisplayHistory { [self loadTestURLs]; [self openHistoryPanel]; @@ -262,8 +264,7 @@ } // Tests that history is not changed after performing back navigation. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testHistoryUpdateAfterBackNavigation { +- (void)testHistoryUpdateAfterBackNavigation { [ChromeEarlGrey loadURL:_URL1]; [ChromeEarlGrey loadURL:_URL2]; @@ -283,8 +284,7 @@ // Test that history displays a message about entries only if the user is logged // in, and that tapping on the link in the message opens a new tab with the sync // help page. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testHistoryEntriesStatusCell { +- (void)testHistoryEntriesStatusCell { [self loadTestURLs]; [self openHistoryPanel]; // Assert that no message is shown when the user is not signed in. @@ -317,8 +317,7 @@ } // Tests that searching history displays only entries matching the search term. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testSearchHistory { +- (void)testSearchHistory { [self loadTestURLs]; [self openHistoryPanel]; [[EarlGrey selectElementWithMatcher:SearchIconButton()] @@ -337,8 +336,7 @@ } // Tests deletion of history entries. -// TODO(crbug.com/704403): Re-enable this test. -- (void)DISABLED_testDeleteHistory { +- (void)testDeleteHistory { [self loadTestURLs]; [self openHistoryPanel]; @@ -396,15 +394,8 @@ performAction:grey_tap()]; [[EarlGrey selectElementWithMatcher:ClearBrowsingDataButton()] performAction:grey_tap()]; - - // There is not currently a matcher for acessibilityElementIsFocused or - // userInteractionEnabled which could be used here instead of checking that - // the button is not a MDCCollectionViewTextCell. Use when available. - // TODO(crbug.com/638674): Evaluate if this can move to shared code. - id<GREYMatcher> confirmClear = grey_allOf( - ClearBrowsingDataButton(), - grey_not(grey_kindOfClass([MDCCollectionViewTextCell class])), nil); - [[EarlGrey selectElementWithMatcher:confirmClear] performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:ConfirmClearBrowsingDataButton()] + performAction:grey_tap()]; // Include sufficientlyVisible condition for the case of the clear browsing // dialog, which also has a "Done" button and is displayed over the history
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn index 99bb2985..64726d7 100644 --- a/ios/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -157,7 +157,6 @@ "//components/ntp_tiles", "//components/prefs", "//components/rappor", - "//components/reading_list/core", "//components/search_engines", "//components/strings", "//components/suggestions",
diff --git a/ios/chrome/browser/ui/ntp/google_landing_controller.mm b/ios/chrome/browser/ui/ntp/google_landing_controller.mm index 96b6901..108372f 100644 --- a/ios/chrome/browser/ui/ntp/google_landing_controller.mm +++ b/ios/chrome/browser/ui/ntp/google_landing_controller.mm
@@ -22,7 +22,6 @@ #include "components/ntp_tiles/most_visited_sites.h" #include "components/ntp_tiles/ntp_tile.h" #include "components/rappor/rappor_service_impl.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/search_engines/template_url_service.h" #include "components/search_engines/template_url_service_observer.h" #include "components/strings/grit/components_strings.h" @@ -1240,11 +1239,8 @@ [_headerView addViewsToSearchField:_searchTapTarget]; if (!IsIPadIdiom()) { - ReadingListModel* readingListModel = nullptr; - if (reading_list::switches::IsReadingListEnabled()) { - readingListModel = - ReadingListModelFactory::GetForBrowserState(_browserState); - } + ReadingListModel* readingListModel = + ReadingListModelFactory::GetForBrowserState(_browserState); // iPhone header also contains a toolbar since the normal toolbar is // hidden. [_headerView addToolbarWithDelegate:_webToolbarDelegate
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn index be8cfbb..6202e36 100644 --- a/ios/chrome/browser/ui/omnibox/BUILD.gn +++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -32,6 +32,7 @@ } source_set("omnibox_internal") { + configs += [ "//build/config/compiler:enable_arc" ] sources = [ "chrome_omnibox_client_ios.h", "chrome_omnibox_client_ios.mm",
diff --git a/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.mm b/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.mm index 84f621b..e7b074d 100644 --- a/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.mm +++ b/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.mm
@@ -23,6 +23,10 @@ #include "ios/web/public/web_state/web_state.h" #include "url/gurl.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + ChromeOmniboxClientIOS::ChromeOmniboxClientIOS( WebOmniboxEditController* controller, ios::ChromeBrowserState* browser_state)
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.h b/ios/chrome/browser/ui/omnibox/location_bar_view_ios.h index 4f47c170..9e583fe 100644 --- a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.h +++ b/ios/chrome/browser/ui/omnibox/location_bar_view_ios.h
@@ -109,8 +109,10 @@ base::scoped_nsobject<UIButton> clear_text_button_; std::unique_ptr<OmniboxViewIOS> edit_view_; base::scoped_nsobject<OmniboxClearButtonBridge> clear_button_bridge_; - OmniboxTextFieldIOS* field_; - id<LocationBarDelegate> delegate_; + // |field_| should be __weak but is included from non-ARC code. + __unsafe_unretained OmniboxTextFieldIOS* field_; + // |delegate_| should be __weak but is included from non-ARC code. + __unsafe_unretained id<LocationBarDelegate> delegate_; bool is_showing_placeholder_while_collapsed_; };
diff --git a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm b/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm index 5359e87b..8b30bdf 100644 --- a/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm +++ b/ios/chrome/browser/ui/omnibox/location_bar_view_ios.mm
@@ -31,6 +31,10 @@ #include "ios/web/public/web_state/web_state.h" #include "ui/base/l10n/l10n_util.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const CGFloat kClearTextButtonWidth = 28; const CGFloat kClearTextButtonHeight = 28; @@ -306,7 +310,7 @@ [button addTarget:clear_button_bridge_ action:@selector(clearText) forControlEvents:UIControlEventTouchUpInside]; - clear_text_button_.reset([button retain]); + clear_text_button_.reset(button); SetA11yLabelAndUiAutomationName(clear_text_button_, IDS_IOS_ACCNAME_CLEAR_TEXT, @"Clear Text");
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h index 48817cb..c051745 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h
@@ -13,18 +13,18 @@ @interface OmniboxPopupMaterialRow : UITableViewCell // A truncate-by-fading version of the textLabel of a UITableViewCell. -@property(nonatomic, readonly, retain) +@property(nonatomic, readonly, strong) OmniboxPopupTruncatingLabel* textTruncatingLabel; // A truncate-by-fading version of the detailTextLabel of a UITableViewCell. -@property(nonatomic, readonly, retain) +@property(nonatomic, readonly, strong) OmniboxPopupTruncatingLabel* detailTruncatingLabel; // A standard UILabel for answers, which truncates with ellipses to support // multi-line text. -@property(nonatomic, readonly, retain) UILabel* detailAnswerLabel; +@property(nonatomic, readonly, strong) UILabel* detailAnswerLabel; -@property(nonatomic, readonly, retain) UIImageView* imageView; -@property(nonatomic, readonly, retain) UIImageView* answerImageView; -@property(nonatomic, readonly, retain) UIButton* appendButton; +@property(nonatomic, readonly, strong) UIImageView* imageView; +@property(nonatomic, readonly, strong) UIImageView* answerImageView; +@property(nonatomic, readonly, strong) UIButton* appendButton; @property(nonatomic, assign) CGFloat rowHeight; // Initialize the row with the given incognito state. The colors and styling are
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.mm index 42d4a3af..2f289f2 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.mm
@@ -5,13 +5,17 @@ #import "ios/chrome/browser/ui/omnibox/omnibox_popup_material_row.h" #include "base/logging.h" -#include "base/mac/objc_property_releaser.h" + #import "ios/chrome/browser/ui/omnibox/truncating_attributed_label.h" #include "ios/chrome/browser/ui/rtl_geometry.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_theme_resources.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const CGFloat kImageDimensionLength = 19.0; const CGFloat kLeadingPaddingIpad = 164; @@ -22,7 +26,6 @@ @interface OmniboxPopupMaterialRow () { BOOL _incognito; - base::mac::ObjCPropertyReleaser _propertyReleaser_OmniboxPopupMaterialRow; } // Set the append button normal and highlighted images. @@ -52,8 +55,6 @@ self.isAccessibilityElement = YES; self.backgroundColor = [UIColor clearColor]; _incognito = incognito; - _propertyReleaser_OmniboxPopupMaterialRow.Init( - self, [OmniboxPopupMaterialRow class]); _textTruncatingLabel = [[OmniboxPopupTruncatingLabel alloc] initWithFrame:CGRectZero]; @@ -75,7 +76,7 @@ _detailAnswerLabel.lineBreakMode = NSLineBreakByTruncatingTail; [self addSubview:_detailAnswerLabel]; - _appendButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; + _appendButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_appendButton setContentMode:UIViewContentModeRight]; [self updateAppendButtonImages]; // TODO(justincohen): Consider using the UITableViewCell's accessory view.
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm index e4fadc03..57e19fc8 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_material_view_controller.mm
@@ -8,7 +8,6 @@ #include "base/ios/ios_util.h" #include "base/mac/scoped_cftyperef.h" -#include "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h" @@ -29,6 +28,10 @@ #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h" #include "net/base/escape.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const int kRowCount = 6; const CGFloat kRowHeight = 48.0; @@ -86,7 +89,7 @@ AutocompleteResult _currentResult; // Array containing the OmniboxPopupMaterialRow objects displayed in the view. - base::scoped_nsobject<NSArray> _rows; + NSArray* _rows; // The height of the keyboard. Used to determine the content inset for the // scroll view. @@ -128,7 +131,6 @@ - (void)dealloc { self.tableView.delegate = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; - [super dealloc]; } - (UIScrollView*)scrollView { @@ -150,10 +152,10 @@ UIViewAutoresizingFlexibleHeight)]; // Cache fonts needed for omnibox attributed string. - NSMutableArray* rowsBuilder = [[[NSMutableArray alloc] init] autorelease]; + NSMutableArray* rowsBuilder = [[NSMutableArray alloc] init]; for (int i = 0; i < kRowCount; i++) { - OmniboxPopupMaterialRow* row = [[[OmniboxPopupMaterialRow alloc] - initWithIncognito:_incognito] autorelease]; + OmniboxPopupMaterialRow* row = + [[OmniboxPopupMaterialRow alloc] initWithIncognito:_incognito]; row.accessibilityIdentifier = [NSString stringWithFormat:@"omnibox suggestion %i", i]; row.autoresizingMask = UIViewAutoresizingFlexibleWidth; @@ -164,7 +166,7 @@ [row.appendButton setTag:i]; row.rowHeight = kRowHeight; } - _rows.reset([rowsBuilder copy]); + _rows = [rowsBuilder copy]; // Table configuration. self.tableView.allowsMultipleSelectionDuringEditing = NO; @@ -181,7 +183,7 @@ - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; if (![self isViewLoaded]) { - _rows.reset(); + _rows = nil; } } @@ -423,7 +425,7 @@ - (NSMutableAttributedString*)attributedStringWithAnswerLine: (const SuggestionAnswer::ImageLine&)line { NSMutableAttributedString* result = - [[[NSMutableAttributedString alloc] initWithString:@""] autorelease]; + [[NSMutableAttributedString alloc] initWithString:@""]; for (size_t i = 0; i < line.text_fields().size(); i++) { const SuggestionAnswer::TextField& field = line.text_fields()[i]; @@ -432,8 +434,8 @@ type:field.type()]]; } - base::scoped_nsobject<NSAttributedString> spacer( - [[NSAttributedString alloc] initWithString:@" "]); + NSAttributedString* spacer = + [[NSAttributedString alloc] initWithString:@" "]; if (line.additional_text() != nil) { const SuggestionAnswer::TextField* field = line.additional_text(); [result appendAttributedString:spacer]; @@ -533,8 +535,8 @@ [unescapedString stringByReplacingOccurrencesOfString:@"</b>" withString:@""]; - return [[[NSAttributedString alloc] initWithString:unescapedString - attributes:attributes] autorelease]; + return [[NSAttributedString alloc] initWithString:unescapedString + attributes:attributes]; } - (void)updateMatches:(const AutocompleteResult&)result @@ -655,7 +657,7 @@ return; _popupView->DidScroll(); - for (OmniboxPopupMaterialRow* row in _rows.get()) { + for (OmniboxPopupMaterialRow* row in _rows) { row.highlighted = NO; } } @@ -687,7 +689,7 @@ smallFont ? [MDCTypography body1Font] : [MDCTypography subheadFont]; NSMutableAttributedString* as = - [[[NSMutableAttributedString alloc] initWithString:text] autorelease]; + [[NSMutableAttributedString alloc] initWithString:text]; // Set the base attributes to the default font and color. NSDictionary* dict = @{
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.h index f46b2794..46c0493f 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.h
@@ -47,8 +47,8 @@ private: std::unique_ptr<OmniboxPopupModel> model_; - OmniboxViewIOS* edit_view_; // weak, owns this instance - id<OmniboxPopupPositioner> positioner_; // weak + OmniboxViewIOS* edit_view_; // weak, owns this instance + __weak id<OmniboxPopupPositioner> positioner_; // View that contains the omnibox popup table view and shadow. base::scoped_nsobject<UIView> popupView_; base::scoped_nsobject<OmniboxPopupMaterialViewController> popup_controller_;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.mm index e975fe27..d15dd359 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_popup_view_ios.mm
@@ -30,6 +30,10 @@ #include "net/url_request/url_request_context_getter.h" #include "ui/gfx/geometry/rect.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const CGFloat kExpandAnimationDuration = 0.1; const CGFloat kCollapseAnimationDuration = 0.05; @@ -73,8 +77,8 @@ [popupView_ addSubview:popupControllerView]; if (IsIPadIdiom()) { [popupView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; - base::scoped_nsobject<UIImageView> shadowView([[UIImageView alloc] - initWithImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]); + UIImageView* shadowView = [[UIImageView alloc] + initWithImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]; [shadowView setUserInteractionEnabled:NO]; [shadowView setTranslatesAutoresizingMaskIntoConstraints:NO]; [popupView_ addSubview:shadowView]; @@ -99,8 +103,7 @@ } else { // Add a white background to prevent seing the logo scroll through the // omnibox. - base::scoped_nsobject<UIView> whiteBackground( - [[UIView alloc] initWithFrame:CGRectZero]); + UIView* whiteBackground = [[UIView alloc] initWithFrame:CGRectZero]; [popupView_ addSubview:whiteBackground]; [whiteBackground setBackgroundColor:[UIColor whiteColor]];
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h index 6dba94f..849c331 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h
@@ -142,12 +142,12 @@ // Redeclare the delegate property to be the more specific // OmniboxTextFieldDelegate. -@property(nonatomic, assign) id<OmniboxTextFieldDelegate> delegate; +@property(nonatomic, weak) id<OmniboxTextFieldDelegate> delegate; -@property(nonatomic, retain) NSString* preEditText; +@property(nonatomic, strong) NSString* preEditText; @property(nonatomic) BOOL clearingPreEditText; -@property(nonatomic, retain) UIColor* selectedTextBackgroundColor; -@property(nonatomic, retain) UIColor* placeholderTextColor; +@property(nonatomic, strong) UIColor* selectedTextBackgroundColor; +@property(nonatomic, strong) UIColor* placeholderTextColor; @property(nonatomic, assign) BOOL incognito; @end
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm index 659afd7..64020a71 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
@@ -9,8 +9,7 @@ #include "base/command_line.h" #include "base/logging.h" #include "base/mac/foundation_util.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" + #include "base/strings/sys_string_conversions.h" #include "components/grit/components_scaled_resources.h" #include "components/omnibox/browser/autocomplete_input.h" @@ -32,6 +31,10 @@ #import "ui/gfx/ios/NSString+CrStringDrawing.h" #include "ui/gfx/scoped_cg_context_save_gstate_mac.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + namespace { const CGFloat kFontSize = 16; const CGFloat kEditingRectX = 16; @@ -92,21 +95,16 @@ @implementation OmniboxTextFieldIOS { // Currently selected chip text. Nil if no chip. - base::scoped_nsobject<NSString> _chipText; - base::scoped_nsobject<UILabel> _selection; - base::scoped_nsobject<UILabel> _preEditStaticLabel; - NSString* _preEditText; - base::scoped_nsobject<UIFont> _font; - base::scoped_nsobject<UIColor> _displayedTextColor; - base::scoped_nsobject<UIColor> _displayedTintColor; - UIColor* _selectedTextBackgroundColor; - UIColor* _placeholderTextColor; + NSString* _chipText; + UILabel* _selection; + UILabel* _preEditStaticLabel; + UIFont* _font; + UIColor* _displayedTextColor; + UIColor* _displayedTintColor; // The 'Copy URL' menu item is sometimes shown in the edit menu, so keep it // around to make adding/removing easier. - base::scoped_nsobject<UIMenuItem> _copyUrlMenuItem; - - base::mac::ObjCPropertyReleaser _propertyReleaser_OmniboxTextFieldIOS; + UIMenuItem* _copyUrlMenuItem; } @synthesize leftViewImageId = _leftViewImageId; @@ -130,15 +128,13 @@ tintColor:(UIColor*)tintColor { self = [super initWithFrame:frame]; if (self) { - _propertyReleaser_OmniboxTextFieldIOS.Init(self, - [OmniboxTextFieldIOS class]); - _font.reset([font retain]); - _displayedTextColor.reset([textColor retain]); + _font = font; + _displayedTextColor = textColor; if (tintColor) { [self setTintColor:tintColor]; - _displayedTintColor.reset([tintColor retain]); + _displayedTintColor = tintColor; } else { - _displayedTintColor.reset([self.tintColor retain]); + _displayedTintColor = self.tintColor; } [self setFont:_font]; [self setTextColor:_displayedTextColor]; @@ -210,7 +206,7 @@ [super selectAll:nil]; } - if (!_selection.get()) { + if (!_selection) { [super touchesBegan:touches withEvent:event]; return; } @@ -221,7 +217,7 @@ return; // Accept selection. - base::scoped_nsobject<NSString> newText([[self nsDisplayedText] copy]); + NSString* newText = [[self nsDisplayedText] copy]; [self clearAutocompleteText]; [self setText:newText]; } @@ -244,22 +240,22 @@ [self setPreEditText:self.text]; // Adjusts the placement so static URL lines up perfectly with UITextField. - DCHECK(!_preEditStaticLabel.get()); + DCHECK(!_preEditStaticLabel); CGRect rect = [self preEditLabelRectForBounds:self.bounds]; - _preEditStaticLabel.reset([[UILabel alloc] initWithFrame:rect]); - _preEditStaticLabel.get().backgroundColor = [UIColor clearColor]; - _preEditStaticLabel.get().opaque = YES; - _preEditStaticLabel.get().font = _font; - _preEditStaticLabel.get().textColor = _displayedTextColor; - _preEditStaticLabel.get().lineBreakMode = NSLineBreakByTruncatingHead; + _preEditStaticLabel = [[UILabel alloc] initWithFrame:rect]; + _preEditStaticLabel.backgroundColor = [UIColor clearColor]; + _preEditStaticLabel.opaque = YES; + _preEditStaticLabel.font = _font; + _preEditStaticLabel.textColor = _displayedTextColor; + _preEditStaticLabel.lineBreakMode = NSLineBreakByTruncatingHead; NSDictionary* attributes = @{NSBackgroundColorAttributeName : [self selectedTextBackgroundColor]}; - base::scoped_nsobject<NSAttributedString> preEditString( + NSAttributedString* preEditString = [[NSAttributedString alloc] initWithString:self.text - attributes:attributes]); + attributes:attributes]; [_preEditStaticLabel setAttributedText:preEditString]; - _preEditStaticLabel.get().textAlignment = [self preEditTextAlignment]; + _preEditStaticLabel.textAlignment = [self preEditTextAlignment]; [self addSubview:_preEditStaticLabel]; } @@ -287,9 +283,9 @@ // If the pre-edit text is wider than the omnibox, right-align the text so it // ends at the same x coord as the blue selection box. CGSize textSize = - [_preEditStaticLabel.get().text cr_pixelAlignedSizeWithFont:_font]; + [_preEditStaticLabel.text cr_pixelAlignedSizeWithFont:_font]; BOOL isLTR = [self bestTextAlignment] == NSTextAlignmentLeft; - return textSize.width < _preEditStaticLabel.get().frame.size.width + return textSize.width < _preEditStaticLabel.frame.size.width ? (isLTR ? NSTextAlignmentLeft : NSTextAlignmentRight) : (isLTR ? NSTextAlignmentRight : NSTextAlignmentLeft); } @@ -301,7 +297,7 @@ [_preEditStaticLabel setFrame:rect]; // Update text alignment since the pre-edit label's frame changed. - _preEditStaticLabel.get().textAlignment = [self preEditTextAlignment]; + _preEditStaticLabel.textAlignment = [self preEditTextAlignment]; [self hideTextAndCursor]; } else if (!_selection) { [self showTextAndCursor]; @@ -313,7 +309,7 @@ [self setPreEditText:nil]; if (_preEditStaticLabel) { [_preEditStaticLabel removeFromSuperview]; - _preEditStaticLabel.reset(nil); + _preEditStaticLabel = nil; [self showTextAndCursor]; } } @@ -333,7 +329,7 @@ } - (NSString*)nsDisplayedText { - if (_selection.get()) + if (_selection) return [_selection text]; return [self text]; } @@ -346,7 +342,7 @@ DCHECK_LT([[self text] length], [[_selection text] length]) << "[_selection text] and [self text] are out of sync. " << "Please email justincohen@ and rohitrao@ if you see this."; - if (_selection.get() && [[_selection text] length] > [[self text] length]) { + if (_selection && [[_selection text] length] > [[self text] length]) { return base::SysNSStringToUTF16( [[_selection text] substringFromIndex:[[self text] length]]); } @@ -364,8 +360,8 @@ if ([self isPreEditing]) { [self exitPreEditState]; } - if (_selection.get()) { - base::scoped_nsobject<NSString> newText([[self nsDisplayedText] copy]); + if (_selection) { + NSString* newText = [[self nsDisplayedText] copy]; [self clearAutocompleteText]; [self setText:newText]; } @@ -375,10 +371,10 @@ // Creates the SelectedTextLabel if it doesn't already exist and adds it as a // subview. - (void)createSelectionViewIfNecessary { - if (_selection.get()) + if (_selection) return; - _selection.reset([[UILabel alloc] initWithFrame:CGRectZero]); + _selection = [[UILabel alloc] initWithFrame:CGRectZero]; [_selection setFont:_font]; [_selection setTextColor:_displayedTextColor]; [_selection setOpaque:NO]; @@ -408,8 +404,7 @@ } else if (_leftViewImageId && (IsIPadIdiom() || ![self isFirstResponder])) { UIImage* image = [NativeImage(_leftViewImageId) imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - UIImageView* imageView = - [[[UIImageView alloc] initWithImage:image] autorelease]; + UIImageView* imageView = [[UIImageView alloc] initWithImage:image]; [leftViewButton setImage:imageView.image forState:UIControlStateNormal]; [leftViewButton setTitle:nil forState:UIControlStateNormal]; UIColor* tint = [UIColor whiteColor]; @@ -475,11 +470,11 @@ // Creating |autocompleteText| from |[text string]| has the added bonus of // removing all the previously set attributes. This way the autocomplete // text doesn't have a highlighted protocol, etc. - base::scoped_nsobject<NSMutableAttributedString> autocompleteText( - [[NSMutableAttributedString alloc] initWithString:[text string]]); + NSMutableAttributedString* autocompleteText = + [[NSMutableAttributedString alloc] initWithString:[text string]]; [self createSelectionViewIfNecessary]; - DCHECK(_selection.get()); + DCHECK(_selection); [autocompleteText addAttribute:NSBackgroundColorAttributeName value:[self selectedTextBackgroundColor] @@ -512,8 +507,7 @@ // Ensures that attributedText always uses the proper style attributes. - (void)setAttributedText:(NSAttributedString*)attributedText { - base::scoped_nsobject<NSMutableAttributedString> mutableText( - [attributedText mutableCopy]); + NSMutableAttributedString* mutableText = [attributedText mutableCopy]; NSRange entireString = NSMakeRange(0, [mutableText length]); // Set the font. @@ -523,13 +517,12 @@ if (self.editing) { // Hide the text when the |_selection| label is displayed. UIColor* textColor = - _selection ? [UIColor clearColor] : _displayedTextColor.get(); + _selection ? [UIColor clearColor] : _displayedTextColor; [mutableText addAttribute:NSForegroundColorAttributeName value:textColor range:entireString]; } else { - base::scoped_nsobject<NSMutableParagraphStyle> style( - [[NSMutableParagraphStyle alloc] init]); + NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; // URLs have their text direction set to to LTR (avoids RTL characters // making the URL render from right to left, as per RFC 3987 Section 4.1). [style setBaseWritingDirection:NSWritingDirectionLeftToRight]; @@ -579,16 +572,15 @@ NSDictionary* attributes = @{NSForegroundColorAttributeName : _placeholderTextColor}; self.attributedPlaceholder = - [[[NSAttributedString alloc] initWithString:placeholder - attributes:attributes] autorelease]; + [[NSAttributedString alloc] initWithString:placeholder + attributes:attributes]; } else { [super setPlaceholder:placeholder]; } } - (void)setText:(NSString*)text { - NSAttributedString* as = - [[[NSAttributedString alloc] initWithString:text] autorelease]; + NSAttributedString* as = [[NSAttributedString alloc] initWithString:text]; if (self.text.length > 0 && as.length == 0) { // Remove the fade animations before the subviews are removed. [self cleanUpFadeAnimations]; @@ -605,23 +597,23 @@ } - (void)setChipText:(NSString*)chipName { - _chipText.reset(); + _chipText = nil; if ([chipName length]) { if ([self bestAlignmentForText:chipName] == NSTextAlignmentLeft) chipName = [chipName stringByAppendingString:@":"]; - _chipText.reset([chipName copy]); + _chipText = [chipName copy]; } [self updateLeftView]; } - (BOOL)hasAutocompleteText { - return !!_selection.get(); + return !!_selection; } - (void)clearAutocompleteText { if (_selection) { [_selection removeFromSuperview]; - _selection.reset(nil); + _selection = nil; [self showTextAndCursor]; } } @@ -992,10 +984,10 @@ if (![super becomeFirstResponder]) return NO; - if (!_copyUrlMenuItem.get()) { + if (!_copyUrlMenuItem) { NSString* const kTitle = l10n_util::GetNSString(IDS_IOS_COPY_URL); - _copyUrlMenuItem.reset( - [[UIMenuItem alloc] initWithTitle:kTitle action:@selector(copyUrl:)]); + _copyUrlMenuItem = + [[UIMenuItem alloc] initWithTitle:kTitle action:@selector(copyUrl:)]; } // Add the "Copy URL" menu item to the |sharedMenuController| if necessary.
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h index ff880426..df2c6ab 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h
@@ -161,7 +161,8 @@ base::scoped_nsobject<OmniboxTextFieldIOS> field_; WebOmniboxEditController* controller_; // weak, owns us std::unique_ptr<OmniboxPopupViewIOS> popup_view_; - id<PreloadProvider> preloader_; + // |preloader_| should be __weak but is included from non-ARC code. + __unsafe_unretained id<PreloadProvider> preloader_; State state_before_change_; base::scoped_nsobject<NSString> marked_text_before_change_;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm index df811ce..63d83627 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
@@ -38,6 +38,10 @@ #include "ui/gfx/color_palette.h" #include "ui/gfx/image/image.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using base::UserMetricsAction; namespace { @@ -171,7 +175,7 @@ controller, base::MakeUnique<ChromeOmniboxClientIOS>(controller, browser_state)), browser_state_(browser_state), - field_([field retain]), + field_(field), controller_(controller), preloader_(preloader), ignore_popup_updates_(false), @@ -684,8 +688,8 @@ NSAttributedString* OmniboxViewIOS::ApplyTextAttributes( const base::string16& text) { - NSMutableAttributedString* as = [[[NSMutableAttributedString alloc] - initWithString:base::SysUTF16ToNSString(text)] autorelease]; + NSMutableAttributedString* as = [[NSMutableAttributedString alloc] + initWithString:base::SysUTF16ToNSString(text)]; // Cache a pointer to the attributed string to allow the superclass' // virtual method invocations to add attributes. DCHECK(attributing_display_string_ == nil);
diff --git a/ios/chrome/browser/ui/omnibox/page_info_view_controller.h b/ios/chrome/browser/ui/omnibox/page_info_view_controller.h index 8965ea21..50fb230 100644 --- a/ios/chrome/browser/ui/omnibox/page_info_view_controller.h +++ b/ios/chrome/browser/ui/omnibox/page_info_view_controller.h
@@ -53,16 +53,9 @@ } private: - void PerformLayout() { - // If the window is animating closed when this is called, the - // animation could be holding the last reference to |controller_| - // (and thus |this|). Pin it until the task is completed. - base::scoped_nsobject<PageInfoViewController> keep_alive( - [controller_ retain]); - [controller_ performLayout]; - } + void PerformLayout(); - PageInfoViewController* controller_; // weak + __unsafe_unretained PageInfoViewController* controller_; base::WeakPtrFactory<PageInfoModelBubbleBridge> weak_ptr_factory_;
diff --git a/ios/chrome/browser/ui/omnibox/page_info_view_controller.mm b/ios/chrome/browser/ui/omnibox/page_info_view_controller.mm index 2650390..5d3d3aa 100644 --- a/ios/chrome/browser/ui/omnibox/page_info_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/page_info_view_controller.mm
@@ -8,8 +8,6 @@ #include "base/location.h" #include "base/mac/bundle_locations.h" #import "base/mac/foundation_util.h" -#include "base/mac/objc_property_releaser.h" -#include "base/mac/scoped_nsobject.h" #include "base/message_loop/message_loop.h" #include "base/single_thread_task_runner.h" #include "base/strings/sys_string_conversions.h" @@ -33,6 +31,10 @@ #import "ui/gfx/ios/NSString+CrStringDrawing.h" #import "ui/gfx/ios/uikit_util.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + using ios::material::TimingFunction; namespace { @@ -126,13 +128,21 @@ base::TimeDelta::FromMilliseconds(1000 /* milliseconds */)); } +void PageInfoModelBubbleBridge::PerformLayout() { + // If the window is animating closed when this is called, the + // animation could be holding the last reference to |controller_| + // (and thus |this|). Pin it until the task is completed. + base::scoped_nsobject<PageInfoViewController> keep_alive(controller_); + [controller_ performLayout]; +} + @interface PageInfoViewController ()<UIGestureRecognizerDelegate> { // Scroll View inside the PageInfoView used to display content that exceeds // the available space. - base::scoped_nsobject<UIScrollView> scrollView_; + UIScrollView* scrollView_; // Container View added inside the Scroll View. All content is added to this // view instead of PopupMenuController.containerView_. - base::scoped_nsobject<BidiContainerView> innerContainerView_; + BidiContainerView* innerContainerView_; // Origin of the arrow at the top of the popup window. CGPoint origin_; @@ -151,8 +161,6 @@ // YES when the popup has finished animating in. NO otherwise. BOOL animateInCompleted_; - - base::mac::ObjCPropertyReleaser propertyReleaser_PageInfoViewController_; } // Adds the state image at a pre-determined x position and the given y. This @@ -186,8 +194,8 @@ // Sends the IDC_HIDE_PAGE_INFO command to hide the current popup. - (void)close; -@property(nonatomic, retain) UIView* containerView; -@property(nonatomic, retain) UIView* popupContainer; +@property(nonatomic, strong) UIView* containerView; +@property(nonatomic, strong) UIView* popupContainer; @end @implementation PageInfoViewController @@ -202,11 +210,8 @@ DCHECK(parent); self = [super init]; if (self) { - propertyReleaser_PageInfoViewController_.Init( - self, [PageInfoViewController class]); - - scrollView_.reset( - [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 240, 128)]); + scrollView_ = + [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 240, 128)]; [scrollView_ setMultipleTouchEnabled:YES]; [scrollView_ setClipsToBounds:YES]; [scrollView_ setShowsHorizontalScrollIndicator:NO]; @@ -215,8 +220,8 @@ setAutoresizingMask:(UIViewAutoresizingFlexibleTrailingMargin() | UIViewAutoresizingFlexibleTopMargin)]; - innerContainerView_.reset( - [[BidiContainerView alloc] initWithFrame:CGRectMake(0, 0, 194, 327)]); + innerContainerView_ = + [[BidiContainerView alloc] initWithFrame:CGRectMake(0, 0, 194, 327)]; [innerContainerView_ setBackgroundColor:[UIColor clearColor]]; [innerContainerView_ setAccessibilityLabel:@"Page Security Info Scroll Container"]; @@ -238,10 +243,10 @@ textWidth_ = viewWidth_ - (kImageSize + kImageSpacing + kFramePadding * 2 + kScrollViewInset * 2); - base::scoped_nsobject<UILongPressGestureRecognizer> touchDownRecognizer( + UILongPressGestureRecognizer* touchDownRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self - action:@selector(rootViewTapped:)]); + action:@selector(rootViewTapped:)]; // Setting the duration to .001 makes this similar to a control event // UIControlEventTouchDown. [touchDownRecognizer setMinimumPressDuration:.001]; @@ -398,7 +403,7 @@ [innerContainerView_ setSubviewNeedsAdjustmentForRTL:view]; } - [scrollView_ setContentSize:innerContainerView_.get().frame.size]; + [scrollView_ setContentSize:innerContainerView_.frame.size]; } - (void)close { @@ -417,17 +422,16 @@ toSubviews:(NSMutableArray*)subviews atOffset:(CGFloat)offset { CGRect frame = CGRectMake(kFramePadding, offset, kImageSize, kImageSize); - base::scoped_nsobject<UIImageView> imageView( - [[UIImageView alloc] initWithFrame:frame]); + UIImageView* imageView = [[UIImageView alloc] initWithFrame:frame]; [imageView setImage:model_->GetIconImage(info.icon_id)->ToUIImage()]; - [subviews addObject:imageView.get()]; + [subviews addObject:imageView]; } - (CGFloat)addHeadlineViewForInfo:(const PageInfoModel::SectionInfo&)info toSubviews:(NSMutableArray*)subviews atPoint:(CGPoint)point { CGRect frame = CGRectMake(point.x, point.y, textWidth_, kHeadlineHeight); - base::scoped_nsobject<UILabel> label([[UILabel alloc] initWithFrame:frame]); + UILabel* label = [[UILabel alloc] initWithFrame:frame]; [label setTextAlignment:NSTextAlignmentNatural]; [label setText:base::SysUTF16ToNSString(info.headline)]; [label setTextColor:PageInfoTextColor()]; @@ -435,7 +439,7 @@ [label setBackgroundColor:[UIColor clearColor]]; [label setFrame:frame]; [label setLineBreakMode:NSLineBreakByTruncatingHead]; - [subviews addObject:label.get()]; + [subviews addObject:label]; return CGRectGetHeight(frame); } @@ -443,7 +447,7 @@ toSubviews:(NSMutableArray*)subviews atPoint:(CGPoint)point { CGRect frame = CGRectMake(point.x, point.y, textWidth_, kImageSize); - base::scoped_nsobject<UILabel> label([[UILabel alloc] initWithFrame:frame]); + UILabel* label = [[UILabel alloc] initWithFrame:frame]; [label setTextAlignment:NSTextAlignmentNatural]; NSString* description = base::SysUTF16ToNSString(info.description); UIFont* font = [MDCTypography captionFont]; @@ -459,7 +463,7 @@ [description cr_boundingSizeWithSize:constraintSize font:font]; frame.size.height = sizeToFit.height; [label setFrame:frame]; - [subviews addObject:label.get()]; + [subviews addObject:label]; return CGRectGetHeight(frame); } @@ -467,7 +471,7 @@ if (buttonAction == PageInfoModel::BUTTON_NONE) { return nil; } - UIButton* button = [[[UIButton alloc] initWithFrame:CGRectZero] autorelease]; + UIButton* button = [[UIButton alloc] initWithFrame:CGRectZero]; int messageId = IDS_IOS_PAGE_INFO_RELOAD; NSInteger tag = IDC_RELOAD; NSString* accessibilityID = @"Reload button";
diff --git a/ios/chrome/browser/ui/omnibox/truncating_attributed_label.mm b/ios/chrome/browser/ui/omnibox/truncating_attributed_label.mm index 0474a614..213a0f6 100644 --- a/ios/chrome/browser/ui/omnibox/truncating_attributed_label.mm +++ b/ios/chrome/browser/ui/omnibox/truncating_attributed_label.mm
@@ -6,9 +6,12 @@ #include <algorithm> -#include "base/mac/objc_property_releaser.h" #include "base/mac/scoped_cftyperef.h" +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + @interface OmniboxPopupTruncatingLabel () - (void)setup; - (UIImage*)getLinearGradient:(CGRect)rect; @@ -16,9 +19,7 @@ @implementation OmniboxPopupTruncatingLabel { // Gradient used to create fade effect. Changes based on view.frame size. - base::scoped_nsobject<UIImage> gradient_; - - base::mac::ObjCPropertyReleaser propertyReleaser_OmniboxPopupTruncatingLabel_; + UIImage* gradient_; } @synthesize truncateMode = truncateMode_; @@ -31,8 +32,6 @@ - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - propertyReleaser_OmniboxPopupTruncatingLabel_.Init( - self, [OmniboxPopupTruncatingLabel class]); self.lineBreakMode = NSLineBreakByClipping; [self setup]; } @@ -49,9 +48,9 @@ // Cache the fade gradient when the frame changes. if (!CGRectIsEmpty(frame) && - (!gradient_.get() || !CGSizeEqualToSize([gradient_ size], frame.size))) { + (!gradient_ || !CGSizeEqualToSize([gradient_ size], frame.size))) { CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height); - gradient_.reset([[self getLinearGradient:rect] retain]); + gradient_ = [self getLinearGradient:rect]; } } @@ -66,9 +65,9 @@ // Add the specified line break and alignment attributes to attributedText and // draw the result. NSMutableAttributedString* attributedString = - [[self.attributedText mutableCopy] autorelease]; + [self.attributedText mutableCopy]; NSMutableParagraphStyle* textStyle = - [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; + [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; textStyle.lineBreakMode = self.lineBreakMode; textStyle.alignment = self.textAlignment; [attributedString addAttribute:NSParagraphStyleAttributeName @@ -91,7 +90,7 @@ } if (textAlignment != self.textAlignment) - gradient_.reset(); + gradient_ = nil; [super setTextAlignment:textAlignment]; }
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index fd7fe3b9..6b36cca 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -59,6 +59,7 @@ "//base", "//components/prefs", "//components/reading_list/core", + "//components/reading_list/ios", "//components/strings", "//components/url_formatter", "//ios/chrome/app/strings", @@ -87,7 +88,6 @@ "//url", ] public_deps = [ - "//components/reading_list/ios", "//ios/chrome/browser/ui/collection_view", ] allow_circular_includes_from = [ "//ios/chrome/browser/ui/side_swipe" ] @@ -107,7 +107,7 @@ "//components/favicon/core", "//components/favicon/core/test:test_support", "//components/prefs", - "//components/reading_list/ios", + "//components/reading_list/core", "//components/url_formatter", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/favicon", @@ -132,7 +132,7 @@ deps = [ ":reading_list", "//base", - "//components/reading_list/ios", + "//components/reading_list/core", "//ios/chrome/app/strings", "//ios/chrome/app/theme:theme_grit", "//ios/chrome/browser/reading_list",
diff --git a/ios/chrome/browser/ui/reading_list/offline_page_native_content.mm b/ios/chrome/browser/ui/reading_list/offline_page_native_content.mm index 0b37551d..f9d84e54 100644 --- a/ios/chrome/browser/ui/reading_list/offline_page_native_content.mm +++ b/ios/chrome/browser/ui/reading_list/offline_page_native_content.mm
@@ -6,7 +6,6 @@ #include "base/files/file_path.h" #include "base/logging.h" -#include "components/reading_list/core/reading_list_switches.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/reading_list/offline_url_utils.h" #include "ios/chrome/browser/reading_list/reading_list_download_service.h" @@ -50,7 +49,6 @@ DCHECK(browserState); DCHECK(URL.is_valid()); - DCHECK(reading_list::switches::IsReadingListEnabled()); base::FilePath offline_root = ReadingListDownloadServiceFactory::GetForBrowserState( ios::ChromeBrowserState::FromBrowserState(browserState))
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm index a7fff71..91d89ff 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.mm
@@ -12,8 +12,8 @@ #include "base/metrics/user_metrics_action.h" #include "base/strings/sys_string_conversions.h" #include "base/time/time.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model.h" #import "components/reading_list/ios/reading_list_model_bridge_observer.h" #include "components/strings/grit/components_strings.h" #include "components/url_formatter/url_formatter.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller_unittest.mm index 47e643f..dd61e80a 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller_unittest.mm
@@ -15,9 +15,9 @@ #include "base/time/default_clock.h" #include "components/favicon/core/large_icon_service.h" #include "components/favicon/core/test/mock_favicon_service.h" -#include "components/reading_list/ios/reading_list_model.h" -#include "components/reading_list/ios/reading_list_model_impl.h" -#include "components/reading_list/ios/reading_list_model_storage.h" +#include "components/reading_list/core/reading_list_model.h" +#include "components/reading_list/core/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_model_storage.h" #include "components/url_formatter/url_formatter.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h index 38e9434..ad21136 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COLLECTION_VIEW_ITEM_H_ #define IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COLLECTION_VIEW_ITEM_H_ -#import "components/reading_list/ios/reading_list_entry.h" +#import "components/reading_list/core/reading_list_entry.h" #import "ios/chrome/browser/favicon/favicon_attributes_provider.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h" #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm index b488546..5f88f09 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_collection_view_item.mm
@@ -360,7 +360,7 @@ _distillationState = distillationState; switch (distillationState) { - case ReadingListEntry::ERROR: + case ReadingListEntry::DISTILLATION_ERROR: [_downloadIndicator setImage:[UIImage imageNamed:kFailureImageString]]; break;
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index 6044569..3a623e3 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -7,7 +7,7 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h" #include "ios/chrome/browser/reading_list/offline_url_utils.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator_unittest.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator_unittest.mm index 2edf96e..80983b8 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator_unittest.mm
@@ -10,8 +10,8 @@ #include "base/time/default_clock.h" #include "components/favicon/core/large_icon_service.h" #include "components/favicon/core/test/mock_favicon_service.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model_impl.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model_impl.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" #import "ios/chrome/browser/ui/reading_list/reading_list_collection_view_controller.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm index a5fe01ac..6770512 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -8,7 +8,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/chrome/browser/reading_list/reading_list_model_factory.h" #import "ios/chrome/browser/ui/commands/generic_chrome_command.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" @@ -349,8 +349,7 @@ // Tests that only the "Cancel", "Delete All Read" and "Mark All…" buttons are // showing when not editing. -// TODO(crbug.com/704401): Re-enable this test. -- (void)DISABLED_testVisibleButtonsEditingModeEmptySelection { +- (void)testVisibleButtonsEditingModeEmptySelection { AddEntriesAndEnterEdit(); AssertButtonNotVisibleWithID(IDS_IOS_READING_LIST_DELETE_BUTTON); @@ -365,8 +364,7 @@ // Tests that only the "Cancel", "Delete" and "Mark Unread" buttons are showing // when not editing. -// TODO(crbug.com/704401): Re-enable this test. -- (void)DISABLED_testVisibleButtonsOnlyReadEntrySelected { +- (void)testVisibleButtonsOnlyReadEntrySelected { AddEntriesAndEnterEdit(); TapEntry(kReadTitle); @@ -382,8 +380,7 @@ // Tests that only the "Cancel", "Delete" and "Mark Read" buttons are showing // when not editing. -// TODO(crbug.com/704401): Re-enable this test. -- (void)DISABLED_testVisibleButtonsOnlyUnreadEntrySelected { +- (void)testVisibleButtonsOnlyUnreadEntrySelected { AddEntriesAndEnterEdit(); TapEntry(kUnreadTitle); @@ -399,8 +396,7 @@ // Tests that only the "Cancel", "Delete" and "Mark…" buttons are showing when // not editing. -// TODO(crbug.com/704401): Re-enable this test. -- (void)DISABLED_testVisibleButtonsMixedEntriesSelected { +- (void)testVisibleButtonsMixedEntriesSelected { AddEntriesAndEnterEdit(); TapEntry(kReadTitle); TapEntry(kUnreadTitle);
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm index 99d4d77186..ab307e6 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm
@@ -6,7 +6,7 @@ #include <memory> -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_side_swipe_provider.mm b/ios/chrome/browser/ui/reading_list/reading_list_side_swipe_provider.mm index a3b42901..44b6f737 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_side_swipe_provider.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_side_swipe_provider.mm
@@ -5,8 +5,8 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_side_swipe_provider.h" #include "base/logging.h" -#include "components/reading_list/ios/reading_list_entry.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_entry.h" +#include "components/reading_list/core/reading_list_model.h" #include "ios/web/public/web_state/web_state.h" #include "net/base/network_change_notifier.h" #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/settings/block_popups_egtest.mm b/ios/chrome/browser/ui/settings/block_popups_egtest.mm index 6aaf6093..9c8860a2 100644 --- a/ios/chrome/browser/ui/settings/block_popups_egtest.mm +++ b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
@@ -39,12 +39,14 @@ const char* kBlockPopupsUrl = "http://blockpopups"; const char* kOpenedWindowUrl = "http://openedwindow"; -// JavaScript to open a new window after a short delay. +// Page with a button that opens a new window after a short delay. NSString* kBlockPopupsResponseTemplate = @"<input type=\"button\" onclick=\"setTimeout(function() {" "window.open('%@')}, 1)\" " - "id=\"openWindow\" " + "id=\"open-window\" " "value=\"openWindow\">"; +// JavaScript that clicks that button. +NSString* kOpenPopupScript = @"document.getElementById('open-window').click()"; const std::string kOpenedWindowResponse = "Opened window"; // Opens the block popups settings page. Must be called from the NTP. @@ -201,8 +203,10 @@ [ChromeEarlGrey loadURL:blockPopupsURL]; chrome_test_util::AssertMainTabCount(1U); - // Tap the "Open Window" link and make sure the popup opened in a new tab. - chrome_test_util::TapWebViewElementWithId("openWindow"); + // Request popup and make sure the popup opened in a new tab. + NSError* error = nil; + chrome_test_util::ExecuteJavaScript(kOpenPopupScript, &error); + GREYAssert(!error, @"Error during script execution: %@", error); chrome_test_util::AssertMainTabCount(2U); // No infobar should be displayed. @@ -229,10 +233,13 @@ [ChromeEarlGrey loadURL:blockPopupsURL]; chrome_test_util::AssertMainTabCount(1U); - // Tap the "Open Window" link, then make sure the popup was blocked and an - // infobar was displayed. The window.open() call is run via async JS, so the - // infobar may not open immediately. - chrome_test_util::TapWebViewElementWithId("openWindow"); + // Request popup, then make sure it was blocked and an infobar was displayed. + // The window.open() call is run via async JS, so the infobar may not open + // immediately. + NSError* error = nil; + chrome_test_util::ExecuteJavaScript(kOpenPopupScript, &error); + GREYAssert(!error, @"Error during script execution: %@", error); + [[GREYCondition conditionWithName:@"Wait for blocked popups infobar to show" block:^BOOL {
diff --git a/ios/chrome/browser/ui/settings/cells/autofill_edit_item.h b/ios/chrome/browser/ui/settings/cells/autofill_edit_item.h index dd8ca2e7..1daf200 100644 --- a/ios/chrome/browser/ui/settings/cells/autofill_edit_item.h +++ b/ios/chrome/browser/ui/settings/cells/autofill_edit_item.h
@@ -25,8 +25,14 @@ @property(nonatomic, copy) UIImage* cardTypeIcon; // The field type this item is describing. +// TODO(crbug.com/702252): Get rid of the dependency on the model type. @property(nonatomic, assign) autofill::ServerFieldType autofillType; +// Whether this field is required. If YES, an "*" is appended to the name of the +// text field to indicate that the field is required. It is also used for +// validation purposes. +@property(nonatomic, getter=isRequired) BOOL required; + // Whether the text field is enabled for editing. @property(nonatomic, getter=isTextFieldEnabled) BOOL textFieldEnabled;
diff --git a/ios/chrome/browser/ui/settings/cells/autofill_edit_item.mm b/ios/chrome/browser/ui/settings/cells/autofill_edit_item.mm index 1db8055..0fc58b1 100644 --- a/ios/chrome/browser/ui/settings/cells/autofill_edit_item.mm +++ b/ios/chrome/browser/ui/settings/cells/autofill_edit_item.mm
@@ -31,6 +31,7 @@ @synthesize cardTypeIcon = _cardTypeIcon; @synthesize textFieldEnabled = _textFieldEnabled; @synthesize autofillType = _autofillType; +@synthesize required = _required; - (instancetype)initWithType:(NSInteger)type { self = [super initWithType:type]; @@ -44,7 +45,9 @@ - (void)configureCell:(AutofillEditCell*)cell { [super configureCell:cell]; - cell.textLabel.text = self.textFieldName; + NSString* textLabelFormat = self.required ? @"%@*" : @"%@"; + cell.textLabel.text = + [NSString stringWithFormat:textLabelFormat, self.textFieldName]; cell.textField.text = self.textFieldValue; if (self.textFieldName.length) { cell.textField.accessibilityIdentifier =
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm index 33feb18a..4143e7d 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
@@ -640,6 +640,8 @@ handler:^(UIAlertAction* action) { [weakSelf clearDataForDataTypes:dataTypeMaskToRemove]; }]; + clearDataAction.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_CONFIRM_CLEAR_BUTTON); UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL) style:UIAlertActionStyleCancel
diff --git a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm index 19184302..ad7ddf79 100644 --- a/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm +++ b/ios/chrome/browser/ui/settings/material_cell_catalog_view_controller.mm
@@ -577,16 +577,17 @@ - (CollectionViewItem*)autofillEditItem { AutofillEditItem* item = [[[AutofillEditItem alloc] initWithType:ItemTypeAutofillDynamicHeight] autorelease]; - item.textFieldName = @"Credit Number"; + item.textFieldName = @"Required Card Number"; item.textFieldValue = @"4111111111111111"; item.textFieldEnabled = YES; + item.required = YES; return item; } - (CollectionViewItem*)autofillEditItemWithIcon { AutofillEditItem* item = [[[AutofillEditItem alloc] initWithType:ItemTypeAutofillDynamicHeight] autorelease]; - item.textFieldName = @"Credit Number"; + item.textFieldName = @"Card Number"; item.textFieldValue = @"4111111111111111"; item.textFieldEnabled = YES; int resourceID =
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm index 8bcf82e..7be9c73 100644 --- a/ios/chrome/browser/ui/settings/settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -94,6 +94,10 @@ id<GREYMatcher> ClearBrowsingDataButton() { return ButtonWithAccessibilityLabelId(IDS_IOS_CLEAR_BUTTON); } +// Matcher for the clear browsing data action sheet item. +id<GREYMatcher> ConfirmClearBrowsingDataButton() { + return ButtonWithAccessibilityLabelId(IDS_IOS_CONFIRM_CLEAR_BUTTON); +} // Matcher for the Settings button in the tools menu. id<GREYMatcher> SettingsButton() { return grey_accessibilityID(kToolsMenuSettingsId); @@ -283,15 +287,8 @@ - (void)clearBrowsingData { [[EarlGrey selectElementWithMatcher:ClearBrowsingDataButton()] performAction:grey_tap()]; - - // There is not currently a matcher for accessibilityElementIsFocused or - // userInteractionEnabled which could be used here instead of checking that - // the button is not a MDCCollectionViewTextCell. Use when available. - // TODO(crbug.com/638674): Evaluate if this can move to shared code. - id<GREYMatcher> confirmClear = grey_allOf( - ClearBrowsingDataButton(), - grey_not(grey_kindOfClass([MDCCollectionViewTextCell class])), nil); - [[EarlGrey selectElementWithMatcher:confirmClear] performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:ConfirmClearBrowsingDataButton()] + performAction:grey_tap()]; } // Exits Settings by clicking on the Done button. @@ -702,7 +699,6 @@ // Verifies that logging into a form on a web page allows the user to save and // then clear a password. - (void)testClearPasswords { - ios::ChromeBrowserState* browserState = chrome_test_util::GetOriginalBrowserState(); PrefService* preferences = browserState->GetPrefs();
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm index 84bdcca..5e0a6704 100644 --- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm
@@ -305,11 +305,6 @@ for (int i = 0; i < SyncSetupService::kNumberOfSyncableDatatypes; ++i) { SyncSetupService::SyncableDatatype dataType = static_cast<SyncSetupService::SyncableDatatype>(i); - if (!experimental_flags::IsReadingListEnabled() && - dataType == SyncSetupService::kSyncReadingList) { - // Display Reading List only if it is enabled. - continue; - } [model addItem:[self switchItemForDataType:dataType] toSectionWithIdentifier:SectionIdentifierSyncServices]; }
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm index 167dcd8..068dbc9 100644 --- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
@@ -230,8 +230,6 @@ EXPECT_EQ(1, NumberOfItemsInSection(0)); int expected_number_of_items = SyncSetupService::kNumberOfSyncableDatatypes + 1; - if (!experimental_flags::IsReadingListEnabled()) - expected_number_of_items--; EXPECT_EQ(expected_number_of_items, NumberOfItemsInSection(1)); EXPECT_EQ(2, NumberOfItemsInSection(2)); @@ -252,11 +250,6 @@ for (int i = 0; i < SyncSetupService::kNumberOfSyncableDatatypes; i++) { SyncSetupService::SyncableDatatype dataType = static_cast<SyncSetupService::SyncableDatatype>(i); - if (!experimental_flags::IsReadingListEnabled() && - dataType == SyncSetupService::kSyncReadingList) { - // Display Reading List only if it is enabled. - continue; - } SyncSwitchItem* syncDataTypeItem = GetCollectionViewItem(1, item++); EXPECT_NSEQ(syncDataTypeItem.text, l10n_util::GetNSString(
diff --git a/ios/chrome/browser/ui/side_swipe/BUILD.gn b/ios/chrome/browser/ui/side_swipe/BUILD.gn index 1291d8fb..ce315af 100644 --- a/ios/chrome/browser/ui/side_swipe/BUILD.gn +++ b/ios/chrome/browser/ui/side_swipe/BUILD.gn
@@ -33,7 +33,6 @@ ":resources", "//base", "//components/reading_list/core", - "//components/reading_list/ios", "//ios/chrome/app/theme", "//ios/chrome/browser", "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm index 9039879a..b95f771 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
@@ -7,8 +7,7 @@ #include <memory> #import "base/ios/weak_nsobject.h" -#include "components/reading_list/core/reading_list_switches.h" -#import "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/infobars/infobar_container_view.h" #import "ios/chrome/browser/reading_list/reading_list_model_factory.h" @@ -123,11 +122,9 @@ historySideSwipeProvider_.reset( [[HistorySideSwipeProvider alloc] initWithTabModel:model_]); - if (reading_list::switches::IsReadingListEnabled()) { - readingListSideSwipeProvider_.reset([[ReadingListSideSwipeProvider alloc] - initWithReadingList:ReadingListModelFactory::GetForBrowserState( - browserState)]); - } + readingListSideSwipeProvider_.reset([[ReadingListSideSwipeProvider alloc] + initWithReadingList:ReadingListModelFactory::GetForBrowserState( + browserState)]); } return self; }
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm index 35549a8a..20370738 100644 --- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm +++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -340,7 +340,13 @@ if (IsIPadIdiom() && base::ios::IsRunningOnIOS10OrLater()) { EARL_GREY_TEST_DISABLED(@"Disabled for iOS10 iPad due to a typing bug."); } - [ChromeEarlGrey loadURL:GURL("chrome://version")]; + + std::map<GURL, std::string> responses; + GURL URL = web::test::HttpServer::MakeUrl("http://foo"); + responses[URL] = "bar"; + web::test::SetUpSimpleHttpServer(responses); + [ChromeEarlGrey loadURL:GURL(URL)]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] performAction:grey_typeText(@"javascript:alert('Hello');")]; @@ -351,6 +357,25 @@ assertWithMatcher:grey_notNil()]; } +// Loads WebUI page, types JavaScript into Omnibox and verifies that alert is +// not displayed. WebUI pages have elevated privileges and should not allow +// script execution. +- (void)testTypeJavaScriptIntoOmniboxWithWebUIPage { + // TODO(crbug.com/642544): Enable the test for iPad when typing bug is fixed. + if (IsIPadIdiom() && base::ios::IsRunningOnIOS10OrLater()) { + EARL_GREY_TEST_DISABLED(@"Disabled for iOS10 iPad due to a typing bug."); + } + [ChromeEarlGrey loadURL:GURL("chrome://version")]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] + performAction:grey_typeText(@"javascript:alert('Hello');")]; + + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Go")] + performAction:grey_tap()]; + + [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Hello")] + assertWithMatcher:grey_nil()]; +} + // Tests typing in the omnibox. - (void)testToolbarOmniboxTyping { // TODO(crbug.com/642559): Enable this test for iPad when typing bug is fixed.
diff --git a/ios/chrome/browser/ui/toolbar/tools_menu_button_observer_bridge.mm b/ios/chrome/browser/ui/toolbar/tools_menu_button_observer_bridge.mm index 965fbd75..9f611180 100644 --- a/ios/chrome/browser/ui/toolbar/tools_menu_button_observer_bridge.mm +++ b/ios/chrome/browser/ui/toolbar/tools_menu_button_observer_bridge.mm
@@ -6,7 +6,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "components/reading_list/ios/reading_list_model.h" +#include "components/reading_list/core/reading_list_model.h" #import "ios/chrome/browser/ui/toolbar/toolbar_tools_menu_button.h" @interface ToolsMenuButtonObserverBridge ()
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm index ee215e35..b036348 100644 --- a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm +++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
@@ -23,7 +23,6 @@ #include "base/strings/sys_string_conversions.h" #include "components/google/core/browser/google_util.h" #include "components/omnibox/browser/omnibox_edit_model.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/search_engines/util.h" #include "components/strings/grit/components_strings.h" #include "components/toolbar/toolbar_model.h" @@ -386,10 +385,8 @@ if (!self) return nil; - if (reading_list::switches::IsReadingListEnabled()) { - self.readingListModel = - ReadingListModelFactory::GetForBrowserState(browserState); - } + self.readingListModel = + ReadingListModelFactory::GetForBrowserState(browserState); InterfaceIdiom idiom = IsIPadIdiom() ? IPAD_IDIOM : IPHONE_IDIOM; // Note that |_webToolbar| gets its frame set to -specificControlArea later in
diff --git a/ios/chrome/browser/ui/tools_menu/BUILD.gn b/ios/chrome/browser/ui/tools_menu/BUILD.gn index 2ca15a9..0a4e712 100644 --- a/ios/chrome/browser/ui/tools_menu/BUILD.gn +++ b/ios/chrome/browser/ui/tools_menu/BUILD.gn
@@ -24,7 +24,6 @@ deps = [ "//base", "//base:i18n", - "//components/reading_list/core", "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/browser",
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm index 741f278..6dc52d1 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
@@ -4,7 +4,6 @@ #include "ios/chrome/browser/ui/tools_menu/tools_menu_model.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/ui/commands/ios_command_ids.h" @@ -94,8 +93,6 @@ return IsIPadIdiom(); case IDS_IOS_TOOLS_MENU_READER_MODE: return experimental_flags::IsReaderModeEnabled(); - case IDS_IOS_TOOLS_MENU_READING_LIST: - return reading_list::switches::IsReadingListEnabled(); case IDS_IOS_TOOLS_MENU_SUGGESTIONS: return experimental_flags::IsSuggestionsUIEnabled(); case IDS_IOS_OPTIONS_REPORT_AN_ISSUE:
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm index 5deeba5b..6b8b3ba 100644 --- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm +++ b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
@@ -12,7 +12,6 @@ #include "base/mac/objc_property_releaser.h" #include "base/mac/scoped_nsobject.h" #include "base/metrics/field_trial.h" -#include "components/reading_list/core/reading_list_switches.h" #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/experimental_flags.h" #import "ios/chrome/browser/ui/animation_util.h"
diff --git a/ios/chrome/browser/web/browsing_egtest.mm b/ios/chrome/browser/web/browsing_egtest.mm index c8a9395..ffa0d96 100644 --- a/ios/chrome/browser/web/browsing_egtest.mm +++ b/ios/chrome/browser/web/browsing_egtest.mm
@@ -632,7 +632,8 @@ // Tests that submitting a POST-based form by tapping the 'Go' button on the // keyboard navigates to the correct URL and the back button works as expected // afterwards. -- (void)testBrowsingPostEntryWithKeyboard { +// TODO(crbug.com/704618): Re-enable this test when the flake is fixed. +- (void)FLAKY_testBrowsingPostEntryWithKeyboard { // Create map of canned responses and set up the test HTML server. std::map<GURL, std::string> responses; const GURL URL =
diff --git a/ios/chrome/browser/web/navigation_manager_util.mm b/ios/chrome/browser/web/navigation_manager_util.mm index 81a61b9..794c72a 100644 --- a/ios/chrome/browser/web/navigation_manager_util.mm +++ b/ios/chrome/browser/web/navigation_manager_util.mm
@@ -12,7 +12,7 @@ web::NavigationManager* nav_manager) { if (!nav_manager || !nav_manager->GetItemCount()) return nullptr; - int index = nav_manager->GetCurrentItemIndex(); + int index = nav_manager->GetLastCommittedItemIndex(); web::NavigationItem* item = nullptr; while (index >= 0) { item = nav_manager->GetItemAtIndex(index);
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 7248bc6..0ed616e 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -189,6 +189,8 @@ "//ios/chrome/common:unit_tests", "//ios/chrome/test/base:unit_tests", "//ios/shared/chrome/browser/tabs:unit_tests", + "//ios/shared/chrome/browser/ui/browser_list:unit_tests", + "//ios/shared/chrome/browser/ui/coordinators:unit_tests", ] assert_no_deps = ios_assert_no_deps
diff --git a/ios/clean/chrome/app/BUILD.gn b/ios/clean/chrome/app/BUILD.gn index b6590ba9..496cb6e 100644 --- a/ios/clean/chrome/app/BUILD.gn +++ b/ios/clean/chrome/app/BUILD.gn
@@ -88,7 +88,7 @@ deps = [ "//base", - "//ios/clean/chrome/browser", + "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/app/steps/BUILD.gn b/ios/clean/chrome/app/steps/BUILD.gn index b2c05f8..7da46f0 100644 --- a/ios/clean/chrome/app/steps/BUILD.gn +++ b/ios/clean/chrome/app/steps/BUILD.gn
@@ -28,10 +28,10 @@ "//ios/chrome/browser/content_settings", "//ios/chrome/browser/web:web_internal", "//ios/clean/chrome/app:application_state", - "//ios/clean/chrome/browser", - "//ios/clean/chrome/browser/model", "//ios/clean/chrome/browser/ui/tab_grid", "//ios/net", + "//ios/shared/chrome/browser/ui/browser_list", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/web:web_arc", ] }
diff --git a/ios/clean/chrome/app/steps/tab_grid_coordinator+application_step.mm b/ios/clean/chrome/app/steps/tab_grid_coordinator+application_step.mm index b592bf2..c15ee227 100644 --- a/ios/clean/chrome/app/steps/tab_grid_coordinator+application_step.mm +++ b/ios/clean/chrome/app/steps/tab_grid_coordinator+application_step.mm
@@ -10,9 +10,9 @@ #import "base/supports_user_data.h" #import "ios/clean/chrome/app/application_state.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" -#import "ios/clean/chrome/browser/model/browser.h" -#import "ios/clean/chrome/browser/model/browser_list.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/BUILD.gn b/ios/clean/chrome/browser/BUILD.gn index 0cbf261e..30d8c8c7 100644 --- a/ios/clean/chrome/browser/BUILD.gn +++ b/ios/clean/chrome/browser/BUILD.gn
@@ -4,39 +4,8 @@ source_set("browser") { sources = [ - "browser_coordinator+internal.h", - "browser_coordinator.h", - "browser_coordinator.mm", "url_opening.h", ] configs += [ "//build/config/compiler:enable_arc" ] - - deps = [ - "//base", - "//ios/chrome/app:tests_fake_hook", - "//ios/chrome/browser", - "//ios/chrome/browser/browser_state", - "//ios/chrome/browser/tabs:tabs_internal", - "//ios/clean/chrome/browser/model", - "//ios/shared/chrome/browser/coordinator_context", - ] -} - -source_set("unit_tests") { - testonly = true - sources = [ - "browser_coordinator_unittest.mm", - ] - - configs += [ "//build/config/compiler:enable_arc" ] - - deps = [ - ":browser", - "//base", - "//base/test:test_support", - "//ios/chrome/test/base", - "//ios/shared/chrome/browser/coordinator_context", - "//testing/gtest", - ] }
diff --git a/ios/clean/chrome/browser/ui/DEPS b/ios/clean/chrome/browser/ui/DEPS new file mode 100644 index 0000000..c9253af --- /dev/null +++ b/ios/clean/chrome/browser/ui/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + # Eventually allow ios/chrome/browser but not ios/chrome/browser/ui. + "+ios/chrome/browser", + "+ios/shared/chrome/browser/ui", +]
diff --git a/ios/clean/chrome/browser/ui/ntp/BUILD.gn b/ios/clean/chrome/browser/ui/ntp/BUILD.gn index 609b8fb2..363e965 100644 --- a/ios/clean/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/clean/chrome/browser/ui/ntp/BUILD.gn
@@ -12,8 +12,8 @@ deps = [ ":ntp_ui", - "//ios/clean/chrome/browser", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/browser/ui/ntp/new_tab_page_coordinator.h b/ios/clean/chrome/browser/ui/ntp/new_tab_page_coordinator.h index ec6381b9..fa0ba00 100644 --- a/ios/clean/chrome/browser/ui/ntp/new_tab_page_coordinator.h +++ b/ios/clean/chrome/browser/ui/ntp/new_tab_page_coordinator.h
@@ -6,7 +6,7 @@ #define IOS_CLEAN_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_COORDINATOR_H_ #import <UIKit/UIKit.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" // Coordinator that runs a "New Tab Page" : The UI displayed instead of a web // page when a new tab is created.
diff --git a/ios/clean/chrome/browser/ui/settings/BUILD.gn b/ios/clean/chrome/browser/ui/settings/BUILD.gn index e2ff2a46..c303140 100644 --- a/ios/clean/chrome/browser/ui/settings/BUILD.gn +++ b/ios/clean/chrome/browser/ui/settings/BUILD.gn
@@ -12,10 +12,10 @@ deps = [ "//ios/chrome/browser/ui/settings", - "//ios/clean/chrome/browser", - "//ios/clean/chrome/browser/model", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/commands", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/browser_list", + "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/browser/ui/settings/settings_coordinator.h b/ios/clean/chrome/browser/ui/settings/settings_coordinator.h index 4ef9eb1..1d4c965b 100644 --- a/ios/clean/chrome/browser/ui/settings/settings_coordinator.h +++ b/ios/clean/chrome/browser/ui/settings/settings_coordinator.h
@@ -11,7 +11,7 @@ #import <UIKit/UIKit.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" @protocol SettingsCommands;
diff --git a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm index 46a0fc98..2ccca729 100644 --- a/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm +++ b/ios/clean/chrome/browser/ui/settings/settings_coordinator.mm
@@ -9,10 +9,10 @@ #import "ios/clean/chrome/browser/ui/settings/settings_coordinator.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" -#import "ios/clean/chrome/browser/model/browser.h" #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/ui/tab/BUILD.gn b/ios/clean/chrome/browser/ui/tab/BUILD.gn index b43a8c9..7964e7f6 100644 --- a/ios/clean/chrome/browser/ui/tab/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab/BUILD.gn
@@ -13,13 +13,13 @@ deps = [ ":tab_ui", "//base", - "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/animators", "//ios/clean/chrome/browser/ui/ntp", "//ios/clean/chrome/browser/ui/toolbar", "//ios/clean/chrome/browser/ui/web_contents", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", ] }
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.h b/ios/clean/chrome/browser/ui/tab/tab_coordinator.h index 1009db8..4d0d6b4 100644 --- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.h +++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.h
@@ -10,7 +10,7 @@ #define IOS_CLEAN_CHROME_BROWSER_UI_TAB_TAB_COORDINATOR_H_ #import <UIKit/UIKit.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" namespace web { class WebState;
diff --git a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm index a8219710..0e75eb9 100644 --- a/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab/tab_coordinator.mm
@@ -12,7 +12,6 @@ #include "base/mac/foundation_util.h" #include "base/memory/ptr_util.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" #import "ios/clean/chrome/browser/ui/actions/tab_grid_actions.h" #import "ios/clean/chrome/browser/ui/actions/tab_strip_actions.h" #import "ios/clean/chrome/browser/ui/animators/zoom_transition_animator.h" @@ -21,6 +20,7 @@ #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h" #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/web_state/web_state.h" #import "ios/web/public/web_state/web_state_observer_bridge.h"
diff --git a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn index e863af2..df70bf2 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_grid/BUILD.gn
@@ -17,12 +17,13 @@ "//base", "//ios/chrome/browser/browser_state", "//ios/clean/chrome/browser", - "//ios/clean/chrome/browser/model", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/settings", "//ios/clean/chrome/browser/ui/tab", "//ios/shared/chrome/browser/coordinator_context", "//ios/shared/chrome/browser/tabs", + "//ios/shared/chrome/browser/ui/browser_list", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", "//net", "//ui/base",
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h index 0e946cfd..61d087cb 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h +++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.h
@@ -11,8 +11,8 @@ #import <Foundation/Foundation.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" #import "ios/clean/chrome/browser/url_opening.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" // Coordinator that drives a UI showing a scrollable grid of tabs, // which each represent a web browsing tab that can be expanded by tapping.
diff --git a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index d1bfadc..9384f8a 100644 --- a/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -12,8 +12,6 @@ #include "base/strings/sys_string_conversions.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" -#import "ios/clean/chrome/browser/model/browser.h" #import "ios/clean/chrome/browser/ui/commands/settings_commands.h" #import "ios/clean/chrome/browser/ui/commands/tab_commands.h" #import "ios/clean/chrome/browser/ui/commands/tab_grid_commands.h" @@ -23,6 +21,8 @@ #import "ios/clean/chrome/browser/ui/tab_grid/tab_grid_view_controller.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" #import "ios/shared/chrome/browser/tabs/web_state_list.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/web/public/navigation_manager.h" #include "ios/web/public/web_state/web_state.h" #import "net/base/mac/url_conversions.h"
diff --git a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn index adfa7cfc..c77bd75 100644 --- a/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tab_strip/BUILD.gn
@@ -10,11 +10,11 @@ deps = [ ":tab_strip_ui", "//base", - "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/animators", "//ios/clean/chrome/browser/ui/tab", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", ] libs = [ "UIKit.framework" ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.h b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.h index c0f0b2f..560efbc 100644 --- a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.h +++ b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.h
@@ -10,7 +10,7 @@ #define IOS_CLEAN_CHROME_BROWSER_UI_TAB_STRIP_TAB_STRIP_CONTAINER_COORDINATOR_H_ #import <UIKit/UIKit.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" namespace web { class WebState;
diff --git a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.mm b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.mm index 932ed19..5a9f2c6 100644 --- a/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.mm +++ b/ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_coordinator.mm
@@ -11,12 +11,12 @@ #include <memory> #include "base/memory/ptr_util.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" #import "ios/clean/chrome/browser/ui/actions/tab_grid_actions.h" #import "ios/clean/chrome/browser/ui/animators/zoom_transition_animator.h" #import "ios/clean/chrome/browser/ui/tab/tab_coordinator.h" #import "ios/clean/chrome/browser/ui/tab_strip/tab_strip_container_view_controller.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn index 4fe1a58..f80a480b 100644 --- a/ios/clean/chrome/browser/ui/toolbar/BUILD.gn +++ b/ios/clean/chrome/browser/ui/toolbar/BUILD.gn
@@ -15,10 +15,10 @@ deps = [ ":toolbar_ui", "//base", - "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/commands", "//ios/clean/chrome/browser/ui/tools", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", ] }
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h index 3bd00dfd..96e8a18 100644 --- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h +++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h
@@ -9,7 +9,7 @@ #ifndef IOS_CLEAN_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_H_ #define IOS_CLEAN_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_H_ -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" namespace web { class WebState;
diff --git a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm index 41a3fec8..6e4781e1 100644 --- a/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm +++ b/ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.mm
@@ -8,12 +8,12 @@ #import "ios/clean/chrome/browser/ui/toolbar/toolbar_coordinator.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" #import "ios/clean/chrome/browser/ui/commands/toolbar_commands.h" #import "ios/clean/chrome/browser/ui/toolbar/toolbar_mediator.h" #import "ios/clean/chrome/browser/ui/toolbar/toolbar_view_controller.h" #import "ios/clean/chrome/browser/ui/tools/tools_coordinator.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/ui/tools/BUILD.gn b/ios/clean/chrome/browser/ui/tools/BUILD.gn index ec5c4e91..66f1c38 100644 --- a/ios/clean/chrome/browser/ui/tools/BUILD.gn +++ b/ios/clean/chrome/browser/ui/tools/BUILD.gn
@@ -13,11 +13,11 @@ deps = [ ":tools_ui", "//base", - "//ios/clean/chrome/browser", "//ios/clean/chrome/browser/ui/actions", "//ios/clean/chrome/browser/ui/animators", "//ios/clean/chrome/browser/ui/presenters", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", ] }
diff --git a/ios/clean/chrome/browser/ui/tools/tools_coordinator.h b/ios/clean/chrome/browser/ui/tools/tools_coordinator.h index a6eed0b..7f77d53 100644 --- a/ios/clean/chrome/browser/ui/tools/tools_coordinator.h +++ b/ios/clean/chrome/browser/ui/tools/tools_coordinator.h
@@ -11,7 +11,7 @@ #import <Foundation/Foundation.h> -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" @protocol ToolbarCommands;
diff --git a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn index 6c6553b..064924f6 100644 --- a/ios/clean/chrome/browser/ui/web_contents/BUILD.gn +++ b/ios/clean/chrome/browser/ui/web_contents/BUILD.gn
@@ -14,8 +14,8 @@ deps = [ ":web_contents_ui", - "//ios/clean/chrome/browser", "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/coordinators", "//ios/web", "//ui/base", "//url",
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.h b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.h index afee0759..92894a9 100644 --- a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.h +++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.h
@@ -9,7 +9,7 @@ #ifndef IOS_CLEAN_CHROME_BROWSER_UI_WEB_CONTENTS_WEB_COORDINATOR_H_ #define IOS_CLEAN_CHROME_BROWSER_UI_WEB_CONTENTS_WEB_COORDINATOR_H_ -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" namespace web { class WebState;
diff --git a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm index 0248d70..07ef0624 100644 --- a/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm +++ b/ios/clean/chrome/browser/ui/web_contents/web_coordinator.mm
@@ -8,10 +8,10 @@ #import "ios/clean/chrome/browser/ui/web_contents/web_coordinator.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" #import "ios/clean/chrome/browser/ui/web_contents/web_contents_mediator.h" #import "ios/clean/chrome/browser/ui/web_contents/web_contents_view_controller.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #include "ios/web/public/web_state/web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/clean/chrome/test/BUILD.gn b/ios/clean/chrome/test/BUILD.gn index 88d9e82..8f87a4a 100644 --- a/ios/clean/chrome/test/BUILD.gn +++ b/ios/clean/chrome/test/BUILD.gn
@@ -19,8 +19,6 @@ ios_packed_resources_target, # Add unit_tests target here. - "//ios/clean/chrome/browser:unit_tests", - "//ios/clean/chrome/browser/model:unit_tests", "//ios/clean/chrome/browser/ui/commands:unit_tests", "//ios/clean/chrome/browser/ui/web_contents:unit_tests", ]
diff --git a/ios/shared/chrome/browser/tabs/web_state_list.mm b/ios/shared/chrome/browser/tabs/web_state_list.mm index 5da7b0c..d4941fdf 100644 --- a/ios/shared/chrome/browser/tabs/web_state_list.mm +++ b/ios/shared/chrome/browser/tabs/web_state_list.mm
@@ -301,7 +301,8 @@ return kInvalidIndex; const int opener_navigation_index = - use_group ? opener->GetNavigationManager()->GetCurrentItemIndex() : -1; + use_group ? opener->GetNavigationManager()->GetLastCommittedItemIndex() + : -1; int found_index = kInvalidIndex; for (int index = start_index + 1; index < count() && n; ++index) {
diff --git a/ios/shared/chrome/browser/tabs/web_state_list_order_controller_unittest.mm b/ios/shared/chrome/browser/tabs/web_state_list_order_controller_unittest.mm index e3c374b..9977b5c6 100644 --- a/ios/shared/chrome/browser/tabs/web_state_list_order_controller_unittest.mm +++ b/ios/shared/chrome/browser/tabs/web_state_list_order_controller_unittest.mm
@@ -24,7 +24,6 @@ FakeNavigationManager() = default; // web::NavigationManager implementation. - int GetCurrentItemIndex() const override { return 0; } int GetLastCommittedItemIndex() const override { return 0; } DISALLOW_COPY_AND_ASSIGN(FakeNavigationManager);
diff --git a/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm b/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm index 2d2d149..bc06f5c 100644 --- a/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm +++ b/ios/shared/chrome/browser/tabs/web_state_list_unittest.mm
@@ -111,27 +111,29 @@ FakeNavigationManager() = default; // web::NavigationManager implementation. - int GetCurrentItemIndex() const override { return current_item_index_; } + int GetLastCommittedItemIndex() const override { + return last_committed_item_index; + } - int GetLastCommittedItemIndex() const override { return current_item_index_; } + bool CanGoBack() const override { return last_committed_item_index > 0; } - bool CanGoBack() const override { return current_item_index_ > 0; } - - bool CanGoForward() const override { return current_item_index_ < INT_MAX; } + bool CanGoForward() const override { + return last_committed_item_index < INT_MAX; + } void GoBack() override { DCHECK(CanGoBack()); - --current_item_index_; + --last_committed_item_index; } void GoForward() override { DCHECK(CanGoForward()); - ++current_item_index_; + ++last_committed_item_index; } - void GoToIndex(int index) override { current_item_index_ = index; } + void GoToIndex(int index) override { last_committed_item_index = index; } - int current_item_index_ = 0; + int last_committed_item_index = 0; DISALLOW_COPY_AND_ASSIGN(FakeNavigationManager); };
diff --git a/ios/shared/chrome/browser/ui/DEPS b/ios/shared/chrome/browser/ui/DEPS new file mode 100644 index 0000000..ead3f09 --- /dev/null +++ b/ios/shared/chrome/browser/ui/DEPS
@@ -0,0 +1,5 @@ +include_rules = [ + # Allow ios/chrome/browser but not ios/chrome/browser/ui. + "+ios/chrome/browser", + "-ios/chrome/browser/ui", +]
diff --git a/ios/clean/chrome/browser/model/BUILD.gn b/ios/shared/chrome/browser/ui/browser_list/BUILD.gn similarity index 93% rename from ios/clean/chrome/browser/model/BUILD.gn rename to ios/shared/chrome/browser/ui/browser_list/BUILD.gn index 5418110..3a18c45 100644 --- a/ios/clean/chrome/browser/model/BUILD.gn +++ b/ios/shared/chrome/browser/ui/browser_list/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("model") { +source_set("browser_list") { sources = [ "browser.h", "browser.mm", @@ -25,7 +25,7 @@ "browser_list_unittest.mm", ] deps = [ - ":model", + ":browser_list", "//base", "//ios/chrome/browser/browser_state:test_support", "//testing/gtest",
diff --git a/ios/clean/chrome/browser/model/browser.h b/ios/shared/chrome/browser/ui/browser_list/browser.h similarity index 83% rename from ios/clean/chrome/browser/model/browser.h rename to ios/shared/chrome/browser/ui/browser_list/browser.h index 18abdd5..256ea80 100644 --- a/ios/clean/chrome/browser/model/browser.h +++ b/ios/shared/chrome/browser/ui/browser_list/browser.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 IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_H_ -#define IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_H_ +#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ +#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_ #include <memory> @@ -36,4 +36,4 @@ DISALLOW_COPY_AND_ASSIGN(Browser); }; -#endif // IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_H_ +#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_H_
diff --git a/ios/clean/chrome/browser/model/browser.mm b/ios/shared/chrome/browser/ui/browser_list/browser.mm similarity index 83% rename from ios/clean/chrome/browser/model/browser.mm rename to ios/shared/chrome/browser/ui/browser_list/browser.mm index 8724e3e..6b84e931 100644 --- a/ios/clean/chrome/browser/model/browser.mm +++ b/ios/shared/chrome/browser/ui/browser_list/browser.mm
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/clean/chrome/browser/model/browser.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#import "ios/clean/chrome/browser/model/browser_web_state_list_delegate.h" #import "ios/shared/chrome/browser/tabs/web_state_list.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/model/browser_list.h b/ios/shared/chrome/browser/ui/browser_list/browser_list.h similarity index 81% rename from ios/clean/chrome/browser/model/browser_list.h rename to ios/shared/chrome/browser/ui/browser_list/browser_list.h index fe06217..6f4446d9 100644 --- a/ios/clean/chrome/browser/model/browser_list.h +++ b/ios/shared/chrome/browser/ui/browser_list/browser_list.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_LIST_H_ -#define IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_LIST_H_ +#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ +#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_ #include <memory> #include <vector> #include "base/macros.h" #include "base/supports_user_data.h" -#include "ios/clean/chrome/browser/model/browser.h" +#include "ios/shared/chrome/browser/ui/browser_list/browser.h" namespace ios { class ChromeBrowserState; @@ -46,4 +46,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserList); }; -#endif // IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_LIST_H_ +#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_LIST_H_
diff --git a/ios/clean/chrome/browser/model/browser_list.mm b/ios/shared/chrome/browser/ui/browser_list/browser_list.mm similarity index 95% rename from ios/clean/chrome/browser/model/browser_list.mm rename to ios/shared/chrome/browser/ui/browser_list/browser_list.mm index 5a2e570..bb49ea6c 100644 --- a/ios/clean/chrome/browser/model/browser_list.mm +++ b/ios/shared/chrome/browser/ui/browser_list/browser_list.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/clean/chrome/browser/model/browser_list.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" #include <stdint.h>
diff --git a/ios/clean/chrome/browser/model/browser_list_unittest.mm b/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm similarity index 96% rename from ios/clean/chrome/browser/model/browser_list_unittest.mm rename to ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm index 0348e675..7cc8dd6 100644 --- a/ios/clean/chrome/browser/model/browser_list_unittest.mm +++ b/ios/shared/chrome/browser/ui/browser_list/browser_list_unittest.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/clean/chrome/browser/model/browser_list.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h" #include <memory>
diff --git a/ios/clean/chrome/browser/model/browser_web_state_list_delegate.h b/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h similarity index 72% rename from ios/clean/chrome/browser/model/browser_web_state_list_delegate.h rename to ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h index dab5cf0f..2a6a737 100644 --- a/ios/clean/chrome/browser/model/browser_web_state_list_delegate.h +++ b/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.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 IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_WEB_STATE_LIST_DELEGATE_H_ -#define IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#ifndef IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#define IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_ #include "base/macros.h" #import "ios/shared/chrome/browser/tabs/web_state_list_delegate.h" @@ -25,4 +25,4 @@ DISALLOW_COPY_AND_ASSIGN(BrowserWebStateListDelegate); }; -#endif // IOS_CLEAN_CHROME_BROWSER_MODEL_BROWSER_WEB_STATE_LIST_DELEGATE_H_ +#endif // IOS_SHARED_CHROME_BROWSER_UI_BROWSER_LIST_BROWSER_WEB_STATE_LIST_DELEGATE_H_
diff --git a/ios/clean/chrome/browser/model/browser_web_state_list_delegate.mm b/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm similarity index 86% rename from ios/clean/chrome/browser/model/browser_web_state_list_delegate.mm rename to ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm index 4f96ede..255061e0 100644 --- a/ios/clean/chrome/browser/model/browser_web_state_list_delegate.mm +++ b/ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/clean/chrome/browser/model/browser_web_state_list_delegate.h" +#import "ios/shared/chrome/browser/ui/browser_list/browser_web_state_list_delegate.h" #include "base/logging.h"
diff --git a/ios/shared/chrome/browser/ui/coordinators/BUILD.gn b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn new file mode 100644 index 0000000..39a3d8f --- /dev/null +++ b/ios/shared/chrome/browser/ui/coordinators/BUILD.gn
@@ -0,0 +1,41 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("coordinators") { + sources = [ + "browser_coordinator+internal.h", + "browser_coordinator.h", + "browser_coordinator.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + "//base", + "//ios/chrome/app:tests_fake_hook", + "//ios/chrome/browser", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/tabs:tabs_internal", + "//ios/shared/chrome/browser/coordinator_context", + "//ios/shared/chrome/browser/ui/browser_list", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ + "browser_coordinator_unittest.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + ":coordinators", + "//base", + "//base/test:test_support", + "//ios/chrome/test/base", + "//ios/shared/chrome/browser/coordinator_context", + "//testing/gtest", + ] +}
diff --git a/ios/clean/chrome/browser/browser_coordinator+internal.h b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h similarity index 89% rename from ios/clean/chrome/browser/browser_coordinator+internal.h rename to ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h index 0cad1471..6ae732a 100644 --- a/ios/clean/chrome/browser/browser_coordinator+internal.h +++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h
@@ -2,14 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ====== New Architecture ===== -// = This code is only used in the new iOS Chrome architecture. = -// ============================================================================ +#ifndef IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_INTERNAL_H_ +#define IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_INTERNAL_H_ -#ifndef IOS_CHROME_BROWSER_BROWSER_COORDINATOR_INTERNAL_H_ -#define IOS_CHROME_BROWSER_BROWSER_COORDINATOR_INTERNAL_H_ - -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" // Internal API for subclasses and categories of BrowserCoordinator. // @@ -97,4 +93,4 @@ @end -#endif // IOS_CHROME_BROWSER_BROWSER_COORDINATOR_INTERNAL_H_ +#endif // IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_INTERNAL_H_
diff --git a/ios/clean/chrome/browser/browser_coordinator.h b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h similarity index 80% rename from ios/clean/chrome/browser/browser_coordinator.h rename to ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h index 0cb5aeea0..c5e725f 100644 --- a/ios/clean/chrome/browser/browser_coordinator.h +++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h
@@ -2,12 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ====== New Architecture ===== -// = This code is only used in the new iOS Chrome architecture. = -// ============================================================================ - -#ifndef IOS_CLEAN_CHROME_BROWSER_BROWSER_COORDINATOR_H_ -#define IOS_CLEAN_CHROME_BROWSER_BROWSER_COORDINATOR_H_ +#ifndef IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_H_ +#define IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_H_ #import <UIKit/UIKit.h> @@ -46,4 +42,4 @@ @end -#endif // IOS_CLEAN_CHROME_BROWSER_BROWSER_COORDINATOR_H_ +#endif // IOS_SHARED_CHROME_BROWSER_UI_COORDINATORS_BROWSER_COORDINATOR_H_
diff --git a/ios/clean/chrome/browser/browser_coordinator.mm b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator.mm similarity index 92% rename from ios/clean/chrome/browser/browser_coordinator.mm rename to ios/shared/chrome/browser/ui/coordinators/browser_coordinator.mm index 4c3b0ecc..ca59e1b6 100644 --- a/ios/clean/chrome/browser/browser_coordinator.mm +++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator.mm
@@ -2,14 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// ====== New Architecture ===== -// = This code is only used in the new iOS Chrome architecture. = -// ============================================================================ - +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" #import "base/logging.h" -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" -#import "ios/clean/chrome/browser/browser_coordinator.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/clean/chrome/browser/browser_coordinator_unittest.mm b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_unittest.mm similarity index 96% rename from ios/clean/chrome/browser/browser_coordinator_unittest.mm rename to ios/shared/chrome/browser/ui/coordinators/browser_coordinator_unittest.mm index 88f0186..ee7ec11 100644 --- a/ios/clean/chrome/browser/browser_coordinator_unittest.mm +++ b/ios/shared/chrome/browser/ui/coordinators/browser_coordinator_unittest.mm
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/clean/chrome/browser/browser_coordinator+internal.h" -#import "ios/clean/chrome/browser/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator.h" +#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h" #import "ios/shared/chrome/browser/coordinator_context/coordinator_context.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/showcase/BUILD.gn b/ios/showcase/BUILD.gn index d19ba9c..a9e88dcf 100644 --- a/ios/showcase/BUILD.gn +++ b/ios/showcase/BUILD.gn
@@ -26,8 +26,10 @@ group("features") { deps = [ "//ios/clean/chrome/browser/ui/tools:tools_ui", + "//ios/showcase/content_suggestions", + "//ios/showcase/payments", "//ios/showcase/settings", - "//ios/showcase/suggestions", + "//ios/showcase/tab", "//ios/showcase/tab_grid", "//ios/showcase/tab_strip", "//ios/showcase/toolbar", @@ -50,7 +52,9 @@ "//ios/showcase/core:main", # Add all eg_tests targets below. + "//ios/showcase/content_suggestions:eg_tests", "//ios/showcase/core:eg_tests", + "//ios/showcase/tab:eg_tests", "//ios/showcase/tab_grid:eg_tests", # All shared libraries must have the sanitizer deps to properly link in
diff --git a/ios/showcase/suggestions/BUILD.gn b/ios/showcase/content_suggestions/BUILD.gn similarity index 77% rename from ios/showcase/suggestions/BUILD.gn rename to ios/showcase/content_suggestions/BUILD.gn index 1a2c81f..39e4c63c 100644 --- a/ios/showcase/suggestions/BUILD.gn +++ b/ios/showcase/content_suggestions/BUILD.gn
@@ -2,10 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("suggestions") { +source_set("content_suggestions") { sources = [ - "sc_suggestions_coordinator.h", - "sc_suggestions_coordinator.mm", + "sc_content_suggestions_coordinator.h", + "sc_content_suggestions_coordinator.mm", ] deps = [ "//base", @@ -19,7 +19,7 @@ source_set("eg_tests") { testonly = true sources = [ - "sc_suggestions_egtest.mm", + "sc_content_suggestions_egtest.mm", ] deps = [ "//ios/showcase/test",
diff --git a/ios/showcase/content_suggestions/sc_content_suggestions_coordinator.h b/ios/showcase/content_suggestions/sc_content_suggestions_coordinator.h new file mode 100644 index 0000000..bca132b --- /dev/null +++ b/ios/showcase/content_suggestions/sc_content_suggestions_coordinator.h
@@ -0,0 +1,15 @@ +// 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 IOS_SHOWCASE_CONTENT_SUGGESTIONS_SC_CONTENT_SUGGESTIONS_COORDINATOR_H_ +#define IOS_SHOWCASE_CONTENT_SUGGESTIONS_SC_CONTENT_SUGGESTIONS_COORDINATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/showcase/common/navigation_coordinator.h" + +@interface SCContentSuggestionsCoordinator : NSObject<NavigationCoordinator> +@end + +#endif // IOS_SHOWCASE_CONTENT_SUGGESTIONS_SC_CONTENT_SUGGESTIONS_COORDINATOR_H_
diff --git a/ios/showcase/suggestions/sc_suggestions_coordinator.mm b/ios/showcase/content_suggestions/sc_content_suggestions_coordinator.mm similarity index 88% rename from ios/showcase/suggestions/sc_suggestions_coordinator.mm rename to ios/showcase/content_suggestions/sc_content_suggestions_coordinator.mm index 332795c..c4109ce 100644 --- a/ios/showcase/suggestions/sc_suggestions_coordinator.mm +++ b/ios/showcase/content_suggestions/sc_content_suggestions_coordinator.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/showcase/suggestions/sc_suggestions_coordinator.h" +#import "ios/showcase/content_suggestions/sc_content_suggestions_coordinator.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h" @@ -12,7 +12,7 @@ #error "This file requires ARC support." #endif -@interface SCSuggestionsCoordinator () +@interface SCContentSuggestionsCoordinator () @property(nonatomic, strong) ContentSuggestionsViewController* suggestionViewController; @@ -20,7 +20,7 @@ @end -@implementation SCSuggestionsCoordinator +@implementation SCContentSuggestionsCoordinator @synthesize baseViewController; @synthesize suggestionViewController = _suggestionViewController;
diff --git a/ios/showcase/suggestions/sc_suggestions_egtest.mm b/ios/showcase/content_suggestions/sc_content_suggestions_egtest.mm similarity index 63% rename from ios/showcase/suggestions/sc_suggestions_egtest.mm rename to ios/showcase/content_suggestions/sc_content_suggestions_egtest.mm index 8509dea4..369a0a1 100644 --- a/ios/showcase/suggestions/sc_suggestions_egtest.mm +++ b/ios/showcase/content_suggestions/sc_content_suggestions_egtest.mm
@@ -4,6 +4,7 @@ #import <EarlGrey/EarlGrey.h> +#import "ios/showcase/test/showcase_eg_utils.h" #import "ios/showcase/test/showcase_test_case.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -11,16 +12,15 @@ #endif // Tests for the suggestions view controller. -@interface SCSuggestionsTestCase : ShowcaseTestCase +@interface SCContentSuggestionsTestCase : ShowcaseTestCase @end -@implementation SCSuggestionsTestCase +@implementation SCContentSuggestionsTestCase // Tests launching ContentSuggestionsViewController. -- (void)testLaunchAndTappingCell { - [[EarlGrey - selectElementWithMatcher:grey_text(@"ContentSuggestionsViewController")] - performAction:grey_tap()]; +- (void)testLaunch { + showcase_utils::Open(@"ContentSuggestionsViewController"); + showcase_utils::Close(); } @end
diff --git a/ios/showcase/core/resources/BUILD.gn b/ios/showcase/core/resources/BUILD.gn index 5614cda..ea6d08c 100644 --- a/ios/showcase/core/resources/BUILD.gn +++ b/ios/showcase/core/resources/BUILD.gn
@@ -3,11 +3,13 @@ # found in the LICENSE file. import("//build/config/ios/rules.gni") +import("//ios/public/provider/chrome/browser/build_config.gni") group("resources") { public_deps = [ ":icons", ":launchscreen_xib", + ios_packed_resources_target, ] }
diff --git a/ios/showcase/core/showcase_model.mm b/ios/showcase/core/showcase_model.mm index 7aafb0c..1afc705 100644 --- a/ios/showcase/core/showcase_model.mm +++ b/ios/showcase/core/showcase_model.mm
@@ -17,14 +17,9 @@ + (NSArray<showcase::ModelRow*>*)model { return @[ @{ - showcase::kClassForDisplayKey : @"SettingsViewController", - showcase::kClassForInstantiationKey : @"SCSettingsCoordinator", - showcase::kUseCaseKey : @"Main settings screen", - }, - @{ showcase::kClassForDisplayKey : @"ContentSuggestionsViewController", - showcase::kClassForInstantiationKey : @"SCSuggestionsCoordinator", - showcase::kUseCaseKey : @"New Suggestions UI", + showcase::kClassForInstantiationKey : @"SCContentSuggestionsCoordinator", + showcase::kUseCaseKey : @"Content Suggestions UI", }, @{ showcase::kClassForDisplayKey : @"MenuViewController", @@ -32,9 +27,14 @@ showcase::kUseCaseKey : @"Tools menu", }, @{ - showcase::kClassForDisplayKey : @"UITableViewCell", - showcase::kClassForInstantiationKey : @"UIKitTableViewCellViewController", - showcase::kUseCaseKey : @"UIKit Table Cells", + showcase::kClassForDisplayKey : @"PaymentRequestEditViewController", + showcase::kClassForInstantiationKey : @"SCPaymentsEditorCoordinator", + showcase::kUseCaseKey : @"Generic payment request editor", + }, + @{ + showcase::kClassForDisplayKey : @"SettingsViewController", + showcase::kClassForInstantiationKey : @"SCSettingsCoordinator", + showcase::kUseCaseKey : @"Main settings screen", }, @{ showcase::kClassForDisplayKey : @"TabGridViewController", @@ -47,10 +47,25 @@ showcase::kUseCaseKey : @"Tab strip container", }, @{ + showcase::kClassForDisplayKey : @"TopToolbarTabViewController", + showcase::kClassForInstantiationKey : @"SCTopToolbarTabCoordinator", + showcase::kUseCaseKey : @"Top toolbar tab", + }, + @{ + showcase::kClassForDisplayKey : @"BottomToolbarTabViewController", + showcase::kClassForInstantiationKey : @"SCBottomToolbarTabCoordinator", + showcase::kUseCaseKey : @"Bottom toolbar tab", + }, + @{ showcase::kClassForDisplayKey : @"ToolbarViewController", showcase::kClassForInstantiationKey : @"SCToolbarCoordinator", showcase::kUseCaseKey : @"Toolbar", }, + @{ + showcase::kClassForDisplayKey : @"UITableViewCell", + showcase::kClassForInstantiationKey : @"UIKitTableViewCellViewController", + showcase::kUseCaseKey : @"UIKit Table Cells", + }, ]; }
diff --git a/ios/showcase/core/showcase_view_controller.mm b/ios/showcase/core/showcase_view_controller.mm index 6348724556..5e91aa4f 100644 --- a/ios/showcase/core/showcase_view_controller.mm +++ b/ios/showcase/core/showcase_view_controller.mm
@@ -61,6 +61,7 @@ self.title = @"Showcase"; self.tableView.tableFooterView = [[UIView alloc] init]; self.tableView.rowHeight = 70.0; + self.tableView.accessibilityIdentifier = @"showcase_home_collection"; self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; @@ -77,6 +78,8 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; + self.navigationController.hidesBarsOnSwipe = NO; + // Resets the current coordinator whenever the navigation controller pops // back to this view controller. self.activeCoordinator = nil;
diff --git a/ios/showcase/payments/BUILD.gn b/ios/showcase/payments/BUILD.gn new file mode 100644 index 0000000..5cdbfdb7 --- /dev/null +++ b/ios/showcase/payments/BUILD.gn
@@ -0,0 +1,20 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("payments") { + sources = [ + "sc_payments_editor_coordinator.h", + "sc_payments_editor_coordinator.mm", + ] + deps = [ + "//base", + "//ios/chrome/browser/payments:payments_ui", + "//ios/chrome/browser/payments/cells", + "//ios/chrome/browser/ui/collection_view/cells", + "//ios/chrome/browser/ui/settings/cells", + "//ios/showcase/common", + ] + libs = [ "UIKit.framework" ] + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/showcase/payments/sc_payments_editor_coordinator.h b/ios/showcase/payments/sc_payments_editor_coordinator.h new file mode 100644 index 0000000..a1cb666b --- /dev/null +++ b/ios/showcase/payments/sc_payments_editor_coordinator.h
@@ -0,0 +1,15 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_SHOWCASE_PAYMENTS_SC_PAYMENTS_EDITOR_COORDINATOR_H_ +#define IOS_SHOWCASE_PAYMENTS_SC_PAYMENTS_EDITOR_COORDINATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/showcase/common/navigation_coordinator.h" + +@interface SCPaymentsEditorCoordinator : NSObject<NavigationCoordinator> +@end + +#endif // IOS_SHOWCASE_PAYMENTS_SC_PAYMENTS_EDITOR_COORDINATOR_H_
diff --git a/ios/showcase/payments/sc_payments_editor_coordinator.mm b/ios/showcase/payments/sc_payments_editor_coordinator.mm new file mode 100644 index 0000000..2850019 --- /dev/null +++ b/ios/showcase/payments/sc_payments_editor_coordinator.mm
@@ -0,0 +1,75 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/showcase/payments/sc_payments_editor_coordinator.h" + +#import "base/mac/foundation_util.h" +#include "base/strings/utf_string_conversions.h" +#import "ios/chrome/browser/payments/cells/payments_text_item.h" +#import "ios/chrome/browser/payments/payment_request_edit_view_controller.h" +#import "ios/chrome/browser/payments/payment_request_editor_field.h" +#import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" +#import "ios/chrome/browser/ui/settings/cells/autofill_edit_item.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface SCPaymentsEditorCoordinator ()< + PaymentRequestEditViewControllerDelegate> { + PaymentRequestEditViewController* _paymentRequestEditViewController; +} +@end + +@implementation SCPaymentsEditorCoordinator + +@synthesize baseViewController = _baseViewController; + +- (void)start { + NSArray<EditorField*>* editorFields = [self editorFields]; + _paymentRequestEditViewController = [[PaymentRequestEditViewController alloc] + initWithEditorFields:editorFields]; + [_paymentRequestEditViewController setTitle:@"Add info"]; + [_paymentRequestEditViewController setEditorDelegate:self]; + [_paymentRequestEditViewController loadModel]; + [self.baseViewController pushViewController:_paymentRequestEditViewController + animated:YES]; +} + +#pragma mark - PaymentRequestEditViewControllerDelegate + +- (void)paymentRequestEditViewController: + (PaymentRequestEditViewController*)controller + didFinishEditingFields:(NSArray<EditorField*>*)fields { + [self.baseViewController popViewControllerAnimated:YES]; +} + +- (void)paymentRequestEditViewControllerDidReturn: + (PaymentRequestEditViewController*)controller { + [self.baseViewController popViewControllerAnimated:YES]; +} + +#pragma mark - Helper methods + +- (NSArray<EditorField*>*)editorFields { + return @[ + [[EditorField alloc] + initWithAutofillType:static_cast<NSInteger>(autofill::UNKNOWN_TYPE) + label:@"Name" + value:@"John Doe" + required:YES], + [[EditorField alloc] + initWithAutofillType:static_cast<NSInteger>(autofill::UNKNOWN_TYPE) + label:@"Address" + value:@"" + required:YES], + [[EditorField alloc] + initWithAutofillType:static_cast<NSInteger>(autofill::UNKNOWN_TYPE) + label:@"Postal Code" + value:@"" + required:NO] + ]; +} + +@end
diff --git a/ios/showcase/suggestions/sc_suggestions_coordinator.h b/ios/showcase/suggestions/sc_suggestions_coordinator.h deleted file mode 100644 index d6700db..0000000 --- a/ios/showcase/suggestions/sc_suggestions_coordinator.h +++ /dev/null
@@ -1,15 +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 IOS_SHOWCASE_SUGGESTIONS_SC_SUGGESTIONS_COORDINATOR_H_ -#define IOS_SHOWCASE_SUGGESTIONS_SC_SUGGESTIONS_COORDINATOR_H_ - -#import <UIKit/UIKit.h> - -#import "ios/showcase/common/navigation_coordinator.h" - -@interface SCSuggestionsCoordinator : NSObject<NavigationCoordinator> -@end - -#endif // IOS_SHOWCASE_SUGGESTIONS_SC_SUGGESTIONS_COORDINATOR_H_
diff --git a/ios/showcase/tab/BUILD.gn b/ios/showcase/tab/BUILD.gn new file mode 100644 index 0000000..b3df825 --- /dev/null +++ b/ios/showcase/tab/BUILD.gn
@@ -0,0 +1,33 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("tab") { + sources = [ + "sc_bottom_toolbar_tab_coordinator.h", + "sc_bottom_toolbar_tab_coordinator.mm", + "sc_top_toolbar_tab_coordinator.h", + "sc_top_toolbar_tab_coordinator.mm", + ] + deps = [ + "//base", + "//ios/clean/chrome/browser/ui/commands", + "//ios/clean/chrome/browser/ui/tab:tab_ui", + "//ios/showcase/common", + ] + libs = [ "UIKit.framework" ] + configs += [ "//build/config/compiler:enable_arc" ] +} + +source_set("eg_tests") { + testonly = true + sources = [ + "sc_tab_egtest.mm", + ] + deps = [ + "//ios/showcase/test", + "//ios/third_party/earl_grey", + ] + libs = [ "XCTest.framework" ] + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.h b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.h new file mode 100644 index 0000000..66b1557 --- /dev/null +++ b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.h
@@ -0,0 +1,15 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_SHOWCASE_TAB_SC_BOTTOM_TOOLBAR_TAB_COORDINATOR_H_ +#define IOS_SHOWCASE_TAB_SC_BOTTOM_TOOLBAR_TAB_COORDINATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/showcase/common/navigation_coordinator.h" + +@interface SCBottomToolbarTabCoordinator : NSObject<NavigationCoordinator> +@end + +#endif // IOS_SHOWCASE_TAB_SC_BOTTOM_TOOLBAR_TAB_COORDINATOR_H_
diff --git a/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm new file mode 100644 index 0000000..ae2c688 --- /dev/null +++ b/ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.mm
@@ -0,0 +1,25 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/showcase/tab/sc_bottom_toolbar_tab_coordinator.h" + +#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation SCBottomToolbarTabCoordinator + +@synthesize baseViewController; + +- (void)start { + UIViewController* bottomToolbarTabViewController = + [[BottomToolbarTabViewController alloc] init]; + bottomToolbarTabViewController.title = @"Bottom toolbar tab"; + [self.baseViewController pushViewController:bottomToolbarTabViewController + animated:YES]; +} + +@end
diff --git a/ios/showcase/tab/sc_tab_egtest.mm b/ios/showcase/tab/sc_tab_egtest.mm new file mode 100644 index 0000000..e419061 --- /dev/null +++ b/ios/showcase/tab/sc_tab_egtest.mm
@@ -0,0 +1,32 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <EarlGrey/EarlGrey.h> + +#import "ios/showcase/test/showcase_eg_utils.h" +#import "ios/showcase/test/showcase_test_case.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// Tests for the tab container view controller. +@interface SCTabTestCase : ShowcaseTestCase +@end + +@implementation SCTabTestCase + +// Tests launching TopToolbarTabViewController. +- (void)testLaunchWithTopToolbar { + showcase_utils::Open(@"TopToolbarTabViewController"); + showcase_utils::Close(); +} + +// Tests launching BottomToolbarTabViewController. +- (void)testLaunchWithBottomToolbar { + showcase_utils::Open(@"BottomToolbarTabViewController"); + showcase_utils::Close(); +} + +@end
diff --git a/ios/showcase/tab/sc_top_toolbar_tab_coordinator.h b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.h new file mode 100644 index 0000000..6f59a82 --- /dev/null +++ b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.h
@@ -0,0 +1,15 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_SHOWCASE_TAB_SC_TOP_TOOLBAR_TAB_COORDINATOR_H_ +#define IOS_SHOWCASE_TAB_SC_TOP_TOOLBAR_TAB_COORDINATOR_H_ + +#import <UIKit/UIKit.h> + +#import "ios/showcase/common/navigation_coordinator.h" + +@interface SCTopToolbarTabCoordinator : NSObject<NavigationCoordinator> +@end + +#endif // IOS_SHOWCASE_TAB_SC_TOP_TOOLBAR_TAB_COORDINATOR_H_
diff --git a/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm new file mode 100644 index 0000000..563dfcd --- /dev/null +++ b/ios/showcase/tab/sc_top_toolbar_tab_coordinator.mm
@@ -0,0 +1,25 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/showcase/tab/sc_top_toolbar_tab_coordinator.h" + +#import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation SCTopToolbarTabCoordinator + +@synthesize baseViewController; + +- (void)start { + UIViewController* topToolbarTabViewController = + [[TopToolbarTabViewController alloc] init]; + topToolbarTabViewController.title = @"Top toolbar tab"; + [self.baseViewController pushViewController:topToolbarTabViewController + animated:YES]; +} + +@end
diff --git a/ios/showcase/tab_grid/sc_tab_grid_egtest.mm b/ios/showcase/tab_grid/sc_tab_grid_egtest.mm index cf0c922..ccce05d6 100644 --- a/ios/showcase/tab_grid/sc_tab_grid_egtest.mm +++ b/ios/showcase/tab_grid/sc_tab_grid_egtest.mm
@@ -4,6 +4,7 @@ #import <EarlGrey/EarlGrey.h> +#import "ios/showcase/test/showcase_eg_utils.h" #import "ios/showcase/test/showcase_test_case.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -23,8 +24,7 @@ EARL_GREY_TEST_DISABLED( @"Disabled for devices because it is flaky on iPhone"); #endif - [[EarlGrey selectElementWithMatcher:grey_text(@"TabGridViewController")] - performAction:grey_tap()]; + showcase_utils::Open(@"TabGridViewController"); [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Tab 0_button")] performAction:grey_tap()]; [[EarlGrey selectElementWithMatcher:grey_text(@"TabCommands")] @@ -32,6 +32,7 @@ [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel( @"protocol_alerter_done")] performAction:grey_tap()]; + showcase_utils::Close(); } @end
diff --git a/ios/showcase/test/BUILD.gn b/ios/showcase/test/BUILD.gn index 9be866c..2cf4003 100644 --- a/ios/showcase/test/BUILD.gn +++ b/ios/showcase/test/BUILD.gn
@@ -5,6 +5,8 @@ source_set("test") { testonly = true sources = [ + "showcase_eg_utils.h", + "showcase_eg_utils.mm", "showcase_test_case.h", "showcase_test_case.mm", ]
diff --git a/ios/showcase/test/showcase_eg_utils.h b/ios/showcase/test/showcase_eg_utils.h new file mode 100644 index 0000000..fee41414 --- /dev/null +++ b/ios/showcase/test/showcase_eg_utils.h
@@ -0,0 +1,20 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_SHOWCASE_TEST_SHOWCASE_EG_UTILS_H_ +#define IOS_SHOWCASE_TEST_SHOWCASE_EG_UTILS_H_ + +#import <EarlGrey/EarlGrey.h> + +namespace showcase_utils { + +// Opens the screen named |name| on the Showcase home screen. +void Open(NSString* name); + +// Returns to the Showcase home screen from a particular screen. +void Close(); + +} // namespace showcase_utils + +#endif // IOS_SHOWCASE_TEST_SHOWCASE_EG_UTILS_H_
diff --git a/ios/showcase/test/showcase_eg_utils.mm b/ios/showcase/test/showcase_eg_utils.mm new file mode 100644 index 0000000..40fe8b1 --- /dev/null +++ b/ios/showcase/test/showcase_eg_utils.mm
@@ -0,0 +1,47 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/showcase/test/showcase_eg_utils.h" + +#import "base/mac/foundation_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Matcher for the back button on screens presented from the Showcase home +// screen. +id<GREYMatcher> BackButton() { + return grey_kindOfClass( + NSClassFromString(@"_UINavigationBarBackIndicatorView")); +} + +// Returns the Showcase navigation controller. +UINavigationController* ShowcaseNavigationController() { + UINavigationController* showcaseNavigationController = + base::mac::ObjCCastStrict<UINavigationController>( + [[[UIApplication sharedApplication] keyWindow] rootViewController]); + return showcaseNavigationController; +} + +} // namespace + +namespace showcase_utils { + +void Open(NSString* name) { + [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(name)] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 50) + onElementWithMatcher:grey_accessibilityID(@"showcase_home_collection")] + performAction:grey_tap()]; +} + +void Close() { + // Some screens hides the navigation bar. Make sure it is showing. + ShowcaseNavigationController().navigationBarHidden = NO; + [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()]; +} + +} // namespace showcase_utils
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn index 900488c..7d25a604 100644 --- a/ios/third_party/material_components_ios/BUILD.gn +++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -248,6 +248,7 @@ ] deps = [ + ":material_collection_cells_bundle", ":material_collections_bundle", ":material_component_ic_arrow_back_bundle", "//ios/third_party/material_text_accessibility_ios", @@ -267,14 +268,46 @@ ] } -bundle_data("material_collections_bundle") { +_locales = [ "en" ] + +foreach(locale, _locales) { + bundle_data("material_collections_bundle_$locale") { + visibility = [ ":material_collections_bundle" ] + sources = [ + "src/components/Collections/src/MaterialCollections.bundle/Resources/$locale.lproj/MaterialCollections.strings", + ] + outputs = [ + "{{bundle_root_dir}}/MaterialCollections.bundle/Resources/$locale.lproj/{{source_file_part}}", + ] + } + + bundle_data("material_collection_cells_bundle_$locale") { + visibility = [ ":material_collection_cells_bundle" ] + sources = [ + "src/components/CollectionCells/src/MaterialCollectionCells.bundle/Resources/$locale.lproj/MaterialCollectionCells.strings", + ] + outputs = [ + "{{bundle_resources_dir}}/MaterialCollectionCells.bundle/Resources/$locale.lproj/{{source_file_part}}", + ] + } +} + +group("material_collections_bundle") { visibility = [ ":material_components_ios" ] - sources = [ - "src/components/Collections/src/MaterialCollections.bundle/Resources/en.lproj/MaterialCollections.strings", - ] - outputs = [ - "{{bundle_root_dir}}/MaterialCollections.bundle/Resources/en.lproj/{{source_file_part}}", - ] + + deps = [] + foreach(locale, _locales) { + deps += [ ":material_collections_bundle_$locale" ] + } +} + +group("material_collection_cells_bundle") { + visibility = [ ":material_components_ios" ] + + deps = [] + foreach(locale, _locales) { + deps += [ ":material_collection_cells_bundle_$locale" ] + } } # TODO(crbug.com/662421): Move back to _icon_names when there is just one
diff --git a/ios/web/navigation/crw_session_controller+private_constructors.h b/ios/web/navigation/crw_session_controller+private_constructors.h index 9afd605..b10295d 100644 --- a/ios/web/navigation/crw_session_controller+private_constructors.h +++ b/ios/web/navigation/crw_session_controller+private_constructors.h
@@ -24,10 +24,10 @@ - (instancetype)initWithBrowserState:(web::BrowserState*)browserState; // Initializes a session controller, supplying a list of NavigationItem objects -// and the current index in the navigation history. +// and the last committed item index in the navigation history. - (instancetype)initWithBrowserState:(web::BrowserState*)browserState navigationItems:(web::ScopedNavigationItemList)items - currentIndex:(NSUInteger)currentIndex; + lastCommittedItemIndex:(NSUInteger)lastCommittedItemIndex; @end #endif // IOS_WEB_NAVIGATION_CRW_SESSION_CONTROLLER_PRIVATE_CONSTRUCTORS_H_
diff --git a/ios/web/navigation/crw_session_controller.h b/ios/web/navigation/crw_session_controller.h index a230bfe67..f053dd14e 100644 --- a/ios/web/navigation/crw_session_controller.h +++ b/ios/web/navigation/crw_session_controller.h
@@ -30,8 +30,8 @@ // TODO(crbug.com/454984): Remove this class. @interface CRWSessionController : NSObject -@property(nonatomic, readonly, assign) NSInteger currentNavigationIndex; -@property(nonatomic, readonly, assign) NSInteger previousNavigationIndex; +@property(nonatomic, readonly, assign) NSInteger lastCommittedItemIndex; +@property(nonatomic, readonly, assign) NSInteger previousItemIndex; // The index of the pending item if it is in |items|, or -1 if |pendingItem| // corresponds with a new navigation (created by addPendingItem:). @property(nonatomic, readwrite, assign) NSInteger pendingItemIndex; @@ -66,10 +66,10 @@ // Returns the NavigationItem corresponding with the previously loaded page. @property(nonatomic, readonly) web::NavigationItemImpl* previousItem; // Returns a list of all non-redirected NavigationItems whose index precedes -// |currentNavigationIndex|. +// |lastCommittedItemIndex|. @property(nonatomic, readonly) web::NavigationItemList backwardItems; // Returns a list of all non-redirected NavigationItems whose index follow -// |currentNavigationIndex|. +// |lastCommittedItemIndex|. @property(nonatomic, readonly) web::NavigationItemList forwardItems; // CRWSessionController doesn't have public constructors. New @@ -133,7 +133,7 @@ // |canPruneAllButLastCommittedItem| is false. - (void)copyStateFromSessionControllerAndPrune:(CRWSessionController*)source; -// Sets |currentNavigationIndex_| to the |index| if it's in the entries bounds. +// Sets |lastCommittedItemIndex| to the |index| if it's in the entries bounds. - (void)goToItemAtIndex:(NSInteger)index; // Removes the item at |index| after discarding any noncomitted entries.
diff --git a/ios/web/navigation/crw_session_controller.mm b/ios/web/navigation/crw_session_controller.mm index 710fc0b..ec96f47 100644 --- a/ios/web/navigation/crw_session_controller.mm +++ b/ios/web/navigation/crw_session_controller.mm
@@ -37,14 +37,12 @@ // the incremental merging of the two classes. web::NavigationManagerImpl* _navigationManager; - // Identifies the index of the current navigation in the NavigationItem - // array. - NSInteger _currentNavigationIndex; - // Identifies the index of the previous navigation in the NavigationItem - // array. - NSInteger _previousNavigationIndex; + // Identifies the index of the last committed item in the items array. + NSInteger _lastCommittedItemIndex; + // Identifies the index of the previous item in the items array. + NSInteger _previousItemIndex; - // Stores the certificate policies decided by the user. + // Stores the certificate policies decided by the user. CRWSessionCertificatePolicyManager* _sessionCertificatePolicyManager; // The browser state associated with this CRWSessionController; @@ -65,7 +63,7 @@ } // Redefine as readwrite. -@property(nonatomic, readwrite, assign) NSInteger currentNavigationIndex; +@property(nonatomic, readwrite, assign) NSInteger lastCommittedItemIndex; // TODO(rohitrao): These properties must be redefined readwrite to work around a // clang bug. crbug.com/228650 @@ -75,9 +73,9 @@ // Expose setters for serialization properties. These are exposed in a category // in SessionStorageBuilder, and will be removed as ownership of // their backing ivars moves to NavigationManagerImpl. -@property(nonatomic, readwrite, assign) NSInteger previousNavigationIndex; +@property(nonatomic, readwrite, assign) NSInteger previousItemIndex; -// Removes all items after currentNavigationIndex_. +// Removes all items after lastCommittedItemIndex. - (void)clearForwardItems; // Discards the transient item, if any. - (void)discardTransientItem; @@ -95,8 +93,8 @@ @implementation CRWSessionController -@synthesize currentNavigationIndex = _currentNavigationIndex; -@synthesize previousNavigationIndex = _previousNavigationIndex; +@synthesize lastCommittedItemIndex = _lastCommittedItemIndex; +@synthesize previousItemIndex = _previousItemIndex; @synthesize pendingItemIndex = _pendingItemIndex; @synthesize sessionCertificatePolicyManager = _sessionCertificatePolicyManager; @@ -104,8 +102,8 @@ self = [super init]; if (self) { _browserState = browserState; - _currentNavigationIndex = -1; - _previousNavigationIndex = -1; + _lastCommittedItemIndex = -1; + _previousItemIndex = -1; _pendingItemIndex = -1; _sessionCertificatePolicyManager = [[CRWSessionCertificatePolicyManager alloc] init]; @@ -115,15 +113,15 @@ - (instancetype)initWithBrowserState:(web::BrowserState*)browserState navigationItems:(web::ScopedNavigationItemList)items - currentIndex:(NSUInteger)currentIndex { + lastCommittedItemIndex:(NSUInteger)lastCommittedItemIndex { self = [super init]; if (self) { _browserState = browserState; _items = web::CreateScopedNavigationItemImplList(std::move(items)); - _currentNavigationIndex = - std::min(static_cast<NSInteger>(currentIndex), + _lastCommittedItemIndex = + std::min(static_cast<NSInteger>(lastCommittedItemIndex), static_cast<NSInteger>(_items.size()) - 1); - _previousNavigationIndex = -1; + _previousItemIndex = -1; _pendingItemIndex = -1; _sessionCertificatePolicyManager = [[CRWSessionCertificatePolicyManager alloc] init]; @@ -133,9 +131,9 @@ #pragma mark - Accessors -- (void)setCurrentNavigationIndex:(NSInteger)currentNavigationIndex { - if (_currentNavigationIndex != currentNavigationIndex) { - _currentNavigationIndex = currentNavigationIndex; +- (void)setLastCommittedItemIndex:(NSInteger)lastCommittedItemIndex { + if (_lastCommittedItemIndex != lastCommittedItemIndex) { + _lastCommittedItemIndex = lastCommittedItemIndex; if (_navigationManager) _navigationManager->RemoveTransientURLRewriters(); } @@ -149,7 +147,7 @@ } - (BOOL)canPruneAllButLastCommittedItem { - return self.currentNavigationIndex != -1 && self.pendingItemIndex == -1 && + return self.lastCommittedItemIndex != -1 && self.pendingItemIndex == -1 && !self.transientItem; } @@ -193,18 +191,18 @@ } - (web::NavigationItemImpl*)lastCommittedItem { - NSInteger index = self.currentNavigationIndex; + NSInteger index = self.lastCommittedItemIndex; return index == -1 ? nullptr : self.items[index].get(); } - (web::NavigationItemImpl*)previousItem { - NSInteger index = self.previousNavigationIndex; + NSInteger index = self.previousItemIndex; return index == -1 || self.items.empty() ? nullptr : self.items[index].get(); } - (web::NavigationItemList)backwardItems { web::NavigationItemList items; - for (size_t index = _currentNavigationIndex; index > 0; --index) { + for (size_t index = _lastCommittedItemIndex; index > 0; --index) { if (![self isRedirectTransitionForItemAtIndex:index]) items.push_back(self.items[index - 1].get()); } @@ -213,7 +211,7 @@ - (web::NavigationItemList)forwardItems { web::NavigationItemList items; - NSUInteger lastNonRedirectedIndex = _currentNavigationIndex + 1; + NSUInteger lastNonRedirectedIndex = _lastCommittedItemIndex + 1; while (lastNonRedirectedIndex < self.items.size()) { web::NavigationItem* item = self.items[lastNonRedirectedIndex].get(); if (!ui::PageTransitionIsRedirect(item->GetTransitionType())) @@ -251,14 +249,14 @@ [NSString stringWithFormat:@"%p", self.transientItem]; } #endif - return [NSString stringWithFormat:@"current index: %" PRIdNS - @"\nprevious index: %" PRIdNS - @"\npending" - @" index: %" PRIdNS - @"\n%@\npending: %@\ntransient: %@\n", - _currentNavigationIndex, - _previousNavigationIndex, _pendingItemIndex, - itemsDescription, pendingItemDescription, + return [NSString stringWithFormat:@"last committed item index: %" PRIdNS + @"\nprevious item index: %" PRIdNS + @"\npending item index: %" PRIdNS + @"\nall items: %@ \npending item: %@" + @"\ntransient item: %@\n", + _lastCommittedItemIndex, _previousItemIndex, + _pendingItemIndex, itemsDescription, + pendingItemDescription, transientItemDescription]; } @@ -361,15 +359,15 @@ DCHECK_EQ(self.pendingItemIndex, -1); [self discardTransientItem]; - NSInteger forwardItemStartIndex = _currentNavigationIndex + 1; + NSInteger forwardItemStartIndex = _lastCommittedItemIndex + 1; DCHECK(forwardItemStartIndex >= 0); size_t itemCount = self.items.size(); if (forwardItemStartIndex >= static_cast<NSInteger>(itemCount)) return; - if (_previousNavigationIndex >= forwardItemStartIndex) - _previousNavigationIndex = -1; + if (_previousItemIndex >= forwardItemStartIndex) + _previousItemIndex = -1; // Remove the NavigationItems and notify the NavigationManater _items.erase(_items.begin() + forwardItemStartIndex, _items.end()); @@ -385,15 +383,15 @@ // the implementation in NavigationController.) self.pendingItem->ResetForCommit(); - NSInteger newNavigationIndex = self.pendingItemIndex; - if (newNavigationIndex == -1) { + NSInteger newItemIndex = self.pendingItemIndex; + if (newItemIndex == -1) { [self clearForwardItems]; // Add the new item at the end. _items.push_back(std::move(_pendingItem)); - newNavigationIndex = self.items.size() - 1; + newItemIndex = self.items.size() - 1; } - _previousNavigationIndex = _currentNavigationIndex; - self.currentNavigationIndex = newNavigationIndex; + _previousItemIndex = _lastCommittedItemIndex; + self.lastCommittedItemIndex = newItemIndex; self.pendingItemIndex = -1; DCHECK(!_pendingItem); } @@ -444,8 +442,8 @@ [self clearForwardItems]; // Add the new item at the end. _items.push_back(std::move(pushedItem)); - _previousNavigationIndex = _currentNavigationIndex; - self.currentNavigationIndex = self.items.size() - 1; + _previousItemIndex = _lastCommittedItemIndex; + self.lastCommittedItemIndex = self.items.size() - 1; if (_navigationManager) _navigationManager->OnNavigationItemCommitted(); @@ -489,28 +487,29 @@ if (!source.lastCommittedItem) return; - // Copy |sourceItems| into a new NavigationItemList. |mergedItems| is needs - // to be large enough for all items in |source| preceding - // |sourceCurrentIndex|, the |source|'s current item, and |self|'s current - // item, which comes out to |sourceCurrentIndex| + 2. - DCHECK_GT(source.currentNavigationIndex, -1); - size_t sourceCurrentIndex = - static_cast<size_t>(source.currentNavigationIndex); - web::ScopedNavigationItemImplList mergedItems(sourceCurrentIndex + 2); - for (size_t index = 0; index <= sourceCurrentIndex; ++index) { + // Copy |sourceItems| into a new NavigationItemList. |mergedItems| needs to + // be large enough for all items in |source| preceding + // |sourceLastCommittedItemIndex|, the |source|'s current item, and |self|'s + // current item, which comes out to |sourceCurrentIndex| + 2. + DCHECK_GT(source.lastCommittedItemIndex, -1); + size_t sourceLastCommittedItemIndex = + static_cast<size_t>(source.lastCommittedItemIndex); + web::ScopedNavigationItemImplList mergedItems(sourceLastCommittedItemIndex + + 2); + for (size_t index = 0; index <= sourceLastCommittedItemIndex; ++index) { mergedItems[index] = base::MakeUnique<web::NavigationItemImpl>(*sourceItems[index]); } - mergedItems.back() = std::move(_items[self.currentNavigationIndex]); + mergedItems.back() = std::move(_items[self.lastCommittedItemIndex]); // Use |mergedItems| as the session history. std::swap(mergedItems, _items); // Update state to reflect inserted NavigationItems. - _previousNavigationIndex = -1; - _currentNavigationIndex = self.items.size() - 1; + _previousItemIndex = -1; + _lastCommittedItemIndex = self.items.size() - 1; - DCHECK_LT(static_cast<NSUInteger>(_currentNavigationIndex), + DCHECK_LT(static_cast<NSUInteger>(_lastCommittedItemIndex), self.items.size()); } @@ -518,33 +517,33 @@ if (index < 0 || static_cast<NSUInteger>(index) >= self.items.size()) return; - if (index < _currentNavigationIndex) { + if (index < _lastCommittedItemIndex) { // Going back. [self discardNonCommittedItems]; - } else if (_currentNavigationIndex < index) { + } else if (_lastCommittedItemIndex < index) { // Going forward. [self discardTransientItem]; } else { - // |delta| is 0, no need to change current navigation index. + // |delta| is 0, no need to change the last committed item index. return; } - _previousNavigationIndex = _currentNavigationIndex; - _currentNavigationIndex = index; + _previousItemIndex = _lastCommittedItemIndex; + _lastCommittedItemIndex = index; } - (void)removeItemAtIndex:(NSInteger)index { DCHECK(index < static_cast<NSInteger>(self.items.size())); - DCHECK(index != _currentNavigationIndex); + DCHECK(index != _lastCommittedItemIndex); DCHECK(index >= 0); [self discardNonCommittedItems]; _items.erase(_items.begin() + index); - if (_currentNavigationIndex > index) - _currentNavigationIndex--; - if (_previousNavigationIndex >= index) - _previousNavigationIndex--; + if (_lastCommittedItemIndex > index) + _lastCommittedItemIndex--; + if (_previousItemIndex >= index) + _previousItemIndex--; } - (BOOL)isSameDocumentNavigationBetweenItem:(web::NavigationItem*)firstItem
diff --git a/ios/web/navigation/crw_session_controller_unittest.mm b/ios/web/navigation/crw_session_controller_unittest.mm index a5d7096..df8b252f6 100644 --- a/ios/web/navigation/crw_session_controller_unittest.mm +++ b/ios/web/navigation/crw_session_controller_unittest.mm
@@ -359,8 +359,8 @@ // All forward items should go away. EXPECT_EQ(2U, [session_controller_ items].size()); EXPECT_EQ(0U, [session_controller_ forwardItems].size()); - ASSERT_EQ(1, [session_controller_ currentNavigationIndex]); - ASSERT_EQ(0, [session_controller_ previousNavigationIndex]); + ASSERT_EQ(1, [session_controller_ lastCommittedItemIndex]); + ASSERT_EQ(0, [session_controller_ previousItemIndex]); } // Tests committing pending item index from the middle. @@ -391,8 +391,8 @@ ASSERT_EQ(0, [session_controller_ pendingItemIndex]); web::NavigationItem* pending_item = [session_controller_ pendingItem]; ASSERT_TRUE(pending_item); - ASSERT_EQ(1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(2, [session_controller_ previousNavigationIndex]); + ASSERT_EQ(1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(2, [session_controller_ previousItemIndex]); [session_controller_ commitPendingItem]; // Verify that pending item has been committed and current and previous item @@ -400,8 +400,8 @@ EXPECT_EQ(pending_item, [session_controller_ lastCommittedItem]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); EXPECT_FALSE([session_controller_ pendingItem]); - EXPECT_EQ(0, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(1, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(0, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(1, [session_controller_ previousItemIndex]); EXPECT_EQ(3U, [session_controller_ items].size()); } @@ -506,8 +506,8 @@ copyStateFromSessionControllerAndPrune:other_session_controller.get()]; EXPECT_EQ(2U, [session_controller_ items].size()); - EXPECT_EQ(1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(-1, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(-1, [session_controller_ previousItemIndex]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); EXPECT_EQ(GURL("http://www.url.com/0"), @@ -543,8 +543,8 @@ [session_controller_ copyStateFromSessionControllerAndPrune:other_session_controller.get()]; EXPECT_EQ(2U, [session_controller_ items].size()); - EXPECT_EQ(1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(0, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(0, [session_controller_ previousItemIndex]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); EXPECT_FALSE([session_controller_ pendingItem]); EXPECT_EQ(GURL("http://www.url.com/0"), @@ -578,8 +578,8 @@ [session_controller_ copyStateFromSessionControllerAndPrune:other_session_controller]; EXPECT_TRUE([session_controller_ items].empty()); - EXPECT_EQ(-1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(-1, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(-1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(-1, [session_controller_ previousItemIndex]); EXPECT_FALSE([session_controller_ currentItem]); EXPECT_FALSE([session_controller_ pendingItem]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); @@ -626,8 +626,8 @@ [session_controller_ copyStateFromSessionControllerAndPrune:other_session_controller]; EXPECT_EQ(2U, [session_controller_ items].size()); - EXPECT_EQ(1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(0, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(0, [session_controller_ previousItemIndex]); EXPECT_EQ(0, [session_controller_ pendingItemIndex]); EXPECT_TRUE([session_controller_ pendingItem]); EXPECT_EQ([session_controller_ previousItem], @@ -673,8 +673,8 @@ [session_controller_ copyStateFromSessionControllerAndPrune:other_session_controller]; EXPECT_EQ(1U, [session_controller_ items].size()); - EXPECT_EQ(0, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(-1, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(0, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(-1, [session_controller_ previousItemIndex]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); EXPECT_TRUE([session_controller_ pendingItem]); EXPECT_TRUE([session_controller_ transientItem]); @@ -685,8 +685,8 @@ // Tests state of an empty session controller. TEST_F(CRWSessionControllerTest, EmptyController) { EXPECT_TRUE([session_controller_ items].empty()); - EXPECT_EQ(-1, [session_controller_ currentNavigationIndex]); - EXPECT_EQ(-1, [session_controller_ previousNavigationIndex]); + EXPECT_EQ(-1, [session_controller_ lastCommittedItemIndex]); + EXPECT_EQ(-1, [session_controller_ previousItemIndex]); EXPECT_FALSE([session_controller_ currentItem]); EXPECT_FALSE([session_controller_ pendingItem]); EXPECT_EQ(-1, [session_controller_ pendingItemIndex]); @@ -718,10 +718,10 @@ base::scoped_nsobject<CRWSessionController> controller( [[CRWSessionController alloc] initWithBrowserState:&browser_state_ navigationItems:std::move(items) - currentIndex:0]); + lastCommittedItemIndex:0]); EXPECT_TRUE(controller.get().items.empty()); - EXPECT_EQ(controller.get().currentNavigationIndex, -1); - EXPECT_EQ(controller.get().previousNavigationIndex, -1); + EXPECT_EQ(controller.get().lastCommittedItemIndex, -1); + EXPECT_EQ(controller.get().previousItemIndex, -1); EXPECT_FALSE(controller.get().currentItem); } @@ -736,11 +736,11 @@ base::scoped_nsobject<CRWSessionController> controller( [[CRWSessionController alloc] initWithBrowserState:&browser_state_ navigationItems:std::move(items) - currentIndex:1]); + lastCommittedItemIndex:1]); EXPECT_EQ(controller.get().items.size(), 3U); - EXPECT_EQ(controller.get().currentNavigationIndex, 1); - EXPECT_EQ(controller.get().previousNavigationIndex, -1); + EXPECT_EQ(controller.get().lastCommittedItemIndex, 1); + EXPECT_EQ(controller.get().previousItemIndex, -1); // Sanity check the current item, the NavigationItem unit test will ensure // the entire object is created properly. EXPECT_EQ([controller currentItem]->GetURL(), GURL("http://www.yahoo.com")); @@ -748,21 +748,21 @@ // Tests index of previous navigation item. TEST_F(CRWSessionControllerTest, PreviousNavigationItem) { - EXPECT_EQ(session_controller_.get().previousNavigationIndex, -1); + EXPECT_EQ(session_controller_.get().previousItemIndex, -1); [session_controller_ addPendingItem:GURL("http://www.url.com") referrer:MakeReferrer("http://www.referer.com") transition:ui::PAGE_TRANSITION_TYPED initiationType:web::NavigationInitiationType::USER_INITIATED]; [session_controller_ commitPendingItem]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, -1); + EXPECT_EQ(session_controller_.get().previousItemIndex, -1); [session_controller_ addPendingItem:GURL("http://www.url1.com") referrer:MakeReferrer("http://www.referer.com") transition:ui::PAGE_TRANSITION_TYPED initiationType:web::NavigationInitiationType::USER_INITIATED]; [session_controller_ commitPendingItem]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 0); + EXPECT_EQ(session_controller_.get().previousItemIndex, 0); [session_controller_ addPendingItem:GURL("http://www.url2.com") referrer:MakeReferrer("http://www.referer.com") @@ -770,19 +770,19 @@ initiationType:web::NavigationInitiationType::USER_INITIATED]; [session_controller_ commitPendingItem]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 1); + EXPECT_EQ(session_controller_.get().previousItemIndex, 1); [session_controller_ goToItemAtIndex:1]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 2); + EXPECT_EQ(session_controller_.get().previousItemIndex, 2); [session_controller_ goToItemAtIndex:0]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 1); + EXPECT_EQ(session_controller_.get().previousItemIndex, 1); [session_controller_ goToItemAtIndex:1]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 0); + EXPECT_EQ(session_controller_.get().previousItemIndex, 0); [session_controller_ goToItemAtIndex:2]; - EXPECT_EQ(session_controller_.get().previousNavigationIndex, 1); + EXPECT_EQ(session_controller_.get().previousItemIndex, 1); } TEST_F(CRWSessionControllerTest, PushNewItem) { @@ -796,7 +796,7 @@ base::scoped_nsobject<CRWSessionController> controller( [[CRWSessionController alloc] initWithBrowserState:&browser_state_ navigationItems:std::move(items) - currentIndex:0]); + lastCommittedItemIndex:0]); GURL pushPageGurl1("http://www.firstpage.com/#push1"); NSString* stateObject1 = @"{'foo': 1}"; @@ -845,7 +845,7 @@ base::scoped_nsobject<CRWSessionController> controller( [[CRWSessionController alloc] initWithBrowserState:&browser_state_ navigationItems:std::move(items) - currentIndex:0]); + lastCommittedItemIndex:0]); web::NavigationItemImpl* item0 = [controller items][0].get(); web::NavigationItemImpl* item1 = [controller items][1].get(); web::NavigationItemImpl* item2 = [controller items][2].get(); @@ -883,7 +883,7 @@ base::scoped_nsobject<CRWSessionController> controller( [[CRWSessionController alloc] initWithBrowserState:&browser_state_ navigationItems:std::move(items) - currentIndex:0]); + lastCommittedItemIndex:0]); GURL replacePageGurl1("http://www.firstpage.com/#replace1"); NSString* stateObject1 = @"{'foo': 1}"; @@ -937,7 +937,7 @@ initiationType:web::NavigationInitiationType::USER_INITIATED]; [session_controller_ commitPendingItem]; - EXPECT_EQ(3, session_controller_.get().currentNavigationIndex); + EXPECT_EQ(3, session_controller_.get().lastCommittedItemIndex); web::NavigationItemList backItems = [session_controller_ backwardItems]; EXPECT_EQ(2U, backItems.size()); EXPECT_TRUE([session_controller_ forwardItems].empty()); @@ -986,15 +986,15 @@ transition:ui::PAGE_TRANSITION_LINK initiationType:web::NavigationInitiationType::USER_INITIATED]; [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; - EXPECT_EQ(3, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(2, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(3, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(2, session_controller_.get().previousItemIndex); EXPECT_TRUE([session_controller_ pendingItem]); EXPECT_TRUE([session_controller_ transientItem]); // Going back should discard transient and pending items. [session_controller_ goToItemAtIndex:1]; - EXPECT_EQ(1, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(3, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(1, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(3, session_controller_.get().previousItemIndex); EXPECT_FALSE(session_controller_.get().pendingItem); EXPECT_FALSE(session_controller_.get().transientItem); @@ -1002,22 +1002,22 @@ [session_controller_ addTransientItemWithURL:GURL("http://www.example.com")]; EXPECT_TRUE(session_controller_.get().transientItem); [session_controller_ goToItemAtIndex:2]; - EXPECT_EQ(2, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(1, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(2, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(1, session_controller_.get().previousItemIndex); EXPECT_FALSE(session_controller_.get().transientItem); // Out of bounds navigations should be no-op. [session_controller_ goToItemAtIndex:-1]; - EXPECT_EQ(2, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(1, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(2, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(1, session_controller_.get().previousItemIndex); [session_controller_ goToItemAtIndex:NSIntegerMax]; - EXPECT_EQ(2, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(1, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(2, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(1, session_controller_.get().previousItemIndex); // Going to current index should not change the previous index. [session_controller_ goToItemAtIndex:2]; - EXPECT_EQ(2, session_controller_.get().currentNavigationIndex); - EXPECT_EQ(1, session_controller_.get().previousNavigationIndex); + EXPECT_EQ(2, session_controller_.get().lastCommittedItemIndex); + EXPECT_EQ(1, session_controller_.get().previousItemIndex); } // Tests that visible URL is the same as transient URL if there are no committed
diff --git a/ios/web/navigation/crw_session_storage_unittest.mm b/ios/web/navigation/crw_session_storage_unittest.mm index ab17ff7..c8a698df 100644 --- a/ios/web/navigation/crw_session_storage_unittest.mm +++ b/ios/web/navigation/crw_session_storage_unittest.mm
@@ -49,8 +49,8 @@ NSArray* items2 = session2.itemStorages; return ItemStorageListsAreEqual(items1, items2) && session1.hasOpener == session2.hasOpener && - session1.currentNavigationIndex == session2.currentNavigationIndex && - session1.previousNavigationIndex == session2.previousNavigationIndex && + session1.lastCommittedItemIndex == session2.lastCommittedItemIndex && + session1.previousItemIndex == session2.previousItemIndex && UserDataAreEqual(session1.userData, session2.userData); } } // namespace @@ -61,8 +61,8 @@ : session_storage_([[CRWSessionStorage alloc] init]) { // Set up |session_storage_|. [session_storage_ setHasOpener:YES]; - [session_storage_ setCurrentNavigationIndex:4]; - [session_storage_ setPreviousNavigationIndex:3]; + [session_storage_ setLastCommittedItemIndex:4]; + [session_storage_ setPreviousItemIndex:3]; // Create an item storage. base::scoped_nsobject<CRWNavigationItemStorage> item_storage( [[CRWNavigationItemStorage alloc] init]);
diff --git a/ios/web/navigation/navigation_manager_impl.h b/ios/web/navigation/navigation_manager_impl.h index 6a8182e..9a42986 100644 --- a/ios/web/navigation/navigation_manager_impl.h +++ b/ios/web/navigation/navigation_manager_impl.h
@@ -124,7 +124,6 @@ BrowserURLRewriter::URLRewriter rewriter) override; int GetItemCount() const override; NavigationItem* GetItemAtIndex(size_t index) const override; - int GetCurrentItemIndex() const override; int GetPendingItemIndex() const override; int GetLastCommittedItemIndex() const override; bool RemoveItemAtIndex(int index) override;
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index 8d3ccad..a059c1d 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -104,11 +104,11 @@ void NavigationManagerImpl::ReplaceSessionHistory( std::vector<std::unique_ptr<web::NavigationItem>> items, - int current_index) { + int lastCommittedItemIndex) { SetSessionController([[CRWSessionController alloc] - initWithBrowserState:browser_state_ - navigationItems:std::move(items) - currentIndex:current_index]); + initWithBrowserState:browser_state_ + navigationItems:std::move(items) + lastCommittedItemIndex:lastCommittedItemIndex]); } void NavigationManagerImpl::SetFacadeDelegate( @@ -139,7 +139,7 @@ LoadCommittedDetails details; details.item = GetLastCommittedItem(); DCHECK(details.item); - details.previous_item_index = [session_controller_ previousNavigationIndex]; + details.previous_item_index = [session_controller_ previousItemIndex]; if (details.previous_item_index >= 0) { DCHECK([session_controller_ previousItem]); details.previous_url = [session_controller_ previousItem]->GetURL(); @@ -275,18 +275,14 @@ return [session_controller_ itemAtIndex:index]; } -int NavigationManagerImpl::GetCurrentItemIndex() const { - return [session_controller_ currentNavigationIndex]; -} - int NavigationManagerImpl::GetPendingItemIndex() const { if (GetPendingItem()) { if ([session_controller_ pendingItemIndex] != -1) { return [session_controller_ pendingItemIndex]; } - // TODO(crbug.com/665189): understand why current item index is + // TODO(crbug.com/665189): understand why last committed item index is // returned here. - return GetCurrentItemIndex(); + return GetLastCommittedItemIndex(); } return -1; } @@ -294,7 +290,7 @@ int NavigationManagerImpl::GetLastCommittedItemIndex() const { if (GetItemCount() == 0) return -1; - return [session_controller_ currentNavigationIndex]; + return [session_controller_ lastCommittedItemIndex]; } bool NavigationManagerImpl::RemoveItemAtIndex(int index) { @@ -369,7 +365,7 @@ int NavigationManagerImpl::GetIndexForOffset(int offset) const { int result = [session_controller_ pendingItemIndex] == -1 - ? GetCurrentItemIndex() + ? GetLastCommittedItemIndex() : static_cast<int>([session_controller_ pendingItemIndex]); if (offset < 0) { @@ -446,7 +442,7 @@ NavigationItem* NavigationManagerImpl::GetLastCommittedNonAppSpecificItem() const { - int index = GetCurrentItemIndex(); + int index = GetLastCommittedItemIndex(); if (index == -1) return nullptr; WebClient* client = GetWebClient();
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm index 5559662..9bc5a3a 100644 --- a/ios/web/navigation/navigation_manager_impl_unittest.mm +++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -51,8 +51,8 @@ // Tests state of an empty navigation manager. TEST_F(NavigationManagerTest, EmptyManager) { EXPECT_EQ(0, navigation_manager()->GetItemCount()); - EXPECT_EQ(-1, navigation_manager()->GetCurrentItemIndex()); - EXPECT_EQ(-1, navigation_manager()->GetCurrentItemIndex()); + EXPECT_EQ(-1, navigation_manager()->GetLastCommittedItemIndex()); + EXPECT_EQ(-1, navigation_manager()->GetLastCommittedItemIndex()); EXPECT_FALSE(navigation_manager()->GetPendingItem()); EXPECT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_EQ(-1, navigation_manager()->GetIndexForOffset(0)); @@ -271,11 +271,11 @@ web::NavigationInitiationType::USER_INITIATED); [session_controller() commitPendingItem]; ASSERT_EQ(5, navigation_manager()->GetItemCount()); - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); // Go to entry at index 1 and test API from that state. [session_controller() goToItemAtIndex:1]; - ASSERT_EQ(1, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(1, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_FALSE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(-1, navigation_manager()->GetIndexForOffset(-1)); @@ -299,7 +299,7 @@ // Go to entry at index 2 and test API from that state. [session_controller() goToItemAtIndex:2]; - ASSERT_EQ(2, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(2, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(1, navigation_manager()->GetIndexForOffset(-1)); @@ -321,7 +321,7 @@ // Go to entry at index 4 and test API from that state. [session_controller() goToItemAtIndex:4]; - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(2, navigation_manager()->GetIndexForOffset(-1)); @@ -344,7 +344,7 @@ // Test with existing transient entry. [session_controller() addTransientItemWithURL:GURL("http://www.url.com")]; ASSERT_EQ(5, navigation_manager()->GetItemCount()); - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(4, navigation_manager()->GetIndexForOffset(-1)); @@ -371,7 +371,7 @@ // Set pending index to 1 and test API from that state. [session_controller() setPendingItemIndex:1]; - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(1, navigation_manager()->GetPendingItemIndex()); EXPECT_FALSE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(-1, navigation_manager()->GetIndexForOffset(-1)); @@ -395,7 +395,7 @@ // Set pending index to 2 and test API from that state. [session_controller() setPendingItemIndex:2]; - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(2, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(1, navigation_manager()->GetIndexForOffset(-1)); @@ -418,7 +418,7 @@ // Set pending index to 4 and committed entry to 1 and test. [session_controller() goToItemAtIndex:1]; [session_controller() setPendingItemIndex:4]; - ASSERT_EQ(1, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(1, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(4, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(2, navigation_manager()->GetIndexForOffset(-1)); @@ -443,7 +443,7 @@ [session_controller() setPendingItemIndex:-1]; [session_controller() addTransientItemWithURL:GURL("http://www.url.com")]; ASSERT_EQ(5, navigation_manager()->GetItemCount()); - ASSERT_EQ(4, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(4, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(-1, navigation_manager()->GetPendingItemIndex()); EXPECT_TRUE(navigation_manager()->CanGoToOffset(-1)); EXPECT_EQ(4, navigation_manager()->GetIndexForOffset(-1)); @@ -488,7 +488,7 @@ [session_controller() setPendingItemIndex:1]; ASSERT_EQ(3, navigation_manager()->GetItemCount()); - ASSERT_EQ(2, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(2, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(1, navigation_manager()->GetPendingItemIndex()); EXPECT_EQ(2, navigation_manager()->GetIndexForOffset(1)); EXPECT_EQ(0, navigation_manager()->GetIndexForOffset(-1)); @@ -498,7 +498,7 @@ [session_controller() goToItemAtIndex:0]; [session_controller() setPendingItemIndex:1]; ASSERT_EQ(3, navigation_manager()->GetItemCount()); - ASSERT_EQ(0, navigation_manager()->GetCurrentItemIndex()); + ASSERT_EQ(0, navigation_manager()->GetLastCommittedItemIndex()); ASSERT_EQ(1, navigation_manager()->GetPendingItemIndex()); EXPECT_EQ(2, navigation_manager()->GetIndexForOffset(1)); EXPECT_EQ(0, navigation_manager()->GetIndexForOffset(-1));
diff --git a/ios/web/navigation/serializable_user_data_manager_impl.mm b/ios/web/navigation/serializable_user_data_manager_impl.mm index 9a0dde5b..aeecffc 100644 --- a/ios/web/navigation/serializable_user_data_manager_impl.mm +++ b/ios/web/navigation/serializable_user_data_manager_impl.mm
@@ -63,7 +63,6 @@ @"tabId" : @"TabID", @"openerId" : @"OpenerID", @"openerNavigationIndex" : @"OpenerNavigationIndex", - @"lastVisitedTimestamp" : @"LastVisitedTimestamp", }]; return [legacy_key_conversion copy]; }
diff --git a/ios/web/navigation/session_storage_builder.mm b/ios/web/navigation/session_storage_builder.mm index 6ad68f1..63f420d 100644 --- a/ios/web/navigation/session_storage_builder.mm +++ b/ios/web/navigation/session_storage_builder.mm
@@ -20,7 +20,7 @@ // as this functionality moves from CRWSessionController to // NavigationManagerImpl; @interface CRWSessionController (ExposedForSerialization) -@property(nonatomic, readwrite, assign) NSInteger previousNavigationIndex; +@property(nonatomic, readwrite, assign) NSInteger previousItemIndex; @property(nonatomic, readwrite, retain) CRWSessionCertificatePolicyManager* sessionCertificatePolicyManager; @end @@ -37,10 +37,9 @@ session_storage.hasOpener = web_state->HasOpener(); CRWSessionController* session_controller = navigation_manager->GetSessionController(); - session_storage.currentNavigationIndex = - session_controller.currentNavigationIndex; - session_storage.previousNavigationIndex = - session_controller.previousNavigationIndex; + session_storage.lastCommittedItemIndex = + session_controller.lastCommittedItemIndex; + session_storage.previousItemIndex = session_controller.previousItemIndex; session_storage.sessionCertificatePolicyManager = session_controller.sessionCertificatePolicyManager; NSMutableArray* item_storages = [[NSMutableArray alloc] init]; @@ -71,13 +70,13 @@ item_storage_builder.BuildNavigationItemImpl(item_storages[index]); items[index] = std::move(item_impl); } - NSUInteger current_index = storage.currentNavigationIndex; + NSUInteger last_committed_item_index = storage.lastCommittedItemIndex; base::scoped_nsobject<CRWSessionController> session_controller( - [[CRWSessionController alloc] initWithBrowserState:nullptr - navigationItems:std::move(items) - currentIndex:current_index]); - [session_controller - setPreviousNavigationIndex:storage.previousNavigationIndex]; + [[CRWSessionController alloc] + initWithBrowserState:nullptr + navigationItems:std::move(items) + lastCommittedItemIndex:last_committed_item_index]); + [session_controller setPreviousItemIndex:storage.previousItemIndex]; [session_controller setSessionCertificatePolicyManager:storage .sessionCertificatePolicyManager];
diff --git a/ios/web/net/crw_ssl_status_updater_unittest.mm b/ios/web/net/crw_ssl_status_updater_unittest.mm index 329a0d6..964dbe4 100644 --- a/ios/web/net/crw_ssl_status_updater_unittest.mm +++ b/ios/web/net/crw_ssl_status_updater_unittest.mm
@@ -107,7 +107,7 @@ base::scoped_nsobject<CRWSessionController> session_controller( [[CRWSessionController alloc] initWithBrowserState:GetBrowserState() navigationItems:std::move(nav_items) - currentIndex:0]); + lastCommittedItemIndex:0]); [session_controller addPendingItem:GURL(item_url_spec) referrer:Referrer()
diff --git a/ios/web/public/crw_session_storage.h b/ios/web/public/crw_session_storage.h index 34d55dd2..a28a007 100644 --- a/ios/web/public/crw_session_storage.h +++ b/ios/web/public/crw_session_storage.h
@@ -19,8 +19,8 @@ @interface CRWSessionStorage : NSObject<NSCoding> @property(nonatomic, assign) BOOL hasOpener; -@property(nonatomic, assign) NSInteger currentNavigationIndex; -@property(nonatomic, assign) NSInteger previousNavigationIndex; +@property(nonatomic, assign) NSInteger lastCommittedItemIndex; +@property(nonatomic, assign) NSInteger previousItemIndex; @property(nonatomic, copy) NSArray* itemStorages; @property(nonatomic, retain) CRWSessionCertificatePolicyManager* sessionCertificatePolicyManager;
diff --git a/ios/web/public/crw_session_storage.mm b/ios/web/public/crw_session_storage.mm index bd92956..3a0c974 100644 --- a/ios/web/public/crw_session_storage.mm +++ b/ios/web/public/crw_session_storage.mm
@@ -14,10 +14,10 @@ namespace { // Serialization keys used in NSCoding functions. NSString* const kCertificatePolicyManagerKey = @"certificatePolicyManager"; -NSString* const kCurrentNavigationIndexKey = @"currentNavigationIndex"; +NSString* const klastCommittedItemIndexKey = @"lastCommittedItemIndex"; NSString* const kItemStoragesKey = @"entries"; NSString* const kHasOpenerKey = @"openedByDOM"; -NSString* const kPreviousNavigationIndexKey = @"previousNavigationIndex"; +NSString* const kPreviousItemIndexKey = @"previousItemIndex"; } @interface CRWSessionStorage () { @@ -30,8 +30,8 @@ @implementation CRWSessionStorage @synthesize hasOpener = _hasOpener; -@synthesize currentNavigationIndex = _currentNavigationIndex; -@synthesize previousNavigationIndex = _previousNavigationIndex; +@synthesize lastCommittedItemIndex = _lastCommittedItemIndex; +@synthesize previousItemIndex = _previousItemIndex; @synthesize itemStorages = _itemStorages; @synthesize sessionCertificatePolicyManager = _sessionCertificatePolicyManager; @@ -52,15 +52,14 @@ self = [super init]; if (self) { _hasOpener = [decoder decodeBoolForKey:kHasOpenerKey]; - _currentNavigationIndex = - [decoder decodeIntForKey:kCurrentNavigationIndexKey]; - _previousNavigationIndex = - [decoder decodeIntForKey:kPreviousNavigationIndexKey]; + _lastCommittedItemIndex = + [decoder decodeIntForKey:klastCommittedItemIndexKey]; + _previousItemIndex = [decoder decodeIntForKey:kPreviousItemIndexKey]; _itemStorages = [[NSMutableArray alloc] initWithArray:[decoder decodeObjectForKey:kItemStoragesKey]]; // Prior to M34, 0 was used as "no index" instead of -1; adjust for that. if (!_itemStorages.count) - _currentNavigationIndex = -1; + _lastCommittedItemIndex = -1; _sessionCertificatePolicyManager = [decoder decodeObjectForKey:kCertificatePolicyManagerKey]; if (!_sessionCertificatePolicyManager) { @@ -75,10 +74,9 @@ - (void)encodeWithCoder:(NSCoder*)coder { [coder encodeBool:self.hasOpener forKey:kHasOpenerKey]; - [coder encodeInt:self.currentNavigationIndex - forKey:kCurrentNavigationIndexKey]; - [coder encodeInt:self.previousNavigationIndex - forKey:kPreviousNavigationIndexKey]; + [coder encodeInt:self.lastCommittedItemIndex + forKey:klastCommittedItemIndexKey]; + [coder encodeInt:self.previousItemIndex forKey:kPreviousItemIndexKey]; [coder encodeObject:self.itemStorages forKey:kItemStoragesKey]; [coder encodeObject:self.sessionCertificatePolicyManager forKey:kCertificatePolicyManagerKey];
diff --git a/ios/web/public/navigation_manager.h b/ios/web/public/navigation_manager.h index 2fd5e061..75b1201 100644 --- a/ios/web/public/navigation_manager.h +++ b/ios/web/public/navigation_manager.h
@@ -120,10 +120,6 @@ // Returns the committed NavigationItem at |index|. virtual NavigationItem* GetItemAtIndex(size_t index) const = 0; - // Returns the index from which web would go back/forward or reload. - // TODO(crbug.com/533848): Update to return size_t. - virtual int GetCurrentItemIndex() const = 0; - // Returns the index of the last committed item or -1 if the last // committed item correspond to a new navigation. // TODO(crbug.com/533848): Update to return size_t.
diff --git a/ios/web/public/test/fakes/test_navigation_manager.h b/ios/web/public/test/fakes/test_navigation_manager.h index 53a7ef0a..4f8be46c 100644 --- a/ios/web/public/test/fakes/test_navigation_manager.h +++ b/ios/web/public/test/fakes/test_navigation_manager.h
@@ -31,7 +31,6 @@ BrowserURLRewriter::URLRewriter rewriter) override; int GetItemCount() const override; NavigationItem* GetItemAtIndex(size_t index) const override; - int GetCurrentItemIndex() const override; int GetPendingItemIndex() const override; int GetLastCommittedItemIndex() const override; bool RemoveItemAtIndex(int index) override; @@ -63,9 +62,9 @@ // GetItemAtIndex(), and GetCurrentItemIndex(). void AddItem(const GURL& url, ui::PageTransition transition); - // Sets the index to be returned by GetCurrentItemIndex(). |index| must be - // either -1 or between 0 and GetItemCount()-1, inclusively. - void SetCurrentItemIndex(const int index); + // Sets the index to be returned by GetLastCommittedItemIndex(). |index| must + // be either -1 or between 0 and GetItemCount()-1, inclusively. + void SetLastCommittedItemIndex(const int index); private: // A list of items constructed by calling AddItem().
diff --git a/ios/web/public/test/fakes/test_navigation_manager.mm b/ios/web/public/test/fakes/test_navigation_manager.mm index 49cbc3b..1c95c4e 100644 --- a/ios/web/public/test/fakes/test_navigation_manager.mm +++ b/ios/web/public/test/fakes/test_navigation_manager.mm
@@ -79,18 +79,13 @@ return items_[index].get(); } -int TestNavigationManager::GetCurrentItemIndex() const { - return items_index_; -} - -void TestNavigationManager::SetCurrentItemIndex(const int index) { +void TestNavigationManager::SetLastCommittedItemIndex(const int index) { DCHECK(index == -1 || index >= 0 && index < GetItemCount()); items_index_ = index; } int TestNavigationManager::GetLastCommittedItemIndex() const { - NOTREACHED(); - return 0; + return items_index_; } int TestNavigationManager::GetPendingItemIndex() const { @@ -171,7 +166,7 @@ items_.push_back(web::NavigationItem::Create()); items_.back()->SetTransitionType(transition); items_.back()->SetURL(url); - SetCurrentItemIndex(GetItemCount() - 1); + SetLastCommittedItemIndex(GetItemCount() - 1); } } // namespace web
diff --git a/ios/web/public/test/web_view_interaction_test_util.mm b/ios/web/public/test/web_view_interaction_test_util.mm index da4e786..9e629c5 100644 --- a/ios/web/public/test/web_view_interaction_test_util.mm +++ b/ios/web/public/test/web_view_interaction_test_util.mm
@@ -142,11 +142,15 @@ element_id.c_str(), js_action]; __block bool did_complete = false; __block bool element_found = false; - [web_controller executeUserJavaScript:script - completionHandler:^(id result, NSError*) { - did_complete = true; - element_found = [result boolValue]; - }]; + + // |executeUserJavaScript:completionHandler:| is no-op for app-specific URLs, + // so simulate a user gesture by calling TouchTracking method. + [web_controller touched:YES]; + [web_controller executeJavaScript:script + completionHandler:^(id result, NSError*) { + did_complete = true; + element_found = [result boolValue]; + }]; testing::WaitUntilConditionOrTimeout(testing::kWaitForJSCompletionTimeout, ^{ return did_complete;
diff --git a/ios/web/public/web_client.h b/ios/web/public/web_client.h index 5c59fd22..feeac03 100644 --- a/ios/web/public/web_client.h +++ b/ios/web/public/web_client.h
@@ -108,6 +108,9 @@ // Gives the embedder a chance to provide the JavaScript to be injected into // the web view as early as possible. Result must not be nil. + // + // TODO(crbug.com/703964): Change the return value to NSArray<NSString*> to + // improve performance. virtual NSString* GetEarlyPageScript(BrowserState* browser_state) const; // Informs the embedder that a certificate error has occurred. If
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 4452fed2..bcc7afb 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -2296,6 +2296,22 @@ - (void)executeUserJavaScript:(NSString*)script completionHandler:(web::JavaScriptResultBlock)completion { + // For security reasons, executing JavaScript on pages with app-specific URLs + // is not allowed, because those pages may have elevated privileges. + GURL lastCommittedURL = self.webState->GetLastCommittedURL(); + if (web::GetWebClient()->IsAppSpecificURL(lastCommittedURL)) { + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + base::scoped_nsobject<NSError> error([[NSError alloc] + initWithDomain:web::kJSEvaluationErrorDomain + code:web::JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW + userInfo:nil]); + completion(nil, error); + }); + } + return; + } + [self setUserInteractionRegistered:YES]; [self executeJavaScript:script completionHandler:completion]; } @@ -3006,14 +3022,14 @@ BOOL isNavigationTypeLinkActivated = action.navigationType == WKNavigationTypeLinkActivated; - // Check if the link navigation leads to a launch of an external app. + // Checks if the link navigation leads to a launch of an external app. + // TODO(crbug.com/704417): External apps will not be launched from clicking + // a Bookmarked URL or a Recently Closed URL. // TODO(crbug.com/607780): Revise the logic of allowing external app launch // and move it to externalAppLauncher. BOOL isOpenInNewTabNavigation = !(self.navigationManagerImpl->GetItemCount()); BOOL isPossibleLinkClick = [self isLinkNavigation:action.navigationType]; - if (isPossibleLinkClick || isOpenInNewTabNavigation || - PageTransitionCoreTypeIs(self.currentTransition, - ui::PAGE_TRANSITION_AUTO_BOOKMARK)) { + if (isPossibleLinkClick || isOpenInNewTabNavigation) { web::NavigationItem* item = self.currentNavItem; const GURL currentNavigationURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); @@ -3382,6 +3398,13 @@ } - (BOOL)userClickedRecently { + // Scrolling generates a pair of touch on/off event which causes + // _lastUserInteraction to register that there was user interaction. + // Checks for scrolling first to override time-based click heuristics. + BOOL scrolling = [[self webScrollView] isDragging] || + [[self webScrollView] isDecelerating]; + if (scrolling) + return NO; if (!_lastUserInteraction) return NO; return _clickInProgress ||
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index e0b987a..ff3099e6 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -33,6 +33,7 @@ #import "ios/web/test/web_test_with_web_controller.h" #import "ios/web/test/wk_web_view_crash_utils.h" #import "ios/web/web_state/ui/crw_web_controller_container_view.h" +#import "ios/web/web_state/ui/web_view_js_utils.h" #import "ios/web/web_state/web_state_impl.h" #import "ios/web/web_state/wk_web_view_security_util.h" #import "net/base/mac/url_conversions.h" @@ -874,6 +875,68 @@ EXPECT_GE(observer.title_change_count(), 2); }; +// Test fixture for JavaScript execution. +class ScriptExecutionTest : public web::WebTestWithWebController { + protected: + // Calls |executeUserJavaScript:completionHandler:|, waits for script + // execution completion, and synchronously returns the result. + id ExecuteUserJavaScript(NSString* java_script, NSError** error) { + __block id script_result = nil; + __block NSError* script_error = nil; + __block bool script_executed = false; + [web_controller() + executeUserJavaScript:java_script + completionHandler:^(id local_result, NSError* local_error) { + script_result = [local_result retain]; + script_error = [local_error retain]; + script_executed = true; + }]; + + WaitForCondition(^{ + return script_executed; + }); + + if (error) { + *error = script_error; + } + [script_error autorelease]; + return [script_result autorelease]; + } +}; + +// Tests evaluating user script on an http page. +TEST_F(ScriptExecutionTest, UserScriptOnHttpPage) { + LoadHtml(@"<html></html>", GURL(kTestURLString)); + NSError* error = nil; + EXPECT_NSEQ(@0, ExecuteUserJavaScript(@"window.w = 0;", &error)); + EXPECT_FALSE(error); + + EXPECT_NSEQ(@0, ExecuteJavaScript(@"window.w")); +}; + +// Tests evaluating user script on app-specific page. Pages with app-specific +// URLs have elevated privileges and JavaScript execution should not be allowed +// for them. +TEST_F(ScriptExecutionTest, UserScriptOnAppSpecificPage) { + LoadHtml(@"<html></html>", GURL(kTestURLString)); + + // Change last committed URL to app-specific URL. + web::NavigationManagerImpl& nav_manager = + [web_controller() webStateImpl]->GetNavigationManagerImpl(); + nav_manager.AddPendingItem(GURL(kTestAppSpecificURL), web::Referrer(), + ui::PAGE_TRANSITION_TYPED, + web::NavigationInitiationType::USER_INITIATED); + [nav_manager.GetSessionController() commitPendingItem]; + + NSError* error = nil; + EXPECT_FALSE(ExecuteUserJavaScript(@"window.w = 0;", &error)); + ASSERT_TRUE(error); + EXPECT_NSEQ(web::kJSEvaluationErrorDomain, error.domain); + EXPECT_EQ(web::JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW, error.code); + + EXPECT_FALSE(ExecuteJavaScript(@"window.w")); +}; + // Fixture class to test WKWebView crashes. class CRWWebControllerWebProcessTest : public web::WebTestWithWebController { protected:
diff --git a/ios/web/web_state/ui/web_view_js_utils.h b/ios/web/web_state/ui/web_view_js_utils.h index 39c5d8e6..a165ccb2 100644 --- a/ios/web/web_state/ui/web_view_js_utils.h +++ b/ios/web/web_state/ui/web_view_js_utils.h
@@ -27,7 +27,9 @@ // The type of errors that can occur while evaluating JS. enum JSEvaluationErrorCode { // No web view present to evaluate JS. - JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW = 1, + JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW = -1000, + // JS evaluation is not allowed for security reasons. + JS_EVALUATION_ERROR_CODE_REJECTED = -1001, }; // Converts result of WKWebView script evaluation to base::Value.
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn index 41b7387..9fe80afe 100644 --- a/ios/web_view/BUILD.gn +++ b/ios/web_view/BUILD.gn
@@ -30,6 +30,8 @@ "public/cwv_navigation_delegate.h", "public/cwv_translate_delegate.h", "public/cwv_ui_delegate.h", + "public/cwv_user_content_controller.h", + "public/cwv_user_script.h", "public/cwv_web_view.h", "public/cwv_web_view_configuration.h", ]
diff --git a/ios/web_view/internal/BUILD.gn b/ios/web_view/internal/BUILD.gn index 444aeda..7cb91be 100644 --- a/ios/web_view/internal/BUILD.gn +++ b/ios/web_view/internal/BUILD.gn
@@ -14,6 +14,9 @@ "cwv_html_element_internal.h", "cwv_navigation_action.mm", "cwv_navigation_action_internal.h", + "cwv_user_content_controller.mm", + "cwv_user_content_controller_internal.h", + "cwv_user_script.mm", "cwv_web_view.mm", "cwv_web_view_configuration.mm", "cwv_web_view_configuration_internal.h", @@ -21,6 +24,8 @@ "pref_names.h", "web_view_browser_state.h", "web_view_browser_state.mm", + "web_view_early_page_script_provider.h", + "web_view_early_page_script_provider.mm", "web_view_java_script_dialog_presenter.h", "web_view_java_script_dialog_presenter.mm", "web_view_network_delegate.cc",
diff --git a/ios/web_view/internal/cwv_user_content_controller.mm b/ios/web_view/internal/cwv_user_content_controller.mm new file mode 100644 index 0000000..edb92bf --- /dev/null +++ b/ios/web_view/internal/cwv_user_content_controller.mm
@@ -0,0 +1,62 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web_view/public/cwv_user_content_controller.h" +#import "ios/web_view/internal/cwv_user_content_controller_internal.h" + +#import "ios/web_view/internal/cwv_web_view_configuration_internal.h" +#include "ios/web_view/internal/web_view_browser_state.h" +#import "ios/web_view/internal/web_view_early_page_script_provider.h" +#import "ios/web_view/public/cwv_user_script.h" + +@interface CWVUserContentController () +@property(weak, nonatomic) CWVWebViewConfiguration* configuration; +@end + +@implementation CWVUserContentController { + NSMutableArray<CWVUserScript*>* _userScripts; +} + +@synthesize configuration = _configuration; + +- (nonnull instancetype)initWithConfiguration: + (nonnull __weak CWVWebViewConfiguration*)configuration { + self = [super init]; + if (self) { + _configuration = configuration; + _userScripts = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)addUserScript:(nonnull CWVUserScript*)userScript { + [_userScripts addObject:userScript]; + [self updateEarlyPageScript]; +} + +- (void)removeAllUserScripts { + [_userScripts removeAllObjects]; + [self updateEarlyPageScript]; +} + +- (nonnull NSArray<CWVUserScript*>*)userScripts { + return _userScripts; +} + +// Updates the early page script associated with the BrowserState with the +// content of _userScripts. +- (void)updateEarlyPageScript { + NSMutableString* joinedScript = [[NSMutableString alloc] init]; + for (CWVUserScript* script in _userScripts) { + [joinedScript appendString:script.source]; + // Inserts "\n" between scripts to make it safer to join multiple scripts, + // in case the first script doesn't end with ";" or "\n". + [joinedScript appendString:@"\n"]; + } + ios_web_view::WebViewEarlyPageScriptProvider::FromBrowserState( + _configuration.browserState) + .SetScript(joinedScript); +} + +@end
diff --git a/ios/web_view/internal/cwv_user_content_controller_internal.h b/ios/web_view/internal/cwv_user_content_controller_internal.h new file mode 100644 index 0000000..90122f8 --- /dev/null +++ b/ios/web_view/internal/cwv_user_content_controller_internal.h
@@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_INTERNAL_CWV_USER_CONTENT_CONTROLLER_INTERNAL_H_ +#define IOS_WEB_VIEW_INTERNAL_CWV_USER_CONTENT_CONTROLLER_INTERNAL_H_ + +#import "ios/web_view/public/cwv_user_content_controller.h" + +@class CWVWebViewConfiguration; + +@interface CWVUserContentController () + +- (nonnull instancetype)initWithConfiguration: + (nonnull __weak CWVWebViewConfiguration*)configuration; + +@end + +#endif // IOS_WEB_VIEW_INTERNAL_CWV_USER_CONTENT_CONTROLLER_INTERNAL_H_
diff --git a/ios/web_view/internal/cwv_user_script.mm b/ios/web_view/internal/cwv_user_script.mm new file mode 100644 index 0000000..12ff4ed --- /dev/null +++ b/ios/web_view/internal/cwv_user_script.mm
@@ -0,0 +1,23 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web_view/public/cwv_user_script.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation CWVUserScript + +@synthesize source = _source; + +- (nonnull instancetype)initWithSource:(nonnull NSString*)source { + self = [super init]; + if (self) { + _source = [source copy]; + } + return self; +} + +@end
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm index 6729797b..08fb4d8d 100644 --- a/ios/web_view/internal/cwv_web_view.mm +++ b/ios/web_view/internal/cwv_web_view.mm
@@ -54,6 +54,7 @@ @implementation CWVWebView +@synthesize configuration = _configuration; @synthesize navigationDelegate = _navigationDelegate; @synthesize translationDelegate = _translationDelegate; @synthesize estimatedProgress = _estimatedProgress;
diff --git a/ios/web_view/internal/cwv_web_view_configuration.mm b/ios/web_view/internal/cwv_web_view_configuration.mm index f29c002..d8916d7 100644 --- a/ios/web_view/internal/cwv_web_view_configuration.mm +++ b/ios/web_view/internal/cwv_web_view_configuration.mm
@@ -5,6 +5,7 @@ #import "ios/web_view/public/cwv_web_view_configuration.h" #import "ios/web_view/internal/cwv_web_view_configuration_internal.h" +#import "ios/web_view/internal/cwv_user_content_controller_internal.h" #import "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/internal/web_view_web_client.h" @@ -23,6 +24,8 @@ ios_web_view::WebViewBrowserState* _browserState; } +@synthesize userContentController = _userContentController; + + (instancetype)defaultConfiguration { static dispatch_once_t once; static CWVWebViewConfiguration* configuration; @@ -51,6 +54,8 @@ self = [super init]; if (self) { _browserState = browserState; + _userContentController = + [[CWVUserContentController alloc] initWithConfiguration:self]; } return self; }
diff --git a/ios/web_view/internal/web_view_early_page_script_provider.h b/ios/web_view/internal/web_view_early_page_script_provider.h new file mode 100644 index 0000000..272ad84 --- /dev/null +++ b/ios/web_view/internal/web_view_early_page_script_provider.h
@@ -0,0 +1,49 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_INTERNAL_WEB_VIEW_EARLY_PAGE_SCRIPT_PROVIDER_H_ +#define IOS_WEB_VIEW_INTERNAL_WEB_VIEW_EARLY_PAGE_SCRIPT_PROVIDER_H_ + +#include <Foundation/Foundation.h> + +#include "base/mac/scoped_nsobject.h" +#include "base/macros.h" +#include "base/supports_user_data.h" + +namespace web { +class BrowserState; +} + +namespace ios_web_view { + +// A provider class associated with a single web::BrowserState object. Keeps +// an early page script, a JavaScript injected into all pages as early as +// possible. +// +// Not threadsafe. Must be used only on the main thread. +class WebViewEarlyPageScriptProvider : public base::SupportsUserData::Data { + public: + ~WebViewEarlyPageScriptProvider() override; + + // Returns a provider for the given |browser_state|. Lazily attaches one if it + // does not exist. |browser_state| can not be null. + static WebViewEarlyPageScriptProvider& FromBrowserState( + web::BrowserState* _Nonnull browser_state); + + // Getter and Setter for the JavaScript source code. + NSString* _Nonnull GetScript() { return script_.get(); } + void SetScript(NSString* _Nonnull script); + + private: + WebViewEarlyPageScriptProvider(); + + // The JavaScript source code. + base::scoped_nsobject<NSString> script_; + + DISALLOW_COPY_AND_ASSIGN(WebViewEarlyPageScriptProvider); +}; + +} // namespace ios_web_view + +#endif // IOS_WEB_VIEW_INTERNAL_WEB_VIEW_EARLY_PAGE_SCRIPT_PROVIDER_H_
diff --git a/ios/web_view/internal/web_view_early_page_script_provider.mm b/ios/web_view/internal/web_view_early_page_script_provider.mm new file mode 100644 index 0000000..89d94c14 --- /dev/null +++ b/ios/web_view/internal/web_view_early_page_script_provider.mm
@@ -0,0 +1,49 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web_view/internal/web_view_early_page_script_provider.h" + +#import <Foundation/Foundation.h> + +#include "ios/web/public/browser_state.h" +#include "ios/web/public/web_thread.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace ios_web_view { + +namespace { +// A key used to associate a WebViewEarlyPageScriptProvider with a BrowserState. +const char kWebViewEarlyPageScriptProviderKeyName[] = + "web_view_early_page_script_provider"; + +} // namespace + +// static +WebViewEarlyPageScriptProvider& +WebViewEarlyPageScriptProvider::FromBrowserState( + web::BrowserState* _Nonnull browser_state) { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + DCHECK(browser_state); + if (!browser_state->GetUserData(kWebViewEarlyPageScriptProviderKeyName)) { + browser_state->SetUserData(kWebViewEarlyPageScriptProviderKeyName, + std::unique_ptr<WebViewEarlyPageScriptProvider>( + new WebViewEarlyPageScriptProvider())); + } + return *(static_cast<WebViewEarlyPageScriptProvider*>( + browser_state->GetUserData(kWebViewEarlyPageScriptProviderKeyName))); +} + +WebViewEarlyPageScriptProvider::~WebViewEarlyPageScriptProvider() = default; + +void WebViewEarlyPageScriptProvider::SetScript(NSString* _Nonnull script) { + script_.reset([script copy]); +} + +WebViewEarlyPageScriptProvider::WebViewEarlyPageScriptProvider() + : script_([[NSString alloc] init]) {} + +} // namespace ios_web_view
diff --git a/ios/web_view/internal/web_view_web_client.h b/ios/web_view/internal/web_view_web_client.h index e4e303c..c352d4b 100644 --- a/ios/web_view/internal/web_view_web_client.h +++ b/ios/web_view/internal/web_view_web_client.h
@@ -25,6 +25,7 @@ web::WebMainParts* CreateWebMainParts() override; std::string GetProduct() const override; std::string GetUserAgent(web::UserAgentType type) const override; + NSString* GetEarlyPageScript(web::BrowserState* browser_state) const override; // Normal browser state associated with the receiver. WebViewBrowserState* browser_state() const;
diff --git a/ios/web_view/internal/web_view_web_client.mm b/ios/web_view/internal/web_view_web_client.mm index 06f0494..56aed9bf 100644 --- a/ios/web_view/internal/web_view_web_client.mm +++ b/ios/web_view/internal/web_view_web_client.mm
@@ -7,6 +7,7 @@ #include "base/strings/sys_string_conversions.h" #include "ios/web/public/user_agent.h" #include "ios/web_view/internal/web_view_browser_state.h" +#import "ios/web_view/internal/web_view_early_page_script_provider.h" #import "ios/web_view/internal/web_view_web_main_parts.h" #import "ios/web_view/public/cwv_delegate.h" @@ -42,4 +43,10 @@ return web::BuildUserAgentFromProduct(GetProduct()); } +NSString* WebViewWebClient::GetEarlyPageScript( + web::BrowserState* browser_state) const { + return WebViewEarlyPageScriptProvider::FromBrowserState(browser_state) + .GetScript(); +} + } // namespace ios_web_view
diff --git a/ios/web_view/public/BUILD.gn b/ios/web_view/public/BUILD.gn index c444db9..1ee60d3 100644 --- a/ios/web_view/public/BUILD.gn +++ b/ios/web_view/public/BUILD.gn
@@ -17,6 +17,8 @@ "cwv_navigation_delegate.h", "cwv_translate_delegate.h", "cwv_ui_delegate.h", + "cwv_user_content_controller.h", + "cwv_user_script.h", "cwv_web_view.h", "cwv_web_view_configuration.h", ]
diff --git a/ios/web_view/public/cwv_user_content_controller.h b/ios/web_view/public/cwv_user_content_controller.h new file mode 100644 index 0000000..8a733fe --- /dev/null +++ b/ios/web_view/public/cwv_user_content_controller.h
@@ -0,0 +1,30 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_PUBLIC_CWV_USER_CONTENT_CONTROLLER_H_ +#define IOS_WEB_VIEW_PUBLIC_CWV_USER_CONTENT_CONTROLLER_H_ + +#import <Foundation/Foundation.h> + +@class CWVUserScript; + +// Allows injecting custom scripts into CWVWebView created with the +// configuration. +@interface CWVUserContentController : NSObject + +// The user scripts associated with the configuration. +@property(nonatomic, copy, readonly, nonnull) + NSArray<CWVUserScript*>* userScripts; + +- (nonnull instancetype)init NS_UNAVAILABLE; + +// Adds a user script. +- (void)addUserScript:(nonnull CWVUserScript*)userScript; + +// Removes all associated user scripts. +- (void)removeAllUserScripts; + +@end + +#endif // IOS_WEB_VIEW_PUBLIC_CWV_USER_CONTENT_CONTROLLER_H_
diff --git a/ios/web_view/public/cwv_user_script.h b/ios/web_view/public/cwv_user_script.h new file mode 100644 index 0000000..1de588cf --- /dev/null +++ b/ios/web_view/public/cwv_user_script.h
@@ -0,0 +1,24 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_VIEW_PUBLIC_CWV_USER_SCRIPT_H_ +#define IOS_WEB_VIEW_PUBLIC_CWV_USER_SCRIPT_H_ + +#import <Foundation/Foundation.h> + +// User Script to be injected into main frame of CWVWebView after +// window.document is created, but before other content is loaded (i.e., at the +// same timing as WKUserScriptInjectionTimeAtDocumentStart). +@interface CWVUserScript : NSObject + +// JavaScript source code. +@property(nonatomic, copy, readonly, nonnull) NSString* source; + +- (nonnull instancetype)init NS_UNAVAILABLE; + +- (nonnull instancetype)initWithSource:(nonnull NSString*)source; + +@end + +#endif // IOS_WEB_VIEW_PUBLIC_CWV_USER_SCRIPT_H_
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h index ee43194..f5d7b4c 100644 --- a/ios/web_view/public/cwv_web_view.h +++ b/ios/web_view/public/cwv_web_view.h
@@ -20,6 +20,9 @@ // Concrete instances can be created through CWV. @interface CWVWebView : UIView +// The configuration of the web view. +@property(nonatomic, readonly, copy) CWVWebViewConfiguration* configuration; + // This web view's navigation delegate. @property(nonatomic, weak) id<CWVNavigationDelegate> navigationDelegate;
diff --git a/ios/web_view/public/cwv_web_view_configuration.h b/ios/web_view/public/cwv_web_view_configuration.h index a2a7489..6be74da 100644 --- a/ios/web_view/public/cwv_web_view_configuration.h +++ b/ios/web_view/public/cwv_web_view_configuration.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +@class CWVUserContentController; @class CWVWebsiteDataStore; // Configuration used for creation of a CWVWebView. @@ -20,9 +21,13 @@ - (instancetype)init NS_UNAVAILABLE; +// The user content controller to associate with web views created using this +// configuration. +@property(nonatomic, readonly) CWVUserContentController* userContentController; + // YES if it is a configuration with persistent data store which stores all data // on disk. -@property(readonly, getter=isPersistent) BOOL persistent; +@property(nonatomic, readonly, getter=isPersistent) BOOL persistent; @end
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc index 456adf7..498aa1f 100644 --- a/media/audio/audio_manager_base.cc +++ b/media/audio/audio_manager_base.cc
@@ -29,11 +29,11 @@ // Default maximum number of output streams that can be open simultaneously // for all platforms. -const int kDefaultMaxOutputStreams = 32; +const int kDefaultMaxOutputStreams = 16; // Default maximum number of input streams that can be open simultaneously // for all platforms. -const int kDefaultMaxInputStreams = 32; +const int kDefaultMaxInputStreams = 16; const int kMaxInputChannels = 3;
diff --git a/media/base/hdr_metadata.h b/media/base/hdr_metadata.h index 1daee4a3..2808e173 100644 --- a/media/base/hdr_metadata.h +++ b/media/base/hdr_metadata.h
@@ -6,7 +6,6 @@ #define MEDIA_BASE_HDR_METADATA_H_ #include "media/base/media_export.h" -#include "ui/gfx/color_space.h" namespace media {
diff --git a/media/base/ipc/BUILD.gn b/media/base/ipc/BUILD.gn index d665e2b..c1112cb 100644 --- a/media/base/ipc/BUILD.gn +++ b/media/base/ipc/BUILD.gn
@@ -11,6 +11,7 @@ public_deps = [ "//ipc", + "//ui/gfx/ipc/color", ] deps = [ "//base",
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h index 70766ac9..52f5ed49 100644 --- a/media/base/ipc/media_param_traits_macros.h +++ b/media/base/ipc/media_param_traits_macros.h
@@ -22,7 +22,9 @@ #include "media/base/sample_format.h" #include "media/base/subsample_entry.h" #include "media/base/video_codecs.h" +#include "media/base/video_color_space.h" #include "media/base/video_types.h" +#include "ui/gfx/ipc/color/gfx_param_traits_macros.h" // Enum traits. @@ -86,6 +88,24 @@ IPC_ENUM_TRAITS_MAX_VALUE(media::VideoPixelFormat, media::PIXEL_FORMAT_MAX) +IPC_ENUM_TRAITS_VALIDATE( + media::VideoColorSpace::PrimaryID, + static_cast<int>(value) == + static_cast<int>( + media::VideoColorSpace::GetPrimaryID(static_cast<int>(value)))); + +IPC_ENUM_TRAITS_VALIDATE( + media::VideoColorSpace::TransferID, + static_cast<int>(value) == + static_cast<int>( + media::VideoColorSpace::GetTransferID(static_cast<int>(value)))); + +IPC_ENUM_TRAITS_VALIDATE( + media::VideoColorSpace::MatrixID, + static_cast<int>(value) == + static_cast<int>( + media::VideoColorSpace::GetMatrixID(static_cast<int>(value)))); + // Struct traits. IPC_STRUCT_TRAITS_BEGIN(media::CdmKeyInformation) @@ -99,4 +119,11 @@ IPC_STRUCT_TRAITS_MEMBER(cypher_bytes) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(media::VideoColorSpace) + IPC_STRUCT_TRAITS_MEMBER(primaries) + IPC_STRUCT_TRAITS_MEMBER(transfer) + IPC_STRUCT_TRAITS_MEMBER(matrix) + IPC_STRUCT_TRAITS_MEMBER(range) +IPC_STRUCT_TRAITS_END() + #endif // MEDIA_BASE_IPC_MEDIA_PARAM_TRAITS_MACROS_H_
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc index f0e45d46..d2ff7a1 100644 --- a/media/base/mime_util_internal.cc +++ b/media/base/mime_util_internal.cc
@@ -581,7 +581,7 @@ // Most codec strings do not yet specify color. We choose 709 as default color // space elsewhere, so defaulting to 709 here as well. See here for context: // https://crrev.com/1221903003/ - *out_color_space = VideoColorSpace::BT709(); + *out_color_space = VideoColorSpace::REC709(); std::map<std::string, Codec>::const_iterator itr = GetStringToCodecMap().find(codec_id); @@ -650,7 +650,7 @@ SupportsType result = IsCodecSupported( mime_type_lower_case, codec, VIDEO_CODEC_PROFILE_UNKNOWN, - 0 /* video_level */, VideoColorSpace::BT709(), is_encrypted); + 0 /* video_level */, VideoColorSpace::REC709(), is_encrypted); // Platform support should never be ambiguous for simple codecs (no range of // profiles to consider).
diff --git a/media/base/video_codecs.cc b/media/base/video_codecs.cc index 5e0cf5c..4d1cdc4 100644 --- a/media/base/video_codecs.cc +++ b/media/base/video_codecs.cc
@@ -100,7 +100,7 @@ uint8_t* level_idc, VideoColorSpace* color_space) { // Initialize optional fields to their defaults. - *color_space = VideoColorSpace::BT709(); + *color_space = VideoColorSpace::REC709(); std::vector<std::string> fields = base::SplitString( codec_id, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
diff --git a/media/base/video_color_space.cc b/media/base/video_color_space.cc index 0501ec4e..036cd57 100644 --- a/media/base/video_color_space.cc +++ b/media/base/video_color_space.cc
@@ -43,6 +43,16 @@ matrix(GetMatrixID(matrix)), range(range) {} +bool VideoColorSpace::operator==(const VideoColorSpace& other) const { + return primaries == other.primaries && transfer == other.transfer && + matrix == other.matrix && range == other.range; +} + +bool VideoColorSpace::operator!=(const VideoColorSpace& other) const { + return primaries != other.primaries || transfer != other.transfer || + matrix != other.matrix || range != other.range; +} + gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { // TODO(hubbe): Make this type-safe. return gfx::ColorSpace::CreateVideo(static_cast<int>(primaries), @@ -50,9 +60,20 @@ static_cast<int>(matrix), range); } -VideoColorSpace VideoColorSpace::BT709() { +VideoColorSpace VideoColorSpace::REC709() { return VideoColorSpace(PrimaryID::BT709, TransferID::BT709, MatrixID::BT709, gfx::ColorSpace::RangeID::LIMITED); } +VideoColorSpace VideoColorSpace::REC601() { + return VideoColorSpace(PrimaryID::SMPTE170M, TransferID::SMPTE170M, + MatrixID::SMPTE170M, + gfx::ColorSpace::RangeID::LIMITED); +} +VideoColorSpace VideoColorSpace::JPEG() { + // TODO(ccameron): Determine which primaries and transfer function were + // intended here. + return VideoColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, + MatrixID::SMPTE170M, gfx::ColorSpace::RangeID::FULL); +} } // namespace
diff --git a/media/base/video_color_space.h b/media/base/video_color_space.h index c8a6a0c..59ec578e 100644 --- a/media/base/video_color_space.h +++ b/media/base/video_color_space.h
@@ -80,13 +80,18 @@ MatrixID matrix, gfx::ColorSpace::RangeID range); + bool operator==(const VideoColorSpace& other) const; + bool operator!=(const VideoColorSpace& other) const; + // These will return INVALID if the number you give it // is not a valid enum value. static PrimaryID GetPrimaryID(int primary); static TransferID GetTransferID(int transfer); static MatrixID GetMatrixID(int matrix); - static VideoColorSpace BT709(); + static VideoColorSpace REC709(); + static VideoColorSpace REC601(); + static VideoColorSpace JPEG(); gfx::ColorSpace ToGfxColorSpace() const;
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc index 5db22234..9599ff1 100644 --- a/media/base/video_decoder_config.cc +++ b/media/base/video_decoder_config.cc
@@ -75,11 +75,11 @@ VideoDecoderConfig::~VideoDecoderConfig() {} void VideoDecoderConfig::set_color_space_info( - const gfx::ColorSpace& color_space_info) { + const VideoColorSpace& color_space_info) { color_space_info_ = color_space_info; } -gfx::ColorSpace VideoDecoderConfig::color_space_info() const { +VideoColorSpace VideoDecoderConfig::color_space_info() const { return color_space_info_; } @@ -112,13 +112,13 @@ switch (color_space) { case ColorSpace::COLOR_SPACE_JPEG: - color_space_info_ = gfx::ColorSpace::CreateJpeg(); + color_space_info_ = VideoColorSpace::JPEG(); break; case ColorSpace::COLOR_SPACE_HD_REC709: - color_space_info_ = gfx::ColorSpace::CreateREC709(); + color_space_info_ = VideoColorSpace::REC709(); break; case ColorSpace::COLOR_SPACE_SD_REC601: - color_space_info_ = gfx::ColorSpace::CreateREC601(); + color_space_info_ = VideoColorSpace::REC601(); break; case ColorSpace::COLOR_SPACE_UNSPECIFIED: default:
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h index 3ed8d4c..ae406fbe 100644 --- a/media/base/video_decoder_config.h +++ b/media/base/video_decoder_config.h
@@ -16,8 +16,8 @@ #include "media/base/hdr_metadata.h" #include "media/base/media_export.h" #include "media/base/video_codecs.h" +#include "media/base/video_color_space.h" #include "media/base/video_types.h" -#include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -113,8 +113,8 @@ return encryption_scheme_; } - void set_color_space_info(const gfx::ColorSpace& color_space_info); - gfx::ColorSpace color_space_info() const; + void set_color_space_info(const VideoColorSpace& color_space_info); + VideoColorSpace color_space_info() const; void set_hdr_metadata(const HDRMetadata& hdr_metadata); base::Optional<HDRMetadata> hdr_metadata() const; @@ -144,7 +144,7 @@ EncryptionScheme encryption_scheme_; - gfx::ColorSpace color_space_info_; + VideoColorSpace color_space_info_; base::Optional<HDRMetadata> hdr_metadata_; // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
diff --git a/media/capture/video/linux/video_capture_device_chromeos.cc b/media/capture/video/linux/video_capture_device_chromeos.cc index 7003990a..3ba9f50 100644 --- a/media/capture/video/linux/video_capture_device_chromeos.cc +++ b/media/capture/video/linux/video_capture_device_chromeos.cc
@@ -110,16 +110,20 @@ device_descriptor.model_id)), camera_orientation_( GetCameraConfig()->GetOrientation(device_descriptor.device_id, - device_descriptor.model_id)) {} + device_descriptor.model_id)), + // External cameras have lens_facing as MEDIA_VIDEO_FACING_NONE. + // We don't want to rotate the frame even if the device rotates. + rotates_with_device_(lens_facing_ != + VideoFacingMode::MEDIA_VIDEO_FACING_NONE) {} VideoCaptureDeviceChromeOS::~VideoCaptureDeviceChromeOS() { screen_observer_delegate_->RemoveObserver(); } void VideoCaptureDeviceChromeOS::SetRotation(int rotation) { - // We assume external camera is facing the users. If not, the users can - // rotate the camera manually by themselves. - if (lens_facing_ == VideoFacingMode::MEDIA_VIDEO_FACING_ENVIRONMENT) { + if (!rotates_with_device_) { + rotation = 0; + } else if (lens_facing_ == VideoFacingMode::MEDIA_VIDEO_FACING_ENVIRONMENT) { // Original frame when |rotation| = 0 // ----------------------- // | * | @@ -153,7 +157,8 @@ // Therefore, for back camera, we need to rotate (360 - |rotation|). rotation = (360 - rotation) % 360; } - // Take into account camera orientation w.r.t. the display. + // Take into account camera orientation w.r.t. the display. External cameras + // would have camera_orientation_ as 0. rotation = (rotation + camera_orientation_) % 360; VideoCaptureDeviceLinux::SetRotation(rotation); }
diff --git a/media/capture/video/linux/video_capture_device_chromeos.h b/media/capture/video/linux/video_capture_device_chromeos.h index f15decf..8ede937 100644 --- a/media/capture/video/linux/video_capture_device_chromeos.h +++ b/media/capture/video/linux/video_capture_device_chromeos.h
@@ -35,6 +35,8 @@ scoped_refptr<ScreenObserverDelegate> screen_observer_delegate_; const VideoFacingMode lens_facing_; const int camera_orientation_; + // Whether the incoming frames should rotate when the device rotates. + const bool rotates_with_device_; DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceChromeOS); };
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn index 43b3db1..24369cd 100644 --- a/media/cast/BUILD.gn +++ b/media/cast/BUILD.gn
@@ -80,6 +80,7 @@ "net/pacing/paced_sender.cc", "net/pacing/paced_sender.h", "net/rtcp/receiver_rtcp_event_subscriber.cc", + "net/rtcp/receiver_rtcp_event_subscriber.h", "net/rtcp/receiver_rtcp_session.cc", "net/rtcp/receiver_rtcp_session.h", "net/rtcp/rtcp_builder.cc", @@ -310,6 +311,7 @@ "net/rtp/packet_storage_unittest.cc", "net/rtp/receiver_stats_unittest.cc", "net/rtp/rtp_packet_builder.cc", + "net/rtp/rtp_packet_builder.h", "net/rtp/rtp_packetizer_unittest.cc", "net/rtp/rtp_parser_unittest.cc", "net/udp_transport_unittest.cc",
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 4085df6..fc0b7efc 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc
@@ -542,7 +542,7 @@ GetEncryptionScheme(stream)); const AVCodecParameters* codec_parameters = stream->codecpar; - config->set_color_space_info(gfx::ColorSpace::CreateVideo( + config->set_color_space_info(VideoColorSpace( codec_parameters->color_primaries, codec_parameters->color_trc, codec_parameters->color_space, codec_parameters->color_range != AVCOL_RANGE_MPEG
diff --git a/media/filters/h264_parser.cc b/media/filters/h264_parser.cc index b5ebf48..7210bff 100644 --- a/media/filters/h264_parser.cc +++ b/media/filters/h264_parser.cc
@@ -123,14 +123,14 @@ // Based on T-REC-H.264 E.2.1, "VUI parameters semantics", // available from http://www.itu.int/rec/T-REC-H.264. -gfx::ColorSpace H264SPS::GetColorSpace() const { +VideoColorSpace H264SPS::GetColorSpace() const { if (colour_description_present_flag) { - return gfx::ColorSpace::CreateVideo( + return VideoColorSpace( colour_primaries, transfer_characteristics, matrix_coefficients, video_full_range_flag ? gfx::ColorSpace::RangeID::FULL : gfx::ColorSpace::RangeID::LIMITED); } else { - return gfx::ColorSpace(); + return VideoColorSpace(); } }
diff --git a/media/filters/h264_parser.h b/media/filters/h264_parser.h index e45adef..07e6bff5 100644 --- a/media/filters/h264_parser.h +++ b/media/filters/h264_parser.h
@@ -20,8 +20,8 @@ #include "media/base/media_export.h" #include "media/base/ranges.h" #include "media/base/video_codecs.h" +#include "media/base/video_color_space.h" #include "media/filters/h264_bit_reader.h" -#include "ui/gfx/color_space.h" namespace gfx { class Rect; @@ -188,7 +188,7 @@ // the results are in-spec for the given profile or level. base::Optional<gfx::Size> GetCodedSize() const; base::Optional<gfx::Rect> GetVisibleRect() const; - gfx::ColorSpace GetColorSpace() const; + VideoColorSpace GetColorSpace() const; }; struct MEDIA_EXPORT H264PPS {
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc index 9ee8eaa5..5fb9439 100644 --- a/media/filters/vpx_video_decoder.cc +++ b/media/filters/vpx_video_decoder.cc
@@ -598,11 +598,12 @@ ->metadata() ->SetInteger(VideoFrameMetadata::COLOR_SPACE, color_space); - if (config_.color_space_info() != gfx::ColorSpace()) { + if (config_.color_space_info() != VideoColorSpace()) { // config_.color_space_info() comes from the color tag which is // more expressive than the bitstream, so prefer it over the // bitstream data below. - (*video_frame)->set_color_space(config_.color_space_info()); + (*video_frame) + ->set_color_space(config_.color_space_info().ToGfxColorSpace()); } else { gfx::ColorSpace::PrimaryID primaries = gfx::ColorSpace::PrimaryID::INVALID; gfx::ColorSpace::TransferID transfer = gfx::ColorSpace::TransferID::INVALID;
diff --git a/media/formats/webm/webm_colour_parser.cc b/media/formats/webm/webm_colour_parser.cc index 5e62ff9..7e3c217 100644 --- a/media/formats/webm/webm_colour_parser.cc +++ b/media/formats/webm/webm_colour_parser.cc
@@ -428,7 +428,7 @@ range_id = gfx::ColorSpace::RangeID::DERIVED; break; } - color_metadata.color_space = gfx::ColorSpace::CreateVideo( + color_metadata.color_space = VideoColorSpace( primaries_, transfer_characteristics_, matrix_coefficients_, range_id); if (max_cll_ != -1)
diff --git a/media/formats/webm/webm_colour_parser.h b/media/formats/webm/webm_colour_parser.h index dd7b0334..8304e65f 100644 --- a/media/formats/webm/webm_colour_parser.h +++ b/media/formats/webm/webm_colour_parser.h
@@ -7,6 +7,7 @@ #include "base/macros.h" #include "media/base/hdr_metadata.h" +#include "media/base/video_color_space.h" #include "media/formats/webm/webm_parser.h" namespace media { @@ -22,7 +23,7 @@ unsigned ChromaSitingHorz = 0; unsigned ChromaSitingVert = 0; - gfx::ColorSpace color_space; + VideoColorSpace color_space; HDRMetadata hdr_metadata;
diff --git a/media/formats/webm/webm_stream_parser_unittest.cc b/media/formats/webm/webm_stream_parser_unittest.cc index e19e91f..d7ef3b7 100644 --- a/media/formats/webm/webm_stream_parser_unittest.cc +++ b/media/formats/webm/webm_stream_parser_unittest.cc
@@ -169,9 +169,9 @@ const VideoDecoderConfig& video_config = media_tracks_->getVideoConfig(video_track->bytestream_track_id()); - gfx::ColorSpace expected_color_space(gfx::ColorSpace::PrimaryID::SMPTEST428_1, - gfx::ColorSpace::TransferID::LOG, - gfx::ColorSpace::MatrixID::RGB, + VideoColorSpace expected_color_space(VideoColorSpace::PrimaryID::SMPTEST428_1, + VideoColorSpace::TransferID::LOG, + VideoColorSpace::MatrixID::RGB, gfx::ColorSpace::RangeID::FULL); EXPECT_EQ(video_config.color_space_info(), expected_color_space);
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index 491032a33..9a5a5778 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -336,6 +336,7 @@ deps += [ "//third_party/angle:includes", "//third_party/libyuv", + "//ui/display", ] libs += [ "d3d9.lib",
diff --git a/media/gpu/DEPS b/media/gpu/DEPS index 6ce29b6..d96abca 100644 --- a/media/gpu/DEPS +++ b/media/gpu/DEPS
@@ -7,6 +7,7 @@ "+third_party/webrtc/common_video", "+third_party/webrtc/system_wrappers", "+ui/base", + "+ui/display/display_switches.h", "+ui/display/manager/chromeos", "+ui/display/types", "+ui/platform_window",
diff --git a/media/gpu/dxva_video_decode_accelerator_win.cc b/media/gpu/dxva_video_decode_accelerator_win.cc index e854874..f54ec1c 100644 --- a/media/gpu/dxva_video_decode_accelerator_win.cc +++ b/media/gpu/dxva_video_decode_accelerator_win.cc
@@ -50,7 +50,7 @@ #include "media/video/video_decode_accelerator.h" #include "third_party/angle/include/EGL/egl.h" #include "third_party/angle/include/EGL/eglext.h" -#include "ui/base/ui_base_switches.h" +#include "ui/display/display_switches.h" #include "ui/gfx/color_space_win.h" #include "ui/gl/gl_angle_util_win.h" #include "ui/gl/gl_bindings.h" @@ -451,14 +451,14 @@ return true; } -gfx::ColorSpace H264ConfigChangeDetector::current_color_space() const { +VideoColorSpace H264ConfigChangeDetector::current_color_space() const { if (!parser_) - return gfx::ColorSpace(); + return VideoColorSpace(); // TODO(hubbe): Is using last_sps_id_ correct here? const H264SPS* sps = parser_->GetSPS(last_sps_id_); if (sps) return sps->GetColorSpace(); - return gfx::ColorSpace(); + return VideoColorSpace(); } DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( @@ -2174,10 +2174,10 @@ // Attempt to retrieve an output frame from the decoder. If we have one, // return and proceed when the output frame is processed. If we don't have a // frame then we are done. - gfx::ColorSpace color_space = config_change_detector_->current_color_space(); - if (!color_space.IsValid()) + VideoColorSpace color_space = config_change_detector_->current_color_space(); + if (color_space == VideoColorSpace()) color_space = config_.color_space; - DoDecode(color_space); + DoDecode(color_space.ToGfxColorSpace()); if (OutputSamplesPresent()) return; @@ -2226,8 +2226,8 @@ return; } - gfx::ColorSpace color_space = config_change_detector_->current_color_space(); - if (!color_space.IsValid()) + VideoColorSpace color_space = config_change_detector_->current_color_space(); + if (color_space == VideoColorSpace()) color_space = config_.color_space; if (!inputs_before_decode_) { @@ -2249,7 +2249,7 @@ // process the input again. Failure in either of these steps is treated as a // decoder failure. if (hr == MF_E_NOTACCEPTING) { - DoDecode(color_space); + DoDecode(color_space.ToGfxColorSpace()); // If the DoDecode call resulted in an output frame then we should not // process any more input until that frame is copied to the target surface. if (!OutputSamplesPresent()) { @@ -2281,7 +2281,7 @@ RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to process input sample", PLATFORM_FAILURE, ); - DoDecode(color_space); + DoDecode(color_space.ToGfxColorSpace()); State state = GetState(); RETURN_AND_NOTIFY_ON_FAILURE(
diff --git a/media/gpu/dxva_video_decode_accelerator_win.h b/media/gpu/dxva_video_decode_accelerator_win.h index 9637845..6f45519 100644 --- a/media/gpu/dxva_video_decode_accelerator_win.h +++ b/media/gpu/dxva_video_decode_accelerator_win.h
@@ -32,6 +32,7 @@ #include "base/threading/thread.h" #include "base/win/scoped_comptr.h" #include "gpu/command_buffer/service/gpu_preferences.h" +#include "media/base/video_color_space.h" #include "media/filters/h264_parser.h" #include "media/gpu/gpu_video_decode_accelerator_helpers.h" #include "media/gpu/media_gpu_export.h" @@ -73,7 +74,7 @@ bool DetectConfig(const uint8_t* stream, unsigned int size); bool config_changed() const { return config_changed_; } - gfx::ColorSpace current_color_space() const; + VideoColorSpace current_color_space() const; private: // These fields are used to track the SPS/PPS in the H.264 bitstream and
diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h index 97af30bb..dea6157 100644 --- a/media/video/video_decode_accelerator.h +++ b/media/video/video_decode_accelerator.h
@@ -171,7 +171,7 @@ std::vector<uint8_t> pps; // Color space specified by the container. - gfx::ColorSpace color_space; + VideoColorSpace color_space; }; // Interface for collaborating with picture interface to provide memory for
diff --git a/mojo/edk/system/ports/BUILD.gn b/mojo/edk/system/ports/BUILD.gn index 37b2548..5c82761 100644 --- a/mojo/edk/system/ports/BUILD.gn +++ b/mojo/edk/system/ports/BUILD.gn
@@ -21,6 +21,7 @@ "port.cc", "port.h", "port_ref.cc", + "port_ref.h", "user_data.h", ]
diff --git a/net/BUILD.gn b/net/BUILD.gn index b346113..fa46b7d 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -135,10 +135,12 @@ "base/network_interfaces.cc", "base/network_interfaces.h", "base/network_interfaces_posix.cc", + "base/network_interfaces_posix.h", "base/parse_number.cc", "base/parse_number.h", "base/port_util.cc", "base/port_util.h", + "base/privacy_mode.h", "base/rand_callback.h", "base/registry_controlled_domains/registry_controlled_domain.cc", "base/registry_controlled_domains/registry_controlled_domain.h", @@ -156,6 +158,7 @@ "cert/cert_database_openssl.cc", "cert/cert_status_flags.cc", "cert/cert_status_flags.h", + "cert/cert_status_flags_list.h", "cert/cert_verifier.cc", "cert/cert_verifier.h", "cert/cert_verify_result.cc", @@ -178,8 +181,6 @@ "cert/internal/cert_error_id.h", "cert/internal/cert_error_params.cc", "cert/internal/cert_error_params.h", - "cert/internal/cert_error_scoper.cc", - "cert/internal/cert_error_scoper.h", "cert/internal/cert_errors.cc", "cert/internal/cert_errors.h", "cert/internal/cert_issuer_source.h", @@ -275,6 +276,7 @@ "http/http_response_info.h", "http/http_security_headers.cc", "http/http_security_headers.h", + "http/http_status_code_list", "http/http_util.cc", "http/http_util.h", "http/http_vary_data.cc", @@ -288,9 +290,12 @@ "log/net_log_capture_mode.h", "log/net_log_entry.cc", "log/net_log_entry.h", + "log/net_log_event_type.h", "log/net_log_event_type_list.h", + "log/net_log_parameters_callback.h", "log/net_log_source.cc", "log/net_log_source.h", + "log/net_log_source_type.h", "log/net_log_source_type_list.h", "log/net_log_with_source.cc", "log/net_log_with_source.h", @@ -457,6 +462,7 @@ "base/network_interfaces_linux.cc", "base/network_interfaces_mac.cc", "base/network_interfaces_win.cc", + "base/network_interfaces_win.h", "base/network_throttle_manager.h", "base/network_throttle_manager_impl.cc", "base/network_throttle_manager_impl.h", @@ -580,6 +586,7 @@ "cert/x509_cert_types_mac.cc", "cert/x509_cert_types_win.cc", "cert/x509_certificate_ios.cc", + "cert/x509_certificate_known_roots_win.h", "cert/x509_certificate_mac.cc", "cert/x509_certificate_nss.cc", "cert/x509_certificate_win.cc", @@ -1567,7 +1574,9 @@ "ssl/ssl_key_logger.h", "ssl/ssl_platform_key.h", "ssl/ssl_platform_key_android.cc", + "ssl/ssl_platform_key_android.h", "ssl/ssl_platform_key_mac.cc", + "ssl/ssl_platform_key_mac.h", "ssl/ssl_platform_key_nss.cc", "ssl/ssl_platform_key_util.cc", "ssl/ssl_platform_key_util.h", @@ -1961,6 +1970,7 @@ "websockets/websocket_deflater.h", "websockets/websocket_errors.cc", "websockets/websocket_errors.h", + "websockets/websocket_event_interface.h", "websockets/websocket_extension.cc", "websockets/websocket_extension.h", "websockets/websocket_extension_parser.cc", @@ -2014,7 +2024,10 @@ # Brotli support. if (!disable_brotli_filter) { - sources += [ "filter/brotli_source_stream.cc" ] + sources += [ + "filter/brotli_source_stream.cc", + "filter/brotli_source_stream.h", + ] deps += [ "//third_party/brotli:dec" ] } else { sources += [ "filter/brotli_source_stream_disabled.cc" ] @@ -2382,6 +2395,7 @@ "test/embedded_test_server/default_handlers.h", "test/embedded_test_server/embedded_test_server.cc", "test/embedded_test_server/embedded_test_server.h", + "test/embedded_test_server/embedded_test_server_connection_listener.h", "test/embedded_test_server/http_connection.cc", "test/embedded_test_server/http_connection.h", "test/embedded_test_server/http_request.cc", @@ -2657,6 +2671,7 @@ testonly = true sources = [ "tools/gdig/file_net_log.cc", + "tools/gdig/file_net_log.h", "tools/gdig/gdig.cc", ] deps = [
diff --git a/net/base/network_throttle_manager.cc b/net/base/network_throttle_manager.cc deleted file mode 100644 index e416ed0..0000000 --- a/net/base/network_throttle_manager.cc +++ /dev/null
@@ -1,144 +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 "net/base/network_throttle_manager.h" - -#include "base/logging.h" -#include "net/base/priority_queue.h" - -namespace net { - -namespace { - -class NetworkThrottleManagerImpl : public NetworkThrottleManager { - public: - class ThrottleImpl : public NetworkThrottleManager::Throttle { - public: - using QueuePointer = PriorityQueue<ThrottleImpl*>::Pointer; - - // Caller must arrange that |*delegate| and |*throttler| outlive - // the ThrottleImpl class. - ThrottleImpl(bool throttled, - RequestPriority priority, - ThrottleDelegate* delegate, - NetworkThrottleManagerImpl* throttler); - - ~ThrottleImpl() override; - - // Throttle - bool IsThrottled() const override; - void SetPriority(RequestPriority priority) override; - - QueuePointer queue_pointer() const { return queue_pointer_; } - void set_queue_pointer(const QueuePointer& pointer) { - queue_pointer_ = pointer; - } - - // Note that this call calls the delegate, and hence - // may result in re-entrant calls into the throttler or - // ThrottleImpl. The throttler should not rely on - // any state other than its own existence being persistent - // across this call. - void NotifyUnthrottled(); - - private: - bool throttled_; - ThrottleDelegate* const delegate_; - PriorityQueue<ThrottleImpl*>::Pointer queue_pointer_; - - NetworkThrottleManagerImpl* const throttler_; - - DISALLOW_COPY_AND_ASSIGN(ThrottleImpl); - }; - - NetworkThrottleManagerImpl(); - ~NetworkThrottleManagerImpl() override; - - std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate, - RequestPriority priority, - bool ignore_limits) override; - - private: - void OnStreamPriorityChanged(ThrottleImpl* throttle, - RequestPriority new_priority); - void OnStreamDestroyed(ThrottleImpl* throttle); - - PriorityQueue<ThrottleImpl*> priority_queue_; - - DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManagerImpl); -}; - -// Currently this is a null implementation that does no throttling; -// all entries are created in the unthrottled state, and no throttle state -// change notifications are transmitted. - -NetworkThrottleManagerImpl::ThrottleImpl::ThrottleImpl( - bool throttled, - RequestPriority priority, - NetworkThrottleManager::ThrottleDelegate* delegate, - NetworkThrottleManagerImpl* throttler) - : throttled_(throttled), delegate_(delegate), throttler_(throttler) { - DCHECK(delegate); -} - -NetworkThrottleManagerImpl::ThrottleImpl::~ThrottleImpl() { - throttler_->OnStreamDestroyed(this); -} - -void NetworkThrottleManagerImpl::ThrottleImpl::SetPriority( - RequestPriority priority) { - throttler_->OnStreamPriorityChanged(this, priority); -} - -bool NetworkThrottleManagerImpl::ThrottleImpl::IsThrottled() const { - return throttled_; -} - -void NetworkThrottleManagerImpl::ThrottleImpl::NotifyUnthrottled() { - // This methods should only be called once, and only if the - // current state is throttled. - DCHECK(throttled_); - throttled_ = false; - delegate_->OnThrottleStateChanged(); -} - -NetworkThrottleManagerImpl::NetworkThrottleManagerImpl() - : priority_queue_(MAXIMUM_PRIORITY + 1) {} - -NetworkThrottleManagerImpl::~NetworkThrottleManagerImpl() {} - -std::unique_ptr<NetworkThrottleManager::Throttle> -NetworkThrottleManagerImpl::CreateThrottle( - NetworkThrottleManager::ThrottleDelegate* delegate, - RequestPriority priority, - bool ignore_limits) { - std::unique_ptr<NetworkThrottleManagerImpl::ThrottleImpl> stream( - new ThrottleImpl(false, priority, delegate, this)); - - stream->set_queue_pointer(priority_queue_.Insert(stream.get(), priority)); - - return std::move(stream); -} - -void NetworkThrottleManagerImpl::OnStreamPriorityChanged( - NetworkThrottleManagerImpl::ThrottleImpl* stream, - RequestPriority new_priority) { - priority_queue_.Erase(stream->queue_pointer()); - stream->set_queue_pointer(priority_queue_.Insert(stream, new_priority)); -} - -void NetworkThrottleManagerImpl::OnStreamDestroyed(ThrottleImpl* stream) { - priority_queue_.Erase(stream->queue_pointer()); -} - -} // namespace - -// static -std::unique_ptr<NetworkThrottleManager> -NetworkThrottleManager::CreateThrottler() { - return std::unique_ptr<NetworkThrottleManager>( - new NetworkThrottleManagerImpl); -} - -} // namespace net
diff --git a/net/base/network_throttle_manager_unittest.cc b/net/base/network_throttle_manager_unittest.cc deleted file mode 100644 index c39a7a8..0000000 --- a/net/base/network_throttle_manager_unittest.cc +++ /dev/null
@@ -1,51 +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 "net/base/network_throttle_manager.h" - -#include <memory> - -#include "net/base/request_priority.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace { - -#include "testing/gtest/include/gtest/gtest.h" - -class NetworkThrottleManagerTest : public testing::Test, - NetworkThrottleManager::ThrottleDelegate { - public: - NetworkThrottleManagerTest() - : throttler_(NetworkThrottleManager::CreateThrottler()) {} - - protected: - std::unique_ptr<NetworkThrottleManager::Throttle> CreateThrottle( - net::RequestPriority priority, - bool expected_throttle_state) { - std::unique_ptr<NetworkThrottleManager::Throttle> throttle( - throttler_->CreateThrottle(this, priority, false)); - EXPECT_EQ(expected_throttle_state, throttle->IsThrottled()); - return throttle; - } - - private: - // NetworkThrottleManager::Delegate - void OnThrottleStateChanged() override { ADD_FAILURE(); } - - std::unique_ptr<NetworkThrottleManager> throttler_; -}; - -// Check to confirm that all created throttles start unthrottled for the -// current null implementation. -TEST_F(NetworkThrottleManagerTest, AllUnthrottled) { - for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { - CreateThrottle(static_cast<RequestPriority>(i), false); - } -} - -} // namespace - -} // namespace net
diff --git a/net/cert/cert_verify_proc_builtin.cc b/net/cert/cert_verify_proc_builtin.cc index 0ac0399..a963f5a 100644 --- a/net/cert/cert_verify_proc_builtin.cc +++ b/net/cert/cert_verify_proc_builtin.cc
@@ -250,25 +250,19 @@ AppendPublicKeyHashes(partial_path.path.trust_anchor->spki(), hashes); } -// Sets the bits on |cert_status| for all the errors encountered during the path -// building of |partial_path|. -void MapPathBuilderErrorsToCertStatus( - const CertPathBuilder::ResultPath& partial_path, - const std::string& hostname, - CertStatus* cert_status) { - // If path building was successful, there are no errors to map (there may have - // been warnings but they do not map to CertStatus). - if (partial_path.valid) +// Sets the bits on |cert_status| for all the errors present in |errors| (the +// errors for a particular path). +void MapPathBuilderErrorsToCertStatus(const CertPathErrors& errors, + CertStatus* cert_status) { + // If there were no errors, nothing to do. + if (!errors.ContainsHighSeverityErrors()) return; - LOG(ERROR) << "CertVerifyProcBuiltin for " << hostname << " failed:\n" - << partial_path.errors.ToDebugString(); - - if (partial_path.errors.ContainsError(kRsaModulusTooSmall)) + if (errors.ContainsError(kRsaModulusTooSmall)) *cert_status |= CERT_STATUS_WEAK_KEY; - if (partial_path.errors.ContainsError(kValidityFailedNotAfter) || - partial_path.errors.ContainsError(kValidityFailedNotBefore)) { + if (errors.ContainsError(kValidityFailedNotAfter) || + errors.ContainsError(kValidityFailedNotBefore)) { *cert_status |= CERT_STATUS_DATE_INVALID; } @@ -328,11 +322,11 @@ CRLSet* crl_set, const CertificateList& additional_trust_anchors, CertVerifyResult* verify_result) { - CertErrors errors; + CertErrors parsing_errors; // Parse the target certificate. - scoped_refptr<ParsedCertificate> target = - ParseCertificateFromOSHandle(input_cert->os_cert_handle(), &errors); + scoped_refptr<ParsedCertificate> target = ParseCertificateFromOSHandle( + input_cert->os_cert_handle(), &parsing_errors); if (!target) { // TODO(crbug.com/634443): Surface these parsing errors? verify_result->cert_status |= CERT_STATUS_INVALID; @@ -400,6 +394,8 @@ verify_result->is_issued_by_additional_trust_anchor = trust_store->IsAdditionalTrustAnchor(partial_path.path.trust_anchor); } else { + // TODO(eroman): This shouldn't be necessary -- partial_path.errors should + // contain an error if it didn't chain to trust anchor. verify_result->cert_status |= CERT_STATUS_AUTHORITY_INVALID; } @@ -407,8 +403,18 @@ CreateVerifiedCertChain(input_cert, partial_path); AppendPublicKeyHashes(partial_path, &verify_result->public_key_hashes); - MapPathBuilderErrorsToCertStatus(partial_path, hostname, + MapPathBuilderErrorsToCertStatus(partial_path.errors, &verify_result->cert_status); + + // TODO(eroman): Is it possible that IsValid() fails but no errors were set in + // partial_path.errors? + CHECK(partial_path.IsValid() || + IsCertStatusError(verify_result->cert_status)); + + if (partial_path.errors.ContainsHighSeverityErrors()) { + LOG(ERROR) << "CertVerifyProcBuiltin for " << hostname << " failed:\n" + << partial_path.errors.ToDebugString(partial_path.path.certs); + } } int CertVerifyProcBuiltin::VerifyInternal(
diff --git a/net/cert/internal/cert_error_scoper.cc b/net/cert/internal/cert_error_scoper.cc deleted file mode 100644 index c970f9a..0000000 --- a/net/cert/internal/cert_error_scoper.cc +++ /dev/null
@@ -1,54 +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 "net/cert/internal/cert_error_scoper.h" - -#include <memory> - -#include "base/logging.h" -#include "base/memory/ptr_util.h" -#include "net/cert/internal/cert_error_params.h" -#include "net/cert/internal/cert_errors.h" - -namespace net { - -CertErrorScoper::CertErrorScoper(CertErrors* parent_errors) { - DCHECK(parent_errors); - parent_errors_ = parent_errors; - parent_scoper_ = parent_errors->SetScoper(this); -} - -CertErrorScoper::~CertErrorScoper() { - CertErrorScoper* prev = parent_errors_->SetScoper(parent_scoper_); - DCHECK_EQ(prev, this); -} - -CertErrorNode* CertErrorScoper::LazyGetRootNode() { - if (!root_node_) { - // Create the node. - auto root_node = BuildRootNode(); - root_node_ = root_node.get(); - - // Attach it to the node hiearchy (ownership of this node is passed off - // to its parent, which is ultimately rooted in the CertErrors object). - if (parent_scoper_) { - parent_scoper_->LazyGetRootNode()->AddChild(std::move(root_node)); - } else { - parent_errors_->nodes_.push_back(std::move(root_node)); - } - } - - return root_node_; -} - -CertErrorScoperNoParams::CertErrorScoperNoParams(CertErrors* parent_errors, - CertErrorId id) - : CertErrorScoper(parent_errors), id_(id) {} - -std::unique_ptr<CertErrorNode> CertErrorScoperNoParams::BuildRootNode() { - return base::MakeUnique<CertErrorNode>(CertErrorNodeType::TYPE_CONTEXT, id_, - nullptr); -} - -} // namespace net
diff --git a/net/cert/internal/cert_error_scoper.h b/net/cert/internal/cert_error_scoper.h deleted file mode 100644 index 1415812..0000000 --- a/net/cert/internal/cert_error_scoper.h +++ /dev/null
@@ -1,59 +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 NET_CERT_INTERNAL_CERT_ERROR_SCOPER_H_ -#define NET_CERT_INTERNAL_CERT_ERROR_SCOPER_H_ - -#include <memory> - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "net/base/net_export.h" -#include "net/cert/internal/cert_error_id.h" - -namespace net { - -class CertErrors; -struct CertErrorNode; - -// CertErrorScoper is a base class for adding parent nodes into a CertErrors -// object. -class NET_EXPORT CertErrorScoper { - public: - explicit CertErrorScoper(CertErrors* parent_errors); - virtual ~CertErrorScoper(); - - // BuildRootNode() will be called at most once, to create the desired parent - // node. It may never be called if no errors are added to the CertErrors - // parent. - virtual std::unique_ptr<CertErrorNode> BuildRootNode() = 0; - - // Returns the parent node for this scoper (the one created by - // BuildRootNode()). - CertErrorNode* LazyGetRootNode(); - - private: - CertErrorScoper* parent_scoper_ = nullptr; - CertErrors* parent_errors_ = nullptr; - CertErrorNode* root_node_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(CertErrorScoper); -}; - -// Implementation of CertErrorScoper that creates a simple parent node with no -// parameters (just an ID). -class NET_EXPORT CertErrorScoperNoParams : public CertErrorScoper { - public: - CertErrorScoperNoParams(CertErrors* parent_errors, CertErrorId id); - std::unique_ptr<CertErrorNode> BuildRootNode() override; - - private: - CertErrorId id_; - - DISALLOW_COPY_AND_ASSIGN(CertErrorScoperNoParams); -}; - -} // namespace net - -#endif // NET_CERT_INTERNAL_CERT_ERROR_SCOPER_H_
diff --git a/net/cert/internal/cert_errors.cc b/net/cert/internal/cert_errors.cc index d58b575f..be4814dc 100644 --- a/net/cert/internal/cert_errors.cc +++ b/net/cert/internal/cert_errors.cc
@@ -7,25 +7,15 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/strings/string_split.h" +#include "base/strings/stringprintf.h" #include "net/cert/internal/cert_error_params.h" -#include "net/cert/internal/cert_error_scoper.h" +#include "net/cert/internal/parse_name.h" +#include "net/cert/internal/parsed_certificate.h" namespace net { namespace { -// Helpers for pretty-printing CertErrors to a string. -void AppendNodeToDebugString(CertErrorNode* node, - const std::string& indentation, - std::string* out); - -void AppendChildrenToDebugString(const CertErrorNodes& children, - const std::string& indentation, - std::string* out) { - for (const auto& child : children) - AppendNodeToDebugString(child.get(), indentation, out); -} - void AppendLinesWithIndentation(const std::string& text, const std::string& indentation, std::string* out) { @@ -39,78 +29,54 @@ } } -const char* CertErrorNodeTypeToString(CertErrorNodeType type) { - switch (type) { - case CertErrorNodeType::TYPE_CONTEXT: - return "[Context] "; - case CertErrorNodeType::TYPE_WARNING: - return "[Warning] "; - case CertErrorNodeType::TYPE_ERROR: - return "[Error] "; - } - return nullptr; -} - -void AppendNodeToDebugString(CertErrorNode* node, - const std::string& indentation, - std::string* out) { - std::string cur_indentation = indentation; - - *out += cur_indentation; - *out += CertErrorNodeTypeToString(node->node_type); - *out += CertErrorIdToDebugString(node->id); - *out += +"\n"; - - if (node->params) { - cur_indentation += " "; - AppendLinesWithIndentation(node->params->ToDebugString(), cur_indentation, - out); - } - - cur_indentation += " "; - - AppendChildrenToDebugString(node->children, cur_indentation, out); -} - -// Returns true if |children| contains the error |id| anywhere within it or its -// children recursively. -bool NodesContainError(const CertErrorNodes& children, CertErrorId id) { - for (const auto& child : children) { - if (child->node_type == CertErrorNodeType::TYPE_ERROR && child->id == id) - return true; - if (NodesContainError(child->children, id)) - return true; - } - return false; -} - } // namespace -CertErrorNode::CertErrorNode(CertErrorNodeType node_type, - CertErrorId id, - std::unique_ptr<CertErrorParams> params) - : node_type(node_type), id(id), params(std::move(params)) {} +CertError::CertError() = default; -CertErrorNode::~CertErrorNode() = default; +CertError::CertError(Severity severity, + CertErrorId id, + std::unique_ptr<CertErrorParams> params) + : severity(severity), id(id), params(std::move(params)) {} -void CertErrorNode::AddChild(std::unique_ptr<CertErrorNode> child) { - DCHECK_EQ(CertErrorNodeType::TYPE_CONTEXT, node_type); - children.push_back(std::move(child)); +CertError::CertError(CertError&& other) = default; + +CertError& CertError::operator=(CertError&&) = default; + +CertError::~CertError() = default; + +std::string CertError::ToDebugString() const { + std::string result; + switch (severity) { + case SEVERITY_WARNING: + result += "WARNING: "; + break; + case SEVERITY_HIGH: + result += "ERROR: "; + break; + } + result += CertErrorIdToDebugString(id); + result += +"\n"; + + if (params) + AppendLinesWithIndentation(params->ToDebugString(), " ", &result); + + return result; } CertErrors::CertErrors() = default; - +CertErrors::CertErrors(CertErrors&& other) = default; +CertErrors& CertErrors::operator=(CertErrors&&) = default; CertErrors::~CertErrors() = default; -void CertErrors::Add(CertErrorNodeType node_type, +void CertErrors::Add(CertError::Severity severity, CertErrorId id, std::unique_ptr<CertErrorParams> params) { - AddNode(base::MakeUnique<CertErrorNode>(node_type, id, std::move(params))); + nodes_.push_back(CertError(severity, id, std::move(params))); } void CertErrors::AddError(CertErrorId id, std::unique_ptr<CertErrorParams> params) { - Add(CertErrorNodeType::TYPE_ERROR, id, std::move(params)); + Add(CertError::SEVERITY_HIGH, id, std::move(params)); } void CertErrors::AddError(CertErrorId id) { @@ -119,38 +85,124 @@ void CertErrors::AddWarning(CertErrorId id, std::unique_ptr<CertErrorParams> params) { - Add(CertErrorNodeType::TYPE_WARNING, id, std::move(params)); + Add(CertError::SEVERITY_WARNING, id, std::move(params)); } void CertErrors::AddWarning(CertErrorId id) { AddWarning(id, nullptr); } -bool CertErrors::empty() const { - return nodes_.empty(); -} - std::string CertErrors::ToDebugString() const { std::string result; - AppendChildrenToDebugString(nodes_, std::string(), &result); + for (const CertError& node : nodes_) + result += node.ToDebugString(); + return result; } bool CertErrors::ContainsError(CertErrorId id) const { - return NodesContainError(nodes_, id); + for (const CertError& node : nodes_) { + if (node.id == id) + return true; + } + return false; } -void CertErrors::AddNode(std::unique_ptr<CertErrorNode> node) { - if (current_scoper_) - current_scoper_->LazyGetRootNode()->AddChild(std::move(node)); - else - nodes_.push_back(std::move(node)); +bool CertErrors::ContainsAnyErrorWithSeverity( + CertError::Severity severity) const { + for (const CertError& node : nodes_) { + if (node.severity == severity) + return true; + } + return false; } -CertErrorScoper* CertErrors::SetScoper(CertErrorScoper* scoper) { - CertErrorScoper* prev = current_scoper_; - current_scoper_ = scoper; - return prev; +CertPathErrors::CertPathErrors() = default; + +CertPathErrors::CertPathErrors(CertPathErrors&& other) = default; +CertPathErrors& CertPathErrors::operator=(CertPathErrors&&) = default; + +CertPathErrors::~CertPathErrors() = default; + +CertErrors* CertPathErrors::GetErrorsForCert(size_t cert_index) { + if (cert_index >= cert_errors_.size()) + cert_errors_.resize(cert_index + 1); + return &cert_errors_[cert_index]; +} + +CertErrors* CertPathErrors::GetOtherErrors() { + return &other_errors_; +} + +bool CertPathErrors::ContainsError(CertErrorId id) const { + for (const CertErrors& errors : cert_errors_) { + if (errors.ContainsError(id)) + return true; + } + + if (other_errors_.ContainsError(id)) + return true; + + return false; +} + +bool CertPathErrors::ContainsAnyErrorWithSeverity( + CertError::Severity severity) const { + for (const CertErrors& errors : cert_errors_) { + if (errors.ContainsAnyErrorWithSeverity(severity)) + return true; + } + + if (other_errors_.ContainsAnyErrorWithSeverity(severity)) + return true; + + return false; +} + +std::string CertPathErrors::ToDebugString( + const ParsedCertificateList& certs) const { + std::string result; + + for (size_t i = 0; i < cert_errors_.size(); ++i) { + // Pretty print the current CertErrors. If there were no errors/warnings, + // then continue. + const CertErrors& errors = cert_errors_[i]; + std::string cert_errors_string = errors.ToDebugString(); + if (cert_errors_string.empty()) + continue; + + // Add a header for the CertErrors that describes which certificate they + // apply to. + // + // TODO(eroman): Show the subject for trust anchor (which currently uses the + // bucket cert_errors_[certs.size()]). + std::string cert_name_debug_str; + if (i < certs.size() && certs[i]) { + RDNSequence subject; + if (ParseName(certs[i]->tbs().subject_tlv, &subject) && + ConvertToRFC2253(subject, &cert_name_debug_str)) { + cert_name_debug_str = " (" + cert_name_debug_str + ")"; + } + } + + result += + base::StringPrintf("----- Certificate i=%d%s -----\n", + static_cast<int>(i), cert_name_debug_str.c_str()); + + result += cert_errors_string; + result += "\n"; + } + + // Print any other errors that aren't associated with a particular certificate + // in the chain. + std::string other_errors = other_errors_.ToDebugString(); + if (!other_errors.empty()) { + result += "----- Other errors (not certificate specific) -----\n"; + result += other_errors; + result += "\n"; + } + + return result; } } // namespace net
diff --git a/net/cert/internal/cert_errors.h b/net/cert/internal/cert_errors.h index f359e2e..438417fd 100644 --- a/net/cert/internal/cert_errors.h +++ b/net/cert/internal/cert_errors.h
@@ -6,46 +6,29 @@ // Overview of error design // ---------------------------- // -// Certificate path validation/parsing may emit a sequence of -// errors/warnings/context. These are represented by a tree of CertErrorNodes. -// Each node is comprised of: +// Certificate path building/validation/parsing may emit a sequence of errors +// and warnings. +// +// Each individual error/warning entry (CertError) is comprised of: // // * A unique identifier. // -// This serves similarly to an error code, and is useful for querying if a -// particular error occurred. +// This serves similarly to an error code, and is used to query if a +// particular error/warning occurred. // // * [optional] A parameters object. // -// Nodes may attach a heap-allocated subclass of CertErrorParams, to carry -// extra information that is useful when reporting the error. For instance -// a parsing error may want to describe where in the DER the failure -// happened, or what the unexpected value was. +// Nodes may attach a heap-allocated subclass of CertErrorParams to carry +// extra information that is used when reporting the error. For instance +// a parsing error may describe where in the DER the failure happened, or +// what the unexpected value was. // -// * [optional] Child nodes. +// A collection of errors is represented by the CertErrors object. This may be +// used to group errors that have a common context, such as all the +// errors/warnings that apply to a specific certificate. // -// Error nodes are arranged in a tree. The parent/child hierarchy is used to -// group errors that share some common state. -// For instance during path processing it is useful to group the -// errors/warnings that happened while processing certificate "i" as -// children of a shared "context" node. The context node in this case -// doesn't describe a particular error, but rather some shared event and -// its parameters. -// -// ---------------------------- -// Using errors in other APIs -// ---------------------------- -// -// The top level object used in APIs is CertErrors. A pointer to a CertErrors -// object is typically given as an out-parameter for code that may generate -// errors. -// -// Note that CertErrors gives a non-hiearhical interface for emitting errors. -// In other words, it doesn't let you create parent/child relationships -// directly. -// -// To change the parent node for subsequently emitted errors in the CertErrors -// object, one constructs a CertErrorScoper on the stack. +// Lastly, CertPathErrors composes multiple CertErrors -- one for each +// certificate in the verified chain. // // ---------------------------- // Defining new errors @@ -70,95 +53,110 @@ #include "base/macros.h" #include "net/base/net_export.h" #include "net/cert/internal/cert_error_id.h" +#include "net/cert/internal/parsed_certificate.h" namespace net { class CertErrorParams; -class CertErrorScoper; -// The type of a particular CertErrorNode. -enum class CertErrorNodeType { - // Note the TYPE_ prefix is to avoid compile errors. Because ERROR() is a - // commonly used macro name. +// CertError represents either an error or a warning. +struct NET_EXPORT CertError { + enum Severity { + SEVERITY_HIGH, + SEVERITY_WARNING, + }; - // Node that represents a single error. - TYPE_ERROR, + CertError(); + CertError(Severity severity, + CertErrorId id, + std::unique_ptr<CertErrorParams> params); + CertError(CertError&& other); + CertError& operator=(CertError&&); + ~CertError(); - // Node that represents a single non-fatal error. - TYPE_WARNING, + // Pretty-prints the error and its parameters. + std::string ToDebugString() const; - // Parent node for other errors/warnings. - TYPE_CONTEXT, -}; - -struct CertErrorNode; -using CertErrorNodes = std::vector<std::unique_ptr<CertErrorNode>>; - -// CertErrorNode represents a node in the error tree. This could be an error, -// warning, or simply contextual parent node. See the error design overview for -// a better description of how this is used. -struct NET_EXPORT CertErrorNode { - CertErrorNode(CertErrorNodeType node_type, - CertErrorId id, - std::unique_ptr<CertErrorParams> params); - ~CertErrorNode(); - - void AddChild(std::unique_ptr<CertErrorNode> child); - - CertErrorNodeType node_type; + Severity severity; CertErrorId id; std::unique_ptr<CertErrorParams> params; - CertErrorNodes children; }; -// CertErrors is the main object for emitting errors and internally builds up -// the error tree. +// CertErrors is a collection of CertError, along with convenience methods to +// add and inspect errors. class NET_EXPORT CertErrors { public: CertErrors(); + CertErrors(CertErrors&& other); + CertErrors& operator=(CertErrors&&); ~CertErrors(); - // Adds a node to the current insertion point in the error tree. |params| may - // be null. - void Add(CertErrorNodeType node_type, + // Adds an error/warning. |params| may be null. + void Add(CertError::Severity severity, CertErrorId id, std::unique_ptr<CertErrorParams> params); + // Adds a high severity error. void AddError(CertErrorId id, std::unique_ptr<CertErrorParams> params); void AddError(CertErrorId id); + // Adds a low severity error. void AddWarning(CertErrorId id, std::unique_ptr<CertErrorParams> params); void AddWarning(CertErrorId id); - // Returns true if the tree is empty. Note that emptiness of the error tree - // is NOT equivalent to success for some call, and vice versa. (For instance - // consumers may forget to emit errors on failures, or some errors may be - // non-fatal warnings). - bool empty() const; - // Dumps a textual representation of the errors for debugging purposes. std::string ToDebugString() const; - // Returns true the error |id| was added to this CertErrors (at any depth). + // Returns true if the error |id| was added to this CertErrors (of any + // severity). bool ContainsError(CertErrorId id) const; + // Returns true if this contains any errors of the given severity level. + bool ContainsAnyErrorWithSeverity(CertError::Severity severity) const; + private: - // CertErrorScoper manipulates the CertErrors object. - friend class CertErrorScoper; + std::vector<CertError> nodes_; +}; - void AddNode(std::unique_ptr<CertErrorNode> node); +// CertPathErrors is a collection of CertErrors, to group errors into different +// buckets for different certificates. The "index" should correspond with that +// of the certificate relative to its chain. +class NET_EXPORT CertPathErrors { + public: + CertPathErrors(); + CertPathErrors(CertPathErrors&& other); + CertPathErrors& operator=(CertPathErrors&&); + ~CertPathErrors(); - // Used by CertErrorScoper to register itself as the top-level scoper. - // Returns the previously set scoper, or nullptr if there was none. - CertErrorScoper* SetScoper(CertErrorScoper* scoper); + // Gets a bucket to put errors in for |cert_index|. This will lookup and + // return the existing error bucket if one exists, or create a new one for the + // specified index. It is expected that |cert_index| is the corresponding + // index in a certificate chain (with 0 being the target). + CertErrors* GetErrorsForCert(size_t cert_index); - CertErrorNodes nodes_; + // Returns a bucket to put errors that are not associated with a particular + // certificate. + CertErrors* GetOtherErrors(); - // The top-most CertErrorScoper that is currently in scope (and which affects - // the parent node for newly added errors). - CertErrorScoper* current_scoper_ = nullptr; + // Returns true if CertPathErrors contains the specified error (of any + // severity). + bool ContainsError(CertErrorId id) const; - DISALLOW_COPY_AND_ASSIGN(CertErrors); + // Returns true if this contains any errors of the given severity level. + bool ContainsAnyErrorWithSeverity(CertError::Severity severity) const; + + // Shortcut for ContainsAnyErrorWithSeverity(CertError::SEVERITY_HIGH). + bool ContainsHighSeverityErrors() const { + return ContainsAnyErrorWithSeverity(CertError::SEVERITY_HIGH); + } + + // Pretty-prints all the errors in the CertPathErrors. If there were no + // errors/warnings, returns an empty string. + std::string ToDebugString(const ParsedCertificateList& certs) const; + + private: + std::vector<CertErrors> cert_errors_; + CertErrors other_errors_; }; } // namespace net
diff --git a/net/cert/internal/path_builder.cc b/net/cert/internal/path_builder.cc index bb4283e..71192b9 100644 --- a/net/cert/internal/path_builder.cc +++ b/net/cert/internal/path_builder.cc
@@ -459,6 +459,12 @@ CertPathBuilder::ResultPath::ResultPath() = default; CertPathBuilder::ResultPath::~ResultPath() = default; + +bool CertPathBuilder::ResultPath::IsValid() const { + return !path.certs.empty() && path.trust_anchor && + !errors.ContainsHighSeverityErrors(); +} + CertPathBuilder::Result::Result() = default; CertPathBuilder::Result::~Result() = default; @@ -471,7 +477,7 @@ return nullptr; const ResultPath* result_path = paths[best_result_index].get(); - if (result_path->valid) + if (result_path->IsValid()) return result_path; return nullptr; @@ -539,9 +545,9 @@ VerifyCertificateChain(next_path_.certs, next_path_.trust_anchor.get(), signature_policy_, time_, &result_path->errors); DVLOG(1) << "CertPathBuilder VerifyCertificateChain result = " - << result_path->valid; + << verify_result; result_path->path = next_path_; - result_path->valid = verify_result; + DCHECK_EQ(verify_result, !result_path->errors.ContainsHighSeverityErrors()); AddResultPath(std::move(result_path)); if (verify_result) { @@ -559,7 +565,7 @@ void CertPathBuilder::AddResultPath(std::unique_ptr<ResultPath> result_path) { // TODO(mattm): set best_result_index based on number or severity of errors. - if (result_path->valid) + if (result_path->IsValid()) out_result_->best_result_index = out_result_->paths.size(); // TODO(mattm): add flag to only return a single path or all attempted paths? out_result_->paths.push_back(std::move(result_path));
diff --git a/net/cert/internal/path_builder.h b/net/cert/internal/path_builder.h index f942fd29..d9d32fc 100644 --- a/net/cert/internal/path_builder.h +++ b/net/cert/internal/path_builder.h
@@ -47,7 +47,7 @@ // Resets the path to empty path (same as if default constructed). void Clear(); - // Returns true if the path is empty. + // TODO(eroman): Can we remove this? Unclear on how this relates to validity. bool IsEmpty() const; }; @@ -64,19 +64,17 @@ ResultPath(); ~ResultPath(); + // Returns true if the candidate path is valid, false otherwise. + bool IsValid() const; + // The (possibly partial) certificate path. Consumers must always test - // |valid| before using |path|. When |!valid| path.trust_anchor may be - // nullptr, and the path may be otherwise incomplete/invalid. + // |errors.IsValid()| before using |path|. When invalid, + // |path.trust_anchor| may be null, and the path may be incomplete. CertPath path; - // The errors/warnings from this path. Note that the list of errors is - // independent of whether the path was |valid| (a valid path may - // contain errors/warnings, and vice versa an invalid path may not have - // logged any errors). - CertErrors errors; - - // True if |path| is a correct verified certificate chain. - bool valid = false; + // The errors/warnings from this path. Use |IsValid()| to determine if the + // path is valid. + CertPathErrors errors; }; // Provides the overall result of path building. This includes the paths that
diff --git a/net/cert/internal/path_builder_unittest.cc b/net/cert/internal/path_builder_unittest.cc index be5432b5..ed26c15 100644 --- a/net/cert/internal/path_builder_unittest.cc +++ b/net/cert/internal/path_builder_unittest.cc
@@ -218,7 +218,7 @@ EXPECT_FALSE(result.HasValidPath()); ASSERT_EQ(2U, result.paths.size()); - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path0 = result.paths[0]->path; ASSERT_EQ(2U, path0.certs.size()); EXPECT_EQ(b_by_c_, path0.certs[0]); @@ -511,7 +511,7 @@ // but it will fail since newintermediate is signed by newroot. ASSERT_EQ(2U, result.paths.size()); const auto& path0 = result.paths[0]->path; - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); ASSERT_EQ(2U, path0.certs.size()); EXPECT_EQ(target_, path0.certs[0]); EXPECT_EQ(newintermediate_, path0.certs[1]); @@ -522,7 +522,7 @@ // which will succeed. const auto& path1 = result.paths[1]->path; EXPECT_EQ(1U, result.best_result_index); - EXPECT_TRUE(result.paths[1]->valid); + EXPECT_TRUE(result.paths[1]->IsValid()); ASSERT_EQ(3U, path1.certs.size()); EXPECT_EQ(target_, path1.certs[0]); EXPECT_EQ(newintermediate_, path1.certs[1]); @@ -561,7 +561,7 @@ // either will succeed. ASSERT_EQ(1U, result.paths.size()); const auto& path = result.paths[0]->path; - EXPECT_TRUE(result.paths[0]->valid); + EXPECT_TRUE(result.paths[0]->IsValid()); ASSERT_EQ(2U, path.certs.size()); EXPECT_EQ(target_, path.certs[0]); if (path.certs[1] != newintermediate_) { @@ -627,7 +627,7 @@ { // Path builder may first attempt: target <- oldintermediate <- newroot // but it will fail since oldintermediate is signed by oldroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path = result.paths[0]->path; ASSERT_EQ(2U, path.certs.size()); EXPECT_EQ(target_, path.certs[0]); @@ -639,7 +639,7 @@ // Path builder will next attempt: // target <- old intermediate <- oldroot // which should succeed. - EXPECT_TRUE(result.paths[result.best_result_index]->valid); + EXPECT_TRUE(result.paths[result.best_result_index]->IsValid()); const auto& path = result.paths[result.best_result_index]->path; ASSERT_EQ(2U, path.certs.size()); EXPECT_EQ(target_, path.certs[0]); @@ -677,7 +677,7 @@ // Path builder will first attempt: target <- newintermediate <- oldroot // but it will fail since newintermediate is signed by newroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path0 = result.paths[0]->path; ASSERT_EQ(2U, path0.certs.size()); EXPECT_EQ(target_, path0.certs[0]); @@ -687,7 +687,7 @@ // Path builder will next attempt: // target <- newintermediate <- newroot <- oldroot // but it will fail since newroot is self-signed. - EXPECT_FALSE(result.paths[1]->valid); + EXPECT_FALSE(result.paths[1]->IsValid()); const auto& path1 = result.paths[1]->path; ASSERT_EQ(3U, path1.certs.size()); EXPECT_EQ(target_, path1.certs[0]); @@ -702,7 +702,7 @@ // Finally path builder will use: // target <- newintermediate <- newrootrollover <- oldroot EXPECT_EQ(2U, result.best_result_index); - EXPECT_TRUE(result.paths[2]->valid); + EXPECT_TRUE(result.paths[2]->IsValid()); const auto& path2 = result.paths[2]->path; ASSERT_EQ(3U, path2.certs.size()); EXPECT_EQ(target_, path2.certs[0]); @@ -778,7 +778,7 @@ // Newroot has same name+SPKI as newrootrollover, thus the path is valid and // only contains newroot. - EXPECT_TRUE(best_result->valid); + EXPECT_TRUE(best_result->IsValid()); ASSERT_EQ(1U, best_result->path.certs.size()); EXPECT_EQ(newroot_, best_result->path.certs[0]); EXPECT_EQ(newrootrollover_, best_result->path.trust_anchor->cert()); @@ -828,7 +828,7 @@ // Path builder will first attempt: target <- oldintermediate <- newroot // but it will fail since oldintermediate is signed by oldroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path0 = result.paths[0]->path; ASSERT_EQ(2U, path0.certs.size()); @@ -841,7 +841,7 @@ // Path builder will next attempt: target <- newintermediate <- newroot // which will succeed. EXPECT_EQ(1U, result.best_result_index); - EXPECT_TRUE(result.paths[1]->valid); + EXPECT_TRUE(result.paths[1]->IsValid()); const auto& path1 = result.paths[1]->path; ASSERT_EQ(2U, path1.certs.size()); EXPECT_EQ(target_, path1.certs[0]); @@ -881,7 +881,7 @@ // Path builder attempt: target <- oldintermediate <- newroot // but it will fail since oldintermediate is signed by oldroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path = result.paths[0]->path; ASSERT_EQ(2U, path.certs.size()); EXPECT_EQ(target_, path.certs[0]); @@ -996,7 +996,7 @@ // Path builder first attempts: target <- oldintermediate <- newroot // but it will fail since oldintermediate is signed by oldroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path0 = result.paths[0]->path; ASSERT_EQ(2U, path0.certs.size()); EXPECT_EQ(target_, path0.certs[0]); @@ -1005,7 +1005,7 @@ // After the second batch of async results, path builder will attempt: // target <- newintermediate <- newroot which will succeed. - EXPECT_TRUE(result.paths[1]->valid); + EXPECT_TRUE(result.paths[1]->IsValid()); const auto& path1 = result.paths[1]->path; ASSERT_EQ(2U, path1.certs.size()); EXPECT_EQ(target_, path1.certs[0]); @@ -1082,7 +1082,7 @@ // Path builder first attempts: target <- oldintermediate <- newroot // but it will fail since oldintermediate is signed by oldroot. - EXPECT_FALSE(result.paths[0]->valid); + EXPECT_FALSE(result.paths[0]->IsValid()); const auto& path0 = result.paths[0]->path; ASSERT_EQ(2U, path0.certs.size()); EXPECT_EQ(target_, path0.certs[0]); @@ -1093,7 +1093,7 @@ // After the third batch of async results, path builder will attempt: // target <- newintermediate <- newroot which will succeed. - EXPECT_TRUE(result.paths[1]->valid); + EXPECT_TRUE(result.paths[1]->IsValid()); const auto& path1 = result.paths[1]->path; ASSERT_EQ(2U, path1.certs.size()); EXPECT_EQ(target_, path1.certs[0]);
diff --git a/net/cert/internal/verify_certificate_chain.cc b/net/cert/internal/verify_certificate_chain.cc index 617b851..34d14223 100644 --- a/net/cert/internal/verify_certificate_chain.cc +++ b/net/cert/internal/verify_certificate_chain.cc
@@ -9,7 +9,6 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "net/cert/internal/cert_error_params.h" -#include "net/cert/internal/cert_error_scoper.h" #include "net/cert/internal/cert_errors.h" #include "net/cert/internal/name_constraints.h" #include "net/cert/internal/parse_certificate.h" @@ -57,45 +56,17 @@ "Certificate.signatureAlgorithm is encoded differently " "than TBSCertificate.signature"); -DEFINE_CERT_ERROR_ID(kContextTrustAnchor, "Processing Trust Anchor"); -DEFINE_CERT_ERROR_ID(kContextCertificate, "Processing Certificate"); - -// This class changes the error scope to indicate which certificate in the -// chain is currently being processed. -class CertErrorScoperForCert : public CertErrorScoper { - public: - CertErrorScoperForCert(CertErrors* parent_errors, size_t index) - : CertErrorScoper(parent_errors), index_(index) {} - - std::unique_ptr<CertErrorNode> BuildRootNode() override { - return base::MakeUnique<CertErrorNode>( - CertErrorNodeType::TYPE_CONTEXT, kContextCertificate, - CreateCertErrorParams1SizeT("index", index_)); - } - - private: - size_t index_; - - DISALLOW_COPY_AND_ASSIGN(CertErrorScoperForCert); -}; - -// Returns true if the certificate does not contain any unconsumed _critical_ +// Adds errors to |errors| if the certificate contains unconsumed _critical_ // extensions. -WARN_UNUSED_RESULT bool VerifyNoUnconsumedCriticalExtensions( - const ParsedCertificate& cert, - CertErrors* errors) { - bool has_unconsumed_critical_extensions = false; - +void VerifyNoUnconsumedCriticalExtensions(const ParsedCertificate& cert, + CertErrors* errors) { for (const auto& entry : cert.unparsed_extensions()) { if (entry.second.critical) { - has_unconsumed_critical_extensions = true; errors->AddError(kUnconsumedCriticalExtension, CreateCertErrorParams2Der("oid", entry.second.oid, "value", entry.second.value)); } } - - return !has_unconsumed_critical_extensions; } // Returns true if |cert| was self-issued. The definition of self-issuance @@ -113,30 +84,25 @@ return cert.normalized_subject() == cert.normalized_issuer(); } -// Returns true if |cert| is valid at time |time|. +// Adds errors to |errors| if |cert| is not valid at time |time|. // // The certificate's validity requirements are described by RFC 5280 section // 4.1.2.5: // // The validity period for a certificate is the period of time from // notBefore through notAfter, inclusive. -WARN_UNUSED_RESULT bool VerifyTimeValidity(const ParsedCertificate& cert, - const der::GeneralizedTime time, - CertErrors* errors) { - if (time < cert.tbs().validity_not_before) { +void VerifyTimeValidity(const ParsedCertificate& cert, + const der::GeneralizedTime time, + CertErrors* errors) { + if (time < cert.tbs().validity_not_before) errors->AddError(kValidityFailedNotBefore); - return false; - } - if (cert.tbs().validity_not_after < time) { + if (cert.tbs().validity_not_after < time) errors->AddError(kValidityFailedNotAfter); - return false; - } - - return true; } -// Returns true if |cert| has internally consistent signature algorithms. +// Adds errors to |errors| if |cert| has internally inconsistent signature +// algorithms. // // X.509 certificates contain two different signature algorithms: // (1) The signatureAlgorithm field of Certificate @@ -155,16 +121,15 @@ // In practice however there are certificates which use different encodings for // specifying RSA with SHA1 (different OIDs). This is special-cased for // compatibility sake. -WARN_UNUSED_RESULT bool VerifySignatureAlgorithmsMatch( - const ParsedCertificate& cert, - CertErrors* errors) { +void VerifySignatureAlgorithmsMatch(const ParsedCertificate& cert, + CertErrors* errors) { const der::Input& alg1_tlv = cert.signature_algorithm_tlv(); const der::Input& alg2_tlv = cert.tbs().signature_algorithm_tlv; // Ensure that the two DER-encoded signature algorithms are byte-for-byte // equal. if (alg1_tlv == alg2_tlv) - return true; + return; // But make a compatibility concession if alternate encodings are used // TODO(eroman): Turn this warning into an error. @@ -174,20 +139,18 @@ kSignatureAlgorithmsDifferentEncoding, CreateCertErrorParams2Der("Certificate.algorithm", alg1_tlv, "TBSCertificate.signature", alg2_tlv)); - return true; + return; } errors->AddError( kSignatureAlgorithmMismatch, CreateCertErrorParams2Der("Certificate.algorithm", alg1_tlv, "TBSCertificate.signature", alg2_tlv)); - - return false; } // This function corresponds to RFC 5280 section 6.1.3's "Basic Certificate // Processing" procedure. -WARN_UNUSED_RESULT bool BasicCertificateProcessing( +void BasicCertificateProcessing( const ParsedCertificate& cert, bool is_target_cert, const SignaturePolicy* signature_policy, @@ -199,8 +162,7 @@ // Check that the signature algorithms in Certificate vs TBSCertificate // match. This isn't part of RFC 5280 section 6.1.3, but is mandated by // sections 4.1.1.2 and 4.1.2.3. - if (!VerifySignatureAlgorithmsMatch(cert, errors)) - return false; + VerifySignatureAlgorithmsMatch(cert, errors); // Verify the digital signature using the previous certificate's key (RFC // 5280 section 6.1.3 step a.1). @@ -208,30 +170,25 @@ errors->AddError( kInvalidOrUnsupportedSignatureAlgorithm, CreateCertErrorParams1Der("algorithm", cert.signature_algorithm_tlv())); - return false; - } - - if (!VerifySignedData(cert.signature_algorithm(), cert.tbs_certificate_tlv(), - cert.signature_value(), working_spki, signature_policy, - errors)) { - errors->AddError(kVerifySignedDataFailed); - return false; + } else { + if (!VerifySignedData(cert.signature_algorithm(), + cert.tbs_certificate_tlv(), cert.signature_value(), + working_spki, signature_policy, errors)) { + errors->AddError(kVerifySignedDataFailed); + } } // Check the time range for the certificate's validity, ensuring it is valid // at |time|. // (RFC 5280 section 6.1.3 step a.2) - if (!VerifyTimeValidity(cert, time, errors)) - return false; + VerifyTimeValidity(cert, time, errors); // TODO(eroman): Check revocation (RFC 5280 section 6.1.3 step a.3) // Verify the certificate's issuer name matches the issuing certificate's // subject name. (RFC 5280 section 6.1.3 step a.4) - if (cert.normalized_issuer() != working_normalized_issuer_name) { + if (cert.normalized_issuer() != working_normalized_issuer_name) errors->AddError(kSubjectDoesNotMatchIssuer); - return false; - } // Name constraints (RFC 5280 section 6.1.3 step b & c) // If certificate i is self-issued and it is not the final certificate in the @@ -242,20 +199,17 @@ if (!nc->IsPermittedCert(cert.normalized_subject(), cert.subject_alt_names())) { errors->AddError(kNotPermittedByNameConstraints); - return false; } } } // TODO(eroman): Steps d-f are omitted, as policy constraints are not yet // implemented. - - return true; } // This function corresponds to RFC 5280 section 6.1.4's "Preparation for // Certificate i+1" procedure. |cert| is expected to be an intermediate. -WARN_UNUSED_RESULT bool PrepareForNextCertificate( +void PrepareForNextCertificate( const ParsedCertificate& cert, size_t* max_path_length_ptr, der::Input* working_spki, @@ -301,12 +255,8 @@ // can't contain a BasicConstraints extension. if (!cert.has_basic_constraints()) { errors->AddError(kMissingBasicConstraints); - return false; - } - - if (!cert.basic_constraints().is_ca) { + } else if (!cert.basic_constraints().is_ca) { errors->AddError(kBasicConstraintsIndicatesNotCa); - return false; } // From RFC 5280 section 6.1.4 step l: @@ -317,9 +267,9 @@ if (!IsSelfIssued(cert)) { if (*max_path_length_ptr == 0) { errors->AddError(kMaxPathLengthViolated); - return false; + } else { + --(*max_path_length_ptr); } - --(*max_path_length_ptr); } // From RFC 5280 section 6.1.4 step m: @@ -327,7 +277,7 @@ // If pathLenConstraint is present in the certificate and is // less than max_path_length, set max_path_length to the value // of pathLenConstraint. - if (cert.basic_constraints().has_path_len && + if (cert.has_basic_constraints() && cert.basic_constraints().has_path_len && cert.basic_constraints().path_len < *max_path_length_ptr) { *max_path_length_ptr = cert.basic_constraints().path_len; } @@ -339,7 +289,6 @@ if (cert.has_key_usage() && !cert.key_usage().AssertsBit(KEY_USAGE_BIT_KEY_CERT_SIGN)) { errors->AddError(kKeyCertSignBitNotSet); - return false; } // From RFC 5280 section 6.1.4 step o: @@ -348,15 +297,12 @@ // the certificate. Process any other recognized non-critical // extension present in the certificate that is relevant to path // processing. - if (!VerifyNoUnconsumedCriticalExtensions(cert, errors)) - return false; - - return true; + VerifyNoUnconsumedCriticalExtensions(cert, errors); } // Checks that if the target certificate has properties that only a CA should // have (keyCertSign, CA=true, pathLenConstraint), then its other properties -// are consistent with being a CA. +// are consistent with being a CA. If it does, adds errors to |errors|. // // This follows from some requirements in RFC 5280 section 4.2.1.9. In // particular: @@ -376,9 +322,8 @@ // TODO(eroman): I don't believe Firefox enforces the keyCertSign restriction // for compatibility reasons. Investigate if we need to similarly relax this // constraint. -WARN_UNUSED_RESULT bool VerifyTargetCertHasConsistentCaBits( - const ParsedCertificate& cert, - CertErrors* errors) { +void VerifyTargetCertHasConsistentCaBits(const ParsedCertificate& cert, + CertErrors* errors) { // Check if the certificate contains any property specific to CAs. bool has_ca_property = (cert.has_basic_constraints() && @@ -398,17 +343,12 @@ // TODO(eroman): Add DER for basic constraints and key usage. errors->AddError(kTargetCertInconsistentCaBits); } - - return success; } - - return true; } // This function corresponds with RFC 5280 section 6.1.5's "Wrap-Up Procedure". // It does processing for the final certificate (the target cert). -WARN_UNUSED_RESULT bool WrapUp(const ParsedCertificate& cert, - CertErrors* errors) { +void WrapUp(const ParsedCertificate& cert, CertErrors* errors) { // TODO(crbug.com/634452): Steps a-b are omitted as policy constraints are not // yet implemented. @@ -424,36 +364,29 @@ // // Note that this is duplicated by PrepareForNextCertificate() so as to // directly match the procedures in RFC 5280's section 6.1. - if (!VerifyNoUnconsumedCriticalExtensions(cert, errors)) - return false; + VerifyNoUnconsumedCriticalExtensions(cert, errors); // TODO(eroman): Step g is omitted, as policy constraints are not yet // implemented. // The following check is NOT part of RFC 5280 6.1.5's "Wrap-Up Procedure", // however is implied by RFC 5280 section 4.2.1.9. - if (!VerifyTargetCertHasConsistentCaBits(cert, errors)) - return false; - - return true; + VerifyTargetCertHasConsistentCaBits(cert, errors); } // Initializes the path validation algorithm given anchor constraints. This // follows the description in RFC 5937 -WARN_UNUSED_RESULT bool ProcessTrustAnchorConstraints( +void ProcessTrustAnchorConstraints( const TrustAnchor& trust_anchor, size_t* max_path_length_ptr, std::vector<const NameConstraints*>* name_constraints_list, CertErrors* errors) { - // Set the trust anchor as the current context for any subsequent errors. - CertErrorScoperNoParams error_context(errors, kContextTrustAnchor); - // In RFC 5937 the enforcement of anchor constraints is governed by the input // enforceTrustAnchorConstraints to path validation. In our implementation // this is always on, and enforcement is controlled solely by whether or not // the trust anchor specified constraints. if (!trust_anchor.enforces_constraints()) - return true; + return; // Anchor constraints are encoded via the attached certificate. const ParsedCertificate& cert = *trust_anchor.cert(); @@ -492,29 +425,25 @@ // Extensions may be marked critical or not critical. When trust anchor // constraints are enforced, clients MUST reject certification paths // containing a trust anchor with unrecognized critical extensions. - if (!VerifyNoUnconsumedCriticalExtensions(cert, errors)) - return false; - - return true; + VerifyNoUnconsumedCriticalExtensions(cert, errors); } -} // namespace - // This implementation is structured to mimic the description of certificate // path verification given by RFC 5280 section 6.1. -bool VerifyCertificateChain(const ParsedCertificateList& certs, - const TrustAnchor* trust_anchor, - const SignaturePolicy* signature_policy, - const der::GeneralizedTime& time, - CertErrors* errors) { +void VerifyCertificateChainNoReturnValue( + const ParsedCertificateList& certs, + const TrustAnchor* trust_anchor, + const SignaturePolicy* signature_policy, + const der::GeneralizedTime& time, + CertPathErrors* errors) { DCHECK(trust_anchor); DCHECK(signature_policy); DCHECK(errors); // An empty chain is necessarily invalid. if (certs.empty()) { - errors->AddError(kChainIsEmpty); - return false; + errors->GetOtherErrors()->AddError(kChainIsEmpty); + return; } // Will contain a NameConstraints for each previous cert in the chain which @@ -557,10 +486,13 @@ size_t max_path_length = certs.size(); // Apply any trust anchor constraints per RFC 5937. - if (!ProcessTrustAnchorConstraints(*trust_anchor, &max_path_length, - &name_constraints_list, errors)) { - return false; - } + // + // TODO(eroman): Errors on the trust anchor are put into a certificate bucket + // GetErrorsForCert(certs.size()). This is a bit magical, and + // has some integration issues. + ProcessTrustAnchorConstraints(*trust_anchor, &max_path_length, + &name_constraints_list, + errors->GetErrorsForCert(certs.size())); // Iterate over all the certificates in the reverse direction: starting from // the certificate signed by trust anchor and progressing towards the target @@ -580,28 +512,24 @@ const ParsedCertificate& cert = *certs[index_into_certs]; - // Set the current certificate as the context for any subsequent errors. - CertErrorScoperForCert error_context(errors, i); + // Output errors for the current certificate into an error bucket that is + // associated with that certificate. + CertErrors* cert_errors = errors->GetErrorsForCert(index_into_certs); // Per RFC 5280 section 6.1: // * Do basic processing for each certificate // * If it is the last certificate in the path (target certificate) // - Then run "Wrap up" // - Otherwise run "Prepare for Next cert" - if (!BasicCertificateProcessing( - cert, is_target_cert, signature_policy, time, working_spki, - working_normalized_issuer_name, name_constraints_list, errors)) { - return false; - } + BasicCertificateProcessing(cert, is_target_cert, signature_policy, time, + working_spki, working_normalized_issuer_name, + name_constraints_list, cert_errors); if (!is_target_cert) { - if (!PrepareForNextCertificate(cert, &max_path_length, &working_spki, - &working_normalized_issuer_name, - &name_constraints_list, errors)) { - return false; - } + PrepareForNextCertificate(cert, &max_path_length, &working_spki, + &working_normalized_issuer_name, + &name_constraints_list, cert_errors); } else { - if (!WrapUp(cert, errors)) - return false; + WrapUp(cert, cert_errors); } } @@ -609,8 +537,21 @@ // // A certificate MUST NOT appear more than once in a prospective // certification path. +} - return true; +} // namespace + +bool VerifyCertificateChain(const ParsedCertificateList& certs, + const TrustAnchor* trust_anchor, + const SignaturePolicy* signature_policy, + const der::GeneralizedTime& time, + CertPathErrors* errors) { + // TODO(eroman): This function requires that |errors| is empty upon entry, + // which is not part of the API contract. + DCHECK(!errors->ContainsHighSeverityErrors()); + VerifyCertificateChainNoReturnValue(certs, trust_anchor, signature_policy, + time, errors); + return !errors->ContainsHighSeverityErrors(); } } // namespace net
diff --git a/net/cert/internal/verify_certificate_chain.h b/net/cert/internal/verify_certificate_chain.h index 00d6680..5ebecb5 100644 --- a/net/cert/internal/verify_certificate_chain.h +++ b/net/cert/internal/verify_certificate_chain.h
@@ -61,18 +61,18 @@ // --------- // // Returns true if the target certificate can be verified. +// TODO(eroman): This return value is redundant with the |errors| parameter. // // errors: // Must be non-null. The set of errors/warnings encountered while -// validating the path are appended to this structure. There is no -// guarantee that on success |errors| is empty, or conversely that -// on failure |errors| is non-empty. Consumers must only use the -// boolean return value to determine success/failure. +// validating the path are appended to this structure. If verification +// failed, then there is guaranteed to be at least 1 error written to +// |errors|. NET_EXPORT bool VerifyCertificateChain(const ParsedCertificateList& certs, const TrustAnchor* trust_anchor, const SignaturePolicy* signature_policy, const der::GeneralizedTime& time, - CertErrors* errors) WARN_UNUSED_RESULT; + CertPathErrors* errors); // TODO(crbug.com/634443): Move exported errors to a central location? extern CertErrorId kValidityFailedNotAfter;
diff --git a/net/cert/internal/verify_certificate_chain_pkits_unittest.cc b/net/cert/internal/verify_certificate_chain_pkits_unittest.cc index 52a5ff88..e8279104 100644 --- a/net/cert/internal/verify_certificate_chain_pkits_unittest.cc +++ b/net/cert/internal/verify_certificate_chain_pkits_unittest.cc
@@ -57,14 +57,15 @@ // PKITS lists chains from trust anchor to target, VerifyCertificateChain // takes them starting with the target and not including the trust anchor. std::vector<scoped_refptr<net::ParsedCertificate>> input_chain; - CertErrors errors; + CertErrors parsing_errors; for (auto i = cert_ders.rbegin(); i != cert_ders.rend(); ++i) { if (!net::ParsedCertificate::CreateAndAddToVector( bssl::UniquePtr<CRYPTO_BUFFER>( CRYPTO_BUFFER_new(reinterpret_cast<const uint8_t*>(i->data()), i->size(), nullptr)), - {}, &input_chain, &errors)) { - ADD_FAILURE() << "Cert failed to parse:\n" << errors.ToDebugString(); + {}, &input_chain, &parsing_errors)) { + ADD_FAILURE() << "Cert failed to parse:\n" + << parsing_errors.ToDebugString(); return false; } } @@ -78,13 +79,12 @@ // Run all tests at the time the PKITS was published. der::GeneralizedTime time = {2011, 4, 15, 0, 0, 0}; + CertPathErrors path_errors; bool result = VerifyCertificateChain(input_chain, trust_anchor.get(), - &signature_policy, time, &errors); + &signature_policy, time, &path_errors); // TODO(crbug.com/634443): Test errors on failure? - if (!result) - EXPECT_FALSE(errors.empty()); - + EXPECT_EQ(result, !path_errors.ContainsHighSeverityErrors()); return result; } };
diff --git a/net/cert/internal/verify_certificate_chain_unittest.cc b/net/cert/internal/verify_certificate_chain_unittest.cc index ec5f637..d66f674 100644 --- a/net/cert/internal/verify_certificate_chain_unittest.cc +++ b/net/cert/internal/verify_certificate_chain_unittest.cc
@@ -24,14 +24,13 @@ SimpleSignaturePolicy signature_policy(1024); - CertErrors errors; + CertPathErrors errors; bool result = VerifyCertificateChain(chain, trust_anchor.get(), &signature_policy, time, &errors); EXPECT_EQ(expected_result, result); - EXPECT_EQ(expected_errors, errors.ToDebugString()) << "Test file: " - << test_file_path; - if (!result) - EXPECT_FALSE(errors.empty()); + EXPECT_EQ(expected_errors, errors.ToDebugString(chain)) + << "Test file: " << test_file_path; + EXPECT_EQ(result, !errors.ContainsHighSeverityErrors()); } };
diff --git a/net/data/parse_certificate_unittest/cert_algorithm_not_sequence.pem b/net/data/parse_certificate_unittest/cert_algorithm_not_sequence.pem index a7a66d7c..89631f9 100644 --- a/net/data/parse_certificate_unittest/cert_algorithm_not_sequence.pem +++ b/net/data/parse_certificate_unittest/cert_algorithm_not_sequence.pem
@@ -12,8 +12,8 @@ MAwwAgUAAgIFAAMCAKs= -----END CERTIFICATE----- -[Error] Couldn't read Certificate.signatureAlgorithm as SEQUENCE +ERROR: Couldn't read Certificate.signatureAlgorithm as SEQUENCE -----BEGIN ERRORS----- -W0Vycm9yXSBDb3VsZG4ndCByZWFkIENlcnRpZmljYXRlLnNpZ25hdHVyZUFsZ29yaXRobSBhcyBTRVFVRU5DRQo= +RVJST1I6IENvdWxkbid0IHJlYWQgQ2VydGlmaWNhdGUuc2lnbmF0dXJlQWxnb3JpdGhtIGFzIFNFUVVFTkNFCg== -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/cert_data_after_signature.pem b/net/data/parse_certificate_unittest/cert_data_after_signature.pem index 09f94bee..db0f00d3 100644 --- a/net/data/parse_certificate_unittest/cert_data_after_signature.pem +++ b/net/data/parse_certificate_unittest/cert_data_after_signature.pem
@@ -14,8 +14,8 @@ MA4wAgUAMAIFAAMCAKwFAA== -----END CERTIFICATE----- -[Error] Unconsumed data inside Certificate SEQUENCE +ERROR: Unconsumed data inside Certificate SEQUENCE -----BEGIN ERRORS----- -W0Vycm9yXSBVbmNvbnN1bWVkIGRhdGEgaW5zaWRlIENlcnRpZmljYXRlIFNFUVVFTkNFCg== +RVJST1I6IFVuY29uc3VtZWQgZGF0YSBpbnNpZGUgQ2VydGlmaWNhdGUgU0VRVUVOQ0UK -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/cert_empty_sequence.pem b/net/data/parse_certificate_unittest/cert_empty_sequence.pem index fb7085a..9e084ba 100644 --- a/net/data/parse_certificate_unittest/cert_empty_sequence.pem +++ b/net/data/parse_certificate_unittest/cert_empty_sequence.pem
@@ -8,8 +8,8 @@ MAA= -----END CERTIFICATE----- -[Error] Couldn't read tbsCertificate as SEQUENCE +ERROR: Couldn't read tbsCertificate as SEQUENCE -----BEGIN ERRORS----- -W0Vycm9yXSBDb3VsZG4ndCByZWFkIHRic0NlcnRpZmljYXRlIGFzIFNFUVVFTkNFCg== +RVJST1I6IENvdWxkbid0IHJlYWQgdGJzQ2VydGlmaWNhdGUgYXMgU0VRVUVOQ0UK -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/cert_missing_signature.pem b/net/data/parse_certificate_unittest/cert_missing_signature.pem index 6fa7197..55cee1dda 100644 --- a/net/data/parse_certificate_unittest/cert_missing_signature.pem +++ b/net/data/parse_certificate_unittest/cert_missing_signature.pem
@@ -12,8 +12,8 @@ MAgwAgUAMAIFAA== -----END CERTIFICATE----- -[Error] Couldn't read Certificate.signatureValue as BIT STRING +ERROR: Couldn't read Certificate.signatureValue as BIT STRING -----BEGIN ERRORS----- -W0Vycm9yXSBDb3VsZG4ndCByZWFkIENlcnRpZmljYXRlLnNpZ25hdHVyZVZhbHVlIGFzIEJJVCBTVFJJTkcK +RVJST1I6IENvdWxkbid0IHJlYWQgQ2VydGlmaWNhdGUuc2lnbmF0dXJlVmFsdWUgYXMgQklUIFNUUklORwo= -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/cert_not_sequence.pem b/net/data/parse_certificate_unittest/cert_not_sequence.pem index b556ca3..fef8938 100644 --- a/net/data/parse_certificate_unittest/cert_not_sequence.pem +++ b/net/data/parse_certificate_unittest/cert_not_sequence.pem
@@ -8,8 +8,8 @@ AhAwBgUAMAIFADACBQADAgCs -----END CERTIFICATE----- -[Error] Failed parsing Certificate SEQUENCE +ERROR: Failed parsing Certificate SEQUENCE -----BEGIN ERRORS----- -W0Vycm9yXSBGYWlsZWQgcGFyc2luZyBDZXJ0aWZpY2F0ZSBTRVFVRU5DRQo= +RVJST1I6IEZhaWxlZCBwYXJzaW5nIENlcnRpZmljYXRlIFNFUVVFTkNFCg== -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/cert_signature_not_bit_string.pem b/net/data/parse_certificate_unittest/cert_signature_not_bit_string.pem index 8c9cc909a..7cf80d3 100644 --- a/net/data/parse_certificate_unittest/cert_signature_not_bit_string.pem +++ b/net/data/parse_certificate_unittest/cert_signature_not_bit_string.pem
@@ -13,8 +13,8 @@ MAwwAgUAMAIFAAQCAQI= -----END CERTIFICATE----- -[Error] Couldn't read Certificate.signatureValue as BIT STRING +ERROR: Couldn't read Certificate.signatureValue as BIT STRING -----BEGIN ERRORS----- -W0Vycm9yXSBDb3VsZG4ndCByZWFkIENlcnRpZmljYXRlLnNpZ25hdHVyZVZhbHVlIGFzIEJJVCBTVFJJTkcK +RVJST1I6IENvdWxkbid0IHJlYWQgQ2VydGlmaWNhdGUuc2lnbmF0dXJlVmFsdWUgYXMgQklUIFNUUklORwo= -----END ERRORS-----
diff --git a/net/data/parse_certificate_unittest/tbs_v3_data_after_extensions.pem b/net/data/parse_certificate_unittest/tbs_v3_data_after_extensions.pem index 3981aa71..25331dd4 100644 --- a/net/data/parse_certificate_unittest/tbs_v3_data_after_extensions.pem +++ b/net/data/parse_certificate_unittest/tbs_v3_data_after_extensions.pem
@@ -27,8 +27,8 @@ DMAMEAfOjBTADBAHdBQA= -----END TBS CERTIFICATE----- -[Error] Unconsumed data inside TBSCertificate +ERROR: Unconsumed data inside TBSCertificate -----BEGIN ERRORS----- -W0Vycm9yXSBVbmNvbnN1bWVkIGRhdGEgaW5zaWRlIFRCU0NlcnRpZmljYXRlCg== +RVJST1I6IFVuY29uc3VtZWQgZGF0YSBpbnNpZGUgVEJTQ2VydGlmaWNhdGUK -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/expired-intermediate.pem b/net/data/verify_certificate_chain_unittest/expired-intermediate.pem index 5ce2527..621f1da 100644 --- a/net/data/verify_certificate_chain_unittest/expired-intermediate.pem +++ b/net/data/verify_certificate_chain_unittest/expired-intermediate.pem
@@ -281,10 +281,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Time is after notAfter +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Time is after notAfter + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIFRpbWUgaXMgYWZ0ZXIgbm90QWZ0ZXIK +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBUaW1lIGlzIGFmdGVyIG5vdEFmdGVyCgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem b/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem index f73790c..84b78fc 100644 --- a/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem +++ b/net/data/verify_certificate_chain_unittest/expired-target-notBefore.pem
@@ -281,10 +281,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Time is before notBefore +----- Certificate i=0 (CN=Target) ----- +ERROR: Time is before notBefore + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFRpbWUgaXMgYmVmb3JlIG5vdEJlZm9yZQo= +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBUaW1lIGlzIGJlZm9yZSBub3RCZWZvcmUKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/expired-target.pem b/net/data/verify_certificate_chain_unittest/expired-target.pem index cb21f35..10a24ebc 100644 --- a/net/data/verify_certificate_chain_unittest/expired-target.pem +++ b/net/data/verify_certificate_chain_unittest/expired-target.pem
@@ -281,10 +281,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Time is after notAfter +----- Certificate i=0 (CN=Target) ----- +ERROR: Time is after notAfter + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFRpbWUgaXMgYWZ0ZXIgbm90QWZ0ZXIK +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBUaW1lIGlzIGFmdGVyIG5vdEFmdGVyCgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-intermediate.py b/net/data/verify_certificate_chain_unittest/generate-expired-intermediate.py index c2aed47..0a38082 100755 --- a/net/data/verify_certificate_chain_unittest/generate-expired-intermediate.py +++ b/net/data/verify_certificate_chain_unittest/generate-expired-intermediate.py
@@ -28,9 +28,9 @@ # intermediate certificate is not. time = common.MARCH_2_2015_UTC verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Time is after notAfter +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Time is after notAfter + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py b/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py index da5d071..2d077c8 100755 --- a/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py +++ b/net/data/verify_certificate_chain_unittest/generate-expired-target-notBefore.py
@@ -28,9 +28,9 @@ # target is not. time = common.MARCH_1_2015_UTC verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Time is before notBefore +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Time is before notBefore + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-expired-target.py b/net/data/verify_certificate_chain_unittest/generate-expired-target.py index 679e0dd..e01cc74 100755 --- a/net/data/verify_certificate_chain_unittest/generate-expired-target.py +++ b/net/data/verify_certificate_chain_unittest/generate-expired-target.py
@@ -28,9 +28,9 @@ # target is not. time = common.MARCH_2_2015_UTC verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Time is after notAfter +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Time is after notAfter + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-incorrect-trust-anchor.py b/net/data/verify_certificate_chain_unittest/generate-incorrect-trust-anchor.py index 22a1e0a..956bc2b 100755 --- a/net/data/verify_certificate_chain_unittest/generate-incorrect-trust-anchor.py +++ b/net/data/verify_certificate_chain_unittest/generate-incorrect-trust-anchor.py
@@ -26,10 +26,11 @@ trusted = common.TrustAnchor(bogus_root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Signature verification failed - [Error] VerifySignedData failed +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Signature verification failed +ERROR: VerifySignedData failed +ERROR: subject does not match issuer + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediate-basic-constraints-ca-false.py b/net/data/verify_certificate_chain_unittest/generate-intermediate-basic-constraints-ca-false.py index 7796e87..c49ea7a6b 100755 --- a/net/data/verify_certificate_chain_unittest/generate-intermediate-basic-constraints-ca-false.py +++ b/net/data/verify_certificate_chain_unittest/generate-intermediate-basic-constraints-ca-false.py
@@ -24,9 +24,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Basic Constraints indicates not a CA +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Basic Constraints indicates not a CA + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-basic-constraints.py b/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-basic-constraints.py index c836417d..7c1c5310 100755 --- a/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-basic-constraints.py +++ b/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-basic-constraints.py
@@ -23,9 +23,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Does not have Basic Constraints +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Does not have Basic Constraints + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-signing-key-usage.py b/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-signing-key-usage.py index f38f6af0..5b6e7d2 100755 --- a/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-signing-key-usage.py +++ b/net/data/verify_certificate_chain_unittest/generate-intermediate-lacks-signing-key-usage.py
@@ -24,9 +24,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] keyCertSign bit is not set +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: keyCertSign bit is not set + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediate-signed-with-md5.py b/net/data/verify_certificate_chain_unittest/generate-intermediate-signed-with-md5.py index 4cffe3ec..087c11b7 100755 --- a/net/data/verify_certificate_chain_unittest/generate-intermediate-signed-with-md5.py +++ b/net/data/verify_certificate_chain_unittest/generate-intermediate-signed-with-md5.py
@@ -23,10 +23,10 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Unacceptable signature algorithm - [Error] VerifySignedData failed +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Unacceptable signature algorithm +ERROR: VerifySignedData failed + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-intermediate-unknown-critical-extension.py b/net/data/verify_certificate_chain_unittest/generate-intermediate-unknown-critical-extension.py index 0d9378f..0229862 100755 --- a/net/data/verify_certificate_chain_unittest/generate-intermediate-unknown-critical-extension.py +++ b/net/data/verify_certificate_chain_unittest/generate-intermediate-unknown-critical-extension.py
@@ -25,11 +25,11 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 0 - [Error] Unconsumed critical extension - oid: 2A0304 - value: 01020304 +errors = """----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Unconsumed critical extension + oid: 2A0304 + value: 01020304 + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py b/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py index 026c704..585b02fe 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-has-keycertsign-but-not-ca.py
@@ -26,9 +26,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Target certificate looks like a CA but does not set all CA properties +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Target certificate looks like a CA but does not set all CA properties + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py b/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py index d35ce7b..b8135e7 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-has-pathlen-but-not-ca.py
@@ -25,9 +25,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Target certificate looks like a CA but does not set all CA properties +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Target certificate looks like a CA but does not set all CA properties + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py b/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py index c5975153..f86013b 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-signed-by-512bit-rsa.py
@@ -23,13 +23,13 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] RSA modulus too small - actual: 512 - minimum: 1024 - [Error] Unacceptable modulus length for RSA key - [Error] VerifySignedData failed +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: RSA modulus too small + actual: 512 + minimum: 1024 +ERROR: Unacceptable modulus length for RSA key +ERROR: VerifySignedData failed + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py b/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py index d9d4df4..7511486 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-signed-with-md5.py
@@ -22,10 +22,10 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Unacceptable signature algorithm - [Error] VerifySignedData failed +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Unacceptable signature algorithm +ERROR: VerifySignedData failed + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py b/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py index a94f418..8179c08 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-unknown-critical-extension.py
@@ -25,11 +25,11 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Unconsumed critical extension - oid: 2A0304 - value: 01020304 +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Unconsumed critical extension + oid: 2A0304 + value: 01020304 + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py b/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py index 4f09b14..368d4f0 100755 --- a/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py +++ b/net/data/verify_certificate_chain_unittest/generate-target-wrong-signature.py
@@ -28,10 +28,10 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] Signature verification failed - [Error] VerifySignedData failed +errors = """----- Certificate i=0 (CN=Target) ----- +ERROR: Signature verification failed +ERROR: VerifySignedData failed + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py b/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py index 64e0355..4d4e40a 100755 --- a/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py +++ b/net/data/verify_certificate_chain_unittest/generate-violates-basic-constraints-pathlen-0.py
@@ -30,9 +30,9 @@ trusted = common.TrustAnchor(root, constrained=False) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] max_path_length reached +errors = """----- Certificate i=1 (CN=Intermediate2) ----- +ERROR: max_path_length reached + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/generate-violates-pathlen-1-constrained-root.py b/net/data/verify_certificate_chain_unittest/generate-violates-pathlen-1-constrained-root.py index 27bd109..7b73f39 100755 --- a/net/data/verify_certificate_chain_unittest/generate-violates-pathlen-1-constrained-root.py +++ b/net/data/verify_certificate_chain_unittest/generate-violates-pathlen-1-constrained-root.py
@@ -28,9 +28,9 @@ trusted = common.TrustAnchor(root, constrained=True) time = common.DEFAULT_TIME verify_result = False -errors = """[Context] Processing Certificate - index: 1 - [Error] max_path_length reached +errors = """----- Certificate i=1 (CN=Intermediate2) ----- +ERROR: max_path_length reached + """ common.write_test_file(__doc__, chain, trusted, time, verify_result, errors)
diff --git a/net/data/verify_certificate_chain_unittest/incorrect-trust-anchor.pem b/net/data/verify_certificate_chain_unittest/incorrect-trust-anchor.pem index ba601d6..c486909 100644 --- a/net/data/verify_certificate_chain_unittest/incorrect-trust-anchor.pem +++ b/net/data/verify_certificate_chain_unittest/incorrect-trust-anchor.pem
@@ -282,11 +282,12 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Signature verification failed - [Error] VerifySignedData failed +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Signature verification failed +ERROR: VerifySignedData failed +ERROR: subject does not match issuer + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkCiAgICAgIFtFcnJvcl0gVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZApFUlJPUjogVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQKRVJST1I6IHN1YmplY3QgZG9lcyBub3QgbWF0Y2ggaXNzdWVyCgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediate-basic-constraints-ca-false.pem b/net/data/verify_certificate_chain_unittest/intermediate-basic-constraints-ca-false.pem index 0d41716..ccb91e6 100644 --- a/net/data/verify_certificate_chain_unittest/intermediate-basic-constraints-ca-false.pem +++ b/net/data/verify_certificate_chain_unittest/intermediate-basic-constraints-ca-false.pem
@@ -282,10 +282,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Basic Constraints indicates not a CA +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Basic Constraints indicates not a CA + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIEJhc2ljIENvbnN0cmFpbnRzIGluZGljYXRlcyBub3QgYSBDQQo= +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBCYXNpYyBDb25zdHJhaW50cyBpbmRpY2F0ZXMgbm90IGEgQ0EKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediate-lacks-basic-constraints.pem b/net/data/verify_certificate_chain_unittest/intermediate-lacks-basic-constraints.pem index ceb0487..6872669 100644 --- a/net/data/verify_certificate_chain_unittest/intermediate-lacks-basic-constraints.pem +++ b/net/data/verify_certificate_chain_unittest/intermediate-lacks-basic-constraints.pem
@@ -279,10 +279,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Does not have Basic Constraints +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Does not have Basic Constraints + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIERvZXMgbm90IGhhdmUgQmFzaWMgQ29uc3RyYWludHMK +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBEb2VzIG5vdCBoYXZlIEJhc2ljIENvbnN0cmFpbnRzCgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediate-lacks-signing-key-usage.pem b/net/data/verify_certificate_chain_unittest/intermediate-lacks-signing-key-usage.pem index eea8741..c43067f 100644 --- a/net/data/verify_certificate_chain_unittest/intermediate-lacks-signing-key-usage.pem +++ b/net/data/verify_certificate_chain_unittest/intermediate-lacks-signing-key-usage.pem
@@ -282,10 +282,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] keyCertSign bit is not set +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: keyCertSign bit is not set + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIGtleUNlcnRTaWduIGJpdCBpcyBub3Qgc2V0Cg== +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBrZXlDZXJ0U2lnbiBiaXQgaXMgbm90IHNldAoK -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediate-signed-with-md5.pem b/net/data/verify_certificate_chain_unittest/intermediate-signed-with-md5.pem index b1a808aa..71e03f9 100644 --- a/net/data/verify_certificate_chain_unittest/intermediate-signed-with-md5.pem +++ b/net/data/verify_certificate_chain_unittest/intermediate-signed-with-md5.pem
@@ -282,11 +282,11 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Unacceptable signature algorithm - [Error] VerifySignedData failed +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Unacceptable signature algorithm +ERROR: VerifySignedData failed + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIFVuYWNjZXB0YWJsZSBzaWduYXR1cmUgYWxnb3JpdGhtCiAgICAgIFtFcnJvcl0gVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBVbmFjY2VwdGFibGUgc2lnbmF0dXJlIGFsZ29yaXRobQpFUlJPUjogVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/intermediate-unknown-critical-extension.pem b/net/data/verify_certificate_chain_unittest/intermediate-unknown-critical-extension.pem index 3d65c7e..fb2dd146 100644 --- a/net/data/verify_certificate_chain_unittest/intermediate-unknown-critical-extension.pem +++ b/net/data/verify_certificate_chain_unittest/intermediate-unknown-critical-extension.pem
@@ -285,12 +285,12 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 0 - [Error] Unconsumed critical extension - oid: 2A0304 - value: 01020304 +----- Certificate i=1 (CN=Intermediate) ----- +ERROR: Unconsumed critical extension + oid: 2A0304 + value: 01020304 + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMAogICAgICBbRXJyb3JdIFVuY29uc3VtZWQgY3JpdGljYWwgZXh0ZW5zaW9uCiAgICAgICAgb2lkOiAyQTAzMDQKICAgICAgICB2YWx1ZTogMDEwMjAzMDQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUpIC0tLS0tCkVSUk9SOiBVbmNvbnN1bWVkIGNyaXRpY2FsIGV4dGVuc2lvbgogIG9pZDogMkEwMzA0CiAgdmFsdWU6IDAxMDIwMzA0Cgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/rebase-errors.py b/net/data/verify_certificate_chain_unittest/rebase-errors.py index 537052a..9237575 100755 --- a/net/data/verify_certificate_chain_unittest/rebase-errors.py +++ b/net/data/verify_certificate_chain_unittest/rebase-errors.py
@@ -15,7 +15,7 @@ net/data/verify_certificate_chain_unittest/rebase-errors.py The script works by scanning the stdout looking for gtest failures when -comparing "errors.ToDebugString()". The C++ test side should have been +comparing "errors.ToDebugString(chain)". The C++ test side should have been instrumented to dump out the test file's path on mismatch. This script will then update the corresponding file(s) -- a .pem file, and @@ -33,7 +33,7 @@ # * Group 2 of the match is file path (relative to //src) where the expected # errors were read from. failed_test_regex = re.compile(r""" -Value of: errors.ToDebugString\(\) +Value of: errors.ToDebugString\((?:chain)?\) Actual: "(.*)" (?:.|\n)+? Test file: (.*)
diff --git a/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem b/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem index 019d30427..56de07fa 100644 --- a/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem +++ b/net/data/verify_certificate_chain_unittest/target-has-keycertsign-but-not-ca.pem
@@ -283,10 +283,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Target certificate looks like a CA but does not set all CA properties +----- Certificate i=0 (CN=Target) ----- +ERROR: Target certificate looks like a CA but does not set all CA properties + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFRhcmdldCBjZXJ0aWZpY2F0ZSBsb29rcyBsaWtlIGEgQ0EgYnV0IGRvZXMgbm90IHNldCBhbGwgQ0EgcHJvcGVydGllcwo= +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBUYXJnZXQgY2VydGlmaWNhdGUgbG9va3MgbGlrZSBhIENBIGJ1dCBkb2VzIG5vdCBzZXQgYWxsIENBIHByb3BlcnRpZXMKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem b/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem index 398314c..1ca13ee39 100644 --- a/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem +++ b/net/data/verify_certificate_chain_unittest/target-has-pathlen-but-not-ca.pem
@@ -284,10 +284,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Target certificate looks like a CA but does not set all CA properties +----- Certificate i=0 (CN=Target) ----- +ERROR: Target certificate looks like a CA but does not set all CA properties + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFRhcmdldCBjZXJ0aWZpY2F0ZSBsb29rcyBsaWtlIGEgQ0EgYnV0IGRvZXMgbm90IHNldCBhbGwgQ0EgcHJvcGVydGllcwo= +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBUYXJnZXQgY2VydGlmaWNhdGUgbG9va3MgbGlrZSBhIENBIGJ1dCBkb2VzIG5vdCBzZXQgYWxsIENBIHByb3BlcnRpZXMKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem b/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem index 916d5a22..f42bb72f 100644 --- a/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem +++ b/net/data/verify_certificate_chain_unittest/target-signed-by-512bit-rsa.pem
@@ -249,14 +249,14 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] RSA modulus too small - actual: 512 - minimum: 1024 - [Error] Unacceptable modulus length for RSA key - [Error] VerifySignedData failed +----- Certificate i=0 (CN=Target) ----- +ERROR: RSA modulus too small + actual: 512 + minimum: 1024 +ERROR: Unacceptable modulus length for RSA key +ERROR: VerifySignedData failed + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFJTQSBtb2R1bHVzIHRvbyBzbWFsbAogICAgICAgIGFjdHVhbDogNTEyCiAgICAgICAgbWluaW11bTogMTAyNAogICAgICBbRXJyb3JdIFVuYWNjZXB0YWJsZSBtb2R1bHVzIGxlbmd0aCBmb3IgUlNBIGtleQogICAgICBbRXJyb3JdIFZlcmlmeVNpZ25lZERhdGEgZmFpbGVkCg== +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBSU0EgbW9kdWx1cyB0b28gc21hbGwKICBhY3R1YWw6IDUxMgogIG1pbmltdW06IDEwMjQKRVJST1I6IFVuYWNjZXB0YWJsZSBtb2R1bHVzIGxlbmd0aCBmb3IgUlNBIGtleQpFUlJPUjogVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem b/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem index 7ba65863..c7f8254 100644 --- a/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem +++ b/net/data/verify_certificate_chain_unittest/target-signed-with-md5.pem
@@ -281,11 +281,11 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Unacceptable signature algorithm - [Error] VerifySignedData failed +----- Certificate i=0 (CN=Target) ----- +ERROR: Unacceptable signature algorithm +ERROR: VerifySignedData failed + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFVuYWNjZXB0YWJsZSBzaWduYXR1cmUgYWxnb3JpdGhtCiAgICAgIFtFcnJvcl0gVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBVbmFjY2VwdGFibGUgc2lnbmF0dXJlIGFsZ29yaXRobQpFUlJPUjogVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem b/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem index a5afd22..af172e2 100644 --- a/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem +++ b/net/data/verify_certificate_chain_unittest/target-unknown-critical-extension.pem
@@ -285,12 +285,12 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Unconsumed critical extension - oid: 2A0304 - value: 01020304 +----- Certificate i=0 (CN=Target) ----- +ERROR: Unconsumed critical extension + oid: 2A0304 + value: 01020304 + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFVuY29uc3VtZWQgY3JpdGljYWwgZXh0ZW5zaW9uCiAgICAgICAgb2lkOiAyQTAzMDQKICAgICAgICB2YWx1ZTogMDEwMjAzMDQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBVbmNvbnN1bWVkIGNyaXRpY2FsIGV4dGVuc2lvbgogIG9pZDogMkEwMzA0CiAgdmFsdWU6IDAxMDIwMzA0Cgo= -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem b/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem index 191a6c70..2c6305a 100644 --- a/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem +++ b/net/data/verify_certificate_chain_unittest/target-wrong-signature.pem
@@ -282,11 +282,11 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] Signature verification failed - [Error] VerifySignedData failed +----- Certificate i=0 (CN=Target) ----- +ERROR: Signature verification failed +ERROR: VerifySignedData failed + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkCiAgICAgIFtFcnJvcl0gVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQK +LS0tLS0gQ2VydGlmaWNhdGUgaT0wIChDTj1UYXJnZXQpIC0tLS0tCkVSUk9SOiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZApFUlJPUjogVmVyaWZ5U2lnbmVkRGF0YSBmYWlsZWQKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem b/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem index ba825fe7..ac92a72c 100644 --- a/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem +++ b/net/data/verify_certificate_chain_unittest/violates-basic-constraints-pathlen-0.pem
@@ -371,10 +371,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] max_path_length reached +----- Certificate i=1 (CN=Intermediate2) ----- +ERROR: max_path_length reached + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIG1heF9wYXRoX2xlbmd0aCByZWFjaGVkCg== +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUyKSAtLS0tLQpFUlJPUjogbWF4X3BhdGhfbGVuZ3RoIHJlYWNoZWQKCg== -----END ERRORS-----
diff --git a/net/data/verify_certificate_chain_unittest/violates-pathlen-1-constrained-root.pem b/net/data/verify_certificate_chain_unittest/violates-pathlen-1-constrained-root.pem index 60c04ac1..0e1f8e4 100644 --- a/net/data/verify_certificate_chain_unittest/violates-pathlen-1-constrained-root.pem +++ b/net/data/verify_certificate_chain_unittest/violates-pathlen-1-constrained-root.pem
@@ -371,10 +371,10 @@ RkFJTA== -----END VERIFY_RESULT----- -[Context] Processing Certificate - index: 1 - [Error] max_path_length reached +----- Certificate i=1 (CN=Intermediate2) ----- +ERROR: max_path_length reached + -----BEGIN ERRORS----- -W0NvbnRleHRdIFByb2Nlc3NpbmcgQ2VydGlmaWNhdGUKICBpbmRleDogMQogICAgICBbRXJyb3JdIG1heF9wYXRoX2xlbmd0aCByZWFjaGVkCg== +LS0tLS0gQ2VydGlmaWNhdGUgaT0xIChDTj1JbnRlcm1lZGlhdGUyKSAtLS0tLQpFUlJPUjogbWF4X3BhdGhfbGVuZ3RoIHJlYWNoZWQKCg== -----END ERRORS-----
diff --git a/net/dns/dns_util.cc b/net/dns/dns_util.cc index 922390e..8eff1c64 100644 --- a/net/dns/dns_util.cc +++ b/net/dns/dns_util.cc
@@ -10,6 +10,7 @@ #include <cstring> #include "base/metrics/field_trial.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "build/build_config.h" @@ -25,17 +26,32 @@ } // namespace +#if defined(OS_POSIX) +#include <netinet/in.h> +#if !defined(OS_NACL) +#include <net/if.h> +#if !defined(OS_ANDROID) +#include <ifaddrs.h> +#endif // !defined(OS_ANDROID) +#endif // !defined(OS_NACL) +#endif // defined(OS_POSIX) + +#if defined(OS_ANDROID) +#include "net/android/network_library.h" +#endif + namespace net { // Based on DJB's public domain code. bool DNSDomainFromDot(const base::StringPiece& dotted, std::string* out) { const char* buf = dotted.data(); - unsigned n = dotted.size(); + size_t n = dotted.size(); char label[kMaxLabelLength]; size_t labellen = 0; /* <= sizeof label */ char name[dns_protocol::kMaxNameLength]; size_t namelen = 0; /* <= sizeof name */ char ch; + bool valid_name = true; for (;;) { if (!n) @@ -56,9 +72,16 @@ } if (labellen >= sizeof label) return false; + if (!IsValidHostLabelCharacter(ch, labellen == 0)) { + // TODO(palmer): In the future, when we can remove support for invalid + // names, return false here instead (and remove the UMA counter). + valid_name = false; + } label[labellen++] = ch; } + UMA_HISTOGRAM_BOOLEAN("Net.ValidDNSName", valid_name); + // Allow empty label at end of name to disable suffix search. if (labellen) { if (namelen + labellen + 1 > sizeof name) @@ -84,6 +107,11 @@ return DNSDomainFromDot(dotted, &dns_formatted); } +bool IsValidHostLabelCharacter(char c, bool is_first_char) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || (!is_first_char && c == '-') || c == '_'; +} + std::string DNSDomainToString(const base::StringPiece& domain) { std::string ret;
diff --git a/net/dns/dns_util.h b/net/dns/dns_util.h index 06cc3d6f..81eb1a28 100644 --- a/net/dns/dns_util.h +++ b/net/dns/dns_util.h
@@ -27,6 +27,21 @@ // Checks that a hostname is valid. Simple wrapper around DNSDomainFromDot. NET_EXPORT_PRIVATE bool IsValidDNSDomain(const base::StringPiece& dotted); +// Returns true if the character is valid in a DNS hostname label, whether in +// the first position or later in the label. +// +// This function asserts a looser form of the restrictions in RFC 7719 (section +// 2; https://tools.ietf.org/html/rfc7719#section-2): hostnames can include +// characters a-z, A-Z, 0-9, -, and _, and any of those characters (except -) +// are legal in the first position. The looser rules are necessary to support +// service records (initial _), and non-compliant but attested hostnames that +// include _. These looser rules also allow Punycode and hence IDN. +// +// TODO(palmer): In the future, when we can remove support for invalid names, +// this can be a private implementation detail of |DNSDomainFromDot|, and need +// not be NET_EXPORT_PRIVATE. +NET_EXPORT_PRIVATE bool IsValidHostLabelCharacter(char c, bool is_first_char); + // DNSDomainToString converts a domain in DNS format to a dotted string. // Excludes the dot at the end. NET_EXPORT_PRIVATE std::string DNSDomainToString(
diff --git a/net/dns/dns_util_unittest.cc b/net/dns/dns_util_unittest.cc index 1d53471..7b01d426 100644 --- a/net/dns/dns_util_unittest.cc +++ b/net/dns/dns_util_unittest.cc
@@ -6,6 +6,28 @@ #include "testing/gtest/include/gtest/gtest.h" +namespace { + +bool IsValidDNSDomainName(const char* name) { + size_t length = strlen(name); + for (size_t i = 0; i < length; ++i) { + if (name[i] == '.') { + if (i == 0 || name[i - 1] == '.') { + return false; + } + continue; + } + + if (!net::IsValidHostLabelCharacter(name[i], + i == 0 || name[i - 1] == '.')) { + return false; + } + } + return true; +} + +} // namespace + namespace net { class DNSUtilTest : public testing::Test { @@ -69,4 +91,30 @@ EXPECT_EQ("", DNSDomainToString("\x06")); } +TEST_F(DNSUtilTest, IsValidDNSDomain) { + const char* const bad_hostnames[] = { + "%20%20noodles.blorg", "noo dles.blorg ", "noo dles.blorg. ", + "^noodles.blorg", "noodles^.blorg", "noo&dles.blorg", + "noodles.blorg`", "www.-noodles.blorg", + }; + + // TODO(palmer): In the future, when we can remove support for invalid names, + // change the calls to from |IsValidDNSDomainName| to |IsValidDNSDomain|, and + // remove |IsValidDNSDomainName| (defined above). + + for (size_t i = 0; i < arraysize(bad_hostnames); ++i) { + EXPECT_FALSE(IsValidDNSDomainName(bad_hostnames[i])); + } + + const char* const good_hostnames[] = { + "www.noodles.blorg", "1www.noodles.blorg", "www.2noodles.blorg", + "www.n--oodles.blorg", "www.noodl_es.blorg", "www.no-_odles.blorg", + "www_.noodles.blorg", "www.noodles.blorg.", "_privet._tcp.local", + }; + + for (size_t i = 0; i < arraysize(good_hostnames); ++i) { + EXPECT_TRUE(IsValidDNSDomainName(good_hostnames[i])); + } +} + } // namespace net
diff --git a/net/ftp/ftp_util.cc b/net/ftp/ftp_util.cc index a66845300..4af3603 100644 --- a/net/ftp/ftp_util.cc +++ b/net/ftp/ftp_util.cc
@@ -9,6 +9,7 @@ #include "base/i18n/case_conversion.h" #include "base/i18n/char_iterator.h" +#include "base/i18n/unicodestring.h" #include "base/logging.h" #include "base/macros.h" #include "base/memory/singleton.h" @@ -175,8 +176,8 @@ format_symbols.getShortMonths(months_count); for (int32_t month = 0; month < months_count; month++) { - base::string16 month_name(months[month].getBuffer(), - static_cast<size_t>(months[month].length())); + base::string16 month_name( + base::i18n::UnicodeStringToString16(months[month])); // Ignore the case of the month names. The simplest way to handle that // is to make everything lowercase.
diff --git a/net/quic/chromium/mock_crypto_client_stream_factory.cc b/net/quic/chromium/mock_crypto_client_stream_factory.cc index 51f5c81..7619bfd 100644 --- a/net/quic/chromium/mock_crypto_client_stream_factory.cc +++ b/net/quic/chromium/mock_crypto_client_stream_factory.cc
@@ -29,6 +29,11 @@ QuicChromiumClientSession* session, std::unique_ptr<ProofVerifyContext> /*proof_verify_context*/, QuicCryptoClientConfig* crypto_config) { + if (handshake_mode_ == MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM) { + return new QuicCryptoClientStream(server_id, session, nullptr, + crypto_config, session); + } + const ProofVerifyDetailsChromium* proof_verify_details = nullptr; if (!proof_verify_details_queue_.empty()) { proof_verify_details = proof_verify_details_queue_.front();
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc index c60dd59e..26c8474 100644 --- a/net/quic/chromium/quic_chromium_client_session.cc +++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -670,6 +670,11 @@ DCHECK(flow_controller()); crypto_stream_->CryptoConnect(); + // Check if the connection is still open, issues during CryptoConnect like + // packet write error could cause the connection to be torn down. + if (!connection()->connected()) + return ERR_QUIC_HANDSHAKE_FAILED; + if (IsCryptoHandshakeConfirmed()) { connect_timing_.connect_end = base::TimeTicks::Now(); return OK;
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc index f38245b..9d5ac29 100644 --- a/net/quic/chromium/quic_network_transaction_unittest.cc +++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -2670,7 +2670,10 @@ test_socket_performance_watcher_factory_.rtt_notification_received()); } -TEST_P(QuicNetworkTransactionTest, QuicUploadToAlternativeProxyServer) { +// TODO(zhongyi): disabled this broken test as it was not testing the correct +// code path. Need a fix to re-enable this test, tracking at crbug.com/704596. +TEST_P(QuicNetworkTransactionTest, + DISABLED_QuicUploadToAlternativeProxyServer) { base::HistogramTester histogram_tester; proxy_service_ = ProxyService::CreateFixedFromPacResult("HTTPS mail.example.org:443");
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc index d6fd5ae..92f93ee 100644 --- a/net/quic/chromium/quic_stream_factory_test.cc +++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -316,6 +316,12 @@ return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id); } + bool HasActiveJob(const HostPortPair& host_port_pair, + const PrivacyMode privacy_mode) { + QuicServerId server_id(host_port_pair, privacy_mode); + return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id); + } + bool HasActiveCertVerifierJob(const QuicServerId& server_id) { return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(), server_id); @@ -1803,6 +1809,134 @@ EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); } +// Regression test for crbug.com/700617. Test a write error during the +// crypto handshake will not hang QuicStreamFactory::Job and should +// report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent +// QuicStreamRequest should succeed without hanging. +TEST_P(QuicStreamFactoryTest, + WriteErrorInCryptoConnectWithAsyncHostResolution) { + Initialize(); + // Use unmocked crypto stream to do crypto connect. + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); + + MockQuicData socket_data; + socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect. + socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); + socket_data.AddSocketDataToFactory(&socket_factory_); + + // Create request, should fail after the write of the CHLO fails. + QuicStreamRequest request(factory_.get()); + EXPECT_EQ(ERR_IO_PENDING, + request.Request(host_port_pair_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback())); + EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult()); + EXPECT_FALSE(HasActiveSession(host_port_pair_)); + EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); + + // Verify new requests can be sent normally without hanging. + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::COLD_START); + ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); + crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + MockQuicData socket_data2; + socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + socket_data2.AddWrite( + ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE, + kDefaultMaxUncompressedHeaderSize, nullptr)); + socket_data2.AddSocketDataToFactory(&socket_factory_); + + QuicStreamRequest request2(factory_.get()); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback())); + EXPECT_FALSE(HasActiveSession(host_port_pair_)); + EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_)); + // Run the message loop to complete host resolution. + base::RunLoop().RunUntilIdle(); + + // Complete handshake. QuicStreamFactory::Job should complete and succeed. + crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( + QuicSession::HANDSHAKE_CONFIRMED); + EXPECT_THAT(callback_.WaitForResult(), IsOk()); + EXPECT_TRUE(HasActiveSession(host_port_pair_)); + EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); + + // Create QuicHttpStream. + std::unique_ptr<QuicHttpStream> stream = request2.CreateStream(); + EXPECT_TRUE(stream.get()); + stream.reset(); + EXPECT_TRUE(socket_data.AllReadDataConsumed()); + EXPECT_TRUE(socket_data.AllWriteDataConsumed()); + EXPECT_TRUE(socket_data2.AllReadDataConsumed()); + EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); +} + +TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) { + Initialize(); + // Use unmocked crypto stream to do crypto connect. + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); + host_resolver_.set_synchronous_mode(true); + host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), + "192.168.0.1", ""); + + MockQuicData socket_data; + socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect. + socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); + socket_data.AddSocketDataToFactory(&socket_factory_); + + // Create request, should fail immediately. + QuicStreamRequest request(factory_.get()); + EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, + request.Request(host_port_pair_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback())); + // Check no active session, or active jobs left for this server. + EXPECT_FALSE(HasActiveSession(host_port_pair_)); + EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); + + // Verify new requests can be sent normally without hanging. + crypto_client_stream_factory_.set_handshake_mode( + MockCryptoClientStream::COLD_START); + ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); + crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + MockQuicData socket_data2; + socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); + socket_data2.AddWrite( + ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE, + kDefaultMaxUncompressedHeaderSize, nullptr)); + socket_data2.AddSocketDataToFactory(&socket_factory_); + + QuicStreamRequest request2(factory_.get()); + EXPECT_EQ(ERR_IO_PENDING, + request2.Request(host_port_pair_, privacy_mode_, + /*cert_verify_flags=*/0, url_, "GET", net_log_, + callback_.callback())); + EXPECT_FALSE(HasActiveSession(host_port_pair_)); + EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_)); + + // Complete handshake. + crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( + QuicSession::HANDSHAKE_CONFIRMED); + EXPECT_THAT(callback_.WaitForResult(), IsOk()); + EXPECT_TRUE(HasActiveSession(host_port_pair_)); + EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); + + // Create QuicHttpStream. + std::unique_ptr<QuicHttpStream> stream = request2.CreateStream(); + EXPECT_TRUE(stream.get()); + stream.reset(); + EXPECT_TRUE(socket_data.AllReadDataConsumed()); + EXPECT_TRUE(socket_data.AllWriteDataConsumed()); + EXPECT_TRUE(socket_data2.AllReadDataConsumed()); + EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); +} + TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { close_sessions_on_ip_change_ = true; Initialize();
diff --git a/net/quic/core/frames/quic_path_close_frame.cc b/net/quic/core/frames/quic_path_close_frame.cc deleted file mode 100644 index f2b751a..0000000 --- a/net/quic/core/frames/quic_path_close_frame.cc +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright (c) 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 "net/quic/core/frames/quic_path_close_frame.h" - -namespace net { - -QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {} - -std::ostream& operator<<(std::ostream& os, - const QuicPathCloseFrame& path_close_frame) { - os << "{ path_id: " << static_cast<int>(path_close_frame.path_id) << " }\n"; - return os; -} - -} // namespace net
diff --git a/net/quic/core/frames/quic_path_close_frame.h b/net/quic/core/frames/quic_path_close_frame.h deleted file mode 100644 index 55982a9..0000000 --- a/net/quic/core/frames/quic_path_close_frame.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright (c) 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 NET_QUIC_CORE_FRAMES_QUIC_PATH_CLOSE_FRAME_H_ -#define NET_QUIC_CORE_FRAMES_QUIC_PATH_CLOSE_FRAME_H_ - -#include <ostream> - -#include "net/quic/core/quic_types.h" -#include "net/quic/platform/api/quic_export.h" - -namespace net { - -// The PATH_CLOSE frame is used to explicitly close a path. Both endpoints can -// send a PATH_CLOSE frame to initiate a path termination. A path is considered -// to be closed either a PATH_CLOSE frame is sent or received. An endpoint drops -// receive side of a closed path, and packets with retransmittable frames on a -// closed path are marked as retransmissions which will be transmitted on other -// paths. -struct QUIC_EXPORT_PRIVATE QuicPathCloseFrame { - QuicPathCloseFrame() {} - explicit QuicPathCloseFrame(QuicPathId path_id); - - friend QUIC_EXPORT_PRIVATE std::ostream& operator<<( - std::ostream& os, - const QuicPathCloseFrame& p); - - QuicPathId path_id; -}; - -} // namespace net - -#endif // NET_QUIC_CORE_FRAMES_QUIC_PATH_CLOSE_FRAME_H_
diff --git a/net/quic/test_tools/mock_crypto_client_stream.cc b/net/quic/test_tools/mock_crypto_client_stream.cc index 0197307..2f0089a 100644 --- a/net/quic/test_tools/mock_crypto_client_stream.cc +++ b/net/quic/test_tools/mock_crypto_client_stream.cc
@@ -100,6 +100,11 @@ encryption_established_ = false; break; } + + case USE_DEFAULT_CRYPTO_STREAM: { + NOTREACHED(); + break; + } } }
diff --git a/net/quic/test_tools/mock_crypto_client_stream.h b/net/quic/test_tools/mock_crypto_client_stream.h index 7c8b9fb..ffec4aa 100644 --- a/net/quic/test_tools/mock_crypto_client_stream.h +++ b/net/quic/test_tools/mock_crypto_client_stream.h
@@ -20,6 +20,8 @@ class MockCryptoClientStream : public QuicCryptoClientStream { public: + // TODO(zhongyi): might consider move HandshakeMode up to + // MockCryptoClientStreamFactory. // HandshakeMode enumerates the handshake mode MockCryptoClientStream should // mock in CryptoConnect. enum HandshakeMode { @@ -35,6 +37,11 @@ // COLD_START indicates that CryptoConnect will neither establish encryption // nor confirm the handshake COLD_START, + + // USE_DEFAULT_CRYPTO_STREAM indicates that MockCryptoClientStreamFactory + // will create a QuicCryptoClientStream instead of a + // MockCryptoClientStream. + USE_DEFAULT_CRYPTO_STREAM, }; MockCryptoClientStream(
diff --git a/net/quic/test_tools/quic_stream_factory_peer.cc b/net/quic/test_tools/quic_stream_factory_peer.cc index d7ea3105..efd3598 100644 --- a/net/quic/test_tools/quic_stream_factory_peer.cc +++ b/net/quic/test_tools/quic_stream_factory_peer.cc
@@ -35,6 +35,11 @@ return factory->HasActiveSession(server_id); } +bool QuicStreamFactoryPeer::HasActiveJob(QuicStreamFactory* factory, + const QuicServerId& server_id) { + return factory->HasActiveJob(server_id); +} + bool QuicStreamFactoryPeer::HasActiveCertVerifierJob( QuicStreamFactory* factory, const QuicServerId& server_id) {
diff --git a/net/quic/test_tools/quic_stream_factory_peer.h b/net/quic/test_tools/quic_stream_factory_peer.h index eeb1dc09..3387e1fe 100644 --- a/net/quic/test_tools/quic_stream_factory_peer.h +++ b/net/quic/test_tools/quic_stream_factory_peer.h
@@ -37,6 +37,9 @@ static bool HasActiveSession(QuicStreamFactory* factory, const QuicServerId& server_id); + static bool HasActiveJob(QuicStreamFactory* factory, + const QuicServerId& server_id); + static bool HasActiveCertVerifierJob(QuicStreamFactory* factory, const QuicServerId& server_id);
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index bdbce02cc..b8db10f 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -12,7 +12,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" -#include "base/feature_list.h" #include "base/lazy_instance.h" #include "base/macros.h" #include "base/memory/singleton.h" @@ -219,21 +218,6 @@ return buffer_size; } -#if defined(OS_NACL) -bool AreLegacyECDSACiphersEnabled() { - return false; -} -#else -// TODO(davidben): Remove this after the ECDSA CBC removal sticks. -// https:/crbug.com/666191. -const base::Feature kLegacyECDSACiphersFeature{ - "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT}; - -bool AreLegacyECDSACiphersEnabled() { - return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature); -} -#endif - scoped_refptr<X509Certificate> OSChainFromBuffers(STACK_OF(CRYPTO_BUFFER) * openssl_chain) { if (sk_CRYPTO_BUFFER_num(openssl_chain) == 0) { @@ -929,16 +913,13 @@ // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers // (note that SHA256 and SHA384 only select legacy CBC ciphers). - std::string command("ALL:!SHA256:!SHA384:!kDHE:!aPSK:!RC4"); + // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining + // CBC-mode ECDSA ciphers. + std::string command("ALL:!SHA256:!SHA384:!kDHE:!aPSK:!RC4:!ECDSA+SHA1"); if (ssl_config_.require_ecdhe) command.append(":!kRSA:!kDHE"); - // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining - // CBC-mode ECDSA ciphers. - if (!AreLegacyECDSACiphersEnabled()) - command.append("!ECDSA+SHA1"); - // Remove any disabled ciphers. for (uint16_t id : ssl_config_.disabled_cipher_suites) { const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
diff --git a/net/ssl/openssl_ssl_util.cc b/net/ssl/openssl_ssl_util.cc index 91c7908..c3988b464 100644 --- a/net/ssl/openssl_ssl_util.cc +++ b/net/ssl/openssl_ssl_util.cc
@@ -61,8 +61,13 @@ int MapOpenSSLErrorSSL(uint32_t error_code) { DCHECK_EQ(ERR_LIB_SSL, ERR_GET_LIB(error_code)); +#if DCHECK_IS_ON() + char buf[ERR_ERROR_STRING_BUF_LEN]; + ERR_error_string_n(error_code, buf, sizeof(buf)); DVLOG(1) << "OpenSSL SSL error, reason: " << ERR_GET_REASON(error_code) - << ", name: " << ERR_error_string(error_code, NULL); + << ", name: " << buf; +#endif + switch (ERR_GET_REASON(error_code)) { case SSL_R_READ_TIMEOUT_EXPIRED: return ERR_TIMED_OUT;
diff --git a/net/tools/cert_verify_tool/verify_using_path_builder.cc b/net/tools/cert_verify_tool/verify_using_path_builder.cc index 9679531..27173064 100644 --- a/net/tools/cert_verify_tool/verify_using_path_builder.cc +++ b/net/tools/cert_verify_tool/verify_using_path_builder.cc
@@ -134,7 +134,7 @@ size_t index, bool is_best) { std::cout << "path " << index << " " - << (result_path->valid ? "valid" : "invalid") + << (result_path->IsValid() ? "valid" : "invalid") << (is_best ? " (best)" : "") << "\n"; // Print the certificate chain. @@ -155,10 +155,12 @@ << SubjectFromTrustAnchor(trust_anchor.get()) << "\n"; } - // Print the errors. - if (!result_path->errors.empty()) { + // Print the errors/warnings if there were any. + std::string errors_str = + result_path->errors.ToDebugString(result_path->path.certs); + if (!errors_str.empty()) { std::cout << "Errors:\n"; - std::cout << result_path->errors.ToDebugString() << "\n"; + std::cout << errors_str << "\n"; } }
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index 5d90b396..2b271b5b 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -283,7 +283,6 @@ zoom_(1.0), needs_reraster_(true), last_bitmap_smaller_(false), - last_zoom_when_smaller_(1.0), device_scale_(1.0), full_(false), paint_manager_(this, this, true), @@ -466,13 +465,14 @@ starting_scroll_offset_.y() * zoom_ratio / initial_zoom_ratio_)); pinch_vector = pp::Point(); - last_zoom_when_smaller_ = zoom; last_bitmap_smaller_ = true; } else if (last_bitmap_smaller_) { pinch_center = pp::Point((plugin_size_.width() / device_scale_) / 2, (plugin_size_.height() / device_scale_) / 2); + const double zoom_when_doc_covers_plugin_width = + zoom_ * plugin_size_.width() / GetDocumentPixelWidth(); paint_offset = pp::Point( - (1 - zoom / last_zoom_when_smaller_) * pinch_center.x(), + (1 - zoom / zoom_when_doc_covers_plugin_width) * pinch_center.x(), (1 - zoom_ratio) * pinch_center.y()); pinch_vector = pp::Point(); scroll_delta = pp::Point(
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h index d4c9c97..dbaeb29 100644 --- a/pdf/out_of_process_instance.h +++ b/pdf/out_of_process_instance.h
@@ -256,7 +256,6 @@ pp::FloatPoint starting_scroll_offset_; // True if last bitmap was smaller than screen. bool last_bitmap_smaller_; - double last_zoom_when_smaller_; // Current device scale factor. float device_scale_; // True if the plugin is full-page.
diff --git a/pdf/pdfium/fuzzers/BUILD.gn b/pdf/pdfium/fuzzers/BUILD.gn index 70a043c..c5aaf3a 100644 --- a/pdf/pdfium/fuzzers/BUILD.gn +++ b/pdf/pdfium/fuzzers/BUILD.gn
@@ -14,6 +14,8 @@ fuzzer_test("pdfium_fuzzer") { sources = [ "pdfium_fuzzer.cc", + "pdfium_fuzzer_helper.cc", + "pdfium_fuzzer_helper.h", ] deps = [ "//third_party/pdfium", @@ -26,6 +28,7 @@ "//v8:external_startup_data", ] dict = "dicts/pdf.dict" + seed_corpus = "src/third_party/pdfium/test" } fuzzer_test("pdf_cmap_fuzzer") { @@ -181,4 +184,24 @@ ] dict = "dicts/pdf_xml.dict" } + + fuzzer_test("pdfium_xfa_fuzzer") { + sources = [ + "pdfium_fuzzer_helper.cc", + "pdfium_fuzzer_helper.h", + "pdfium_xfa_fuzzer.cc", + ] + deps = [ + "//third_party/pdfium", + "//third_party/pdfium:test_support", + "//v8", + "//v8:v8_libplatform", + ] + additional_configs = [ + "//third_party/pdfium:pdfium_core_config", + "//v8:external_startup_data", + ] + dict = "dicts/pdf.dict" + seed_corpus = "src/third_party/pdfium/test" + } }
diff --git a/pdf/pdfium/fuzzers/pdfium_fuzzer.cc b/pdf/pdfium/fuzzers/pdfium_fuzzer.cc index 658be7ec..ba9503ed 100644 --- a/pdf/pdfium/fuzzers/pdfium_fuzzer.cc +++ b/pdf/pdfium/fuzzers/pdfium_fuzzer.cc
@@ -1,213 +1,19 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// This fuzzer is simplified & cleaned up pdfium/samples/pdfium_test.cc +#include "pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h" -#include <assert.h> -#include <limits.h> -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +class PDFiumFuzzer : public PDFiumFuzzerHelper { + public: + PDFiumFuzzer() : PDFiumFuzzerHelper() {} + ~PDFiumFuzzer() override {} -#ifdef _MSC_VER -#include <Windows.h> -#else -#include <unistd.h> -#endif - -#include <list> -#include <memory> -#include <sstream> -#include <string> -#include <utility> -#include <vector> - -#include "third_party/pdfium/public/cpp/fpdf_deleters.h" -#include "third_party/pdfium/public/fpdf_dataavail.h" -#include "third_party/pdfium/public/fpdf_ext.h" -#include "third_party/pdfium/public/fpdf_formfill.h" -#include "third_party/pdfium/public/fpdf_text.h" -#include "third_party/pdfium/public/fpdfview.h" -#include "third_party/pdfium/testing/test_support.h" - -#include "v8/include/v8.h" - -static int ExampleAppAlert(IPDF_JSPLATFORM*, - FPDF_WIDESTRING, - FPDF_WIDESTRING, - int, - int) { - return 0; -} - -static void ExampleDocGotoPage(IPDF_JSPLATFORM*, int pageNumber) {} - -static void ExampleUnsupportedHandler(UNSUPPORT_INFO*, int type) {} - -FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { - return true; -} - -static void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} - -static bool RenderPage(const FPDF_DOCUMENT& doc, - const FPDF_FORMHANDLE& form, - const int page_index) { - std::unique_ptr<void, FPDFPageDeleter> page(FPDF_LoadPage(doc, page_index)); - if (!page) - return false; - - std::unique_ptr<void, FPDFTextPageDeleter> text_page( - FPDFText_LoadPage(page.get())); - FORM_OnAfterLoadPage(page.get(), form); - FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_OPEN); - - const double scale = 1.0; - int width = static_cast<int>(FPDF_GetPageWidth(page.get()) * scale); - int height = static_cast<int>(FPDF_GetPageHeight(page.get()) * scale); - std::unique_ptr<void, FPDFBitmapDeleter> bitmap( - FPDFBitmap_Create(width, height, 0)); - if (bitmap) { - FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF); - FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0, 0); - FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0, 0); - } - FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE); - FORM_OnBeforeClosePage(page.get(), form); - return !!bitmap; -} - -static void RenderPdf(const char* pBuf, size_t len) { - IPDF_JSPLATFORM platform_callbacks; - memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); - platform_callbacks.version = 3; - platform_callbacks.app_alert = ExampleAppAlert; - platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; - - FPDF_FORMFILLINFO form_callbacks; - memset(&form_callbacks, '\0', sizeof(form_callbacks)); - form_callbacks.version = 1; - form_callbacks.m_pJsPlatform = &platform_callbacks; - - TestLoader loader(pBuf, len); - FPDF_FILEACCESS file_access; - memset(&file_access, '\0', sizeof(file_access)); - file_access.m_FileLen = static_cast<unsigned long>(len); - file_access.m_GetBlock = TestLoader::GetBlock; - file_access.m_Param = &loader; - - FX_FILEAVAIL file_avail; - memset(&file_avail, '\0', sizeof(file_avail)); - file_avail.version = 1; - file_avail.IsDataAvail = Is_Data_Avail; - - FX_DOWNLOADHINTS hints; - memset(&hints, '\0', sizeof(hints)); - hints.version = 1; - hints.AddSegment = Add_Segment; - - std::unique_ptr<void, FPDFAvailDeleter> pdf_avail( - FPDFAvail_Create(&file_avail, &file_access)); - - int nRet = PDF_DATA_NOTAVAIL; - bool bIsLinearized = false; - std::unique_ptr<void, FPDFDocumentDeleter> doc; - if (FPDFAvail_IsLinearized(pdf_avail.get()) == PDF_LINEARIZED) { - doc.reset(FPDFAvail_GetDocument(pdf_avail.get(), nullptr)); - if (doc) { - while (nRet == PDF_DATA_NOTAVAIL) - nRet = FPDFAvail_IsDocAvail(pdf_avail.get(), &hints); - - if (nRet == PDF_DATA_ERROR) - return; - - nRet = FPDFAvail_IsFormAvail(pdf_avail.get(), &hints); - if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) - return; - - bIsLinearized = true; - } - } else { - doc.reset(FPDF_LoadCustomDocument(&file_access, nullptr)); - } - - if (!doc) - return; - - (void)FPDF_GetDocPermissions(doc.get()); - - std::unique_ptr<void, FPDFFormHandleDeleter> form( - FPDFDOC_InitFormFillEnvironment(doc.get(), &form_callbacks)); - FPDF_SetFormFieldHighlightColor(form.get(), 0, 0xFFE4DD); - FPDF_SetFormFieldHighlightAlpha(form.get(), 100); - FORM_DoDocumentJSAction(form.get()); - FORM_DoDocumentOpenAction(form.get()); - - int page_count = FPDF_GetPageCount(doc.get()); - for (int i = 0; i < page_count; ++i) { - if (bIsLinearized) { - nRet = PDF_DATA_NOTAVAIL; - while (nRet == PDF_DATA_NOTAVAIL) - nRet = FPDFAvail_IsPageAvail(pdf_avail.get(), i, &hints); - - if (nRet == PDF_DATA_ERROR) - return; - } - RenderPage(doc.get(), form.get(), i); - } - FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC); -} - -std::string ProgramPath() { -#ifdef _MSC_VER - wchar_t wpath[MAX_PATH]; - char path[MAX_PATH]; - DWORD res = GetModuleFileName(NULL, wpath, MAX_PATH); - assert(res != 0); - wcstombs(path, wpath, MAX_PATH); - return std::string(path, res); -#else - char* path = new char[PATH_MAX + 1]; - assert(path); - ssize_t sz = readlink("/proc/self/exe", path, PATH_MAX); - assert(sz > 0); - std::string result(path, sz); - delete[] path; - return result; -#endif -} - -struct TestCase { - TestCase() { - InitializeV8ForPDFium(ProgramPath(), "", &natives_blob, &snapshot_blob, - &platform); - - memset(&config, '\0', sizeof(config)); - config.version = 2; - config.m_pUserFontPaths = nullptr; - config.m_pIsolate = nullptr; - config.m_v8EmbedderSlot = 0; - FPDF_InitLibraryWithConfig(&config); - - memset(&unsupport_info, '\0', sizeof(unsupport_info)); - unsupport_info.version = 1; - unsupport_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler; - FSDK_SetUnSpObjProcessHandler(&unsupport_info); - } - - v8::Platform* platform; - v8::StartupData natives_blob; - v8::StartupData snapshot_blob; - FPDF_LIBRARY_CONFIG config; - UNSUPPORT_INFO unsupport_info; + int GetFormCallbackVersion() const override { return 1; } }; -static TestCase* testCase = new TestCase(); - extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - RenderPdf(reinterpret_cast<const char*>(data), size); + PDFiumFuzzer fuzzer; + fuzzer.RenderPdf(reinterpret_cast<const char*>(data), size); return 0; }
diff --git a/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.cc b/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.cc new file mode 100644 index 0000000..3d49a0a7 --- /dev/null +++ b/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.cc
@@ -0,0 +1,247 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This fuzzer is simplified & cleaned up pdfium/samples/pdfium_test.cc + +#include "pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h" + +#include <assert.h> +#include <limits.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef _MSC_VER +#include <Windows.h> +#else +#include <unistd.h> +#endif + +#include <memory> +#include <sstream> +#include <string> +#include <utility> + +#include "third_party/pdfium/public/cpp/fpdf_deleters.h" +#include "third_party/pdfium/public/fpdf_dataavail.h" +#include "third_party/pdfium/public/fpdf_text.h" +#include "third_party/pdfium/testing/test_support.h" + +namespace { + +int ExampleAppAlert(IPDF_JSPLATFORM*, + FPDF_WIDESTRING, + FPDF_WIDESTRING, + int, + int) { + return 0; +} + +int ExampleAppResponse(IPDF_JSPLATFORM*, + FPDF_WIDESTRING question, + FPDF_WIDESTRING title, + FPDF_WIDESTRING default_value, + FPDF_WIDESTRING label, + FPDF_BOOL is_password, + void* response, + int length) { + // UTF-16, always LE regardless of platform. + uint8_t* ptr = static_cast<uint8_t*>(response); + ptr[0] = 'N'; + ptr[1] = 0; + ptr[2] = 'o'; + ptr[3] = 0; + return 4; +} + +void ExampleDocGotoPage(IPDF_JSPLATFORM*, int pageNumber) {} + +void ExampleDocMail(IPDF_JSPLATFORM*, + void* mailData, + int length, + FPDF_BOOL UI, + FPDF_WIDESTRING To, + FPDF_WIDESTRING Subject, + FPDF_WIDESTRING CC, + FPDF_WIDESTRING BCC, + FPDF_WIDESTRING Msg) {} + +void ExampleUnsupportedHandler(UNSUPPORT_INFO*, int type) {} + +FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) { + return true; +} + +void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {} + +std::string ProgramPath() { +#ifdef _MSC_VER + wchar_t wpath[MAX_PATH]; + char path[MAX_PATH]; + DWORD res = GetModuleFileName(NULL, wpath, MAX_PATH); + assert(res != 0); + wcstombs(path, wpath, MAX_PATH); + return std::string(path, res); +#else + char* path = new char[PATH_MAX + 1]; + assert(path); + ssize_t sz = readlink("/proc/self/exe", path, PATH_MAX); + assert(sz > 0); + std::string result(path, sz); + delete[] path; + return result; +#endif +} + +} // namespace + +PDFiumFuzzerHelper::PDFiumFuzzerHelper() {} + +PDFiumFuzzerHelper::~PDFiumFuzzerHelper() {} + +bool PDFiumFuzzerHelper::OnFormFillEnvLoaded(FPDF_DOCUMENT doc) { + return true; +} + +void PDFiumFuzzerHelper::RenderPdf(const char* pBuf, size_t len) { + IPDF_JSPLATFORM platform_callbacks; + memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); + platform_callbacks.version = 3; + platform_callbacks.app_alert = ExampleAppAlert; + platform_callbacks.app_response = ExampleAppResponse; + platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; + platform_callbacks.Doc_mail = ExampleDocMail; + + FPDF_FORMFILLINFO form_callbacks; + memset(&form_callbacks, '\0', sizeof(form_callbacks)); + form_callbacks.version = GetFormCallbackVersion(); + form_callbacks.m_pJsPlatform = &platform_callbacks; + + TestLoader loader(pBuf, len); + FPDF_FILEACCESS file_access; + memset(&file_access, '\0', sizeof(file_access)); + file_access.m_FileLen = static_cast<unsigned long>(len); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + + FX_FILEAVAIL file_avail; + memset(&file_avail, '\0', sizeof(file_avail)); + file_avail.version = 1; + file_avail.IsDataAvail = Is_Data_Avail; + + FX_DOWNLOADHINTS hints; + memset(&hints, '\0', sizeof(hints)); + hints.version = 1; + hints.AddSegment = Add_Segment; + + std::unique_ptr<void, FPDFAvailDeleter> pdf_avail( + FPDFAvail_Create(&file_avail, &file_access)); + + int nRet = PDF_DATA_NOTAVAIL; + bool bIsLinearized = false; + std::unique_ptr<void, FPDFDocumentDeleter> doc; + if (FPDFAvail_IsLinearized(pdf_avail.get()) == PDF_LINEARIZED) { + doc.reset(FPDFAvail_GetDocument(pdf_avail.get(), nullptr)); + if (doc) { + while (nRet == PDF_DATA_NOTAVAIL) + nRet = FPDFAvail_IsDocAvail(pdf_avail.get(), &hints); + + if (nRet == PDF_DATA_ERROR) + return; + + nRet = FPDFAvail_IsFormAvail(pdf_avail.get(), &hints); + if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) + return; + + bIsLinearized = true; + } + } else { + doc.reset(FPDF_LoadCustomDocument(&file_access, nullptr)); + } + + if (!doc) + return; + + (void)FPDF_GetDocPermissions(doc.get()); + + std::unique_ptr<void, FPDFFormHandleDeleter> form( + FPDFDOC_InitFormFillEnvironment(doc.get(), &form_callbacks)); + if (!OnFormFillEnvLoaded(doc.get())) + return; + + FPDF_SetFormFieldHighlightColor(form.get(), 0, 0xFFE4DD); + FPDF_SetFormFieldHighlightAlpha(form.get(), 100); + FORM_DoDocumentJSAction(form.get()); + FORM_DoDocumentOpenAction(form.get()); + + int page_count = FPDF_GetPageCount(doc.get()); + for (int i = 0; i < page_count; ++i) { + if (bIsLinearized) { + nRet = PDF_DATA_NOTAVAIL; + while (nRet == PDF_DATA_NOTAVAIL) + nRet = FPDFAvail_IsPageAvail(pdf_avail.get(), i, &hints); + + if (nRet == PDF_DATA_ERROR) + return; + } + RenderPage(doc.get(), form.get(), i); + } + FORM_DoDocumentAAction(form.get(), FPDFDOC_AACTION_WC); +} + +bool PDFiumFuzzerHelper::RenderPage(const FPDF_DOCUMENT& doc, + const FPDF_FORMHANDLE& form, + const int page_index) { + std::unique_ptr<void, FPDFPageDeleter> page(FPDF_LoadPage(doc, page_index)); + if (!page) + return false; + + std::unique_ptr<void, FPDFTextPageDeleter> text_page( + FPDFText_LoadPage(page.get())); + FORM_OnAfterLoadPage(page.get(), form); + FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_OPEN); + + const double scale = 1.0; + int width = static_cast<int>(FPDF_GetPageWidth(page.get()) * scale); + int height = static_cast<int>(FPDF_GetPageHeight(page.get()) * scale); + std::unique_ptr<void, FPDFBitmapDeleter> bitmap( + FPDFBitmap_Create(width, height, 0)); + if (bitmap) { + FPDFBitmap_FillRect(bitmap.get(), 0, 0, width, height, 0xFFFFFFFF); + FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, width, height, 0, 0); + FPDF_FFLDraw(form, bitmap.get(), page.get(), 0, 0, width, height, 0, 0); + } + FORM_DoPageAAction(page.get(), form, FPDFPAGE_AACTION_CLOSE); + FORM_OnBeforeClosePage(page.get(), form); + return !!bitmap; +} + +// Initialize the library once for all runs of the fuzzer. +struct TestCase { + TestCase() { + InitializeV8ForPDFium(ProgramPath(), "", &natives_blob, &snapshot_blob, + &platform); + + memset(&config, '\0', sizeof(config)); + config.version = 2; + config.m_pUserFontPaths = nullptr; + config.m_pIsolate = nullptr; + config.m_v8EmbedderSlot = 0; + FPDF_InitLibraryWithConfig(&config); + + memset(&unsupport_info, '\0', sizeof(unsupport_info)); + unsupport_info.version = 1; + unsupport_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler; + FSDK_SetUnSpObjProcessHandler(&unsupport_info); + } + + v8::Platform* platform; + v8::StartupData natives_blob; + v8::StartupData snapshot_blob; + FPDF_LIBRARY_CONFIG config; + UNSUPPORT_INFO unsupport_info; +}; +static TestCase* testCase = new TestCase();
diff --git a/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h b/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h new file mode 100644 index 0000000..7c4f3a3 --- /dev/null +++ b/pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h
@@ -0,0 +1,28 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This fuzzer is simplified & cleaned up pdfium/samples/pdfium_test.cc + +#include "third_party/pdfium/public/fpdf_ext.h" +#include "third_party/pdfium/public/fpdf_formfill.h" +#include "third_party/pdfium/public/fpdfview.h" +#include "v8/include/v8.h" + +class PDFiumFuzzerHelper { + public: + virtual ~PDFiumFuzzerHelper(); + + void RenderPdf(const char* pBuf, size_t len); + + virtual int GetFormCallbackVersion() const = 0; + virtual bool OnFormFillEnvLoaded(FPDF_DOCUMENT doc); + + protected: + PDFiumFuzzerHelper(); + + private: + bool RenderPage(const FPDF_DOCUMENT& doc, + const FPDF_FORMHANDLE& form, + const int page_index); +};
diff --git a/pdf/pdfium/fuzzers/pdfium_xfa_fuzzer.cc b/pdf/pdfium/fuzzers/pdfium_xfa_fuzzer.cc new file mode 100644 index 0000000..379a95b3 --- /dev/null +++ b/pdf/pdfium/fuzzers/pdfium_xfa_fuzzer.cc
@@ -0,0 +1,28 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "pdf/pdfium/fuzzers/pdfium_fuzzer_helper.h" + +class PDFiumXFAFuzzer : public PDFiumFuzzerHelper { + public: + PDFiumXFAFuzzer() : PDFiumFuzzerHelper() {} + ~PDFiumXFAFuzzer() override {} + + int GetFormCallbackVersion() const override { return 2; } + + // Return false if XFA doesn't load as otherwise we're duplicating the work + // done by the non-xfa fuzzer. + bool OnFormFillEnvLoaded(FPDF_DOCUMENT doc) override { + int doc_type = DOCTYPE_PDF; + if (!FPDF_HasXFAField(doc, &doc_type) || doc_type == DOCTYPE_PDF) + return false; + return FPDF_LoadXFA(doc); + } +}; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + PDFiumXFAFuzzer fuzzer; + fuzzer.RenderPdf(reinterpret_cast<const char*>(data), size); + return 0; +}
diff --git a/ppapi/BUILD.gn b/ppapi/BUILD.gn index 072b04b0e..794ee96b 100644 --- a/ppapi/BUILD.gn +++ b/ppapi/BUILD.gn
@@ -440,8 +440,11 @@ "tests/test_nacl_irt_stack_alignment.cc", "tests/test_nacl_irt_stack_alignment.h", "tests/test_tcp_server_socket_private_disallowed.cc", + "tests/test_tcp_server_socket_private_disallowed.h", "tests/test_tcp_socket_private_disallowed.cc", + "tests/test_tcp_socket_private_disallowed.h", "tests/test_udp_socket_private_disallowed.cc", + "tests/test_udp_socket_private_disallowed.h", ] defines = [
diff --git a/printing/backend/cups_helper.cc b/printing/backend/cups_helper.cc index 2b845ffd..d352ccf8c 100644 --- a/printing/backend/cups_helper.cc +++ b/printing/backend/cups_helper.cc
@@ -23,6 +23,8 @@ #include "printing/units.h" #include "url/gurl.h" +using base::EqualsCaseInsensitiveASCII; + namespace printing { // This section contains helper code for PPD parsing for semantic capabilities. @@ -46,6 +48,10 @@ constexpr char kBrotherMonoColor[] = "BRMonoColor"; constexpr char kBrotherPrintQuality[] = "BRPrintQuality"; +// Samsung printer specific options. +constexpr char kSamsungColorTrue[] = "True"; +constexpr char kSamsungColorFalse[] = "False"; + const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch; void ParseLpOptions(const base::FilePath& filepath, @@ -88,7 +94,7 @@ if (name.empty()) continue; - if (!base::EqualsCaseInsensitiveASCII(printer_name, name)) + if (!EqualsCaseInsensitiveASCII(printer_name, name)) continue; // This is not the required printer. line = line.substr(space_found + 1); @@ -146,9 +152,9 @@ *duplex_capable = true; const char* choice = duplex_choice->choice; - if (base::EqualsCaseInsensitiveASCII(choice, kDuplexNone)) { + if (EqualsCaseInsensitiveASCII(choice, kDuplexNone)) { *duplex_default = SIMPLEX; - } else if (base::EqualsCaseInsensitiveASCII(choice, kDuplexTumble)) { + } else if (EqualsCaseInsensitiveASCII(choice, kDuplexTumble)) { *duplex_default = SHORT_EDGE; } else { *duplex_default = LONG_EDGE; @@ -193,9 +199,9 @@ if (marked_choice) { *color_is_default = - !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kBlack) && - !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kGray) && - !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kGrayscale); + !EqualsCaseInsensitiveASCII(marked_choice->choice, kBlack) && + !EqualsCaseInsensitiveASCII(marked_choice->choice, kGray) && + !EqualsCaseInsensitiveASCII(marked_choice->choice, kGrayscale); } return true; } @@ -226,12 +232,9 @@ printout_mode->defchoice); } if (printout_mode_choice) { - if (base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, - kNormalGray) || - base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, - kHighGray) || - base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, - kDraftGray)) { + if (EqualsCaseInsensitiveASCII(printout_mode_choice->choice, kNormalGray) || + EqualsCaseInsensitiveASCII(printout_mode_choice->choice, kHighGray) || + EqualsCaseInsensitiveASCII(printout_mode_choice->choice, kDraftGray)) { *color_model_for_black = PRINTOUTMODE_NORMAL_GRAY; *color_is_default = false; } @@ -248,11 +251,15 @@ if (!color_mode_option) return false; - if (ppdFindChoice(color_mode_option, kColor)) + if (ppdFindChoice(color_mode_option, kColor) || + ppdFindChoice(color_mode_option, kSamsungColorTrue)) { *color_model_for_color = COLORMODE_COLOR; + } - if (ppdFindChoice(color_mode_option, kMonochrome)) + if (ppdFindChoice(color_mode_option, kMonochrome) || + ppdFindChoice(color_mode_option, kSamsungColorFalse)) { *color_model_for_black = COLORMODE_MONOCHROME; + } ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode); if (!mode_choice) { @@ -262,7 +269,8 @@ if (mode_choice) { *color_is_default = - base::EqualsCaseInsensitiveASCII(mode_choice->choice, kColor); + EqualsCaseInsensitiveASCII(mode_choice->choice, kColor) || + EqualsCaseInsensitiveASCII(mode_choice->choice, kSamsungColorTrue); } return true; } @@ -296,8 +304,8 @@ } if (marked_choice) { *color_is_default = - !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kBlack) && - !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kMono); + !EqualsCaseInsensitiveASCII(marked_choice->choice, kBlack) && + !EqualsCaseInsensitiveASCII(marked_choice->choice, kMono); } return true; } @@ -322,8 +330,7 @@ color_mode_option->defchoice); } if (mode_choice) { - *color_is_default = - base::EqualsCaseInsensitiveASCII(mode_choice->choice, kColor); + *color_is_default = EqualsCaseInsensitiveASCII(mode_choice->choice, kColor); } return true; } @@ -353,7 +360,7 @@ if (mode_choice) { *color_is_default = - !base::EqualsCaseInsensitiveASCII(mode_choice->choice, kGreyscale); + !EqualsCaseInsensitiveASCII(mode_choice->choice, kGreyscale); } return true; }
diff --git a/printing/backend/cups_helper_unittest.cc b/printing/backend/cups_helper_unittest.cc index 4aaf7ef..7e300310 100644 --- a/printing/backend/cups_helper_unittest.cc +++ b/printing/backend/cups_helper_unittest.cc
@@ -172,7 +172,6 @@ const char kTestPpdData[] = "*PPD-Adobe: \"4.3\"\n\n" "*OpenUI *PageSize: PickOne\n" - "*OrderDependency: 30 AnySetup *PageSize\n" "*DefaultPageSize: Letter\n" "*PageSize Letter/US Letter: \"" " <</DeferredMediaSelection true /PageSize [612 792] " @@ -242,7 +241,6 @@ "*PPD-Adobe: \"4.3\"\n\n" "*ColorDevice: True\n" "*OpenUI *BRDuplex/Two-Sided Printing: PickOne\n" - "*OrderDependency: 25 AnySetup *BRDuplex\n" "*DefaultBRDuplex: DuplexTumble\n" "*BRDuplex DuplexTumble/Short-Edge Binding: \"\"\n" "*BRDuplex DuplexNoTumble/Long-Edge Binding: \"\"\n" @@ -255,3 +253,23 @@ EXPECT_EQ(printing::SHORT_EDGE, caps.duplex_default); } } + +TEST(PrintBackendCupsHelperTest, TestPpdParsingSamsungPrinters) { + { + const char kTestPpdData[] = + "*PPD-Adobe: \"4.3\"\n\n" + "*ColorDevice: True\n" + "*OpenUI *ColorMode/Color Mode: Boolean\n" + "*DefaultColorMode: True\n" + "*ColorMode False/Grayscale: \"\"\n" + "*ColorMode True/Color: \"\"\n" + "*CloseUI: *ColorMode\n\n"; + + printing::PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(printing::COLORMODE_COLOR, caps.color_model); + EXPECT_EQ(printing::COLORMODE_MONOCHROME, caps.bw_model); + } +}
diff --git a/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java b/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java index 0fda299..2a6e277 100644 --- a/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java +++ b/remoting/android/java/src/org/chromium/chromoting/help/CreditsActivity.java
@@ -4,11 +4,14 @@ package org.chromium.chromoting.help; +import android.annotation.TargetApi; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -36,13 +39,24 @@ webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient() { - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { + private boolean shouldOverrideUrlLoading(final Uri uri) { // There are no internal links in the Credits page, so open any links in a // Web browser. - ChromotingUtil.openUrl(CreditsActivity.this, Uri.parse(url)); + ChromotingUtil.openUrl(CreditsActivity.this, uri); return true; } + + @TargetApi(Build.VERSION_CODES.N) + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldOverrideUrlLoading(request.getUrl()); + } + + @SuppressWarnings("deprecation") + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return shouldOverrideUrlLoading(Uri.parse(url)); + } }); webView.loadUrl(CREDITS_URL); }
diff --git a/remoting/android/java/src/org/chromium/chromoting/help/HelpActivity.java b/remoting/android/java/src/org/chromium/chromoting/help/HelpActivity.java index 45d4a87..79bc700 100644 --- a/remoting/android/java/src/org/chromium/chromoting/help/HelpActivity.java +++ b/remoting/android/java/src/org/chromium/chromoting/help/HelpActivity.java
@@ -4,12 +4,14 @@ package org.chromium.chromoting.help; +import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -17,6 +19,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -86,10 +89,8 @@ mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new WebViewClient() { - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { + private boolean shouldOverrideUrlLoading(final Uri uri) { // Make sure any links to other websites open up in an external browser. - Uri uri = Uri.parse(url); String host = uri.getHost(); // Note that |host| might be null, so allow for this in the test for equality. @@ -99,6 +100,18 @@ ChromotingUtil.openUrl(HelpActivity.this, uri); return true; } + + @TargetApi(Build.VERSION_CODES.N) + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldOverrideUrlLoading(request.getUrl()); + } + + @SuppressWarnings("deprecation") + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return shouldOverrideUrlLoading(Uri.parse(url)); + } }); mWebView.loadUrl(initialUrl); }
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn index 2c68433..567d828e 100644 --- a/services/device/BUILD.gn +++ b/services/device/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/features.gni") import("//services/service_manager/public/cpp/service.gni") import("//services/service_manager/public/service_manifest.gni") @@ -17,6 +18,7 @@ deps = [ "//base", + "//device/battery:mojo_bindings", "//device/sensors", "//services/device/fingerprint", "//services/device/power_monitor", @@ -30,6 +32,9 @@ "//services/device/android/register_jni.cc", "//services/device/android/register_jni.h", ] + deps += [ ":device_service_jni_headers" ] + } else { + deps += [ "//device/battery" ] } } @@ -54,6 +59,12 @@ sources += [ "fingerprint/fingerprint_chromeos_unittest.cc" ] deps += [ "//services/device/fingerprint" ] } + + if (is_android) { + deps += [ ":device_service_jni_headers" ] + } else { + deps += [ "//device/battery" ] + } } service_manifest("manifest") { @@ -62,13 +73,28 @@ } if (is_android) { + generate_jni("device_service_jni_headers") { + sources = [ + "android/java/src/org/chromium/services/device/InterfaceRegistrar.java", + ] + jni_package = "device_service" + } + android_library("java") { java_files = [ + "android/java/src/org/chromium/services/device/InterfaceRegistrar.java", "screen_orientation/android/java/src/org/chromium/device/screen_orientation/ScreenOrientationListener.java", "time_zone_monitor/android/java/src/org/chromium/device/time_zone_monitor/TimeZoneMonitor.java", ] deps = [ "//base:base_java", + "//device/battery:mojo_bindings_java", + "//device/battery/android:battery_monitor_java", + "//mojo/android:system_java", + "//mojo/public/java:bindings_java", + "//mojo/public/java:system_java", + "//services/service_manager/public/interfaces:interfaces_java", + "//services/service_manager/public/java:service_manager_java", "//ui/android:ui_java", ] }
diff --git a/services/device/DEPS b/services/device/DEPS index 56fffa1..4d38b23c 100644 --- a/services/device/DEPS +++ b/services/device/DEPS
@@ -1,3 +1,4 @@ include_rules = [ "+device", + "+jni", ]
diff --git a/services/device/android/java/src/org/chromium/services/device/InterfaceRegistrar.java b/services/device/android/java/src/org/chromium/services/device/InterfaceRegistrar.java new file mode 100644 index 0000000..ef627a12 --- /dev/null +++ b/services/device/android/java/src/org/chromium/services/device/InterfaceRegistrar.java
@@ -0,0 +1,27 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.services.device; + +import android.content.Context; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.device.BatteryMonitor; +import org.chromium.device.battery.BatteryMonitorFactory; +import org.chromium.mojo.system.impl.CoreImpl; +import org.chromium.services.service_manager.InterfaceRegistry; + +@JNINamespace("device") +class InterfaceRegistrar { + @CalledByNative + static void createInterfaceRegistryForContext(int nativeHandle, Context applicationContext) { + // Note: The bindings code manages the lifetime of this object, so it + // is not necessary to hold on to a reference to it explicitly. + InterfaceRegistry registry = InterfaceRegistry.create( + CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle()); + registry.addInterface( + BatteryMonitor.MANAGER, new BatteryMonitorFactory(applicationContext)); + } +}
diff --git a/services/device/device_service.cc b/services/device/device_service.cc index a01f1f9..38f0aa2 100644 --- a/services/device/device_service.cc +++ b/services/device/device_service.cc
@@ -9,7 +9,11 @@ #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" +#include "device/battery/battery_monitor.mojom.h" +#include "device/battery/battery_monitor_impl.h" +#include "device/battery/battery_status_service.h" #include "device/sensors/device_sensor_host.h" +#include "mojo/public/cpp/system/message_pipe.h" #include "services/device/fingerprint/fingerprint.h" #include "services/device/power_monitor/power_monitor_message_broadcaster.h" #include "services/device/time_zone_monitor/time_zone_monitor.h" @@ -17,6 +21,9 @@ #include "services/service_manager/public/cpp/interface_registry.h" #if defined(OS_ANDROID) +#include "base/android/context_utils.h" +#include "base/android/jni_android.h" +#include "jni/InterfaceRegistrar_jni.h" #include "services/device/android/register_jni.h" #include "services/device/screen_orientation/screen_orientation_listener_android.h" #endif @@ -40,10 +47,19 @@ DeviceService::DeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) - : file_task_runner_(std::move(file_task_runner)), - io_task_runner_(std::move(io_task_runner)) {} + : +#if defined(OS_ANDROID) + java_interface_provider_initialized_(false), +#endif + file_task_runner_(std::move(file_task_runner)), + io_task_runner_(std::move(io_task_runner)) { +} -DeviceService::~DeviceService() {} +DeviceService::~DeviceService() { +#if !defined(OS_ANDROID) + device::BatteryStatusService::GetInstance()->Shutdown(); +#endif +} void DeviceService::OnStart() {} @@ -58,9 +74,23 @@ registry->AddInterface<mojom::ScreenOrientationListener>(this); registry->AddInterface<mojom::TimeZoneMonitor>(this); +#if defined(OS_ANDROID) + registry->AddInterface( + GetJavaInterfaceProvider()->CreateInterfaceFactory<BatteryMonitor>()); +#else + registry->AddInterface<BatteryMonitor>(this); +#endif + return true; } +#if !defined(OS_ANDROID) +void DeviceService::Create(const service_manager::Identity& remote_identity, + BatteryMonitorRequest request) { + device::BatteryMonitorImpl::Create(std::move(request)); +} +#endif + void DeviceService::Create(const service_manager::Identity& remote_identity, mojom::FingerprintRequest request) { Fingerprint::Create(std::move(request)); @@ -159,4 +189,21 @@ time_zone_monitor_->Bind(std::move(request)); } +#if defined(OS_ANDROID) +service_manager::InterfaceProvider* DeviceService::GetJavaInterfaceProvider() { + if (!java_interface_provider_initialized_) { + service_manager::mojom::InterfaceProviderPtr provider; + JNIEnv* env = base::android::AttachCurrentThread(); + Java_InterfaceRegistrar_createInterfaceRegistryForContext( + env, mojo::MakeRequest(&provider).PassMessagePipe().release().value(), + base::android::GetApplicationContext()); + java_interface_provider_.Bind(std::move(provider)); + + java_interface_provider_initialized_ = true; + } + + return &java_interface_provider_; +} +#endif + } // namespace device
diff --git a/services/device/device_service.h b/services/device/device_service.h index 7e9e44a..a51a397a 100644 --- a/services/device/device_service.h +++ b/services/device/device_service.h
@@ -6,14 +6,17 @@ #define SERVICES_DEVICE_DEVICE_SERVICE_H_ #include "base/memory/ref_counted.h" +#include "device/battery/battery_monitor.mojom.h" #include "device/screen_orientation/public/interfaces/screen_orientation.mojom.h" #include "device/sensors/public/interfaces/light.mojom.h" #include "device/sensors/public/interfaces/motion.mojom.h" #include "device/sensors/public/interfaces/orientation.mojom.h" +#include "mojo/public/cpp/bindings/binding_set.h" #include "services/device/public/interfaces/fingerprint.mojom.h" #include "services/device/public/interfaces/power_monitor.mojom.h" #include "services/device/public/interfaces/time_zone_monitor.mojom.h" #include "services/service_manager/public/cpp/interface_factory.h" +#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/service.h" namespace base { @@ -37,6 +40,10 @@ public service_manager::InterfaceFactory<mojom::OrientationSensor>, public service_manager::InterfaceFactory< mojom::OrientationAbsoluteSensor>, +#if !defined(OS_ANDROID) + // On Android the Device Service provides BatteryMonitor via Java. + public service_manager::InterfaceFactory<BatteryMonitor>, +#endif public service_manager::InterfaceFactory<mojom::PowerMonitor>, public service_manager::InterfaceFactory< mojom::ScreenOrientationListener>, @@ -72,6 +79,12 @@ void Create(const service_manager::Identity& remote_identity, mojom::OrientationAbsoluteSensorRequest request) override; +#if !defined(OS_ANDROID) + // InterfaceFactory<BatteryMonitor>: + void Create(const service_manager::Identity& remote_identity, + BatteryMonitorRequest request) override; +#endif + // InterfaceFactory<mojom::PowerMonitor>: void Create(const service_manager::Identity& remote_identity, mojom::PowerMonitorRequest request) override; @@ -87,6 +100,16 @@ std::unique_ptr<PowerMonitorMessageBroadcaster> power_monitor_message_broadcaster_; std::unique_ptr<TimeZoneMonitor> time_zone_monitor_; +#if defined(OS_ANDROID) + // Binds |java_interface_provider_| to an interface registry that exposes + // factories for the interfaces that are provided via Java on Android. + service_manager::InterfaceProvider* GetJavaInterfaceProvider(); + + // InterfaceProvider that is bound to the Java-side interface registry. + service_manager::InterfaceProvider java_interface_provider_; + + bool java_interface_provider_initialized_; +#endif scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
diff --git a/services/device/manifest.json b/services/device/manifest.json index b655cb84..54ec11cf 100644 --- a/services/device/manifest.json +++ b/services/device/manifest.json
@@ -4,6 +4,7 @@ "interface_provider_specs": { "service_manager:connector": { "provides": { + "device:battery_monitor": [ "device::BatteryMonitor" ], "device:fingerprint": [ "device::mojom::Fingerprint" ], "device:power_monitor": [ "device::mojom::PowerMonitor" ], "device:screen_orientation": [ "device::mojom::ScreenOrientationListener" ],
diff --git a/services/ui/ws/BUILD.gn b/services/ui/ws/BUILD.gn index 988cab5..53cac7d7 100644 --- a/services/ui/ws/BUILD.gn +++ b/services/ui/ws/BUILD.gn
@@ -49,6 +49,8 @@ "focus_controller_observer.h", "frame_generator.cc", "frame_generator.h", + "gpu_client.cc", + "gpu_client.h", "gpu_host.cc", "gpu_host.h", "gpu_host_delegate.h", @@ -238,6 +240,7 @@ "event_matcher_unittest.cc", "focus_controller_unittest.cc", "frame_generator_unittest.cc", + "gpu_host_unittest.cc", "server_window_drawn_tracker_unittest.cc", "test_server_window_delegate.cc", "test_server_window_delegate.h", @@ -276,6 +279,7 @@ "//services/service_manager/public/interfaces", "//services/ui/common:mus_common", "//services/ui/common:task_runner_test_base", + "//services/ui/gpu:gpu", "//services/ui/public/cpp", "//services/ui/public/interfaces", "//testing/gtest",
diff --git a/services/ui/ws/DEPS b/services/ui/ws/DEPS index f771ac8..9145166 100644 --- a/services/ui/ws/DEPS +++ b/services/ui/ws/DEPS
@@ -11,4 +11,7 @@ "gpu_host.h": [ "+services/ui/gpu/gpu_main.h", ], + "gpu_host_unittest.cc": [ + "+services/ui/gpu" + ], }
diff --git a/services/ui/ws/frame_generator.cc b/services/ui/ws/frame_generator.cc index ada6158..7b41aa83 100644 --- a/services/ui/ws/frame_generator.cc +++ b/services/ui/ws/frame_generator.cc
@@ -13,17 +13,14 @@ #include "cc/quads/render_pass_draw_quad.h" #include "cc/quads/shared_quad_state.h" #include "cc/quads/surface_draw_quad.h" -#include "services/ui/ws/server_window.h" namespace ui { namespace ws { FrameGenerator::FrameGenerator( - ServerWindow* root_window, std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink) - : root_window_(root_window), - compositor_frame_sink_(std::move(compositor_frame_sink)) { + : compositor_frame_sink_(std::move(compositor_frame_sink)) { compositor_frame_sink_->BindToClient(this); } @@ -35,8 +32,7 @@ if (device_scale_factor_ == device_scale_factor) return; device_scale_factor_ = device_scale_factor; - if (window_manager_surface_info_.is_valid()) - SetNeedsBeginFrame(true); + SetNeedsBeginFrame(true); } void FrameGenerator::SetHighContrastMode(bool enabled) { @@ -44,8 +40,7 @@ return; high_contrast_mode_enabled_ = enabled; - if (window_manager_surface_info_.is_valid()) - SetNeedsBeginFrame(true); + SetNeedsBeginFrame(true); } void FrameGenerator::OnSurfaceCreated(const cc::SurfaceInfo& surface_info) { @@ -60,8 +55,15 @@ } void FrameGenerator::OnWindowDamaged() { - if (window_manager_surface_info_.is_valid()) - SetNeedsBeginFrame(true); + SetNeedsBeginFrame(true); +} + +void FrameGenerator::OnWindowSizeChanged(const gfx::Size& pixel_size) { + if (pixel_size_ == pixel_size) + return; + + pixel_size_ = pixel_size; + SetNeedsBeginFrame(true); } void FrameGenerator::SetBeginFrameSource(cc::BeginFrameSource* source) { @@ -101,8 +103,7 @@ current_begin_frame_ack_ = cc::BeginFrameAck( begin_frame_args.source_id, begin_frame_args.sequence_number, begin_frame_args.sequence_number, 0, false); - if (!root_window_->visible() || - begin_frame_args.type == cc::BeginFrameArgs::MISSED) { + if (begin_frame_args.type == cc::BeginFrameArgs::MISSED) { begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); return; } @@ -111,7 +112,8 @@ last_begin_frame_args_ = begin_frame_args; // TODO(fsamuel): We should add a trace for generating a top level frame. - cc::CompositorFrame frame(GenerateCompositorFrame(root_window_->bounds())); + cc::CompositorFrame frame(GenerateCompositorFrame()); + compositor_frame_sink_->SubmitCompositorFrame(std::move(frame)); begin_frame_source_->DidFinishFrame(this, current_begin_frame_ack_); @@ -124,12 +126,11 @@ void FrameGenerator::OnBeginFrameSourcePausedChanged(bool paused) {} -cc::CompositorFrame FrameGenerator::GenerateCompositorFrame( - const gfx::Rect& output_rect) { +cc::CompositorFrame FrameGenerator::GenerateCompositorFrame() { const int render_pass_id = 1; + const gfx::Rect bounds(pixel_size_); std::unique_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); - render_pass->SetNew(render_pass_id, output_rect, output_rect, - gfx::Transform()); + render_pass->SetNew(render_pass_id, bounds, bounds, gfx::Transform()); DrawWindow(render_pass.get()); @@ -137,23 +138,22 @@ frame.render_pass_list.push_back(std::move(render_pass)); if (high_contrast_mode_enabled_) { std::unique_ptr<cc::RenderPass> invert_pass = cc::RenderPass::Create(); - invert_pass->SetNew(2, output_rect, output_rect, gfx::Transform()); + invert_pass->SetNew(2, bounds, bounds, gfx::Transform()); cc::SharedQuadState* shared_state = invert_pass->CreateAndAppendSharedQuadState(); gfx::Size scaled_bounds = gfx::ScaleToCeiledSize( - output_rect.size(), window_manager_surface_info_.device_scale_factor(), + pixel_size_, window_manager_surface_info_.device_scale_factor(), window_manager_surface_info_.device_scale_factor()); - shared_state->SetAll(gfx::Transform(), scaled_bounds, output_rect, - output_rect, false, 1.f, SkBlendMode::kSrcOver, 0); + shared_state->SetAll(gfx::Transform(), scaled_bounds, bounds, bounds, false, + 1.f, SkBlendMode::kSrcOver, 0); auto* quad = invert_pass->CreateAndAppendDrawQuad<cc::RenderPassDrawQuad>(); frame.render_pass_list.back()->filters.Append( cc::FilterOperation::CreateInvertFilter(1.f)); - quad->SetNew(shared_state, output_rect, output_rect, render_pass_id, - 0 /* mask_resource_id */, gfx::RectF() /* mask_uv_rect */, - gfx::Size() /* mask_texture_size */, - gfx::Vector2dF() /* filters_scale */, - gfx::PointF() /* filters_origin */, - gfx::RectF() /* tex_coord_rect */); + quad->SetNew( + shared_state, bounds, bounds, render_pass_id, 0 /* mask_resource_id */, + gfx::RectF() /* mask_uv_rect */, gfx::Size() /* mask_texture_size */, + gfx::Vector2dF() /* filters_scale */, + gfx::PointF() /* filters_origin */, gfx::RectF() /* tex_coord_rect */); frame.render_pass_list.push_back(std::move(invert_pass)); } frame.metadata.device_scale_factor = device_scale_factor_; @@ -199,6 +199,7 @@ } void FrameGenerator::SetNeedsBeginFrame(bool needs_begin_frame) { + needs_begin_frame &= window_manager_surface_info_.is_valid(); if (needs_begin_frame == observing_begin_frames_) return;
diff --git a/services/ui/ws/frame_generator.h b/services/ui/ws/frame_generator.h index ea5887ea..5d6666e 100644 --- a/services/ui/ws/frame_generator.h +++ b/services/ui/ws/frame_generator.h
@@ -8,17 +8,12 @@ #include <memory> #include "base/macros.h" -#include "base/timer/timer.h" -#include "cc/ipc/display_compositor.mojom.h" +#include "cc/output/compositor_frame.h" #include "cc/output/compositor_frame_sink_client.h" #include "cc/scheduler/begin_frame_source.h" -#include "cc/surfaces/frame_sink_id.h" -#include "cc/surfaces/local_surface_id_allocator.h" #include "cc/surfaces/surface_id.h" -#include "cc/surfaces/surface_reference.h" -#include "services/ui/public/interfaces/window_tree_constants.mojom.h" +#include "cc/surfaces/surface_info.h" #include "ui/gfx/geometry/rect.h" -#include "ui/gfx/native_widget_types.h" namespace cc { class CompositorFrameSink; @@ -28,15 +23,12 @@ namespace ui { namespace ws { -class ServerWindow; - // Responsible for redrawing the display in response to the redraw requests by // submitting CompositorFrames to the owned CompositorFrameSink. class FrameGenerator : public cc::CompositorFrameSinkClient, public cc::BeginFrameObserver { public: - FrameGenerator( - ServerWindow* root_window, + explicit FrameGenerator( std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink); ~FrameGenerator() override; @@ -47,6 +39,7 @@ void OnSurfaceCreated(const cc::SurfaceInfo& surface_info); void OnWindowDamaged(); + void OnWindowSizeChanged(const gfx::Size& pixel_size); private: // cc::CompositorFrameSinkClient implementation: @@ -69,7 +62,7 @@ void OnBeginFrameSourcePausedChanged(bool paused) override; // Generates the CompositorFrame. - cc::CompositorFrame GenerateCompositorFrame(const gfx::Rect& output_rect); + cc::CompositorFrame GenerateCompositorFrame(); // DrawWindow creates SurfaceDrawQuad for the window manager and appends it to // the provided cc::RenderPass. @@ -79,8 +72,8 @@ // FrameGenerator as an observer to/from begin_frame_source_ accordingly. void SetNeedsBeginFrame(bool needs_begin_frame); - ServerWindow* const root_window_; float device_scale_factor_ = 1.f; + gfx::Size pixel_size_; std::unique_ptr<cc::CompositorFrameSink> compositor_frame_sink_; cc::BeginFrameArgs last_begin_frame_args_;
diff --git a/services/ui/ws/frame_generator_unittest.cc b/services/ui/ws/frame_generator_unittest.cc index 24326998..86d4508 100644 --- a/services/ui/ws/frame_generator_unittest.cc +++ b/services/ui/ws/frame_generator_unittest.cc
@@ -154,13 +154,25 @@ kRefreshRate, kTickAutomatically); compositor_frame_sink_->SetBeginFrameSource(begin_frame_source_.get()); server_window_delegate_ = base::MakeUnique<TestServerWindowDelegate>(); - root_window_ = base::MakeUnique<ServerWindow>(server_window_delegate_.get(), - WindowId()); - root_window_->SetVisible(true); - frame_generator_ = base::MakeUnique<FrameGenerator>( - root_window_.get(), std::move(compositor_frame_sink)); + frame_generator_ = + base::MakeUnique<FrameGenerator>(std::move(compositor_frame_sink)); + frame_generator_->OnWindowSizeChanged(gfx::Size(1, 2)); }; + void InitWithSurfaceInfo() { + // FrameGenerator requires a valid SurfaceInfo before generating + // CompositorFrames. + const cc::SurfaceId kArbitrarySurfaceId( + cc::FrameSinkId(1, 1), + cc::LocalSurfaceId(1, base::UnguessableToken::Create())); + const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, + gfx::Size(100, 100)); + + frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); + IssueBeginFrame(); + EXPECT_EQ(1, NumberOfFramesReceived()); + } + int NumberOfFramesReceived() { return compositor_frame_sink_->number_frames_received(); } @@ -185,19 +197,25 @@ return begin_frame_source_->LastAckForObserver(compositor_frame_sink_); } - ServerWindow* root_window() { return root_window_.get(); } - private: FakeCompositorFrameSink* compositor_frame_sink_ = nullptr; std::unique_ptr<cc::FakeExternalBeginFrameSource> begin_frame_source_; std::unique_ptr<TestServerWindowDelegate> server_window_delegate_; - std::unique_ptr<ServerWindow> root_window_; std::unique_ptr<FrameGenerator> frame_generator_; int next_sequence_number_ = 1; DISALLOW_COPY_AND_ASSIGN(FrameGeneratorTest); }; +TEST_F(FrameGeneratorTest, InvalidSurfaceInfo) { + // After SetUP(), frame_generator() has its |is_window_visible_| set to true + // and |bounds_| to an arbitrary non-empty gfx::Rect but not a valid + // SurfaceInfo. frame_generator() should not request BeginFrames in this + // state. + IssueBeginFrame(); + EXPECT_EQ(0, NumberOfFramesReceived()); +} + TEST_F(FrameGeneratorTest, OnSurfaceCreated) { EXPECT_EQ(0, NumberOfFramesReceived()); @@ -236,33 +254,6 @@ EXPECT_EQ(expected_ack, LastBeginFrameAck()); } -TEST_F(FrameGeneratorTest, BeginFrameWhileInvisible) { - EXPECT_EQ(0, NumberOfFramesReceived()); - - // A valid SurfaceInfo is required for BeginFrame processing. - const cc::SurfaceId kArbitrarySurfaceId( - cc::FrameSinkId(1, 1), - cc::LocalSurfaceId(1, base::UnguessableToken::Create())); - const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, - gfx::Size(100, 100)); - frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); - EXPECT_EQ(0, NumberOfFramesReceived()); - - // No frames are produced while invisible but in need of BeginFrames. - root_window()->SetVisible(false); - IssueBeginFrame(); - EXPECT_EQ(0, NumberOfFramesReceived()); - EXPECT_EQ(cc::BeginFrameAck(0, 1, 1, 0, false), LastBeginFrameAck()); - - // When visible again, a frame is produced. - root_window()->SetVisible(true); - IssueBeginFrame(); - EXPECT_EQ(1, NumberOfFramesReceived()); - cc::BeginFrameAck expected_ack(0, 2, 2, 0, true); - EXPECT_EQ(expected_ack, LastBeginFrameAck()); - EXPECT_EQ(expected_ack, LastMetadata().begin_frame_ack); -} - TEST_F(FrameGeneratorTest, SetDeviceScaleFactor) { EXPECT_EQ(0, NumberOfFramesReceived()); const cc::SurfaceId kArbitrarySurfaceId( @@ -298,16 +289,7 @@ } TEST_F(FrameGeneratorTest, SetHighContrastMode) { - // FrameGenerator requires a valid SurfaceInfo before generating - // CompositorFrames. - const cc::SurfaceId kArbitrarySurfaceId( - cc::FrameSinkId(1, 1), - cc::LocalSurfaceId(1, base::UnguessableToken::Create())); - const cc::SurfaceInfo kArbitrarySurfaceInfo(kArbitrarySurfaceId, 1.0f, - gfx::Size(100, 100)); - frame_generator()->OnSurfaceCreated(kArbitrarySurfaceInfo); - IssueBeginFrame(); - EXPECT_EQ(1, NumberOfFramesReceived()); + InitWithSurfaceInfo(); // Changing high contrast mode should trigger a BeginFrame. frame_generator()->SetHighContrastMode(true); @@ -321,6 +303,50 @@ EXPECT_EQ(expected_filters, render_pass_list.front()->filters); } +TEST_F(FrameGeneratorTest, WindowBoundsChanged) { + InitWithSurfaceInfo(); + + // Window bounds change triggers a BeginFrame. + constexpr int expected_render_pass_id = 1; + const gfx::Size kArbitrarySize(3, 4); + frame_generator()->OnWindowSizeChanged(kArbitrarySize); + IssueBeginFrame(); + EXPECT_EQ(2, NumberOfFramesReceived()); + cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); + EXPECT_EQ(expected_render_pass_id, received_render_pass->id); + EXPECT_EQ(kArbitrarySize, received_render_pass->output_rect.size()); + EXPECT_EQ(kArbitrarySize, received_render_pass->damage_rect.size()); + EXPECT_EQ(gfx::Transform(), received_render_pass->transform_to_root_target); +} + +// Change window bounds twice before issuing a BeginFrame. The CompositorFrame +// submitted by frame_generator() should only has the second bounds. +TEST_F(FrameGeneratorTest, WindowBoundsChangedTwice) { + InitWithSurfaceInfo(); + + const gfx::Size kArbitrarySize(3, 4); + const gfx::Size kAnotherArbitrarySize(5, 6); + frame_generator()->OnWindowSizeChanged(kArbitrarySize); + frame_generator()->OnWindowSizeChanged(kAnotherArbitrarySize); + IssueBeginFrame(); + EXPECT_EQ(2, NumberOfFramesReceived()); + cc::RenderPass* received_render_pass = LastRenderPassList().front().get(); + EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->output_rect.size()); + EXPECT_EQ(kAnotherArbitrarySize, received_render_pass->damage_rect.size()); + + // frame_generator() stops requesting BeginFrames after getting one. + IssueBeginFrame(); + EXPECT_EQ(2, NumberOfFramesReceived()); +} + +TEST_F(FrameGeneratorTest, WindowDamaged) { + InitWithSurfaceInfo(); + + frame_generator()->OnWindowDamaged(); + IssueBeginFrame(); + EXPECT_EQ(2, NumberOfFramesReceived()); +} + } // namespace test } // namespace ws } // namespace ui
diff --git a/services/ui/ws/gpu_client.cc b/services/ui/ws/gpu_client.cc new file mode 100644 index 0000000..c0ec4e6 --- /dev/null +++ b/services/ui/ws/gpu_client.cc
@@ -0,0 +1,67 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/ui/ws/gpu_client.h" + +#include "services/ui/common/server_gpu_memory_buffer_manager.h" +#include "services/ui/gpu/interfaces/gpu_service.mojom.h" + +namespace ui { +namespace ws { + +GpuClient::GpuClient(int client_id, + gpu::GPUInfo* gpu_info, + ServerGpuMemoryBufferManager* gpu_memory_buffer_manager, + mojom::GpuService* gpu_service) + : client_id_(client_id), + gpu_info_(gpu_info), + gpu_memory_buffer_manager_(gpu_memory_buffer_manager), + gpu_service_(gpu_service), + weak_factory_(this) { + DCHECK(gpu_memory_buffer_manager_); + DCHECK(gpu_service_); +} + +GpuClient::~GpuClient() { + gpu_memory_buffer_manager_->DestroyAllGpuMemoryBufferForClient(client_id_); +} + +void GpuClient::OnGpuChannelEstablished( + const EstablishGpuChannelCallback& callback, + mojo::ScopedMessagePipeHandle channel_handle) { + callback.Run(client_id_, std::move(channel_handle), *gpu_info_); +} + +// mojom::Gpu overrides: +void GpuClient::EstablishGpuChannel( + const EstablishGpuChannelCallback& callback) { + // TODO(sad): crbug.com/617415 figure out how to generate a meaningful + // tracing id. + const uint64_t client_tracing_id = 0; + constexpr bool is_gpu_host = false; + gpu_service_->EstablishGpuChannel( + client_id_, client_tracing_id, is_gpu_host, + base::Bind(&GpuClient::OnGpuChannelEstablished, + weak_factory_.GetWeakPtr(), callback)); +} + +void GpuClient::CreateGpuMemoryBuffer( + gfx::GpuMemoryBufferId id, + const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferUsage usage, + const mojom::Gpu::CreateGpuMemoryBufferCallback& callback) { + auto handle = gpu_memory_buffer_manager_->CreateGpuMemoryBufferHandle( + id, client_id_, size, format, usage, gpu::kNullSurfaceHandle); + callback.Run(handle); +} + +void GpuClient::DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, + const gpu::SyncToken& sync_token) { + gpu_memory_buffer_manager_->DestroyGpuMemoryBuffer(id, client_id_, + sync_token); +} + +} // namespace ws +} // namespace ui
diff --git a/services/ui/ws/gpu_client.h b/services/ui/ws/gpu_client.h new file mode 100644 index 0000000..ac5f072 --- /dev/null +++ b/services/ui/ws/gpu_client.h
@@ -0,0 +1,69 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_UI_WS_GPU_CLIENT_H_ +#define SERVICES_UI_WS_GPU_CLIENT_H_ + +#include "base/memory/weak_ptr.h" +#include "gpu/config/gpu_info.h" +#include "services/ui/public/interfaces/gpu.mojom.h" + +namespace ui { + +namespace mojom { +class GpuService; +} // namespace mojom + +class ServerGpuMemoryBufferManager; + +namespace ws { + +namespace test { +class GpuHostTest; +} // namespace test + +// The implementation that relays requests from clients to the real +// service implementation in the GPU process over mojom.GpuService. +class GpuClient : public mojom::Gpu { + public: + GpuClient(int client_id, + gpu::GPUInfo* gpu_info, + ServerGpuMemoryBufferManager* gpu_memory_buffer_manager, + mojom::GpuService* gpu_service); + ~GpuClient() override; + + private: + friend class test::GpuHostTest; + + // EstablishGpuChannelCallback: + void OnGpuChannelEstablished(const EstablishGpuChannelCallback& callback, + mojo::ScopedMessagePipeHandle channel_handle); + // mojom::Gpu overrides: + void EstablishGpuChannel( + const EstablishGpuChannelCallback& callback) override; + void CreateGpuMemoryBuffer( + gfx::GpuMemoryBufferId id, + const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferUsage usage, + const mojom::Gpu::CreateGpuMemoryBufferCallback& callback) override; + void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, + const gpu::SyncToken& sync_token) override; + + const int client_id_; + + // The objects these pointers refer to are owned by the GpuHost object. + const gpu::GPUInfo* gpu_info_; + ServerGpuMemoryBufferManager* gpu_memory_buffer_manager_; + mojom::GpuService* gpu_service_; + + base::WeakPtrFactory<GpuClient> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(GpuClient); +}; + +} // namespace ws +} // namespace ui + +#endif // SERVICES_UI_WS_GPU_CLIENT_H_
diff --git a/services/ui/ws/gpu_host.cc b/services/ui/ws/gpu_host.cc index 76fe6d8..1414fe28 100644 --- a/services/ui/ws/gpu_host.cc +++ b/services/ui/ws/gpu_host.cc
@@ -16,6 +16,7 @@ #include "mojo/public/cpp/system/platform_handle.h" #include "services/service_manager/public/cpp/connection.h" #include "services/ui/common/server_gpu_memory_buffer_manager.h" +#include "services/ui/ws/gpu_client.h" #include "services/ui/ws/gpu_host_delegate.h" #include "ui/gfx/buffer_format_util.h" @@ -31,71 +32,6 @@ // The client Id 1 is reserved for the display compositor. const int32_t kInternalGpuChannelClientId = 2; -// The implementation that relays requests from clients to the real -// service implementation in the GPU process over mojom.GpuService. -class GpuClient : public mojom::Gpu { - public: - GpuClient(int client_id, - gpu::GPUInfo* gpu_info, - ServerGpuMemoryBufferManager* gpu_memory_buffer_manager, - mojom::GpuService* gpu_service) - : client_id_(client_id), - gpu_info_(gpu_info), - gpu_memory_buffer_manager_(gpu_memory_buffer_manager), - gpu_service_(gpu_service) { - DCHECK(gpu_memory_buffer_manager_); - DCHECK(gpu_service_); - } - ~GpuClient() override { - gpu_memory_buffer_manager_->DestroyAllGpuMemoryBufferForClient(client_id_); - } - - private: - void OnGpuChannelEstablished(const EstablishGpuChannelCallback& callback, - mojo::ScopedMessagePipeHandle channel_handle) { - callback.Run(client_id_, std::move(channel_handle), *gpu_info_); - } - - // mojom::Gpu overrides: - void EstablishGpuChannel( - const EstablishGpuChannelCallback& callback) override { - // TODO(sad): crbug.com/617415 figure out how to generate a meaningful - // tracing id. - const uint64_t client_tracing_id = 0; - constexpr bool is_gpu_host = false; - gpu_service_->EstablishGpuChannel( - client_id_, client_tracing_id, is_gpu_host, - base::Bind(&GpuClient::OnGpuChannelEstablished, base::Unretained(this), - callback)); - } - - void CreateGpuMemoryBuffer( - gfx::GpuMemoryBufferId id, - const gfx::Size& size, - gfx::BufferFormat format, - gfx::BufferUsage usage, - const mojom::Gpu::CreateGpuMemoryBufferCallback& callback) override { - auto handle = gpu_memory_buffer_manager_->CreateGpuMemoryBufferHandle( - id, client_id_, size, format, usage, gpu::kNullSurfaceHandle); - callback.Run(handle); - } - - void DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, - const gpu::SyncToken& sync_token) override { - gpu_memory_buffer_manager_->DestroyGpuMemoryBuffer(id, client_id_, - sync_token); - } - - const int client_id_; - - // The objects these pointers refer to are owned by the GpuHost object. - const gpu::GPUInfo* gpu_info_; - ServerGpuMemoryBufferManager* gpu_memory_buffer_manager_; - mojom::GpuService* gpu_service_; - - DISALLOW_COPY_AND_ASSIGN(GpuClient); -}; - } // namespace GpuHost::GpuHost(GpuHostDelegate* delegate) @@ -121,11 +57,7 @@ GpuHost::~GpuHost() {} void GpuHost::Add(mojom::GpuRequest request) { - mojo::MakeStrongBinding( - base::MakeUnique<GpuClient>(next_client_id_++, &gpu_info_, - gpu_memory_buffer_manager_.get(), - gpu_service_.get()), - std::move(request)); + AddInternal(std::move(request)); } void GpuHost::OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) { @@ -146,6 +78,15 @@ gpu_main_->CreateDisplayCompositor(std::move(request), std::move(client)); } +GpuClient* GpuHost::AddInternal(mojom::GpuRequest request) { + auto client(base::MakeUnique<GpuClient>(next_client_id_++, &gpu_info_, + gpu_memory_buffer_manager_.get(), + gpu_service_.get())); + GpuClient* client_ref = client.get(); + gpu_bindings_.AddBinding(std::move(client), std::move(request)); + return client_ref; +} + void GpuHost::OnBadMessageFromGpu() { // TODO(sad): Received some unexpected message from the gpu process. We // should kill the process and restart it.
diff --git a/services/ui/ws/gpu_host.h b/services/ui/ws/gpu_host.h index d967b06c..247ff63 100644 --- a/services/ui/ws/gpu_host.h +++ b/services/ui/ws/gpu_host.h
@@ -12,6 +12,7 @@ #include "gpu/ipc/client/gpu_channel_host.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/bindings/strong_binding_set.h" #include "services/ui/gpu/gpu_main.h" #include "services/ui/gpu/interfaces/gpu_host.mojom.h" #include "services/ui/gpu/interfaces/gpu_service.mojom.h" @@ -23,6 +24,12 @@ namespace ws { +class GpuClient; + +namespace test { +class GpuHostTest; +} // namespace test + class GpuHostDelegate; // Sets up connection from clients to the real service implementation in the GPU @@ -42,6 +49,9 @@ cc::mojom::DisplayCompositorClientPtr client); private: + friend class test::GpuHostTest; + + GpuClient* AddInternal(mojom::GpuRequest request); void OnBadMessageFromGpu(); // mojom::GpuHost: @@ -75,6 +85,8 @@ // because that will live in another process soon. std::unique_ptr<GpuMain> gpu_main_impl_; + mojo::StrongBindingSet<mojom::Gpu> gpu_bindings_; + DISALLOW_COPY_AND_ASSIGN(GpuHost); };
diff --git a/services/ui/ws/gpu_host_unittest.cc b/services/ui/ws/gpu_host_unittest.cc new file mode 100644 index 0000000..9b4b338e --- /dev/null +++ b/services/ui/ws/gpu_host_unittest.cc
@@ -0,0 +1,120 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/ui/ws/gpu_host.h" + +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/memory/weak_ptr.h" +#include "base/message_loop/message_loop.h" +#include "gpu/config/gpu_info.h" +#include "services/ui/gpu/gpu_service.h" +#include "services/ui/public/interfaces/gpu.mojom.h" +#include "services/ui/ws/gpu_client.h" +#include "services/ui/ws/gpu_host_delegate.h" + +#if defined(USE_X11) +#include <X11/Xlib.h> +#undef None +#undef Bool +#endif // USE_X11 + +#include "testing/gtest/include/gtest/gtest.h" + +namespace ui { +namespace ws { +namespace test { +namespace { + +// No-opt implementation of GpuHostDelegate. +class TestGpuHostDelegate : public GpuHostDelegate { + public: + TestGpuHostDelegate() {} + ~TestGpuHostDelegate() override {} + + // GpuHostDelegate: + void OnGpuServiceInitialized() override {} + + private: + DISALLOW_COPY_AND_ASSIGN(TestGpuHostDelegate); +}; + +// Test implementation of GpuService. For testing behaviour of calls made by +// GpuClient +class TestGpuService : public GpuService { + public: + TestGpuService(); + ~TestGpuService() override {} + + private: + DISALLOW_COPY_AND_ASSIGN(TestGpuService); +}; + +TestGpuService::TestGpuService() + : GpuService(gpu::GPUInfo(), + nullptr, + nullptr, + base::ThreadTaskRunnerHandle::Get(), + gpu::GpuFeatureInfo()) {} + +} // namespace + +class GpuHostTest : public testing::Test { + public: + GpuHostTest() {} + ~GpuHostTest() override {} + + GpuHost* gpu_host() { return gpu_host_.get(); } + + base::WeakPtr<GpuClient> AddGpuClient(); + void DestroyHost(); + + // testing::Test + void SetUp() override; + + private: + base::MessageLoop message_loop_; + + base::WeakPtr<GpuClient> client_ref_; + + TestGpuHostDelegate gpu_host_delegate_; + TestGpuService gpu_service_; + ui::mojom::GpuServicePtr gpu_service_ptr_; + std::unique_ptr<GpuHost> gpu_host_; + + DISALLOW_COPY_AND_ASSIGN(GpuHostTest); +}; + +base::WeakPtr<GpuClient> GpuHostTest::AddGpuClient() { + mojom::GpuRequest request; + GpuClient* client = gpu_host_->AddInternal(std::move(request)); + return client->weak_factory_.GetWeakPtr(); +} + +void GpuHostTest::DestroyHost() { + gpu_host_.reset(); +} + +void GpuHostTest::SetUp() { + testing::Test::SetUp(); + gpu_host_ = base::MakeUnique<GpuHost>(&gpu_host_delegate_); + + ui::mojom::GpuServiceRequest request(&gpu_service_ptr_); + gpu_service_.Bind(std::move(request)); + gpu_host_->gpu_service_ = std::move(gpu_service_ptr_); +} + +// Tests to verify, that if a GpuHost is deleted before GpuClient receives a +// callback, that GpuClient is torn down and does not attempt to use GpuInfo +// after deletion. This should not crash on asan-builds. +TEST_F(GpuHostTest, GpuClientDestructionOrder) { + base::WeakPtr<GpuClient> client_ref = AddGpuClient(); + EXPECT_NE(nullptr, client_ref); + DestroyHost(); + EXPECT_EQ(nullptr, client_ref); +} + +} // namespace test +} // namespace ws +} // namespace ui
diff --git a/services/ui/ws/platform_display_default.cc b/services/ui/ws/platform_display_default.cc index 4325355..09d5e31 100644 --- a/services/ui/ws/platform_display_default.cc +++ b/services/ui/ws/platform_display_default.cc
@@ -37,8 +37,7 @@ image_cursors_(new ImageCursors), #endif metrics_(metrics), - widget_(gfx::kNullAcceleratedWidget), - init_device_scale_factor_(metrics.device_scale_factor) { + widget_(gfx::kNullAcceleratedWidget) { } PlatformDisplayDefault::~PlatformDisplayDefault() { @@ -141,8 +140,10 @@ } metrics_ = metrics; - if (frame_generator_) + if (frame_generator_) { frame_generator_->SetDeviceScaleFactor(metrics_.device_scale_factor); + frame_generator_->OnWindowSizeChanged(metrics_.bounds_in_pixels.size()); + } return true; } @@ -265,8 +266,9 @@ std::move(display_private), std::move(compositor_frame_sink_client_request)); frame_generator_ = base::MakeUnique<FrameGenerator>( - root_window_, std::move(display_client_compositor_frame_sink)); - frame_generator_->SetDeviceScaleFactor(init_device_scale_factor_); + std::move(display_client_compositor_frame_sink)); + frame_generator_->OnWindowSizeChanged(root_window_->bounds().size()); + frame_generator_->SetDeviceScaleFactor(metrics_.device_scale_factor); } void PlatformDisplayDefault::OnAcceleratedWidgetDestroyed() {
diff --git a/services/ui/ws/platform_display_default.h b/services/ui/ws/platform_display_default.h index f659136..393c36e 100644 --- a/services/ui/ws/platform_display_default.h +++ b/services/ui/ws/platform_display_default.h
@@ -82,7 +82,6 @@ display::ViewportMetrics metrics_; std::unique_ptr<ui::PlatformWindow> platform_window_; gfx::AcceleratedWidget widget_; - float init_device_scale_factor_; DISALLOW_COPY_AND_ASSIGN(PlatformDisplayDefault); };
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index f1f8b4f..1038725bd 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -196,37 +196,63 @@ "config/sk_ref_cnt_ext_debug.h", "config/sk_ref_cnt_ext_release.h", "ext/SkDiscardableMemory_chrome.cc", + "ext/SkDiscardableMemory_chrome.h", "ext/SkMemory_new_handler.cpp", "ext/analysis_canvas.cc", + "ext/analysis_canvas.h", "ext/benchmarking_canvas.cc", + "ext/benchmarking_canvas.h", "ext/convolver.cc", + "ext/convolver.h", "ext/event_tracer_impl.cc", + "ext/event_tracer_impl.h", "ext/fontmgr_default_android.cc", + "ext/fontmgr_default_android.h", "ext/fontmgr_default_linux.cc", + "ext/fontmgr_default_linux.h", "ext/fontmgr_default_win.cc", + "ext/fontmgr_default_win.h", "ext/google_logging.cc", "ext/image_operations.cc", + "ext/image_operations.h", "ext/opacity_filter_canvas.cc", + "ext/opacity_filter_canvas.h", "ext/recursive_gaussian_convolution.cc", + "ext/recursive_gaussian_convolution.h", "ext/skia_encode_image.cc", "ext/skia_encode_image.h", "ext/skia_histogram.cc", + "ext/skia_histogram.h", "ext/skia_memory_dump_provider.cc", + "ext/skia_memory_dump_provider.h", "ext/skia_trace_memory_dump_impl.cc", + "ext/skia_trace_memory_dump_impl.h", "ext/skia_utils_base.cc", + "ext/skia_utils_base.h", "ext/skia_utils_ios.h", "ext/skia_utils_ios.mm", + "ext/skia_utils_mac.h", "ext/skia_utils_mac.mm", "ext/skia_utils_win.cc", + "ext/skia_utils_win.h", ] if (!is_ios) { - sources += [ "ext/platform_canvas.cc" ] + sources += [ + "ext/platform_canvas.cc", + "ext/platform_canvas.h", + ] } if (!is_ios && (current_cpu == "x86" || current_cpu == "x64")) { - sources += [ "ext/convolver_SSE2.cc" ] + sources += [ + "ext/convolver_SSE2.cc", + "ext/convolver_SSE2.h", + ] } else if (current_cpu == "mipsel" && mips_dsp_rev >= 2) { - sources += [ "ext/convolver_mips_dspr2.cc" ] + sources += [ + "ext/convolver_mips_dspr2.cc", + "ext/convolver_mips_dspr2.h", + ] } # The imported Skia gni source paths are made absolute by gn. @@ -294,7 +320,10 @@ } if (is_android && (!enable_basic_printing && !enable_print_preview)) { - sources -= [ "ext/skia_utils_base.cc" ] + sources -= [ + "ext/skia_utils_base.cc", + "ext/skia_utils_base.h", + ] } # Select Skia ports.
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 6044125..a8845cb 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -380,7 +380,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -413,7 +413,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -446,7 +446,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -482,7 +482,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -515,7 +515,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -548,7 +548,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -584,7 +584,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -620,7 +620,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -653,7 +653,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -686,7 +686,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -719,7 +719,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -755,7 +755,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -788,7 +788,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -821,7 +821,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -854,7 +854,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -887,7 +887,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -920,7 +920,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -953,7 +953,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -986,7 +986,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1019,7 +1019,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1052,7 +1052,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1085,7 +1085,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1118,7 +1118,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1154,7 +1154,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1187,7 +1187,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1220,7 +1220,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1253,7 +1253,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1286,7 +1286,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1319,7 +1319,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1352,7 +1352,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1385,7 +1385,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 112721d..44497469 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -17,7 +17,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -49,7 +49,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -80,7 +80,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -111,7 +111,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -143,7 +143,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -174,7 +174,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -205,7 +205,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -239,7 +239,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -271,7 +271,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -302,7 +302,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -336,7 +336,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -368,7 +368,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -399,7 +399,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -430,7 +430,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -461,7 +461,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -492,7 +492,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -523,7 +523,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -555,7 +555,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -586,7 +586,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -617,7 +617,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -648,7 +648,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -679,7 +679,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -711,7 +711,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -743,7 +743,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -775,7 +775,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -807,7 +807,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -842,7 +842,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -874,7 +874,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -905,7 +905,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -936,7 +936,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -968,7 +968,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -999,7 +999,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1030,7 +1030,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1061,7 +1061,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1092,7 +1092,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1123,7 +1123,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1154,7 +1154,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:3ff24775a900b675866fbcacf2a8f98a18b2a16a" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1332,7 +1332,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1365,7 +1365,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1401,7 +1401,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1434,7 +1434,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1467,7 +1467,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1500,7 +1500,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1533,7 +1533,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1566,7 +1566,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1599,7 +1599,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1632,7 +1632,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1665,7 +1665,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1698,7 +1698,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1731,7 +1731,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1764,7 +1764,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1797,7 +1797,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1830,7 +1830,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1863,7 +1863,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1896,7 +1896,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1929,7 +1929,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1965,7 +1965,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1998,7 +1998,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2031,7 +2031,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2064,7 +2064,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2097,7 +2097,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2130,7 +2130,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2163,7 +2163,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2196,7 +2196,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2232,7 +2232,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2268,7 +2268,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2304,7 +2304,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2340,7 +2340,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2482,7 +2482,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2516,7 +2516,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2554,7 +2554,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2585,7 +2585,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2616,7 +2616,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2650,7 +2650,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2681,7 +2681,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2712,7 +2712,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2747,7 +2747,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2756,7 +2756,7 @@ "device_type": "bullhead" } ], - "hard_timeout": 1200, + "hard_timeout": 1800, "output_links": [ { "link": [ @@ -2781,7 +2781,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2819,7 +2819,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2850,7 +2850,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2885,7 +2885,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2916,7 +2916,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2951,7 +2951,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2982,7 +2982,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2991,7 +2991,7 @@ "device_type": "bullhead" } ], - "hard_timeout": 960, + "hard_timeout": 1200, "output_links": [ { "link": [ @@ -3017,7 +3017,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3026,7 +3026,7 @@ "device_type": "bullhead" } ], - "hard_timeout": 960, + "hard_timeout": 1200, "output_links": [ { "link": [ @@ -3051,7 +3051,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3089,7 +3089,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3120,7 +3120,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3155,7 +3155,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3186,7 +3186,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3217,7 +3217,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3248,7 +3248,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3279,7 +3279,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3310,7 +3310,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3341,7 +3341,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3372,7 +3372,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3403,7 +3403,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3434,7 +3434,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3465,7 +3465,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3499,7 +3499,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3530,7 +3530,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3561,7 +3561,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3592,7 +3592,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3623,7 +3623,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3654,7 +3654,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3685,7 +3685,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3720,7 +3720,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -3751,7 +3751,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 17a1be0..3b9f96e 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -3308,462 +3308,6 @@ } ] }, - "Linux Release (AMD R5 230)": { - "gtest_tests": [ - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "angle_end2end_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests", - "--test-launcher-retry-limit=0" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "angle_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "audio_unittests", - "use_xvfb": false - }, - { - "args": [ - "--enable-gpu", - "--test-launcher-jobs=1", - "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" - ], - "name": "tab_capture_end2end_tests", - "swarming": { - "can_use_on_swarming_builders": false - }, - "test": "browser_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "gl_tests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "gl_unittests", - "use_xvfb": false - }, - { - "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "gles2_conform_test", - "use_xvfb": false - }, - { - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - }, - "test": "swiftshader_unittests", - "use_xvfb": false - } - ], - "isolated_scripts": [ - { - "args": [ - "context_lost", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "context_lost_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "depth_capture", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "depth_capture_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "gpu_process", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "gpu_process_launch_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "hardware_accelerated_feature", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "hardware_accelerated_feature_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "info_collection", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--expected-vendor-id", - "1002", - "--expected-device-id", - "6779" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "info_collection_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "maps", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "maps_pixel_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "pixel", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--refimg-cloud-storage-bucket", - "chromium-gpu-archive/reference-images", - "--os-type", - "linux", - "--build-revision", - "${got_revision}", - "--test-machine-name", - "${buildername}" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "pixel_test", - "non_precommit_args": [ - "--upload-refimg-to-cloud-storage" - ], - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "precommit_args": [ - "--download-refimg-from-cloud-storage" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "screenshot_sync", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "screenshot_sync_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "trace_test", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "trace_test", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl2_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ], - "shards": 15 - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_angle_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-passthrough-cmd-decoder" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_gl_passthrough_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" - ], - "isolate_name": "telemetry_gpu_integration_test", - "name": "webgl_conformance_tests", - "override_compile_targets": [ - "telemetry_gpu_integration_test_run" - ], - "swarming": { - "can_use_on_swarming_builders": false, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Ubuntu" - } - ] - } - } - ] - }, "Linux Release (AMD R7 240)": { "gtest_tests": [ { @@ -16259,6 +15803,23 @@ } ] }, + "test": "angle_end2end_tests", + "use_xvfb": false + }, + { + "args": [ + "--use-gpu-in-tests", + "--test-launcher-retry-limit=0" + ], + "swarming": { + "can_use_on_swarming_builders": false, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, "test": "angle_unittests", "use_xvfb": false },
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index ca3449d..e05e1bf 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -33,7 +33,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -65,7 +65,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -96,7 +96,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -127,7 +127,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -159,7 +159,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -190,7 +190,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -221,7 +221,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -255,7 +255,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -290,7 +290,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -322,7 +322,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -353,7 +353,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -384,7 +384,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -419,7 +419,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -451,7 +451,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -482,7 +482,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -513,7 +513,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -544,7 +544,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -575,7 +575,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -607,7 +607,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -638,7 +638,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -669,7 +669,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -700,7 +700,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -731,7 +731,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -763,7 +763,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -795,7 +795,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -827,7 +827,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -859,7 +859,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -894,7 +894,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -926,7 +926,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -957,7 +957,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -988,7 +988,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1019,7 +1019,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1050,7 +1050,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1081,7 +1081,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1112,7 +1112,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1143,7 +1143,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1248,7 +1248,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1280,7 +1280,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1311,7 +1311,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1342,7 +1342,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1374,7 +1374,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1405,7 +1405,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1436,7 +1436,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1470,7 +1470,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1505,7 +1505,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1537,7 +1537,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1568,7 +1568,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1599,7 +1599,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1634,7 +1634,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1666,7 +1666,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1697,7 +1697,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1728,7 +1728,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1759,7 +1759,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1790,7 +1790,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1822,7 +1822,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1853,7 +1853,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1884,7 +1884,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1915,7 +1915,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1946,7 +1946,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -1978,7 +1978,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2010,7 +2010,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2042,7 +2042,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2074,7 +2074,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2109,7 +2109,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2141,7 +2141,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2172,7 +2172,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2203,7 +2203,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2235,7 +2235,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2266,7 +2266,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2297,7 +2297,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2328,7 +2328,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2359,7 +2359,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [ @@ -2390,7 +2390,7 @@ { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", "location": "bin", - "revision": "git_revision:dec8cc6fd715753846d0aca1693dc63844ea55d6" + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index 5c472e7..5bff6be 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -26,7 +26,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55,7 +55,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83,7 +83,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112,7 +112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140,7 +140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169,7 +169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -197,7 +197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -226,7 +226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -254,7 +254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -283,7 +283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -311,7 +311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -340,7 +340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -368,7 +368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -397,7 +397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -425,7 +425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -454,7 +454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -482,7 +482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -511,7 +511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -539,7 +539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -568,7 +568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -596,7 +596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -625,7 +625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -653,7 +653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -682,7 +682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -710,7 +710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -739,7 +739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -767,7 +767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -796,7 +796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -824,7 +824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -853,7 +853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -881,7 +881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -910,7 +910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -938,7 +938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -967,7 +967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -995,7 +995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1024,7 +1024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1052,7 +1052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1081,7 +1081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1109,7 +1109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1138,7 +1138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1166,7 +1166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1195,7 +1195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1223,7 +1223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1252,7 +1252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1280,7 +1280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1309,7 +1309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1337,7 +1337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1366,7 +1366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1394,7 +1394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1423,7 +1423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1451,7 +1451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1480,7 +1480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1508,7 +1508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1537,7 +1537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1565,7 +1565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1594,7 +1594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1622,7 +1622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1651,7 +1651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1679,7 +1679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1708,7 +1708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1736,7 +1736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1765,7 +1765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1793,7 +1793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1822,7 +1822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1850,7 +1850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1879,7 +1879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1907,7 +1907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1936,7 +1936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1964,7 +1964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1993,7 +1993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2021,7 +2021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2050,7 +2050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2078,7 +2078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2107,7 +2107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2135,7 +2135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2164,7 +2164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2192,7 +2192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2221,7 +2221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2249,7 +2249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2278,7 +2278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2306,7 +2306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2335,7 +2335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2363,7 +2363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2392,7 +2392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2420,7 +2420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2449,7 +2449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2477,7 +2477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2506,7 +2506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2534,7 +2534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2563,7 +2563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2591,7 +2591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -2620,7 +2620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -2648,7 +2648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2677,7 +2677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2705,7 +2705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2734,7 +2734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2762,7 +2762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2791,7 +2791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2819,7 +2819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2848,7 +2848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2876,7 +2876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2905,7 +2905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2933,7 +2933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2962,7 +2962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2990,7 +2990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3019,7 +3019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3047,7 +3047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3076,7 +3076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3104,7 +3104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3133,7 +3133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3161,7 +3161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3190,7 +3190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3218,7 +3218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3247,7 +3247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3275,7 +3275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3304,7 +3304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3332,7 +3332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3361,7 +3361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3389,7 +3389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3418,7 +3418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3446,7 +3446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3475,7 +3475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3503,7 +3503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3532,7 +3532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3560,7 +3560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3589,7 +3589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3617,7 +3617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3646,7 +3646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3674,7 +3674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3703,7 +3703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3731,7 +3731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3760,7 +3760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3788,7 +3788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3817,7 +3817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3845,7 +3845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3874,7 +3874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3902,7 +3902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3931,7 +3931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3959,7 +3959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3988,7 +3988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4016,7 +4016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4045,7 +4045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4073,7 +4073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4102,7 +4102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4130,7 +4130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4159,7 +4159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4187,7 +4187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4216,7 +4216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4244,7 +4244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4273,7 +4273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4301,7 +4301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4330,7 +4330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4358,7 +4358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4387,7 +4387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4415,7 +4415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4444,7 +4444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4472,7 +4472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4501,7 +4501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4529,7 +4529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4558,7 +4558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4586,7 +4586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4615,7 +4615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4643,7 +4643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4672,7 +4672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4700,7 +4700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4729,7 +4729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4757,7 +4757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4786,7 +4786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4814,7 +4814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4843,7 +4843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4871,7 +4871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4900,7 +4900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4928,7 +4928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4957,7 +4957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4985,7 +4985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5014,7 +5014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5042,7 +5042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5071,7 +5071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5099,7 +5099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5128,7 +5128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5156,7 +5156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5185,7 +5185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5213,7 +5213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5242,7 +5242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5270,7 +5270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5299,7 +5299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5327,7 +5327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5356,7 +5356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5384,7 +5384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5413,7 +5413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5441,7 +5441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5470,7 +5470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5498,7 +5498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5527,7 +5527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5555,7 +5555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5584,7 +5584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5612,7 +5612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5641,7 +5641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5669,7 +5669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5698,7 +5698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5726,7 +5726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5755,7 +5755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5783,7 +5783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5812,7 +5812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5840,7 +5840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5869,7 +5869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5897,7 +5897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5926,7 +5926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5954,7 +5954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5983,7 +5983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6011,7 +6011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6040,7 +6040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6068,7 +6068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6097,7 +6097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6125,7 +6125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6154,7 +6154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6182,7 +6182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6211,7 +6211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6239,7 +6239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6268,7 +6268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6296,7 +6296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6325,7 +6325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6353,7 +6353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6382,7 +6382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6410,7 +6410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6439,7 +6439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6467,7 +6467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6496,7 +6496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6524,7 +6524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6553,7 +6553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6581,7 +6581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6610,7 +6610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6638,7 +6638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6667,7 +6667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6695,7 +6695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6724,7 +6724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6752,7 +6752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6781,7 +6781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6809,7 +6809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6838,7 +6838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6866,7 +6866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6895,7 +6895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6923,7 +6923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6952,7 +6952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6980,7 +6980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7009,7 +7009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7037,7 +7037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7066,7 +7066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7094,7 +7094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7123,7 +7123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7151,7 +7151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7180,7 +7180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7208,7 +7208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7237,7 +7237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7265,7 +7265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7294,7 +7294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7322,7 +7322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7351,7 +7351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7379,7 +7379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7408,7 +7408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7436,7 +7436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7465,7 +7465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7493,7 +7493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7521,7 +7521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7550,7 +7550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7578,7 +7578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7607,7 +7607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7636,7 +7636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7664,7 +7664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7693,7 +7693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7721,7 +7721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7750,7 +7750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7778,7 +7778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7807,7 +7807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7835,7 +7835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7864,7 +7864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7892,7 +7892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7921,7 +7921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7949,7 +7949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7978,7 +7978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8006,7 +8006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8035,7 +8035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8063,7 +8063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8092,7 +8092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8120,7 +8120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8149,7 +8149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8177,7 +8177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8206,7 +8206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8234,7 +8234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8263,7 +8263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8291,7 +8291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8320,7 +8320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8348,7 +8348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8377,7 +8377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8405,7 +8405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8434,7 +8434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8462,7 +8462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8491,7 +8491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8519,7 +8519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8548,7 +8548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8576,7 +8576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8605,7 +8605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8633,7 +8633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8662,7 +8662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8690,7 +8690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8719,7 +8719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8747,7 +8747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8776,7 +8776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8804,7 +8804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8833,7 +8833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8861,7 +8861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8890,7 +8890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8918,7 +8918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8947,7 +8947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8975,7 +8975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9004,7 +9004,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9032,7 +9032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9061,7 +9061,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9089,7 +9089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9118,7 +9118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9146,7 +9146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9175,7 +9175,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9203,7 +9203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9232,7 +9232,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9260,7 +9260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9289,7 +9289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9317,7 +9317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9346,7 +9346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9374,7 +9374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9403,7 +9403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9431,7 +9431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9460,7 +9460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9488,7 +9488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9517,7 +9517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9545,7 +9545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9574,7 +9574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9602,7 +9602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9631,7 +9631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9659,7 +9659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9688,7 +9688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9716,7 +9716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9745,7 +9745,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9773,7 +9773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9802,7 +9802,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9830,7 +9830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9859,7 +9859,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9887,7 +9887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9916,7 +9916,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9944,7 +9944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9973,7 +9973,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10001,7 +10001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10030,7 +10030,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10058,7 +10058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10087,7 +10087,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10115,7 +10115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10144,7 +10144,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10172,7 +10172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10201,7 +10201,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10229,7 +10229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10258,7 +10258,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10286,7 +10286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10315,7 +10315,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10343,7 +10343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10372,7 +10372,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10400,7 +10400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10429,7 +10429,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10457,7 +10457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10486,7 +10486,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10514,7 +10514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10543,7 +10543,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10571,7 +10571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10600,7 +10600,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10628,7 +10628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10657,7 +10657,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10685,7 +10685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10714,7 +10714,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10742,7 +10742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10770,7 +10770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10799,7 +10799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10827,7 +10827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10856,7 +10856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10885,7 +10885,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10913,7 +10913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10942,7 +10942,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10970,7 +10970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10999,7 +10999,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11027,7 +11027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11056,7 +11056,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11084,7 +11084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11113,7 +11113,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11141,7 +11141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11170,7 +11170,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11198,7 +11198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11227,7 +11227,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11255,7 +11255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11284,7 +11284,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11307,7 +11307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11335,7 +11335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11364,7 +11364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11392,7 +11392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11421,7 +11421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11449,7 +11449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11478,7 +11478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11506,7 +11506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11535,7 +11535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11563,7 +11563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11592,7 +11592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11620,7 +11620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11649,7 +11649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11677,7 +11677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11706,7 +11706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11734,7 +11734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11763,7 +11763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11791,7 +11791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11820,7 +11820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11848,7 +11848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11877,7 +11877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11905,7 +11905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11934,7 +11934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11962,7 +11962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11991,7 +11991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12019,7 +12019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12048,7 +12048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12076,7 +12076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12105,7 +12105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12133,7 +12133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12162,7 +12162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12190,7 +12190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12219,7 +12219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12247,7 +12247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12276,7 +12276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12304,7 +12304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12333,7 +12333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12361,7 +12361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12390,7 +12390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12409,7 +12409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12437,7 +12437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12466,7 +12466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12494,7 +12494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12523,7 +12523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12551,7 +12551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12580,7 +12580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12608,7 +12608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12637,7 +12637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12665,7 +12665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12694,7 +12694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12722,7 +12722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12751,7 +12751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12779,7 +12779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12808,7 +12808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12836,7 +12836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12865,7 +12865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12893,7 +12893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12922,7 +12922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12950,7 +12950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12979,7 +12979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13007,7 +13007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13036,7 +13036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13064,7 +13064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13093,7 +13093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13121,7 +13121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13150,7 +13150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13178,7 +13178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13207,7 +13207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13235,7 +13235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13264,7 +13264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13292,7 +13292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13321,7 +13321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13349,7 +13349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13378,7 +13378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13397,7 +13397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13425,7 +13425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13454,7 +13454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13482,7 +13482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13511,7 +13511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13539,7 +13539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13568,7 +13568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13596,7 +13596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13625,7 +13625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13653,7 +13653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13682,7 +13682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13710,7 +13710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13739,7 +13739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13767,7 +13767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13796,7 +13796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13824,7 +13824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13853,7 +13853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13872,7 +13872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13900,7 +13900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13929,7 +13929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13957,7 +13957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -13986,7 +13986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -14014,7 +14014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14043,7 +14043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14071,7 +14071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14100,7 +14100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14128,7 +14128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14157,7 +14157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14185,7 +14185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14214,7 +14214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14242,7 +14242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14271,7 +14271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14299,7 +14299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14328,7 +14328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14356,7 +14356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14385,7 +14385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14413,7 +14413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14442,7 +14442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14470,7 +14470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14499,7 +14499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14527,7 +14527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14556,7 +14556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14584,7 +14584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14613,7 +14613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14641,7 +14641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14670,7 +14670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14698,7 +14698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14727,7 +14727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14755,7 +14755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14784,7 +14784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14812,7 +14812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14841,7 +14841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14869,7 +14869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14898,7 +14898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14926,7 +14926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14955,7 +14955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14983,7 +14983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15012,7 +15012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15040,7 +15040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15069,7 +15069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15097,7 +15097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15126,7 +15126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15154,7 +15154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15183,7 +15183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15211,7 +15211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15240,7 +15240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15268,7 +15268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15297,7 +15297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15325,7 +15325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15354,7 +15354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15382,7 +15382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15411,7 +15411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15439,7 +15439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15468,7 +15468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15496,7 +15496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15525,7 +15525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15553,7 +15553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15582,7 +15582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15610,7 +15610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15639,7 +15639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15667,7 +15667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15696,7 +15696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15724,7 +15724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15753,7 +15753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15781,7 +15781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15810,7 +15810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15838,7 +15838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15867,7 +15867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15886,7 +15886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15914,7 +15914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15943,7 +15943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15971,7 +15971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16000,7 +16000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16028,7 +16028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16057,7 +16057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16085,7 +16085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16114,7 +16114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16142,7 +16142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16171,7 +16171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16199,7 +16199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16228,7 +16228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16256,7 +16256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16285,7 +16285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16313,7 +16313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16342,7 +16342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16370,7 +16370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16399,7 +16399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16427,7 +16427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16456,7 +16456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16484,7 +16484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16513,7 +16513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16541,7 +16541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16570,7 +16570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16598,7 +16598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16627,7 +16627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16655,7 +16655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16684,7 +16684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16712,7 +16712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16741,7 +16741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16769,7 +16769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16798,7 +16798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16826,7 +16826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16855,7 +16855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16883,7 +16883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16912,7 +16912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16940,7 +16940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16969,7 +16969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16997,7 +16997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17026,7 +17026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17054,7 +17054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17083,7 +17083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17111,7 +17111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17140,7 +17140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17168,7 +17168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17197,7 +17197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17225,7 +17225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17254,7 +17254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17282,7 +17282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17311,7 +17311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17339,7 +17339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17368,7 +17368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17396,7 +17396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17425,7 +17425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17453,7 +17453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17482,7 +17482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17510,7 +17510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17539,7 +17539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17567,7 +17567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17596,7 +17596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17624,7 +17624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17653,7 +17653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17681,7 +17681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17710,7 +17710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17738,7 +17738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17767,7 +17767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17795,7 +17795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17824,7 +17824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17852,7 +17852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17881,7 +17881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17909,7 +17909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17938,7 +17938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17966,7 +17966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17995,7 +17995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18023,7 +18023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18052,7 +18052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18080,7 +18080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18109,7 +18109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18137,7 +18137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18166,7 +18166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18194,7 +18194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18223,7 +18223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18251,7 +18251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18280,7 +18280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18308,7 +18308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18337,7 +18337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18365,7 +18365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18394,7 +18394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18422,7 +18422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18451,7 +18451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18479,7 +18479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18508,7 +18508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18536,7 +18536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18565,7 +18565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18593,7 +18593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18622,7 +18622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18650,7 +18650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18679,7 +18679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18707,7 +18707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18736,7 +18736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18764,7 +18764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18793,7 +18793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18821,7 +18821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18850,7 +18850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18878,7 +18878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18906,7 +18906,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18935,7 +18935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18963,7 +18963,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18992,7 +18992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19021,7 +19021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19049,7 +19049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19078,7 +19078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19106,7 +19106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19135,7 +19135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19163,7 +19163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19192,7 +19192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19220,7 +19220,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19249,7 +19249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19277,7 +19277,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19306,7 +19306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19334,7 +19334,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19363,7 +19363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19391,7 +19391,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19420,7 +19420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19448,7 +19448,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19477,7 +19477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19505,7 +19505,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19534,7 +19534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19562,7 +19562,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19591,7 +19591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19619,7 +19619,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19648,7 +19648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19676,7 +19676,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19705,7 +19705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19733,7 +19733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19762,7 +19762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19790,7 +19790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19819,7 +19819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19847,7 +19847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19876,7 +19876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19904,7 +19904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19933,7 +19933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19961,7 +19961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19990,7 +19990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20018,7 +20018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20047,7 +20047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20075,7 +20075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20104,7 +20104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20132,7 +20132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20161,7 +20161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20189,7 +20189,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20218,7 +20218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20246,7 +20246,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20275,7 +20275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20303,7 +20303,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20332,7 +20332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20360,7 +20360,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20389,7 +20389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20417,7 +20417,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20446,7 +20446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20474,7 +20474,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20503,7 +20503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20531,7 +20531,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20560,7 +20560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20588,7 +20588,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20617,7 +20617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20645,7 +20645,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20674,7 +20674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20702,7 +20702,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20731,7 +20731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20759,7 +20759,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20788,7 +20788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20816,7 +20816,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20845,7 +20845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20864,7 +20864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20892,7 +20892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20921,7 +20921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20949,7 +20949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20978,7 +20978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21006,7 +21006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21035,7 +21035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21063,7 +21063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21092,7 +21092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21120,7 +21120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21149,7 +21149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21177,7 +21177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21206,7 +21206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21234,7 +21234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21263,7 +21263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21291,7 +21291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21320,7 +21320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21348,7 +21348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21377,7 +21377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21405,7 +21405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21434,7 +21434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21462,7 +21462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21491,7 +21491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21519,7 +21519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21548,7 +21548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21576,7 +21576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21605,7 +21605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21633,7 +21633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21662,7 +21662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21690,7 +21690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21719,7 +21719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21747,7 +21747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21776,7 +21776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21804,7 +21804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21833,7 +21833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21861,7 +21861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21890,7 +21890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21918,7 +21918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21947,7 +21947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21975,7 +21975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22004,7 +22004,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22032,7 +22032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22061,7 +22061,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22089,7 +22089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22118,7 +22118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22146,7 +22146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22174,7 +22174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22203,7 +22203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22231,7 +22231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22260,7 +22260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22289,7 +22289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22317,7 +22317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22346,7 +22346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22374,7 +22374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22403,7 +22403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22431,7 +22431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22460,7 +22460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22488,7 +22488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22517,7 +22517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22545,7 +22545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22574,7 +22574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22602,7 +22602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22631,7 +22631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22659,7 +22659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22688,7 +22688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22720,7 +22720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22749,7 +22749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22777,7 +22777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22806,7 +22806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22834,7 +22834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22863,7 +22863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22891,7 +22891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22920,7 +22920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22948,7 +22948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22977,7 +22977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23005,7 +23005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23034,7 +23034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23062,7 +23062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23091,7 +23091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23119,7 +23119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23148,7 +23148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23176,7 +23176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23205,7 +23205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23233,7 +23233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23262,7 +23262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23290,7 +23290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23319,7 +23319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23347,7 +23347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23376,7 +23376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23404,7 +23404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23433,7 +23433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23461,7 +23461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23490,7 +23490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23518,7 +23518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23547,7 +23547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23575,7 +23575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23604,7 +23604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23632,7 +23632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23661,7 +23661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23689,7 +23689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23718,7 +23718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23746,7 +23746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23775,7 +23775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23803,7 +23803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23832,7 +23832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23860,7 +23860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23889,7 +23889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23917,7 +23917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23946,7 +23946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23974,7 +23974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24003,7 +24003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24031,7 +24031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24060,7 +24060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24088,7 +24088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24117,7 +24117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24145,7 +24145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24174,7 +24174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24202,7 +24202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24231,7 +24231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24259,7 +24259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24288,7 +24288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24316,7 +24316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24345,7 +24345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24373,7 +24373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24402,7 +24402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24430,7 +24430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24459,7 +24459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24487,7 +24487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24516,7 +24516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24544,7 +24544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24573,7 +24573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24601,7 +24601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24630,7 +24630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24658,7 +24658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24687,7 +24687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24715,7 +24715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24744,7 +24744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24772,7 +24772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24801,7 +24801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24829,7 +24829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24858,7 +24858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24886,7 +24886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24915,7 +24915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24943,7 +24943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24972,7 +24972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25000,7 +25000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25029,7 +25029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25057,7 +25057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25086,7 +25086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25114,7 +25114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25143,7 +25143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25171,7 +25171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25200,7 +25200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25228,7 +25228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25257,7 +25257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25285,7 +25285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -25314,7 +25314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -25342,7 +25342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25371,7 +25371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25399,7 +25399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25428,7 +25428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25456,7 +25456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25485,7 +25485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25513,7 +25513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25542,7 +25542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25570,7 +25570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25599,7 +25599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25627,7 +25627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25656,7 +25656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25684,7 +25684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25713,7 +25713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25741,7 +25741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25770,7 +25770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25798,7 +25798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25827,7 +25827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25855,7 +25855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25884,7 +25884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25912,7 +25912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25941,7 +25941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25969,7 +25969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25998,7 +25998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26026,7 +26026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26055,7 +26055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26083,7 +26083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26112,7 +26112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26140,7 +26140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26169,7 +26169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26197,7 +26197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26226,7 +26226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26254,7 +26254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26283,7 +26283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26311,7 +26311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26340,7 +26340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26368,7 +26368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26397,7 +26397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26425,7 +26425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26454,7 +26454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26482,7 +26482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26511,7 +26511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26539,7 +26539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26568,7 +26568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26596,7 +26596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26625,7 +26625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26653,7 +26653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26682,7 +26682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26710,7 +26710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26739,7 +26739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26767,7 +26767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26796,7 +26796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26824,7 +26824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26853,7 +26853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26881,7 +26881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26910,7 +26910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26938,7 +26938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26967,7 +26967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26995,7 +26995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27024,7 +27024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27052,7 +27052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27081,7 +27081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27109,7 +27109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27138,7 +27138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27166,7 +27166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27195,7 +27195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27223,7 +27223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27252,7 +27252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27280,7 +27280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27309,7 +27309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27337,7 +27337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27366,7 +27366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27394,7 +27394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27423,7 +27423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27451,7 +27451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27480,7 +27480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27508,7 +27508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27537,7 +27537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27565,7 +27565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27594,7 +27594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27622,7 +27622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27651,7 +27651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27679,7 +27679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27708,7 +27708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27736,7 +27736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27765,7 +27765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27793,7 +27793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27822,7 +27822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27850,7 +27850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27879,7 +27879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27907,7 +27907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27936,7 +27936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27964,7 +27964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27993,7 +27993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28021,7 +28021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28050,7 +28050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28078,7 +28078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28107,7 +28107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28135,7 +28135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28164,7 +28164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28192,7 +28192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28221,7 +28221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28249,7 +28249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28278,7 +28278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28306,7 +28306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28335,7 +28335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28363,7 +28363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28392,7 +28392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28420,7 +28420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28449,7 +28449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28477,7 +28477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28506,7 +28506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28534,7 +28534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28563,7 +28563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28591,7 +28591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28620,7 +28620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28648,7 +28648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28677,7 +28677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28705,7 +28705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28734,7 +28734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28762,7 +28762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28791,7 +28791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28819,7 +28819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28848,7 +28848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28876,7 +28876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28905,7 +28905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28933,7 +28933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28962,7 +28962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28990,7 +28990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29019,7 +29019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29047,7 +29047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29076,7 +29076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29104,7 +29104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29133,7 +29133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29161,7 +29161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29190,7 +29190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29218,7 +29218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29247,7 +29247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29275,7 +29275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29304,7 +29304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29332,7 +29332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29361,7 +29361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29389,7 +29389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29418,7 +29418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29446,7 +29446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29475,7 +29475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29503,7 +29503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29532,7 +29532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29560,7 +29560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29589,7 +29589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29617,7 +29617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29646,7 +29646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29674,7 +29674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29703,7 +29703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29731,7 +29731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29760,7 +29760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29788,7 +29788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29817,7 +29817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29845,7 +29845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29874,7 +29874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29902,7 +29902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29931,7 +29931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29959,7 +29959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29988,7 +29988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30016,7 +30016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30045,7 +30045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30073,7 +30073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30102,7 +30102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30130,7 +30130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30159,7 +30159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30187,7 +30187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30215,7 +30215,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30244,7 +30244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30272,7 +30272,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30301,7 +30301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30330,7 +30330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30358,7 +30358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30387,7 +30387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30415,7 +30415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30444,7 +30444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30472,7 +30472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30501,7 +30501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30529,7 +30529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30558,7 +30558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30586,7 +30586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30615,7 +30615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30643,7 +30643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30672,7 +30672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30700,7 +30700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30729,7 +30729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30757,7 +30757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30786,7 +30786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30814,7 +30814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30843,7 +30843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30871,7 +30871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30900,7 +30900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30928,7 +30928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30957,7 +30957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30985,7 +30985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31014,7 +31014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31042,7 +31042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31071,7 +31071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31099,7 +31099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31128,7 +31128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31156,7 +31156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31185,7 +31185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31213,7 +31213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31242,7 +31242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31270,7 +31270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31299,7 +31299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31327,7 +31327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31356,7 +31356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31384,7 +31384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31413,7 +31413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31441,7 +31441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31470,7 +31470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31498,7 +31498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31527,7 +31527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31555,7 +31555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31584,7 +31584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31612,7 +31612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31641,7 +31641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31669,7 +31669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31698,7 +31698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31726,7 +31726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31755,7 +31755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31783,7 +31783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31812,7 +31812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31840,7 +31840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31869,7 +31869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31897,7 +31897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31926,7 +31926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31954,7 +31954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31983,7 +31983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32011,7 +32011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32040,7 +32040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32068,7 +32068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32097,7 +32097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32125,7 +32125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32154,7 +32154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32182,7 +32182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32211,7 +32211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32239,7 +32239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32268,7 +32268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32296,7 +32296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32325,7 +32325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32353,7 +32353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32382,7 +32382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32410,7 +32410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32439,7 +32439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32467,7 +32467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32496,7 +32496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32524,7 +32524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32553,7 +32553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32581,7 +32581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32610,7 +32610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32638,7 +32638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32667,7 +32667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32695,7 +32695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32724,7 +32724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32752,7 +32752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32781,7 +32781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32809,7 +32809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32838,7 +32838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32866,7 +32866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32895,7 +32895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32923,7 +32923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32952,7 +32952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32980,7 +32980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33009,7 +33009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33037,7 +33037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33066,7 +33066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33094,7 +33094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33123,7 +33123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33151,7 +33151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33180,7 +33180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33208,7 +33208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33237,7 +33237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33265,7 +33265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33294,7 +33294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33322,7 +33322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33351,7 +33351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33379,7 +33379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33408,7 +33408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33436,7 +33436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33464,7 +33464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33493,7 +33493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33521,7 +33521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33550,7 +33550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33579,7 +33579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33607,7 +33607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33636,7 +33636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33664,7 +33664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33693,7 +33693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33721,7 +33721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33750,7 +33750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33778,7 +33778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33807,7 +33807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33835,7 +33835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33864,7 +33864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33892,7 +33892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33921,7 +33921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33949,7 +33949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33978,7 +33978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 }
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index d1436e19..aaeacbb 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -93,7 +93,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122,7 +122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150,7 +150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179,7 +179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -207,7 +207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -236,7 +236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -264,7 +264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -293,7 +293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -321,7 +321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -350,7 +350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -378,7 +378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -407,7 +407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -435,7 +435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -464,7 +464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -492,7 +492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -521,7 +521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -549,7 +549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -578,7 +578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -606,7 +606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -635,7 +635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -663,7 +663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -692,7 +692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -720,7 +720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -749,7 +749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -777,7 +777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -806,7 +806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -834,7 +834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -863,7 +863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -891,7 +891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -920,7 +920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -948,7 +948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -977,7 +977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1005,7 +1005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1034,7 +1034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1062,7 +1062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1091,7 +1091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1119,7 +1119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1148,7 +1148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1176,7 +1176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1205,7 +1205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1233,7 +1233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1262,7 +1262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1290,7 +1290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1319,7 +1319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1347,7 +1347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1376,7 +1376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1404,7 +1404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1433,7 +1433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1461,7 +1461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1490,7 +1490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1518,7 +1518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1547,7 +1547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1575,7 +1575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1604,7 +1604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1632,7 +1632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1661,7 +1661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1689,7 +1689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1718,7 +1718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1746,7 +1746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1775,7 +1775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1803,7 +1803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1832,7 +1832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1860,7 +1860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1889,7 +1889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1917,7 +1917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1946,7 +1946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -1974,7 +1974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2003,7 +2003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2031,7 +2031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2060,7 +2060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2088,7 +2088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2117,7 +2117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2145,7 +2145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2174,7 +2174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2202,7 +2202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2231,7 +2231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2259,7 +2259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2288,7 +2288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2316,7 +2316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2345,7 +2345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2373,7 +2373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2402,7 +2402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2430,7 +2430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2459,7 +2459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2487,7 +2487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2516,7 +2516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2544,7 +2544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2573,7 +2573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2592,7 +2592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2620,7 +2620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2649,7 +2649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2677,7 +2677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -2706,7 +2706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -2734,7 +2734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2763,7 +2763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2791,7 +2791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2820,7 +2820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2848,7 +2848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2877,7 +2877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2905,7 +2905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2934,7 +2934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2962,7 +2962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -2991,7 +2991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3019,7 +3019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3048,7 +3048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3076,7 +3076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3105,7 +3105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3133,7 +3133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3162,7 +3162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3181,7 +3181,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3209,7 +3209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3238,7 +3238,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3266,7 +3266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3295,7 +3295,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3323,7 +3323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3352,7 +3352,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3380,7 +3380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3409,7 +3409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3437,7 +3437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3466,7 +3466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3494,7 +3494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3523,7 +3523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3551,7 +3551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3580,7 +3580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3608,7 +3608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3637,7 +3637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3665,7 +3665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3694,7 +3694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3722,7 +3722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3751,7 +3751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3779,7 +3779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3808,7 +3808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3836,7 +3836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3865,7 +3865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3893,7 +3893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3922,7 +3922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3950,7 +3950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -3979,7 +3979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4007,7 +4007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4036,7 +4036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4064,7 +4064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4093,7 +4093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4121,7 +4121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4150,7 +4150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4178,7 +4178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4207,7 +4207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4235,7 +4235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4264,7 +4264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4292,7 +4292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4321,7 +4321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4349,7 +4349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4378,7 +4378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4406,7 +4406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4435,7 +4435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4463,7 +4463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4492,7 +4492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4520,7 +4520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4549,7 +4549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4577,7 +4577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4606,7 +4606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4634,7 +4634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4663,7 +4663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4691,7 +4691,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4720,7 +4720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4748,7 +4748,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4777,7 +4777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4805,7 +4805,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4834,7 +4834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4862,7 +4862,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4891,7 +4891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4919,7 +4919,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4948,7 +4948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -4976,7 +4976,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5005,7 +5005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5033,7 +5033,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5062,7 +5062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5090,7 +5090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5119,7 +5119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5147,7 +5147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5176,7 +5176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5204,7 +5204,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5233,7 +5233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5261,7 +5261,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5290,7 +5290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5318,7 +5318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5347,7 +5347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5375,7 +5375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5404,7 +5404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5432,7 +5432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5461,7 +5461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5489,7 +5489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5518,7 +5518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5546,7 +5546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5575,7 +5575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5603,7 +5603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5632,7 +5632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5660,7 +5660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5689,7 +5689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5717,7 +5717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5746,7 +5746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5774,7 +5774,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5803,7 +5803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5831,7 +5831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5860,7 +5860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5888,7 +5888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5917,7 +5917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5945,7 +5945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -5974,7 +5974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6002,7 +6002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6031,7 +6031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6059,7 +6059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6088,7 +6088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6116,7 +6116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6145,7 +6145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6173,7 +6173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6202,7 +6202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6230,7 +6230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6259,7 +6259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6287,7 +6287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6316,7 +6316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6344,7 +6344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6373,7 +6373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6401,7 +6401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6430,7 +6430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6458,7 +6458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6487,7 +6487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6515,7 +6515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6544,7 +6544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6572,7 +6572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6601,7 +6601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6629,7 +6629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6658,7 +6658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6686,7 +6686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6715,7 +6715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6743,7 +6743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6772,7 +6772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6800,7 +6800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6829,7 +6829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6857,7 +6857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6886,7 +6886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6914,7 +6914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6943,7 +6943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -6971,7 +6971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7000,7 +7000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7028,7 +7028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7057,7 +7057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7085,7 +7085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7114,7 +7114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7142,7 +7142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7171,7 +7171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7199,7 +7199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7228,7 +7228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7256,7 +7256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7285,7 +7285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7313,7 +7313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7342,7 +7342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7370,7 +7370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7399,7 +7399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7427,7 +7427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7456,7 +7456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7484,7 +7484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7513,7 +7513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7541,7 +7541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7570,7 +7570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7598,7 +7598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7626,7 +7626,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7655,7 +7655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7683,7 +7683,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7712,7 +7712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7741,7 +7741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7769,7 +7769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7798,7 +7798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7826,7 +7826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7855,7 +7855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7883,7 +7883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7912,7 +7912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7940,7 +7940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7969,7 +7969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -7997,7 +7997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8026,7 +8026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8054,7 +8054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8083,7 +8083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8111,7 +8111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8140,7 +8140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8168,7 +8168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8197,7 +8197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8225,7 +8225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8254,7 +8254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8282,7 +8282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8311,7 +8311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8339,7 +8339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8368,7 +8368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8396,7 +8396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8425,7 +8425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8453,7 +8453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8482,7 +8482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8510,7 +8510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8539,7 +8539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8567,7 +8567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8596,7 +8596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8624,7 +8624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8653,7 +8653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8681,7 +8681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8710,7 +8710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8738,7 +8738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8767,7 +8767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8795,7 +8795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8824,7 +8824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8852,7 +8852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8881,7 +8881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8909,7 +8909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8938,7 +8938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8966,7 +8966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -8995,7 +8995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9023,7 +9023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9052,7 +9052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9080,7 +9080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9109,7 +9109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9137,7 +9137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9166,7 +9166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9194,7 +9194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9223,7 +9223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9251,7 +9251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9280,7 +9280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9308,7 +9308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9337,7 +9337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9365,7 +9365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9394,7 +9394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9422,7 +9422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9451,7 +9451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9479,7 +9479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9508,7 +9508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9536,7 +9536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9565,7 +9565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9584,7 +9584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9612,7 +9612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9641,7 +9641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9669,7 +9669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9698,7 +9698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9726,7 +9726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9755,7 +9755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9783,7 +9783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9812,7 +9812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9840,7 +9840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9869,7 +9869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9897,7 +9897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9926,7 +9926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9954,7 +9954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -9983,7 +9983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10011,7 +10011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10040,7 +10040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10068,7 +10068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10097,7 +10097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10125,7 +10125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10154,7 +10154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10182,7 +10182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10211,7 +10211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10239,7 +10239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10268,7 +10268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10296,7 +10296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10325,7 +10325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10353,7 +10353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10382,7 +10382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10410,7 +10410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10439,7 +10439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10467,7 +10467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10496,7 +10496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10524,7 +10524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10553,7 +10553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10581,7 +10581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10610,7 +10610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10638,7 +10638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10667,7 +10667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10695,7 +10695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10724,7 +10724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10752,7 +10752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10781,7 +10781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10809,7 +10809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10838,7 +10838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10866,7 +10866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10894,7 +10894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10923,7 +10923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10951,7 +10951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -10980,7 +10980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11009,7 +11009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11037,7 +11037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11066,7 +11066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11094,7 +11094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11123,7 +11123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11151,7 +11151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11180,7 +11180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11208,7 +11208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11237,7 +11237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11265,7 +11265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11294,7 +11294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11322,7 +11322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11351,7 +11351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11379,7 +11379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11408,7 +11408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11440,7 +11440,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11469,7 +11469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11497,7 +11497,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11526,7 +11526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11554,7 +11554,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11583,7 +11583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11611,7 +11611,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11640,7 +11640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11668,7 +11668,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11697,7 +11697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11725,7 +11725,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11754,7 +11754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11782,7 +11782,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11811,7 +11811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11839,7 +11839,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11868,7 +11868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11896,7 +11896,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11925,7 +11925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11953,7 +11953,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -11982,7 +11982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12010,7 +12010,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12039,7 +12039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12067,7 +12067,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12096,7 +12096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12124,7 +12124,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12153,7 +12153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12181,7 +12181,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12210,7 +12210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12238,7 +12238,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12267,7 +12267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12295,7 +12295,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12324,7 +12324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12352,7 +12352,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12381,7 +12381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12409,7 +12409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12438,7 +12438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12466,7 +12466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12495,7 +12495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12523,7 +12523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12552,7 +12552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12580,7 +12580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12609,7 +12609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12637,7 +12637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12666,7 +12666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12694,7 +12694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12723,7 +12723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12751,7 +12751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12780,7 +12780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12808,7 +12808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12837,7 +12837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12865,7 +12865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12894,7 +12894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12922,7 +12922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12951,7 +12951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -12979,7 +12979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13008,7 +13008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13036,7 +13036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13065,7 +13065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13093,7 +13093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13122,7 +13122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13150,7 +13150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13179,7 +13179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13207,7 +13207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13236,7 +13236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13264,7 +13264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13293,7 +13293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13321,7 +13321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13350,7 +13350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13378,7 +13378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13407,7 +13407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13435,7 +13435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13464,7 +13464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13492,7 +13492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13521,7 +13521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13549,7 +13549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13578,7 +13578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13606,7 +13606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13635,7 +13635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13663,7 +13663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13692,7 +13692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13720,7 +13720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13749,7 +13749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13777,7 +13777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13806,7 +13806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13834,7 +13834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13863,7 +13863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13891,7 +13891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13920,7 +13920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13948,7 +13948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -13977,7 +13977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14005,7 +14005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -14034,7 +14034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -14062,7 +14062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14091,7 +14091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14119,7 +14119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14148,7 +14148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14176,7 +14176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14205,7 +14205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14233,7 +14233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14262,7 +14262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14290,7 +14290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14319,7 +14319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14347,7 +14347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14376,7 +14376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14404,7 +14404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14433,7 +14433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14461,7 +14461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14490,7 +14490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14509,7 +14509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14537,7 +14537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14566,7 +14566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14594,7 +14594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14623,7 +14623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14651,7 +14651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14680,7 +14680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14708,7 +14708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14737,7 +14737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14765,7 +14765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14794,7 +14794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14822,7 +14822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14851,7 +14851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14879,7 +14879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14908,7 +14908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14936,7 +14936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14965,7 +14965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -14993,7 +14993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15022,7 +15022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15050,7 +15050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15079,7 +15079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15107,7 +15107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15136,7 +15136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15164,7 +15164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15193,7 +15193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15221,7 +15221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15250,7 +15250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15278,7 +15278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15307,7 +15307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15335,7 +15335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15364,7 +15364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15392,7 +15392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15421,7 +15421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15449,7 +15449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15478,7 +15478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15506,7 +15506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15535,7 +15535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15563,7 +15563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15592,7 +15592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15620,7 +15620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15649,7 +15649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15677,7 +15677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15706,7 +15706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15734,7 +15734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15763,7 +15763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15791,7 +15791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15820,7 +15820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15848,7 +15848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15877,7 +15877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15905,7 +15905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15934,7 +15934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15962,7 +15962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -15991,7 +15991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16019,7 +16019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16048,7 +16048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16076,7 +16076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16105,7 +16105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16133,7 +16133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16162,7 +16162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16190,7 +16190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16219,7 +16219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16247,7 +16247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16276,7 +16276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16304,7 +16304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16333,7 +16333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16361,7 +16361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16390,7 +16390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16418,7 +16418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16447,7 +16447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16475,7 +16475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16504,7 +16504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16532,7 +16532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16561,7 +16561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16589,7 +16589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16618,7 +16618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16646,7 +16646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16675,7 +16675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16703,7 +16703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16732,7 +16732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16760,7 +16760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16789,7 +16789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16817,7 +16817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16846,7 +16846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16874,7 +16874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16903,7 +16903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16931,7 +16931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16960,7 +16960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -16988,7 +16988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17017,7 +17017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17045,7 +17045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17074,7 +17074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17102,7 +17102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17131,7 +17131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17159,7 +17159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17188,7 +17188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17216,7 +17216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17245,7 +17245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17273,7 +17273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17302,7 +17302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17330,7 +17330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17359,7 +17359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17387,7 +17387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17416,7 +17416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17444,7 +17444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17473,7 +17473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17501,7 +17501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17530,7 +17530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17558,7 +17558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17587,7 +17587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17615,7 +17615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17644,7 +17644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17672,7 +17672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17701,7 +17701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17729,7 +17729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17758,7 +17758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17786,7 +17786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17815,7 +17815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17843,7 +17843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17872,7 +17872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17900,7 +17900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17929,7 +17929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17957,7 +17957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -17986,7 +17986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18014,7 +18014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18043,7 +18043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18071,7 +18071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18100,7 +18100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18128,7 +18128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18157,7 +18157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18185,7 +18185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18214,7 +18214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18242,7 +18242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18271,7 +18271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18299,7 +18299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18328,7 +18328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18356,7 +18356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18385,7 +18385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18413,7 +18413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18442,7 +18442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18470,7 +18470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18499,7 +18499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18527,7 +18527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18556,7 +18556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18584,7 +18584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18613,7 +18613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18641,7 +18641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18670,7 +18670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18698,7 +18698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18727,7 +18727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18755,7 +18755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18784,7 +18784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18812,7 +18812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18841,7 +18841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18869,7 +18869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18898,7 +18898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18926,7 +18926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18954,7 +18954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -18983,7 +18983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19011,7 +19011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19040,7 +19040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19069,7 +19069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19097,7 +19097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19126,7 +19126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19154,7 +19154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19183,7 +19183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19211,7 +19211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19240,7 +19240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19268,7 +19268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19297,7 +19297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19325,7 +19325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19354,7 +19354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19382,7 +19382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19411,7 +19411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19439,7 +19439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19468,7 +19468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19496,7 +19496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19525,7 +19525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19553,7 +19553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19582,7 +19582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19610,7 +19610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19639,7 +19639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19667,7 +19667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19696,7 +19696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19724,7 +19724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19753,7 +19753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19781,7 +19781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19810,7 +19810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19838,7 +19838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19867,7 +19867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19895,7 +19895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19924,7 +19924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19952,7 +19952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -19981,7 +19981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20009,7 +20009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20038,7 +20038,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20066,7 +20066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20095,7 +20095,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20123,7 +20123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20152,7 +20152,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20180,7 +20180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20209,7 +20209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20237,7 +20237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20266,7 +20266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20294,7 +20294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20323,7 +20323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20351,7 +20351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20380,7 +20380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20408,7 +20408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20437,7 +20437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20465,7 +20465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20494,7 +20494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20522,7 +20522,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20551,7 +20551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20579,7 +20579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20608,7 +20608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20636,7 +20636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20665,7 +20665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20693,7 +20693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20722,7 +20722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20750,7 +20750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20779,7 +20779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20807,7 +20807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20836,7 +20836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20864,7 +20864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20893,7 +20893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20921,7 +20921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20950,7 +20950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -20978,7 +20978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21007,7 +21007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21035,7 +21035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21064,7 +21064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21092,7 +21092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21121,7 +21121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21149,7 +21149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21178,7 +21178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21206,7 +21206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21235,7 +21235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21263,7 +21263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21292,7 +21292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21320,7 +21320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21349,7 +21349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21377,7 +21377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21406,7 +21406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21434,7 +21434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21463,7 +21463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21491,7 +21491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21520,7 +21520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21548,7 +21548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21577,7 +21577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21605,7 +21605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21634,7 +21634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21662,7 +21662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21691,7 +21691,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21719,7 +21719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21748,7 +21748,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21776,7 +21776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21805,7 +21805,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21833,7 +21833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21862,7 +21862,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21890,7 +21890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21919,7 +21919,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21947,7 +21947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -21976,7 +21976,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22004,7 +22004,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22033,7 +22033,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22061,7 +22061,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22090,7 +22090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22118,7 +22118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22147,7 +22147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22175,7 +22175,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22203,7 +22203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22232,7 +22232,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22260,7 +22260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22289,7 +22289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22318,7 +22318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22346,7 +22346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22375,7 +22375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22403,7 +22403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22432,7 +22432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22460,7 +22460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22489,7 +22489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22517,7 +22517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22546,7 +22546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22574,7 +22574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22603,7 +22603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22631,7 +22631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22660,7 +22660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22688,7 +22688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22717,7 +22717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22749,7 +22749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22778,7 +22778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22806,7 +22806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22835,7 +22835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22863,7 +22863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22892,7 +22892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22920,7 +22920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22949,7 +22949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -22977,7 +22977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23006,7 +23006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23034,7 +23034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23063,7 +23063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23091,7 +23091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23120,7 +23120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23148,7 +23148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23177,7 +23177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23205,7 +23205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23234,7 +23234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23262,7 +23262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23291,7 +23291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23319,7 +23319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23348,7 +23348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23376,7 +23376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23405,7 +23405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23433,7 +23433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23462,7 +23462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23490,7 +23490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23519,7 +23519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23547,7 +23547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23576,7 +23576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23604,7 +23604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23633,7 +23633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23661,7 +23661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23690,7 +23690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23718,7 +23718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23747,7 +23747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23775,7 +23775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23804,7 +23804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23832,7 +23832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23861,7 +23861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23889,7 +23889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23918,7 +23918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23946,7 +23946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -23975,7 +23975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24003,7 +24003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24032,7 +24032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24060,7 +24060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24089,7 +24089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24117,7 +24117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24146,7 +24146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24174,7 +24174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24203,7 +24203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24231,7 +24231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24260,7 +24260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24288,7 +24288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24317,7 +24317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24345,7 +24345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24374,7 +24374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24402,7 +24402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24431,7 +24431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24459,7 +24459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24488,7 +24488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24516,7 +24516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24545,7 +24545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24573,7 +24573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24602,7 +24602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24630,7 +24630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24659,7 +24659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24687,7 +24687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24716,7 +24716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24744,7 +24744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24773,7 +24773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24801,7 +24801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24830,7 +24830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24858,7 +24858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24887,7 +24887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24915,7 +24915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24944,7 +24944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -24972,7 +24972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25001,7 +25001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25029,7 +25029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25058,7 +25058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25086,7 +25086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25115,7 +25115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25143,7 +25143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25172,7 +25172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25200,7 +25200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25229,7 +25229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25257,7 +25257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25286,7 +25286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25314,7 +25314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -25343,7 +25343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -25371,7 +25371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25400,7 +25400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25428,7 +25428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25457,7 +25457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25485,7 +25485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25514,7 +25514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25542,7 +25542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25571,7 +25571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25599,7 +25599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25628,7 +25628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25656,7 +25656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25685,7 +25685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25713,7 +25713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25742,7 +25742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25770,7 +25770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25799,7 +25799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25827,7 +25827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25856,7 +25856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25884,7 +25884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25913,7 +25913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25941,7 +25941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25970,7 +25970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -25998,7 +25998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26027,7 +26027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26055,7 +26055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26084,7 +26084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26112,7 +26112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26141,7 +26141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26169,7 +26169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26198,7 +26198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26226,7 +26226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26255,7 +26255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26283,7 +26283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26312,7 +26312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26340,7 +26340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26369,7 +26369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26397,7 +26397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26426,7 +26426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26454,7 +26454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26483,7 +26483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26511,7 +26511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26540,7 +26540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26568,7 +26568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26597,7 +26597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26625,7 +26625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26654,7 +26654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26682,7 +26682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26711,7 +26711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26739,7 +26739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26768,7 +26768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26796,7 +26796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26825,7 +26825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26853,7 +26853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26882,7 +26882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26910,7 +26910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26939,7 +26939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26967,7 +26967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -26996,7 +26996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27024,7 +27024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27053,7 +27053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27081,7 +27081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27110,7 +27110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27138,7 +27138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27167,7 +27167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27195,7 +27195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27224,7 +27224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27252,7 +27252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27281,7 +27281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27309,7 +27309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27338,7 +27338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27366,7 +27366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27395,7 +27395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27423,7 +27423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27452,7 +27452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27480,7 +27480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27509,7 +27509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27537,7 +27537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27566,7 +27566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27594,7 +27594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27623,7 +27623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27651,7 +27651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27680,7 +27680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27708,7 +27708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27737,7 +27737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27765,7 +27765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27794,7 +27794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27822,7 +27822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27851,7 +27851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27879,7 +27879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27908,7 +27908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27936,7 +27936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27965,7 +27965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -27993,7 +27993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28022,7 +28022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28050,7 +28050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28079,7 +28079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28107,7 +28107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28136,7 +28136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28164,7 +28164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28193,7 +28193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28221,7 +28221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28250,7 +28250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28278,7 +28278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28307,7 +28307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28335,7 +28335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28364,7 +28364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28392,7 +28392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28421,7 +28421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28449,7 +28449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28478,7 +28478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28506,7 +28506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28535,7 +28535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28563,7 +28563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28592,7 +28592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28620,7 +28620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28649,7 +28649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28677,7 +28677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28706,7 +28706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28734,7 +28734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28763,7 +28763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28791,7 +28791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28820,7 +28820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28848,7 +28848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28877,7 +28877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28905,7 +28905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28934,7 +28934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28962,7 +28962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -28991,7 +28991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29019,7 +29019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29048,7 +29048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29076,7 +29076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29105,7 +29105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29133,7 +29133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29162,7 +29162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29190,7 +29190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29219,7 +29219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29247,7 +29247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29276,7 +29276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29304,7 +29304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29333,7 +29333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29361,7 +29361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29390,7 +29390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29418,7 +29418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29447,7 +29447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29475,7 +29475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29504,7 +29504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29532,7 +29532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29561,7 +29561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29589,7 +29589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29618,7 +29618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29646,7 +29646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29675,7 +29675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29703,7 +29703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29732,7 +29732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29760,7 +29760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29789,7 +29789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29817,7 +29817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29846,7 +29846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29874,7 +29874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29903,7 +29903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29931,7 +29931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29960,7 +29960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -29988,7 +29988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30017,7 +30017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30045,7 +30045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30074,7 +30074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30102,7 +30102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30131,7 +30131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30159,7 +30159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30188,7 +30188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30216,7 +30216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30244,7 +30244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30273,7 +30273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30301,7 +30301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30330,7 +30330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30359,7 +30359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30387,7 +30387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30416,7 +30416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30444,7 +30444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30473,7 +30473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30501,7 +30501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30530,7 +30530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30558,7 +30558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30587,7 +30587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30615,7 +30615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30644,7 +30644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30672,7 +30672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30701,7 +30701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30729,7 +30729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30758,7 +30758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30786,7 +30786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30815,7 +30815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30843,7 +30843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30872,7 +30872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30900,7 +30900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30929,7 +30929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30957,7 +30957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -30986,7 +30986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31014,7 +31014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31043,7 +31043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31071,7 +31071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31100,7 +31100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31128,7 +31128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31157,7 +31157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31185,7 +31185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31214,7 +31214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31242,7 +31242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31271,7 +31271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31299,7 +31299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31328,7 +31328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31356,7 +31356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31385,7 +31385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31413,7 +31413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31442,7 +31442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31470,7 +31470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31499,7 +31499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31527,7 +31527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31556,7 +31556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31584,7 +31584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31613,7 +31613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31641,7 +31641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31670,7 +31670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31698,7 +31698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31727,7 +31727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31755,7 +31755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31784,7 +31784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31812,7 +31812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31841,7 +31841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31869,7 +31869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31898,7 +31898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31926,7 +31926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31955,7 +31955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -31983,7 +31983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32012,7 +32012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32040,7 +32040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32069,7 +32069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32097,7 +32097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32126,7 +32126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32154,7 +32154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32183,7 +32183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32211,7 +32211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32240,7 +32240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32268,7 +32268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32297,7 +32297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32325,7 +32325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32354,7 +32354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32382,7 +32382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32411,7 +32411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32439,7 +32439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32468,7 +32468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32496,7 +32496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32525,7 +32525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32553,7 +32553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32582,7 +32582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32610,7 +32610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32639,7 +32639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32667,7 +32667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32696,7 +32696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32724,7 +32724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32753,7 +32753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32781,7 +32781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32810,7 +32810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32838,7 +32838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32867,7 +32867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32895,7 +32895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32924,7 +32924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32952,7 +32952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -32981,7 +32981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33009,7 +33009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33038,7 +33038,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33066,7 +33066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33095,7 +33095,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33123,7 +33123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33152,7 +33152,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33180,7 +33180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33209,7 +33209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33237,7 +33237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33266,7 +33266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33294,7 +33294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33323,7 +33323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33351,7 +33351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33380,7 +33380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33408,7 +33408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33437,7 +33437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33465,7 +33465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33493,7 +33493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33522,7 +33522,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33550,7 +33550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33579,7 +33579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33608,7 +33608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33636,7 +33636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33665,7 +33665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33693,7 +33693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33722,7 +33722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33750,7 +33750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33779,7 +33779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33807,7 +33807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33836,7 +33836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33864,7 +33864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33893,7 +33893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33921,7 +33921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33950,7 +33950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -33978,7 +33978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34007,7 +34007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34039,7 +34039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34068,7 +34068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34096,7 +34096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34125,7 +34125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34153,7 +34153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34182,7 +34182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34210,7 +34210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34239,7 +34239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34267,7 +34267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34296,7 +34296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34324,7 +34324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34353,7 +34353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34381,7 +34381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34410,7 +34410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34438,7 +34438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34467,7 +34467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34495,7 +34495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34524,7 +34524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34552,7 +34552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34581,7 +34581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34609,7 +34609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34638,7 +34638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34666,7 +34666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34695,7 +34695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34723,7 +34723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34752,7 +34752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34780,7 +34780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34809,7 +34809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34837,7 +34837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34866,7 +34866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34894,7 +34894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34923,7 +34923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34951,7 +34951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -34980,7 +34980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35008,7 +35008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35037,7 +35037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35065,7 +35065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35094,7 +35094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35122,7 +35122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35151,7 +35151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35179,7 +35179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35208,7 +35208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35236,7 +35236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35265,7 +35265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35293,7 +35293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35322,7 +35322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35350,7 +35350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35379,7 +35379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35407,7 +35407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35436,7 +35436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35464,7 +35464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35493,7 +35493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35521,7 +35521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35550,7 +35550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35578,7 +35578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35607,7 +35607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35635,7 +35635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35664,7 +35664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35692,7 +35692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35721,7 +35721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35749,7 +35749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35778,7 +35778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35806,7 +35806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35835,7 +35835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35863,7 +35863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35892,7 +35892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35920,7 +35920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35949,7 +35949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -35977,7 +35977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36006,7 +36006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36034,7 +36034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36063,7 +36063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36091,7 +36091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36120,7 +36120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36148,7 +36148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36177,7 +36177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36205,7 +36205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36234,7 +36234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36262,7 +36262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36291,7 +36291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36319,7 +36319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36348,7 +36348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36376,7 +36376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36405,7 +36405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36433,7 +36433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36462,7 +36462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36490,7 +36490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36519,7 +36519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36547,7 +36547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36576,7 +36576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36604,7 +36604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -36633,7 +36633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -36661,7 +36661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36690,7 +36690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36718,7 +36718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36747,7 +36747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36775,7 +36775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36804,7 +36804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36832,7 +36832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36861,7 +36861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36889,7 +36889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36918,7 +36918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36946,7 +36946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -36975,7 +36975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37003,7 +37003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37032,7 +37032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37060,7 +37060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37089,7 +37089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37117,7 +37117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37146,7 +37146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37174,7 +37174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37203,7 +37203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37231,7 +37231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37260,7 +37260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37288,7 +37288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37317,7 +37317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37345,7 +37345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37374,7 +37374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37402,7 +37402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37431,7 +37431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37459,7 +37459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37488,7 +37488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37516,7 +37516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37545,7 +37545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37573,7 +37573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37602,7 +37602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37630,7 +37630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37659,7 +37659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37687,7 +37687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37716,7 +37716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37744,7 +37744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37773,7 +37773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37801,7 +37801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37830,7 +37830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37858,7 +37858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37887,7 +37887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37915,7 +37915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37944,7 +37944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -37972,7 +37972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38001,7 +38001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38029,7 +38029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38058,7 +38058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38086,7 +38086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38115,7 +38115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38143,7 +38143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38172,7 +38172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38200,7 +38200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38229,7 +38229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38257,7 +38257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38286,7 +38286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38314,7 +38314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38343,7 +38343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38371,7 +38371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38400,7 +38400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38428,7 +38428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38457,7 +38457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38485,7 +38485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38514,7 +38514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38542,7 +38542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38571,7 +38571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38599,7 +38599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38628,7 +38628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38656,7 +38656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38685,7 +38685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38713,7 +38713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38742,7 +38742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38770,7 +38770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38799,7 +38799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38827,7 +38827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38856,7 +38856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38884,7 +38884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38913,7 +38913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38941,7 +38941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38970,7 +38970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -38998,7 +38998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39027,7 +39027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39055,7 +39055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39084,7 +39084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39112,7 +39112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39141,7 +39141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39169,7 +39169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39198,7 +39198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39226,7 +39226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39255,7 +39255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39283,7 +39283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39312,7 +39312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39340,7 +39340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39369,7 +39369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39397,7 +39397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39426,7 +39426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39454,7 +39454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39483,7 +39483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39511,7 +39511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39540,7 +39540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39568,7 +39568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39597,7 +39597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39625,7 +39625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39654,7 +39654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39682,7 +39682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39711,7 +39711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39739,7 +39739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39768,7 +39768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39796,7 +39796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39825,7 +39825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39853,7 +39853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39882,7 +39882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39910,7 +39910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39939,7 +39939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39967,7 +39967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -39996,7 +39996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40024,7 +40024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40053,7 +40053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40081,7 +40081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40110,7 +40110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40138,7 +40138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40167,7 +40167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40195,7 +40195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40224,7 +40224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40252,7 +40252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40281,7 +40281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40309,7 +40309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40338,7 +40338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40366,7 +40366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40395,7 +40395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40423,7 +40423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40452,7 +40452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40480,7 +40480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40509,7 +40509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40537,7 +40537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40566,7 +40566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40594,7 +40594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40623,7 +40623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40651,7 +40651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40680,7 +40680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40708,7 +40708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40737,7 +40737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40765,7 +40765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40794,7 +40794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40822,7 +40822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40851,7 +40851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40879,7 +40879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40908,7 +40908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40936,7 +40936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40965,7 +40965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -40993,7 +40993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41022,7 +41022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41050,7 +41050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41079,7 +41079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41107,7 +41107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41136,7 +41136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41164,7 +41164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41193,7 +41193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41221,7 +41221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41250,7 +41250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41278,7 +41278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41307,7 +41307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41335,7 +41335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41364,7 +41364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41392,7 +41392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41421,7 +41421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41449,7 +41449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41478,7 +41478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41506,7 +41506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41534,7 +41534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41563,7 +41563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41591,7 +41591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41620,7 +41620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41649,7 +41649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41677,7 +41677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41706,7 +41706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41734,7 +41734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41763,7 +41763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41791,7 +41791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41820,7 +41820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41848,7 +41848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41877,7 +41877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41905,7 +41905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41934,7 +41934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41962,7 +41962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -41991,7 +41991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42019,7 +42019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42048,7 +42048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42076,7 +42076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42105,7 +42105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42133,7 +42133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42162,7 +42162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42190,7 +42190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42219,7 +42219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42247,7 +42247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42276,7 +42276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42304,7 +42304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42333,7 +42333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42361,7 +42361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42390,7 +42390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42418,7 +42418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42447,7 +42447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42475,7 +42475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42504,7 +42504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42532,7 +42532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42561,7 +42561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42589,7 +42589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42618,7 +42618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42646,7 +42646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42675,7 +42675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42703,7 +42703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42732,7 +42732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42760,7 +42760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42789,7 +42789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42817,7 +42817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42846,7 +42846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42874,7 +42874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42903,7 +42903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42931,7 +42931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42960,7 +42960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -42988,7 +42988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43017,7 +43017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43045,7 +43045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43074,7 +43074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43102,7 +43102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43131,7 +43131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43159,7 +43159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43188,7 +43188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43216,7 +43216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43245,7 +43245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43273,7 +43273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43302,7 +43302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43330,7 +43330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43359,7 +43359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43387,7 +43387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43416,7 +43416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43444,7 +43444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43473,7 +43473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43501,7 +43501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43530,7 +43530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43558,7 +43558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43587,7 +43587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43615,7 +43615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43644,7 +43644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43672,7 +43672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43701,7 +43701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43729,7 +43729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43758,7 +43758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43786,7 +43786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43815,7 +43815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43843,7 +43843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43872,7 +43872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43900,7 +43900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43929,7 +43929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43957,7 +43957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -43986,7 +43986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44014,7 +44014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44043,7 +44043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44071,7 +44071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44100,7 +44100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44128,7 +44128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44157,7 +44157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44185,7 +44185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44214,7 +44214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44242,7 +44242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44271,7 +44271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44299,7 +44299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44328,7 +44328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44356,7 +44356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44385,7 +44385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44413,7 +44413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44442,7 +44442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44470,7 +44470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44499,7 +44499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44527,7 +44527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44556,7 +44556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44584,7 +44584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44613,7 +44613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44641,7 +44641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44670,7 +44670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44698,7 +44698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44727,7 +44727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44755,7 +44755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44783,7 +44783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44812,7 +44812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44840,7 +44840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44869,7 +44869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44898,7 +44898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44926,7 +44926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44955,7 +44955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -44983,7 +44983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45012,7 +45012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45040,7 +45040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45069,7 +45069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45097,7 +45097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45126,7 +45126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45154,7 +45154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45183,7 +45183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45211,7 +45211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45240,7 +45240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45268,7 +45268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45297,7 +45297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45329,7 +45329,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45358,7 +45358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45386,7 +45386,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45415,7 +45415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45443,7 +45443,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45472,7 +45472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45500,7 +45500,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45529,7 +45529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45557,7 +45557,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45586,7 +45586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45614,7 +45614,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45643,7 +45643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45671,7 +45671,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45700,7 +45700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45728,7 +45728,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45757,7 +45757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45785,7 +45785,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45814,7 +45814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45842,7 +45842,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45871,7 +45871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45899,7 +45899,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45928,7 +45928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45956,7 +45956,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -45985,7 +45985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46013,7 +46013,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46042,7 +46042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46070,7 +46070,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46099,7 +46099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46127,7 +46127,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46156,7 +46156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46184,7 +46184,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46213,7 +46213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46241,7 +46241,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46270,7 +46270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46298,7 +46298,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46327,7 +46327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46355,7 +46355,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46384,7 +46384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46412,7 +46412,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46441,7 +46441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46469,7 +46469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46498,7 +46498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46526,7 +46526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46555,7 +46555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46583,7 +46583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46612,7 +46612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46640,7 +46640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46669,7 +46669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46697,7 +46697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46726,7 +46726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46754,7 +46754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46783,7 +46783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46811,7 +46811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46840,7 +46840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46868,7 +46868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46897,7 +46897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46925,7 +46925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46954,7 +46954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -46982,7 +46982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47011,7 +47011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47039,7 +47039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47068,7 +47068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47096,7 +47096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47125,7 +47125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47153,7 +47153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47182,7 +47182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47210,7 +47210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47239,7 +47239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47267,7 +47267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47296,7 +47296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47324,7 +47324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47353,7 +47353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47381,7 +47381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47410,7 +47410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47438,7 +47438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47467,7 +47467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47495,7 +47495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47524,7 +47524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47552,7 +47552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47581,7 +47581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47609,7 +47609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47638,7 +47638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47666,7 +47666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47695,7 +47695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47723,7 +47723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47752,7 +47752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47780,7 +47780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47809,7 +47809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47837,7 +47837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47866,7 +47866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47894,7 +47894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -47923,7 +47923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -47951,7 +47951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -47980,7 +47980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48008,7 +48008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48037,7 +48037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48065,7 +48065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48094,7 +48094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48122,7 +48122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48151,7 +48151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48179,7 +48179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48208,7 +48208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48236,7 +48236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48265,7 +48265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48293,7 +48293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48322,7 +48322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48350,7 +48350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48379,7 +48379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48407,7 +48407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48436,7 +48436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48464,7 +48464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48493,7 +48493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48521,7 +48521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48550,7 +48550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48578,7 +48578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48607,7 +48607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48635,7 +48635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48664,7 +48664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48692,7 +48692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48721,7 +48721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48749,7 +48749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48778,7 +48778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48806,7 +48806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48835,7 +48835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48863,7 +48863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48892,7 +48892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48920,7 +48920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48949,7 +48949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -48977,7 +48977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49006,7 +49006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49034,7 +49034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49063,7 +49063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49091,7 +49091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49120,7 +49120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49148,7 +49148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49177,7 +49177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49205,7 +49205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49234,7 +49234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49262,7 +49262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49291,7 +49291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49319,7 +49319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49348,7 +49348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49376,7 +49376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49405,7 +49405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49433,7 +49433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49462,7 +49462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49490,7 +49490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49519,7 +49519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49547,7 +49547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49576,7 +49576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49604,7 +49604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49633,7 +49633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49661,7 +49661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49690,7 +49690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49718,7 +49718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49747,7 +49747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49775,7 +49775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49804,7 +49804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49832,7 +49832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49861,7 +49861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49889,7 +49889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49918,7 +49918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49946,7 +49946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -49975,7 +49975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50003,7 +50003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50032,7 +50032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50060,7 +50060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50089,7 +50089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50117,7 +50117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50146,7 +50146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50174,7 +50174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50203,7 +50203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50231,7 +50231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50260,7 +50260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50288,7 +50288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50317,7 +50317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50345,7 +50345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50374,7 +50374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50402,7 +50402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50431,7 +50431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50459,7 +50459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50488,7 +50488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50516,7 +50516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50545,7 +50545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50573,7 +50573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50602,7 +50602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50630,7 +50630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50659,7 +50659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50687,7 +50687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50716,7 +50716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50744,7 +50744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50773,7 +50773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50801,7 +50801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50830,7 +50830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50858,7 +50858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50887,7 +50887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50915,7 +50915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50944,7 +50944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -50972,7 +50972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51001,7 +51001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51029,7 +51029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51058,7 +51058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51086,7 +51086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51115,7 +51115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51143,7 +51143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51172,7 +51172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51200,7 +51200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51229,7 +51229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51257,7 +51257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51286,7 +51286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51314,7 +51314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51343,7 +51343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51371,7 +51371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51400,7 +51400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51428,7 +51428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51457,7 +51457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51485,7 +51485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51514,7 +51514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51542,7 +51542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51571,7 +51571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51599,7 +51599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51628,7 +51628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51656,7 +51656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51685,7 +51685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51713,7 +51713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51742,7 +51742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51770,7 +51770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51799,7 +51799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51827,7 +51827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51856,7 +51856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51884,7 +51884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51913,7 +51913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51941,7 +51941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51970,7 +51970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -51998,7 +51998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52027,7 +52027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52055,7 +52055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52084,7 +52084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52112,7 +52112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52141,7 +52141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52169,7 +52169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52198,7 +52198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52226,7 +52226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52255,7 +52255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52283,7 +52283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52312,7 +52312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52340,7 +52340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52369,7 +52369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52397,7 +52397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52426,7 +52426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52454,7 +52454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52483,7 +52483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52511,7 +52511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52540,7 +52540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52568,7 +52568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52597,7 +52597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52625,7 +52625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52654,7 +52654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52682,7 +52682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52711,7 +52711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52739,7 +52739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52768,7 +52768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52796,7 +52796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52824,7 +52824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52853,7 +52853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52881,7 +52881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52910,7 +52910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52939,7 +52939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52967,7 +52967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -52996,7 +52996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53024,7 +53024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53053,7 +53053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53081,7 +53081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53110,7 +53110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53138,7 +53138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53167,7 +53167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53195,7 +53195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53224,7 +53224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53252,7 +53252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53281,7 +53281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53309,7 +53309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53338,7 +53338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53366,7 +53366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53395,7 +53395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53423,7 +53423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53452,7 +53452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53480,7 +53480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53509,7 +53509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53537,7 +53537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53566,7 +53566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53594,7 +53594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53623,7 +53623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53651,7 +53651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53680,7 +53680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53708,7 +53708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53737,7 +53737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53765,7 +53765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53794,7 +53794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53822,7 +53822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53851,7 +53851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53879,7 +53879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53908,7 +53908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53936,7 +53936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53965,7 +53965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -53993,7 +53993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54022,7 +54022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54050,7 +54050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54079,7 +54079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54107,7 +54107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54136,7 +54136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54164,7 +54164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54193,7 +54193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54221,7 +54221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54250,7 +54250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54278,7 +54278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54307,7 +54307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54335,7 +54335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54364,7 +54364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54392,7 +54392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54421,7 +54421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54449,7 +54449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54478,7 +54478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54506,7 +54506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54535,7 +54535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54563,7 +54563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54592,7 +54592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54620,7 +54620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54649,7 +54649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54677,7 +54677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54706,7 +54706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54734,7 +54734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54763,7 +54763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54791,7 +54791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54820,7 +54820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54848,7 +54848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54877,7 +54877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54905,7 +54905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54934,7 +54934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54962,7 +54962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -54991,7 +54991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55019,7 +55019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55048,7 +55048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55076,7 +55076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55105,7 +55105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55133,7 +55133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55162,7 +55162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55190,7 +55190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55219,7 +55219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55247,7 +55247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55276,7 +55276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55304,7 +55304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55333,7 +55333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55361,7 +55361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55390,7 +55390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55418,7 +55418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55447,7 +55447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55475,7 +55475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55504,7 +55504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55532,7 +55532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55561,7 +55561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55589,7 +55589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55618,7 +55618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55646,7 +55646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55675,7 +55675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55703,7 +55703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55732,7 +55732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55760,7 +55760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55789,7 +55789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55817,7 +55817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55846,7 +55846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55874,7 +55874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55903,7 +55903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55931,7 +55931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55960,7 +55960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -55988,7 +55988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56017,7 +56017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56045,7 +56045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56073,7 +56073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56102,7 +56102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56130,7 +56130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56159,7 +56159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56188,7 +56188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56216,7 +56216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56245,7 +56245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56273,7 +56273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56302,7 +56302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56330,7 +56330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56359,7 +56359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56387,7 +56387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56416,7 +56416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56444,7 +56444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56473,7 +56473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56501,7 +56501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56530,7 +56530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56558,7 +56558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56587,7 +56587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56619,7 +56619,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56648,7 +56648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56676,7 +56676,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56705,7 +56705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56733,7 +56733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56762,7 +56762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56790,7 +56790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56819,7 +56819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56847,7 +56847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56876,7 +56876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56904,7 +56904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56933,7 +56933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56961,7 +56961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -56990,7 +56990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57018,7 +57018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57047,7 +57047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57075,7 +57075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57104,7 +57104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57132,7 +57132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57161,7 +57161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57189,7 +57189,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57218,7 +57218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57246,7 +57246,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57275,7 +57275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57303,7 +57303,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57332,7 +57332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57360,7 +57360,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57389,7 +57389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57417,7 +57417,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57446,7 +57446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57474,7 +57474,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57503,7 +57503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57531,7 +57531,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57560,7 +57560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57588,7 +57588,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57617,7 +57617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57645,7 +57645,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57674,7 +57674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57702,7 +57702,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57731,7 +57731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57759,7 +57759,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57788,7 +57788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57816,7 +57816,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57845,7 +57845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57873,7 +57873,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57902,7 +57902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57930,7 +57930,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57959,7 +57959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -57987,7 +57987,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58016,7 +58016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58044,7 +58044,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58073,7 +58073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58101,7 +58101,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58130,7 +58130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58158,7 +58158,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58187,7 +58187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58215,7 +58215,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58244,7 +58244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58272,7 +58272,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58301,7 +58301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58329,7 +58329,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58358,7 +58358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58386,7 +58386,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58415,7 +58415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58443,7 +58443,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58472,7 +58472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58500,7 +58500,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58529,7 +58529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58557,7 +58557,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58586,7 +58586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58614,7 +58614,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58643,7 +58643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58671,7 +58671,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58700,7 +58700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58728,7 +58728,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58757,7 +58757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58785,7 +58785,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58814,7 +58814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58842,7 +58842,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58871,7 +58871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58899,7 +58899,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58928,7 +58928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58956,7 +58956,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -58985,7 +58985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59013,7 +59013,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59042,7 +59042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59070,7 +59070,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59099,7 +59099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59127,7 +59127,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59156,7 +59156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59184,7 +59184,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -59213,7 +59213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -59241,7 +59241,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59270,7 +59270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59298,7 +59298,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59327,7 +59327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59355,7 +59355,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59384,7 +59384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59412,7 +59412,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59441,7 +59441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59469,7 +59469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59498,7 +59498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59526,7 +59526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59555,7 +59555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59583,7 +59583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59612,7 +59612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59640,7 +59640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59669,7 +59669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59697,7 +59697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59726,7 +59726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59754,7 +59754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59783,7 +59783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59811,7 +59811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59840,7 +59840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59868,7 +59868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59897,7 +59897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59925,7 +59925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59954,7 +59954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -59982,7 +59982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60011,7 +60011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60039,7 +60039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60068,7 +60068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60096,7 +60096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60125,7 +60125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60153,7 +60153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60182,7 +60182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60210,7 +60210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60239,7 +60239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60267,7 +60267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60296,7 +60296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60324,7 +60324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60353,7 +60353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60381,7 +60381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60410,7 +60410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60438,7 +60438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60467,7 +60467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60495,7 +60495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60524,7 +60524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60552,7 +60552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60581,7 +60581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60609,7 +60609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60638,7 +60638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60666,7 +60666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60695,7 +60695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60723,7 +60723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60752,7 +60752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60780,7 +60780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60809,7 +60809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60837,7 +60837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60866,7 +60866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60894,7 +60894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60923,7 +60923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60951,7 +60951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -60980,7 +60980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61008,7 +61008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61037,7 +61037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61065,7 +61065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61094,7 +61094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61122,7 +61122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61151,7 +61151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61179,7 +61179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61208,7 +61208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61236,7 +61236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61265,7 +61265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61293,7 +61293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61322,7 +61322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61350,7 +61350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61379,7 +61379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61407,7 +61407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61436,7 +61436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61464,7 +61464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61493,7 +61493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61521,7 +61521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61550,7 +61550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61578,7 +61578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61607,7 +61607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61635,7 +61635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61664,7 +61664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61692,7 +61692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61721,7 +61721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61749,7 +61749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61778,7 +61778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61806,7 +61806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61835,7 +61835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61863,7 +61863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61892,7 +61892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61920,7 +61920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61949,7 +61949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -61977,7 +61977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62006,7 +62006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62034,7 +62034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62063,7 +62063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62091,7 +62091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62120,7 +62120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62148,7 +62148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62177,7 +62177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62205,7 +62205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62234,7 +62234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62262,7 +62262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62291,7 +62291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62319,7 +62319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62348,7 +62348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62376,7 +62376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62405,7 +62405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62433,7 +62433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62462,7 +62462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62490,7 +62490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62519,7 +62519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62547,7 +62547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62576,7 +62576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62604,7 +62604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62633,7 +62633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62661,7 +62661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62690,7 +62690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62718,7 +62718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62747,7 +62747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62775,7 +62775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62804,7 +62804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62832,7 +62832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62861,7 +62861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62889,7 +62889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62918,7 +62918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62946,7 +62946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -62975,7 +62975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63003,7 +63003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63032,7 +63032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63060,7 +63060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63089,7 +63089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63117,7 +63117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63146,7 +63146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63174,7 +63174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63203,7 +63203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63231,7 +63231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63260,7 +63260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63288,7 +63288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63317,7 +63317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63345,7 +63345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63374,7 +63374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63402,7 +63402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63431,7 +63431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63459,7 +63459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63488,7 +63488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63516,7 +63516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63545,7 +63545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63573,7 +63573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63602,7 +63602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63630,7 +63630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63659,7 +63659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63687,7 +63687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63716,7 +63716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63744,7 +63744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63773,7 +63773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63801,7 +63801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63830,7 +63830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63858,7 +63858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63887,7 +63887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63915,7 +63915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63944,7 +63944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -63972,7 +63972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64001,7 +64001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64029,7 +64029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64058,7 +64058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64086,7 +64086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64114,7 +64114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64143,7 +64143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64171,7 +64171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64200,7 +64200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64229,7 +64229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64257,7 +64257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64286,7 +64286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64314,7 +64314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64343,7 +64343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64371,7 +64371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64400,7 +64400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64428,7 +64428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64457,7 +64457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64485,7 +64485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64514,7 +64514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64542,7 +64542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64571,7 +64571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64599,7 +64599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64628,7 +64628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64656,7 +64656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64685,7 +64685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64713,7 +64713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64742,7 +64742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64770,7 +64770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64799,7 +64799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64827,7 +64827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64856,7 +64856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64884,7 +64884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64913,7 +64913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64941,7 +64941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64970,7 +64970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -64998,7 +64998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65027,7 +65027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65055,7 +65055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65084,7 +65084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65112,7 +65112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65141,7 +65141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65169,7 +65169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65198,7 +65198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65226,7 +65226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65255,7 +65255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65283,7 +65283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65312,7 +65312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65340,7 +65340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65369,7 +65369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65397,7 +65397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65426,7 +65426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65454,7 +65454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65483,7 +65483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65511,7 +65511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65540,7 +65540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65568,7 +65568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65597,7 +65597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65625,7 +65625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65654,7 +65654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65682,7 +65682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65711,7 +65711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65739,7 +65739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65768,7 +65768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65796,7 +65796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65825,7 +65825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65853,7 +65853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65882,7 +65882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65910,7 +65910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65939,7 +65939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65967,7 +65967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -65996,7 +65996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66024,7 +66024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66053,7 +66053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66081,7 +66081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66110,7 +66110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66138,7 +66138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66167,7 +66167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66195,7 +66195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66224,7 +66224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66252,7 +66252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66281,7 +66281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66309,7 +66309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66338,7 +66338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66366,7 +66366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66395,7 +66395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66423,7 +66423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66452,7 +66452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66480,7 +66480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66509,7 +66509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66537,7 +66537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66566,7 +66566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66594,7 +66594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66623,7 +66623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66651,7 +66651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66680,7 +66680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66708,7 +66708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66737,7 +66737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66765,7 +66765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66794,7 +66794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66822,7 +66822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66851,7 +66851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66879,7 +66879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66908,7 +66908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66936,7 +66936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66965,7 +66965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -66993,7 +66993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67022,7 +67022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67050,7 +67050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67079,7 +67079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67107,7 +67107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67136,7 +67136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67164,7 +67164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67193,7 +67193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67221,7 +67221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67250,7 +67250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67278,7 +67278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67307,7 +67307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67335,7 +67335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67363,7 +67363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67392,7 +67392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67420,7 +67420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67449,7 +67449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67478,7 +67478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67506,7 +67506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67535,7 +67535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67563,7 +67563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67592,7 +67592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67620,7 +67620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67649,7 +67649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67677,7 +67677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67706,7 +67706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67734,7 +67734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67763,7 +67763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67791,7 +67791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67820,7 +67820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67848,7 +67848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67877,7 +67877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67909,7 +67909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67938,7 +67938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67966,7 +67966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -67995,7 +67995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68023,7 +68023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68052,7 +68052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68080,7 +68080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68109,7 +68109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68137,7 +68137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68166,7 +68166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68194,7 +68194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68223,7 +68223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68251,7 +68251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68280,7 +68280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68308,7 +68308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68337,7 +68337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68365,7 +68365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68394,7 +68394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68422,7 +68422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68451,7 +68451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68479,7 +68479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68508,7 +68508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68536,7 +68536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68565,7 +68565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68593,7 +68593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68622,7 +68622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68650,7 +68650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68679,7 +68679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68707,7 +68707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68736,7 +68736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68764,7 +68764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68793,7 +68793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68821,7 +68821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68850,7 +68850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68878,7 +68878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68907,7 +68907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68935,7 +68935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68964,7 +68964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -68992,7 +68992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69021,7 +69021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69049,7 +69049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69078,7 +69078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69106,7 +69106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69135,7 +69135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69163,7 +69163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69192,7 +69192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69220,7 +69220,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69249,7 +69249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69277,7 +69277,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69306,7 +69306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69334,7 +69334,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69363,7 +69363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69391,7 +69391,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69420,7 +69420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69448,7 +69448,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69477,7 +69477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69505,7 +69505,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69534,7 +69534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69562,7 +69562,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69591,7 +69591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69619,7 +69619,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69648,7 +69648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69676,7 +69676,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69705,7 +69705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69733,7 +69733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69762,7 +69762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69790,7 +69790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69819,7 +69819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69847,7 +69847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69876,7 +69876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69904,7 +69904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69933,7 +69933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69961,7 +69961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -69990,7 +69990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70018,7 +70018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70047,7 +70047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70075,7 +70075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70104,7 +70104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70132,7 +70132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70161,7 +70161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70189,7 +70189,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70218,7 +70218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70246,7 +70246,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70275,7 +70275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70303,7 +70303,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70332,7 +70332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70360,7 +70360,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70389,7 +70389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70417,7 +70417,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70446,7 +70446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70474,7 +70474,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -70503,7 +70503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -70531,7 +70531,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70560,7 +70560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70588,7 +70588,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70617,7 +70617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70645,7 +70645,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70674,7 +70674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70702,7 +70702,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70731,7 +70731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70759,7 +70759,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70788,7 +70788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70816,7 +70816,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70845,7 +70845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70873,7 +70873,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70902,7 +70902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70930,7 +70930,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70959,7 +70959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -70987,7 +70987,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71016,7 +71016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71044,7 +71044,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71073,7 +71073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71101,7 +71101,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71130,7 +71130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71158,7 +71158,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71187,7 +71187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71215,7 +71215,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71244,7 +71244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71272,7 +71272,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71301,7 +71301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71329,7 +71329,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71358,7 +71358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71386,7 +71386,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71415,7 +71415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71443,7 +71443,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71472,7 +71472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71500,7 +71500,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71529,7 +71529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71557,7 +71557,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71586,7 +71586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71614,7 +71614,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71643,7 +71643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71671,7 +71671,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71700,7 +71700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71728,7 +71728,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71757,7 +71757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71785,7 +71785,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71814,7 +71814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71842,7 +71842,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71871,7 +71871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71899,7 +71899,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71928,7 +71928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71956,7 +71956,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -71985,7 +71985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72013,7 +72013,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72042,7 +72042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72070,7 +72070,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72099,7 +72099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72127,7 +72127,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72156,7 +72156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72184,7 +72184,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72213,7 +72213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72241,7 +72241,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72270,7 +72270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72298,7 +72298,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72327,7 +72327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72355,7 +72355,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72384,7 +72384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72412,7 +72412,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72441,7 +72441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72469,7 +72469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72498,7 +72498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72526,7 +72526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72555,7 +72555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72583,7 +72583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72612,7 +72612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72640,7 +72640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72669,7 +72669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72697,7 +72697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72726,7 +72726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72754,7 +72754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72783,7 +72783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72811,7 +72811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72840,7 +72840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72868,7 +72868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72897,7 +72897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72925,7 +72925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72954,7 +72954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -72982,7 +72982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73011,7 +73011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73039,7 +73039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73068,7 +73068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73096,7 +73096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73125,7 +73125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73153,7 +73153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73182,7 +73182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73210,7 +73210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73239,7 +73239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73267,7 +73267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73296,7 +73296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73324,7 +73324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73353,7 +73353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73381,7 +73381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73410,7 +73410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73438,7 +73438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73467,7 +73467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73495,7 +73495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73524,7 +73524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73552,7 +73552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73581,7 +73581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73609,7 +73609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73638,7 +73638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73666,7 +73666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73695,7 +73695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73723,7 +73723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73752,7 +73752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73780,7 +73780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73809,7 +73809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73837,7 +73837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73866,7 +73866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73894,7 +73894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73923,7 +73923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73951,7 +73951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -73980,7 +73980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74008,7 +74008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74037,7 +74037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74065,7 +74065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74094,7 +74094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74122,7 +74122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74151,7 +74151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74179,7 +74179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74208,7 +74208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74236,7 +74236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74265,7 +74265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74293,7 +74293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74322,7 +74322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74350,7 +74350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74379,7 +74379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74407,7 +74407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74436,7 +74436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74464,7 +74464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74493,7 +74493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74521,7 +74521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74550,7 +74550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74578,7 +74578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74607,7 +74607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74635,7 +74635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74664,7 +74664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74692,7 +74692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74721,7 +74721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74749,7 +74749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74778,7 +74778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74806,7 +74806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74835,7 +74835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74863,7 +74863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74892,7 +74892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74920,7 +74920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74949,7 +74949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -74977,7 +74977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75006,7 +75006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75034,7 +75034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75063,7 +75063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75091,7 +75091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75120,7 +75120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75148,7 +75148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75177,7 +75177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75205,7 +75205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75234,7 +75234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75262,7 +75262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75291,7 +75291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75319,7 +75319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75348,7 +75348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75376,7 +75376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75404,7 +75404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75433,7 +75433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75461,7 +75461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75490,7 +75490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75519,7 +75519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75547,7 +75547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75576,7 +75576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75604,7 +75604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75633,7 +75633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75661,7 +75661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75690,7 +75690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75718,7 +75718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75747,7 +75747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75775,7 +75775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75804,7 +75804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75832,7 +75832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75861,7 +75861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75889,7 +75889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75918,7 +75918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75946,7 +75946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -75975,7 +75975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76003,7 +76003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76032,7 +76032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76060,7 +76060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76089,7 +76089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76117,7 +76117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76146,7 +76146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76174,7 +76174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76203,7 +76203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76231,7 +76231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76260,7 +76260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76288,7 +76288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76317,7 +76317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76345,7 +76345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76374,7 +76374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76402,7 +76402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76431,7 +76431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76459,7 +76459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76488,7 +76488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76516,7 +76516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76545,7 +76545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76573,7 +76573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76602,7 +76602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76630,7 +76630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76659,7 +76659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76687,7 +76687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76716,7 +76716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76744,7 +76744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76773,7 +76773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76801,7 +76801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76830,7 +76830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76858,7 +76858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76887,7 +76887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76915,7 +76915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76944,7 +76944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -76972,7 +76972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77001,7 +77001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77029,7 +77029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77058,7 +77058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77086,7 +77086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77115,7 +77115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77143,7 +77143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77172,7 +77172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77200,7 +77200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77229,7 +77229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77257,7 +77257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77286,7 +77286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77314,7 +77314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77343,7 +77343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77371,7 +77371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77400,7 +77400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77428,7 +77428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77457,7 +77457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77485,7 +77485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77514,7 +77514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77542,7 +77542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77571,7 +77571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77599,7 +77599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77628,7 +77628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77656,7 +77656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77685,7 +77685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77713,7 +77713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77742,7 +77742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77770,7 +77770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77799,7 +77799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77827,7 +77827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77856,7 +77856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77884,7 +77884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77913,7 +77913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77941,7 +77941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77970,7 +77970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -77998,7 +77998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78027,7 +78027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78055,7 +78055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78084,7 +78084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78112,7 +78112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78141,7 +78141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78169,7 +78169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78198,7 +78198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78226,7 +78226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78255,7 +78255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78283,7 +78283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78312,7 +78312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78340,7 +78340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78369,7 +78369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78397,7 +78397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78426,7 +78426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78454,7 +78454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78483,7 +78483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78511,7 +78511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78540,7 +78540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78568,7 +78568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78597,7 +78597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78625,7 +78625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78653,7 +78653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78682,7 +78682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78710,7 +78710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78739,7 +78739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78768,7 +78768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78796,7 +78796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78825,7 +78825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78853,7 +78853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78882,7 +78882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78910,7 +78910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78939,7 +78939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78967,7 +78967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -78996,7 +78996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79024,7 +79024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79053,7 +79053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79081,7 +79081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79110,7 +79110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79138,7 +79138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79167,7 +79167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79199,7 +79199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79228,7 +79228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79256,7 +79256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79285,7 +79285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79313,7 +79313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79342,7 +79342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79370,7 +79370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79399,7 +79399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79427,7 +79427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79456,7 +79456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79484,7 +79484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79513,7 +79513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79541,7 +79541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79570,7 +79570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79598,7 +79598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79627,7 +79627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79655,7 +79655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79684,7 +79684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79712,7 +79712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79741,7 +79741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79769,7 +79769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79798,7 +79798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79826,7 +79826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79855,7 +79855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79883,7 +79883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79912,7 +79912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79940,7 +79940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79969,7 +79969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -79997,7 +79997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80026,7 +80026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80054,7 +80054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80083,7 +80083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80111,7 +80111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80140,7 +80140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80168,7 +80168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80197,7 +80197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80225,7 +80225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80254,7 +80254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80282,7 +80282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80311,7 +80311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80339,7 +80339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80368,7 +80368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80396,7 +80396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80425,7 +80425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80453,7 +80453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80482,7 +80482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80510,7 +80510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80539,7 +80539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80567,7 +80567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80596,7 +80596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80624,7 +80624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80653,7 +80653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80681,7 +80681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80710,7 +80710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80738,7 +80738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80767,7 +80767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80795,7 +80795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80824,7 +80824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80852,7 +80852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80881,7 +80881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80909,7 +80909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80938,7 +80938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80966,7 +80966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -80995,7 +80995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81023,7 +81023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81052,7 +81052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81080,7 +81080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81109,7 +81109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81137,7 +81137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81166,7 +81166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81194,7 +81194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81223,7 +81223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81251,7 +81251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81280,7 +81280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81308,7 +81308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81337,7 +81337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81365,7 +81365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81394,7 +81394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81422,7 +81422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81451,7 +81451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81479,7 +81479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81508,7 +81508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81536,7 +81536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81565,7 +81565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81593,7 +81593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81622,7 +81622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81650,7 +81650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81679,7 +81679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81707,7 +81707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81736,7 +81736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81764,7 +81764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -81793,7 +81793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -81821,7 +81821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81850,7 +81850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81878,7 +81878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81907,7 +81907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81935,7 +81935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81964,7 +81964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -81992,7 +81992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82021,7 +82021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82049,7 +82049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82078,7 +82078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82106,7 +82106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82135,7 +82135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82163,7 +82163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82192,7 +82192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82220,7 +82220,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82249,7 +82249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82277,7 +82277,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82306,7 +82306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82334,7 +82334,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82363,7 +82363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82391,7 +82391,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82420,7 +82420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82448,7 +82448,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82477,7 +82477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82505,7 +82505,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82534,7 +82534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82562,7 +82562,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82591,7 +82591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82619,7 +82619,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82648,7 +82648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82676,7 +82676,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82705,7 +82705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82733,7 +82733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82762,7 +82762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82790,7 +82790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82819,7 +82819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82847,7 +82847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82876,7 +82876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82904,7 +82904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82933,7 +82933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82961,7 +82961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -82990,7 +82990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83018,7 +83018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83047,7 +83047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83075,7 +83075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83104,7 +83104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83132,7 +83132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83161,7 +83161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83189,7 +83189,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83218,7 +83218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83246,7 +83246,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83275,7 +83275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83303,7 +83303,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83332,7 +83332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83360,7 +83360,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83389,7 +83389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83417,7 +83417,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83446,7 +83446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83474,7 +83474,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83503,7 +83503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83531,7 +83531,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83560,7 +83560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83588,7 +83588,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83617,7 +83617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83645,7 +83645,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83674,7 +83674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83702,7 +83702,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83731,7 +83731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83759,7 +83759,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83788,7 +83788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83816,7 +83816,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83845,7 +83845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83873,7 +83873,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83902,7 +83902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83930,7 +83930,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83959,7 +83959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -83987,7 +83987,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84016,7 +84016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84044,7 +84044,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84073,7 +84073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84101,7 +84101,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84130,7 +84130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84158,7 +84158,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84187,7 +84187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84215,7 +84215,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84244,7 +84244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84272,7 +84272,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84301,7 +84301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84329,7 +84329,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84358,7 +84358,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84386,7 +84386,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84415,7 +84415,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84443,7 +84443,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84472,7 +84472,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84500,7 +84500,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84529,7 +84529,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84557,7 +84557,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84586,7 +84586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84614,7 +84614,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84643,7 +84643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84671,7 +84671,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84700,7 +84700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84728,7 +84728,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84757,7 +84757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84785,7 +84785,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84814,7 +84814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84842,7 +84842,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84871,7 +84871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84899,7 +84899,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84928,7 +84928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84956,7 +84956,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -84985,7 +84985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85013,7 +85013,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85042,7 +85042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85070,7 +85070,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85099,7 +85099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85127,7 +85127,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85156,7 +85156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85184,7 +85184,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85213,7 +85213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85241,7 +85241,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85270,7 +85270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85298,7 +85298,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85327,7 +85327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85355,7 +85355,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85384,7 +85384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85412,7 +85412,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85441,7 +85441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85469,7 +85469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85498,7 +85498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85526,7 +85526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85555,7 +85555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85583,7 +85583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85612,7 +85612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85640,7 +85640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85669,7 +85669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85697,7 +85697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85726,7 +85726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85754,7 +85754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85783,7 +85783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85811,7 +85811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85840,7 +85840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85868,7 +85868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85897,7 +85897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85925,7 +85925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85954,7 +85954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -85982,7 +85982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86011,7 +86011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86039,7 +86039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86068,7 +86068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86096,7 +86096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86125,7 +86125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86153,7 +86153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86182,7 +86182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86210,7 +86210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86239,7 +86239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86267,7 +86267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86296,7 +86296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86324,7 +86324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86353,7 +86353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86381,7 +86381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86410,7 +86410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86438,7 +86438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86467,7 +86467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86495,7 +86495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86524,7 +86524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86552,7 +86552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86581,7 +86581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86609,7 +86609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86638,7 +86638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86666,7 +86666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86694,7 +86694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86723,7 +86723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86751,7 +86751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86780,7 +86780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86809,7 +86809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86837,7 +86837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86866,7 +86866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86894,7 +86894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86923,7 +86923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86951,7 +86951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -86980,7 +86980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87008,7 +87008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87037,7 +87037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87065,7 +87065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87094,7 +87094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87122,7 +87122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87151,7 +87151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87179,7 +87179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87208,7 +87208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87236,7 +87236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87265,7 +87265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87293,7 +87293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87322,7 +87322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87350,7 +87350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87379,7 +87379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87407,7 +87407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87436,7 +87436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87464,7 +87464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87493,7 +87493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87521,7 +87521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87550,7 +87550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87578,7 +87578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87607,7 +87607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87635,7 +87635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87664,7 +87664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87692,7 +87692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87721,7 +87721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87749,7 +87749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87778,7 +87778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87806,7 +87806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87835,7 +87835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87863,7 +87863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87892,7 +87892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87920,7 +87920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87949,7 +87949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -87977,7 +87977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88006,7 +88006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88034,7 +88034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88063,7 +88063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88091,7 +88091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88120,7 +88120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88148,7 +88148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88177,7 +88177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88205,7 +88205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88234,7 +88234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88262,7 +88262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88291,7 +88291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88319,7 +88319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88348,7 +88348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88376,7 +88376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88405,7 +88405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88433,7 +88433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88462,7 +88462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88490,7 +88490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88519,7 +88519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88547,7 +88547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88576,7 +88576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88604,7 +88604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88633,7 +88633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88661,7 +88661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88690,7 +88690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88718,7 +88718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88747,7 +88747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88775,7 +88775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88804,7 +88804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88832,7 +88832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88861,7 +88861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88889,7 +88889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88918,7 +88918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88946,7 +88946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -88975,7 +88975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89003,7 +89003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89032,7 +89032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89060,7 +89060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89089,7 +89089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89117,7 +89117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89146,7 +89146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89174,7 +89174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89203,7 +89203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89231,7 +89231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89260,7 +89260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89288,7 +89288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89317,7 +89317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89345,7 +89345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89374,7 +89374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89402,7 +89402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89431,7 +89431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89459,7 +89459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89488,7 +89488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89516,7 +89516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89545,7 +89545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89573,7 +89573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89602,7 +89602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89630,7 +89630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89659,7 +89659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89687,7 +89687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89716,7 +89716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89744,7 +89744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89773,7 +89773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89801,7 +89801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89830,7 +89830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89858,7 +89858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89887,7 +89887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89915,7 +89915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89943,7 +89943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -89972,7 +89972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90000,7 +90000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90029,7 +90029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90058,7 +90058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90086,7 +90086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90115,7 +90115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90143,7 +90143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90172,7 +90172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90200,7 +90200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90229,7 +90229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90257,7 +90257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90286,7 +90286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90314,7 +90314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90343,7 +90343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90371,7 +90371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90400,7 +90400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90428,7 +90428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90457,7 +90457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90489,7 +90489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90518,7 +90518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90546,7 +90546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90575,7 +90575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90603,7 +90603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90632,7 +90632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90660,7 +90660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90689,7 +90689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90717,7 +90717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90746,7 +90746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90774,7 +90774,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90803,7 +90803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90831,7 +90831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90860,7 +90860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90888,7 +90888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90917,7 +90917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90945,7 +90945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -90974,7 +90974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91002,7 +91002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91031,7 +91031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91059,7 +91059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91088,7 +91088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91116,7 +91116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91145,7 +91145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91173,7 +91173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91202,7 +91202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91230,7 +91230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91259,7 +91259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91287,7 +91287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91316,7 +91316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91344,7 +91344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91373,7 +91373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91401,7 +91401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91430,7 +91430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91458,7 +91458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91487,7 +91487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91515,7 +91515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91544,7 +91544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91572,7 +91572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91601,7 +91601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91629,7 +91629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91658,7 +91658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91686,7 +91686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91715,7 +91715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91743,7 +91743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91772,7 +91772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91800,7 +91800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91829,7 +91829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91857,7 +91857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91886,7 +91886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91914,7 +91914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91943,7 +91943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -91971,7 +91971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92000,7 +92000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92028,7 +92028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92057,7 +92057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92085,7 +92085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92114,7 +92114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92142,7 +92142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92171,7 +92171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92199,7 +92199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92228,7 +92228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92256,7 +92256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92285,7 +92285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92313,7 +92313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92342,7 +92342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92370,7 +92370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92399,7 +92399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92427,7 +92427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92456,7 +92456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92484,7 +92484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92513,7 +92513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92541,7 +92541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92570,7 +92570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92598,7 +92598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92627,7 +92627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92655,7 +92655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92684,7 +92684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92712,7 +92712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92741,7 +92741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92769,7 +92769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92798,7 +92798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92826,7 +92826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92855,7 +92855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92883,7 +92883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92912,7 +92912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92940,7 +92940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92969,7 +92969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -92997,7 +92997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93026,7 +93026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93054,7 +93054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -93083,7 +93083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -93111,7 +93111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93140,7 +93140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93168,7 +93168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93197,7 +93197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93225,7 +93225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93254,7 +93254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93282,7 +93282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93311,7 +93311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93339,7 +93339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93368,7 +93368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93396,7 +93396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93425,7 +93425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93453,7 +93453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93482,7 +93482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93510,7 +93510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93539,7 +93539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93558,7 +93558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93586,7 +93586,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93615,7 +93615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93643,7 +93643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93672,7 +93672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93700,7 +93700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93729,7 +93729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93757,7 +93757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93786,7 +93786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93814,7 +93814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93843,7 +93843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93871,7 +93871,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93900,7 +93900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93928,7 +93928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93957,7 +93957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -93985,7 +93985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94014,7 +94014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94042,7 +94042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94071,7 +94071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94099,7 +94099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94128,7 +94128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94156,7 +94156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94185,7 +94185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94213,7 +94213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94242,7 +94242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94270,7 +94270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94299,7 +94299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94327,7 +94327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94356,7 +94356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94384,7 +94384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94413,7 +94413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94441,7 +94441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94470,7 +94470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94498,7 +94498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94527,7 +94527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94555,7 +94555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94584,7 +94584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94612,7 +94612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94641,7 +94641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94669,7 +94669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94698,7 +94698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94726,7 +94726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94755,7 +94755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94783,7 +94783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94812,7 +94812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94840,7 +94840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94869,7 +94869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94897,7 +94897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94926,7 +94926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94954,7 +94954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -94983,7 +94983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95011,7 +95011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95040,7 +95040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95068,7 +95068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95097,7 +95097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95125,7 +95125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95154,7 +95154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95182,7 +95182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95211,7 +95211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95239,7 +95239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95268,7 +95268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95296,7 +95296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95325,7 +95325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95353,7 +95353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95382,7 +95382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95410,7 +95410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95439,7 +95439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95467,7 +95467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95496,7 +95496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95524,7 +95524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95553,7 +95553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95581,7 +95581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95610,7 +95610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95638,7 +95638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95667,7 +95667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95695,7 +95695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95724,7 +95724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95752,7 +95752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95781,7 +95781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95809,7 +95809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95838,7 +95838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95866,7 +95866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95895,7 +95895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95923,7 +95923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95952,7 +95952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -95980,7 +95980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96009,7 +96009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96037,7 +96037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96066,7 +96066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96094,7 +96094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96123,7 +96123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96151,7 +96151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96180,7 +96180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96208,7 +96208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96237,7 +96237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96265,7 +96265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96294,7 +96294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96322,7 +96322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96351,7 +96351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96379,7 +96379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96408,7 +96408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96436,7 +96436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96465,7 +96465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96493,7 +96493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96522,7 +96522,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96550,7 +96550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96579,7 +96579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96607,7 +96607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96636,7 +96636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96664,7 +96664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96693,7 +96693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96721,7 +96721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96750,7 +96750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96778,7 +96778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96807,7 +96807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96835,7 +96835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96864,7 +96864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96892,7 +96892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96921,7 +96921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96949,7 +96949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -96978,7 +96978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97006,7 +97006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97035,7 +97035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97063,7 +97063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97092,7 +97092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97120,7 +97120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97149,7 +97149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97177,7 +97177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97206,7 +97206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97234,7 +97234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97263,7 +97263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97291,7 +97291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97320,7 +97320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97348,7 +97348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97377,7 +97377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97405,7 +97405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97434,7 +97434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97462,7 +97462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97491,7 +97491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97519,7 +97519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97548,7 +97548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97576,7 +97576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97605,7 +97605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97633,7 +97633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97662,7 +97662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97690,7 +97690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97719,7 +97719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97747,7 +97747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97776,7 +97776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97804,7 +97804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97833,7 +97833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97861,7 +97861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97890,7 +97890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97918,7 +97918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97947,7 +97947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -97975,7 +97975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98003,7 +98003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98032,7 +98032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98060,7 +98060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98089,7 +98089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98118,7 +98118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98146,7 +98146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98175,7 +98175,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98203,7 +98203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98232,7 +98232,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98260,7 +98260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98289,7 +98289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98317,7 +98317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98346,7 +98346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98374,7 +98374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98403,7 +98403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98431,7 +98431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98460,7 +98460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98488,7 +98488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98517,7 +98517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98545,7 +98545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98574,7 +98574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98602,7 +98602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98631,7 +98631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98659,7 +98659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98688,7 +98688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98716,7 +98716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98745,7 +98745,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98773,7 +98773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98802,7 +98802,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98830,7 +98830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98859,7 +98859,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98887,7 +98887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98916,7 +98916,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98944,7 +98944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -98973,7 +98973,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99001,7 +99001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99030,7 +99030,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99058,7 +99058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99087,7 +99087,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99115,7 +99115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99144,7 +99144,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99172,7 +99172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99201,7 +99201,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99229,7 +99229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99258,7 +99258,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99286,7 +99286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99315,7 +99315,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99343,7 +99343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99372,7 +99372,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99400,7 +99400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99429,7 +99429,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99457,7 +99457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99486,7 +99486,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99514,7 +99514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99543,7 +99543,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99571,7 +99571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99600,7 +99600,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99628,7 +99628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99657,7 +99657,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99685,7 +99685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99714,7 +99714,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99742,7 +99742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99771,7 +99771,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99799,7 +99799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99828,7 +99828,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99856,7 +99856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99885,7 +99885,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99913,7 +99913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99942,7 +99942,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99970,7 +99970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -99999,7 +99999,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100027,7 +100027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100056,7 +100056,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100084,7 +100084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100113,7 +100113,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100141,7 +100141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100170,7 +100170,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100198,7 +100198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100227,7 +100227,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100255,7 +100255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100284,7 +100284,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100312,7 +100312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100341,7 +100341,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100369,7 +100369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100398,7 +100398,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100426,7 +100426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100455,7 +100455,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100483,7 +100483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100512,7 +100512,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100540,7 +100540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100569,7 +100569,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100597,7 +100597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100626,7 +100626,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100654,7 +100654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100683,7 +100683,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100711,7 +100711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100740,7 +100740,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100768,7 +100768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100797,7 +100797,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100825,7 +100825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100854,7 +100854,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100882,7 +100882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100911,7 +100911,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100939,7 +100939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100968,7 +100968,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -100996,7 +100996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101025,7 +101025,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101053,7 +101053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101082,7 +101082,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101110,7 +101110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101139,7 +101139,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101167,7 +101167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101196,7 +101196,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101224,7 +101224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101252,7 +101252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101281,7 +101281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101309,7 +101309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101338,7 +101338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101367,7 +101367,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101395,7 +101395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101424,7 +101424,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101452,7 +101452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101481,7 +101481,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101509,7 +101509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101538,7 +101538,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101566,7 +101566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101595,7 +101595,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101623,7 +101623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101652,7 +101652,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101680,7 +101680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101709,7 +101709,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101737,7 +101737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101766,7 +101766,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101789,7 +101789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101817,7 +101817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101846,7 +101846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101874,7 +101874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101903,7 +101903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101931,7 +101931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101960,7 +101960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -101988,7 +101988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102017,7 +102017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102045,7 +102045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102074,7 +102074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102102,7 +102102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102131,7 +102131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102159,7 +102159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102188,7 +102188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102216,7 +102216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102245,7 +102245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102273,7 +102273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102302,7 +102302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102330,7 +102330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102359,7 +102359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102387,7 +102387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102416,7 +102416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102444,7 +102444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102473,7 +102473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102501,7 +102501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102530,7 +102530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102558,7 +102558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102587,7 +102587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102615,7 +102615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102644,7 +102644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102672,7 +102672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102701,7 +102701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102729,7 +102729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102758,7 +102758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102786,7 +102786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102815,7 +102815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102843,7 +102843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102872,7 +102872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102900,7 +102900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102929,7 +102929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102957,7 +102957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -102986,7 +102986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103014,7 +103014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103043,7 +103043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103071,7 +103071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103100,7 +103100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103128,7 +103128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103157,7 +103157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103185,7 +103185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103214,7 +103214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103242,7 +103242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103271,7 +103271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103299,7 +103299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103328,7 +103328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103356,7 +103356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103385,7 +103385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103413,7 +103413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103442,7 +103442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103470,7 +103470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103499,7 +103499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103527,7 +103527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103556,7 +103556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103584,7 +103584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103613,7 +103613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103641,7 +103641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103670,7 +103670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103698,7 +103698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103727,7 +103727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103755,7 +103755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103784,7 +103784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103812,7 +103812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103841,7 +103841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103869,7 +103869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103898,7 +103898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103926,7 +103926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103955,7 +103955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -103983,7 +103983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104012,7 +104012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104040,7 +104040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104069,7 +104069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104097,7 +104097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104126,7 +104126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104154,7 +104154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104183,7 +104183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104211,7 +104211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104240,7 +104240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104268,7 +104268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104297,7 +104297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104316,7 +104316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104344,7 +104344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104373,7 +104373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104401,7 +104401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -104430,7 +104430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -104458,7 +104458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104487,7 +104487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104515,7 +104515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104544,7 +104544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104572,7 +104572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104601,7 +104601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104629,7 +104629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104658,7 +104658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104686,7 +104686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104715,7 +104715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104743,7 +104743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104772,7 +104772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104800,7 +104800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104829,7 +104829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104857,7 +104857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104886,7 +104886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104905,7 +104905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104933,7 +104933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104962,7 +104962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -104990,7 +104990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105019,7 +105019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105047,7 +105047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105076,7 +105076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105104,7 +105104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105133,7 +105133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105161,7 +105161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105190,7 +105190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105218,7 +105218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105247,7 +105247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105275,7 +105275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105304,7 +105304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105332,7 +105332,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105361,7 +105361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105389,7 +105389,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105418,7 +105418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105446,7 +105446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105475,7 +105475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105503,7 +105503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105532,7 +105532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105560,7 +105560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105589,7 +105589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105617,7 +105617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105646,7 +105646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105674,7 +105674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105703,7 +105703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105731,7 +105731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105760,7 +105760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105788,7 +105788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105817,7 +105817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105845,7 +105845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105874,7 +105874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105902,7 +105902,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105931,7 +105931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105959,7 +105959,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -105988,7 +105988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106016,7 +106016,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106045,7 +106045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106073,7 +106073,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106102,7 +106102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106130,7 +106130,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106159,7 +106159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106187,7 +106187,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106216,7 +106216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106244,7 +106244,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106273,7 +106273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106301,7 +106301,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106330,7 +106330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106349,7 +106349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106377,7 +106377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106406,7 +106406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106434,7 +106434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106463,7 +106463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106491,7 +106491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106520,7 +106520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106548,7 +106548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106577,7 +106577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106605,7 +106605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106634,7 +106634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106662,7 +106662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106691,7 +106691,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106719,7 +106719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106748,7 +106748,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106776,7 +106776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106805,7 +106805,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106833,7 +106833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106862,7 +106862,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106890,7 +106890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106919,7 +106919,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106947,7 +106947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -106976,7 +106976,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107004,7 +107004,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107033,7 +107033,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107061,7 +107061,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107090,7 +107090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107118,7 +107118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107147,7 +107147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107175,7 +107175,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107204,7 +107204,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107232,7 +107232,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107261,7 +107261,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107289,7 +107289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107318,7 +107318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107346,7 +107346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107375,7 +107375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107403,7 +107403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107432,7 +107432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107460,7 +107460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107489,7 +107489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107517,7 +107517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107546,7 +107546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107574,7 +107574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107603,7 +107603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107631,7 +107631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107660,7 +107660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107688,7 +107688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107717,7 +107717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107745,7 +107745,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107774,7 +107774,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107802,7 +107802,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107831,7 +107831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107859,7 +107859,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107888,7 +107888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107916,7 +107916,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107945,7 +107945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -107973,7 +107973,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108002,7 +108002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108030,7 +108030,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108059,7 +108059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108087,7 +108087,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108116,7 +108116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108144,7 +108144,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108173,7 +108173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108201,7 +108201,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108230,7 +108230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108258,7 +108258,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108287,7 +108287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108315,7 +108315,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108344,7 +108344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108372,7 +108372,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108401,7 +108401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108429,7 +108429,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108458,7 +108458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108486,7 +108486,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108515,7 +108515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108543,7 +108543,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108572,7 +108572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108600,7 +108600,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108629,7 +108629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108657,7 +108657,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108686,7 +108686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108714,7 +108714,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108743,7 +108743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108771,7 +108771,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108800,7 +108800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108828,7 +108828,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108857,7 +108857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108885,7 +108885,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108914,7 +108914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108942,7 +108942,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108971,7 +108971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -108999,7 +108999,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109028,7 +109028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109056,7 +109056,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109085,7 +109085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109113,7 +109113,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109142,7 +109142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109170,7 +109170,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109199,7 +109199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109227,7 +109227,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109256,7 +109256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109284,7 +109284,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109313,7 +109313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109341,7 +109341,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109369,7 +109369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109398,7 +109398,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109426,7 +109426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109455,7 +109455,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109484,7 +109484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109512,7 +109512,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109541,7 +109541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109569,7 +109569,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109598,7 +109598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109626,7 +109626,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109655,7 +109655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109683,7 +109683,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109712,7 +109712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109740,7 +109740,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109769,7 +109769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109797,7 +109797,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109826,7 +109826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109854,7 +109854,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109883,7 +109883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109911,7 +109911,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109940,7 +109940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109968,7 +109968,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -109997,7 +109997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110025,7 +110025,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110054,7 +110054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110082,7 +110082,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110111,7 +110111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110139,7 +110139,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110168,7 +110168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110196,7 +110196,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110225,7 +110225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110253,7 +110253,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110282,7 +110282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110310,7 +110310,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110339,7 +110339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110367,7 +110367,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110396,7 +110396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110424,7 +110424,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110453,7 +110453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110481,7 +110481,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110510,7 +110510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110538,7 +110538,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110567,7 +110567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110595,7 +110595,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110624,7 +110624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110652,7 +110652,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110681,7 +110681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110709,7 +110709,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110738,7 +110738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110766,7 +110766,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110795,7 +110795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110823,7 +110823,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110852,7 +110852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110880,7 +110880,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110909,7 +110909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110937,7 +110937,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110966,7 +110966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -110994,7 +110994,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111023,7 +111023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111051,7 +111051,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111080,7 +111080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111108,7 +111108,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111137,7 +111137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111165,7 +111165,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111194,7 +111194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111222,7 +111222,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111251,7 +111251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111279,7 +111279,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111308,7 +111308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111336,7 +111336,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111365,7 +111365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111393,7 +111393,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111422,7 +111422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111450,7 +111450,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111479,7 +111479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111507,7 +111507,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111536,7 +111536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111564,7 +111564,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111593,7 +111593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111621,7 +111621,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111650,7 +111650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111678,7 +111678,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111707,7 +111707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111735,7 +111735,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111764,7 +111764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111792,7 +111792,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111821,7 +111821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111849,7 +111849,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111878,7 +111878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111906,7 +111906,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111935,7 +111935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111963,7 +111963,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -111992,7 +111992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112020,7 +112020,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112049,7 +112049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112077,7 +112077,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112106,7 +112106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112134,7 +112134,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112163,7 +112163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112191,7 +112191,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112220,7 +112220,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112248,7 +112248,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112277,7 +112277,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112305,7 +112305,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112334,7 +112334,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112362,7 +112362,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112391,7 +112391,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112419,7 +112419,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112448,7 +112448,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112476,7 +112476,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112505,7 +112505,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112533,7 +112533,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112562,7 +112562,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112590,7 +112590,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112618,7 +112618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112647,7 +112647,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112675,7 +112675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112704,7 +112704,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112733,7 +112733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112761,7 +112761,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112790,7 +112790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112818,7 +112818,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112847,7 +112847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112875,7 +112875,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112904,7 +112904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112932,7 +112932,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112961,7 +112961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -112989,7 +112989,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113018,7 +113018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113046,7 +113046,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113075,7 +113075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113103,7 +113103,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113132,7 +113132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113155,7 +113155,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113183,7 +113183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113212,7 +113212,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113240,7 +113240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113269,7 +113269,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113297,7 +113297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113326,7 +113326,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113354,7 +113354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113383,7 +113383,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113411,7 +113411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113440,7 +113440,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113468,7 +113468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113497,7 +113497,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113525,7 +113525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113554,7 +113554,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113582,7 +113582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113611,7 +113611,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113639,7 +113639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113668,7 +113668,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113696,7 +113696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113725,7 +113725,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113753,7 +113753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113782,7 +113782,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113810,7 +113810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113839,7 +113839,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113867,7 +113867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113896,7 +113896,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113924,7 +113924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113953,7 +113953,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -113981,7 +113981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114010,7 +114010,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114038,7 +114038,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114067,7 +114067,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114095,7 +114095,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114124,7 +114124,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114152,7 +114152,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114181,7 +114181,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114209,7 +114209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114238,7 +114238,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114266,7 +114266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114295,7 +114295,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114323,7 +114323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114352,7 +114352,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114380,7 +114380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114409,7 +114409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114437,7 +114437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114466,7 +114466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114494,7 +114494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114523,7 +114523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114551,7 +114551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114580,7 +114580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114608,7 +114608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114637,7 +114637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114665,7 +114665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114694,7 +114694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114722,7 +114722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114751,7 +114751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114779,7 +114779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114808,7 +114808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114836,7 +114836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114865,7 +114865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114893,7 +114893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114922,7 +114922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114950,7 +114950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -114979,7 +114979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115007,7 +115007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115036,7 +115036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115064,7 +115064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115093,7 +115093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115121,7 +115121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115150,7 +115150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115178,7 +115178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115207,7 +115207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115235,7 +115235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115264,7 +115264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115292,7 +115292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115321,7 +115321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115349,7 +115349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115378,7 +115378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115406,7 +115406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115435,7 +115435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115463,7 +115463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115492,7 +115492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115520,7 +115520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115549,7 +115549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115577,7 +115577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115606,7 +115606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115634,7 +115634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115663,7 +115663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115682,7 +115682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115710,7 +115710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115739,7 +115739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115767,7 +115767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -115796,7 +115796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -115824,7 +115824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115853,7 +115853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115881,7 +115881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115910,7 +115910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115938,7 +115938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115967,7 +115967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -115995,7 +115995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116024,7 +116024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116052,7 +116052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116081,7 +116081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116109,7 +116109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116138,7 +116138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116166,7 +116166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116195,7 +116195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116223,7 +116223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116252,7 +116252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116280,7 +116280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116309,7 +116309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116337,7 +116337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116366,7 +116366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116394,7 +116394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116423,7 +116423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116451,7 +116451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116480,7 +116480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116508,7 +116508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116537,7 +116537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116565,7 +116565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116594,7 +116594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116622,7 +116622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116651,7 +116651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116679,7 +116679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116708,7 +116708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116736,7 +116736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116765,7 +116765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116793,7 +116793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116822,7 +116822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116850,7 +116850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116879,7 +116879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116907,7 +116907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116936,7 +116936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116964,7 +116964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -116993,7 +116993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117021,7 +117021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117050,7 +117050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117078,7 +117078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117107,7 +117107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117135,7 +117135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117164,7 +117164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117192,7 +117192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117221,7 +117221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117249,7 +117249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117278,7 +117278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117306,7 +117306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117335,7 +117335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117363,7 +117363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117392,7 +117392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117420,7 +117420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117449,7 +117449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117477,7 +117477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117506,7 +117506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117534,7 +117534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117563,7 +117563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117591,7 +117591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117620,7 +117620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117648,7 +117648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117677,7 +117677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117696,7 +117696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117724,7 +117724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117753,7 +117753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117781,7 +117781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117810,7 +117810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117838,7 +117838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117867,7 +117867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117895,7 +117895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117924,7 +117924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117952,7 +117952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -117981,7 +117981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118009,7 +118009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118038,7 +118038,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118066,7 +118066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118095,7 +118095,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118123,7 +118123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118152,7 +118152,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118180,7 +118180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118209,7 +118209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118237,7 +118237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118266,7 +118266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118294,7 +118294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118323,7 +118323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118351,7 +118351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118380,7 +118380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118408,7 +118408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118437,7 +118437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118465,7 +118465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118494,7 +118494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118522,7 +118522,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118551,7 +118551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118579,7 +118579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118608,7 +118608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118636,7 +118636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118665,7 +118665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118693,7 +118693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118722,7 +118722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118750,7 +118750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118779,7 +118779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118807,7 +118807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118836,7 +118836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118864,7 +118864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118893,7 +118893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118921,7 +118921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118950,7 +118950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -118978,7 +118978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119007,7 +119007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119035,7 +119035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119064,7 +119064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119092,7 +119092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119121,7 +119121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119149,7 +119149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119178,7 +119178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119206,7 +119206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119235,7 +119235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119263,7 +119263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119292,7 +119292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119320,7 +119320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119349,7 +119349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119377,7 +119377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119406,7 +119406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119434,7 +119434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119463,7 +119463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119491,7 +119491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119520,7 +119520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119548,7 +119548,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119577,7 +119577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119605,7 +119605,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119634,7 +119634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119662,7 +119662,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119691,7 +119691,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119719,7 +119719,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119748,7 +119748,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119776,7 +119776,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119805,7 +119805,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119833,7 +119833,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119862,7 +119862,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119890,7 +119890,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119919,7 +119919,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119947,7 +119947,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -119976,7 +119976,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120004,7 +120004,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120033,7 +120033,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120061,7 +120061,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120090,7 +120090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120118,7 +120118,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120147,7 +120147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120175,7 +120175,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120204,7 +120204,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120232,7 +120232,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120261,7 +120261,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120289,7 +120289,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120318,7 +120318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120346,7 +120346,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120375,7 +120375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120403,7 +120403,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120432,7 +120432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120460,7 +120460,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120489,7 +120489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120517,7 +120517,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120546,7 +120546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120574,7 +120574,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120603,7 +120603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120631,7 +120631,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120660,7 +120660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120688,7 +120688,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120716,7 +120716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120745,7 +120745,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120773,7 +120773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120802,7 +120802,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120831,7 +120831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120859,7 +120859,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120888,7 +120888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120916,7 +120916,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120945,7 +120945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -120973,7 +120973,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121002,7 +121002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121030,7 +121030,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121059,7 +121059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121087,7 +121087,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121116,7 +121116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121144,7 +121144,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121173,7 +121173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121201,7 +121201,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121230,7 +121230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121258,7 +121258,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121287,7 +121287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121315,7 +121315,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121344,7 +121344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121372,7 +121372,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121401,7 +121401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121429,7 +121429,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121458,7 +121458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121486,7 +121486,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121515,7 +121515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121543,7 +121543,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121572,7 +121572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121600,7 +121600,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121629,7 +121629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121657,7 +121657,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121686,7 +121686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121714,7 +121714,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121743,7 +121743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121771,7 +121771,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121800,7 +121800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121828,7 +121828,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121857,7 +121857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121885,7 +121885,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121914,7 +121914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121942,7 +121942,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121971,7 +121971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -121999,7 +121999,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122028,7 +122028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122056,7 +122056,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122085,7 +122085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122113,7 +122113,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122142,7 +122142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122170,7 +122170,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122199,7 +122199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122227,7 +122227,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122256,7 +122256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122284,7 +122284,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122313,7 +122313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122341,7 +122341,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122370,7 +122370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122398,7 +122398,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122427,7 +122427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122455,7 +122455,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122484,7 +122484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122512,7 +122512,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122541,7 +122541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122569,7 +122569,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122598,7 +122598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122626,7 +122626,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122655,7 +122655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122683,7 +122683,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122712,7 +122712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122740,7 +122740,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122769,7 +122769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122797,7 +122797,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122826,7 +122826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122854,7 +122854,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122883,7 +122883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122911,7 +122911,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122940,7 +122940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122968,7 +122968,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -122997,7 +122997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123025,7 +123025,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123054,7 +123054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123082,7 +123082,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123111,7 +123111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123139,7 +123139,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123168,7 +123168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123196,7 +123196,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123225,7 +123225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123253,7 +123253,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123282,7 +123282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123310,7 +123310,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123339,7 +123339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123367,7 +123367,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123396,7 +123396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123424,7 +123424,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123453,7 +123453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123481,7 +123481,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123510,7 +123510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123538,7 +123538,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123567,7 +123567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123595,7 +123595,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123624,7 +123624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123652,7 +123652,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123681,7 +123681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123709,7 +123709,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123738,7 +123738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123766,7 +123766,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123795,7 +123795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123823,7 +123823,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123852,7 +123852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123880,7 +123880,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123909,7 +123909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123937,7 +123937,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123965,7 +123965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -123994,7 +123994,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124022,7 +124022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124051,7 +124051,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124080,7 +124080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124108,7 +124108,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124137,7 +124137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124165,7 +124165,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124194,7 +124194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124222,7 +124222,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124251,7 +124251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124279,7 +124279,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124308,7 +124308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124336,7 +124336,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124365,7 +124365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124393,7 +124393,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124422,7 +124422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124450,7 +124450,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124479,7 +124479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124502,7 +124502,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124530,7 +124530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124559,7 +124559,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124587,7 +124587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124616,7 +124616,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124644,7 +124644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124673,7 +124673,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124701,7 +124701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124730,7 +124730,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124758,7 +124758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124787,7 +124787,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124815,7 +124815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124844,7 +124844,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124872,7 +124872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124901,7 +124901,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124929,7 +124929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124958,7 +124958,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -124986,7 +124986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125015,7 +125015,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125043,7 +125043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125072,7 +125072,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125100,7 +125100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125129,7 +125129,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125157,7 +125157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125186,7 +125186,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125214,7 +125214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125243,7 +125243,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125271,7 +125271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125300,7 +125300,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125328,7 +125328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125357,7 +125357,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125385,7 +125385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125414,7 +125414,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125442,7 +125442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125471,7 +125471,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125499,7 +125499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125528,7 +125528,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125556,7 +125556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125585,7 +125585,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125613,7 +125613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125642,7 +125642,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125670,7 +125670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125699,7 +125699,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125727,7 +125727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125756,7 +125756,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125784,7 +125784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125813,7 +125813,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125841,7 +125841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125870,7 +125870,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125898,7 +125898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125927,7 +125927,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125955,7 +125955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -125984,7 +125984,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126012,7 +126012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126041,7 +126041,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126069,7 +126069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126098,7 +126098,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126126,7 +126126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126155,7 +126155,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126183,7 +126183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126212,7 +126212,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126240,7 +126240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126269,7 +126269,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126297,7 +126297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126326,7 +126326,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126354,7 +126354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126383,7 +126383,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126411,7 +126411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126440,7 +126440,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126468,7 +126468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126497,7 +126497,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126525,7 +126525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126554,7 +126554,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126582,7 +126582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126611,7 +126611,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126639,7 +126639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126668,7 +126668,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126696,7 +126696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126725,7 +126725,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126753,7 +126753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126782,7 +126782,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126810,7 +126810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126839,7 +126839,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126867,7 +126867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126896,7 +126896,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126924,7 +126924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126953,7 +126953,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -126981,7 +126981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127010,7 +127010,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127029,7 +127029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127057,7 +127057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127086,7 +127086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127114,7 +127114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -127143,7 +127143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -127171,7 +127171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127200,7 +127200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127228,7 +127228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127257,7 +127257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127285,7 +127285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127314,7 +127314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127342,7 +127342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127371,7 +127371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127399,7 +127399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127428,7 +127428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127456,7 +127456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127485,7 +127485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127513,7 +127513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127542,7 +127542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127570,7 +127570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127599,7 +127599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127618,7 +127618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127646,7 +127646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127675,7 +127675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127703,7 +127703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127732,7 +127732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127760,7 +127760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127789,7 +127789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127817,7 +127817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127846,7 +127846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127874,7 +127874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127903,7 +127903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127931,7 +127931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127960,7 +127960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -127988,7 +127988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128017,7 +128017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128045,7 +128045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128074,7 +128074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128102,7 +128102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128131,7 +128131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128159,7 +128159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128188,7 +128188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128216,7 +128216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128245,7 +128245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128273,7 +128273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128302,7 +128302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128330,7 +128330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128359,7 +128359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128387,7 +128387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128416,7 +128416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128444,7 +128444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128473,7 +128473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128501,7 +128501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128530,7 +128530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128558,7 +128558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128587,7 +128587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128615,7 +128615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128644,7 +128644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128672,7 +128672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128701,7 +128701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128729,7 +128729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128758,7 +128758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128786,7 +128786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128815,7 +128815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128843,7 +128843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128872,7 +128872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128900,7 +128900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128929,7 +128929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128957,7 +128957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -128986,7 +128986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129014,7 +129014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129043,7 +129043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129062,7 +129062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129090,7 +129090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129119,7 +129119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129147,7 +129147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129176,7 +129176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129204,7 +129204,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129233,7 +129233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129261,7 +129261,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129290,7 +129290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129318,7 +129318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129347,7 +129347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129375,7 +129375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129404,7 +129404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129432,7 +129432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129461,7 +129461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129489,7 +129489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129518,7 +129518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129546,7 +129546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129575,7 +129575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129603,7 +129603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129632,7 +129632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129660,7 +129660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129689,7 +129689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129717,7 +129717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129746,7 +129746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129774,7 +129774,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129803,7 +129803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129831,7 +129831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129860,7 +129860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129888,7 +129888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129917,7 +129917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129945,7 +129945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -129974,7 +129974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130002,7 +130002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130031,7 +130031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130059,7 +130059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130088,7 +130088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130116,7 +130116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130145,7 +130145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130173,7 +130173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130202,7 +130202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130230,7 +130230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130259,7 +130259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130287,7 +130287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130316,7 +130316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130344,7 +130344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130373,7 +130373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130401,7 +130401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130430,7 +130430,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130458,7 +130458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130487,7 +130487,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130515,7 +130515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130544,7 +130544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130572,7 +130572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130601,7 +130601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130629,7 +130629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130658,7 +130658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130686,7 +130686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130715,7 +130715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130743,7 +130743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130772,7 +130772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130800,7 +130800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130829,7 +130829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130857,7 +130857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130886,7 +130886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130914,7 +130914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130943,7 +130943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -130971,7 +130971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131000,7 +131000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131028,7 +131028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131057,7 +131057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131085,7 +131085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131114,7 +131114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131142,7 +131142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131171,7 +131171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131199,7 +131199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131228,7 +131228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131256,7 +131256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131285,7 +131285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131313,7 +131313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131342,7 +131342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131370,7 +131370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131399,7 +131399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131427,7 +131427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131456,7 +131456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131484,7 +131484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131513,7 +131513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131541,7 +131541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131570,7 +131570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131598,7 +131598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131627,7 +131627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131655,7 +131655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131684,7 +131684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131712,7 +131712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131741,7 +131741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131769,7 +131769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131798,7 +131798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131826,7 +131826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131855,7 +131855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131883,7 +131883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131912,7 +131912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131940,7 +131940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131969,7 +131969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -131997,7 +131997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132026,7 +132026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132054,7 +132054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132082,7 +132082,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132111,7 +132111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132139,7 +132139,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132168,7 +132168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132197,7 +132197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132225,7 +132225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132254,7 +132254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132282,7 +132282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132311,7 +132311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132339,7 +132339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132368,7 +132368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132396,7 +132396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132425,7 +132425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132453,7 +132453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132482,7 +132482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132510,7 +132510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132539,7 +132539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132567,7 +132567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132596,7 +132596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132624,7 +132624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132653,7 +132653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132681,7 +132681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132710,7 +132710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132738,7 +132738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132767,7 +132767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132795,7 +132795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132824,7 +132824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132852,7 +132852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132881,7 +132881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132909,7 +132909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132938,7 +132938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132966,7 +132966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -132995,7 +132995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133023,7 +133023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133052,7 +133052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133080,7 +133080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133109,7 +133109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133137,7 +133137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133166,7 +133166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133194,7 +133194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133223,7 +133223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133251,7 +133251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133280,7 +133280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133308,7 +133308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133337,7 +133337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133365,7 +133365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133394,7 +133394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133422,7 +133422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133451,7 +133451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133479,7 +133479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133508,7 +133508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133536,7 +133536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133565,7 +133565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133593,7 +133593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133622,7 +133622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133650,7 +133650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133679,7 +133679,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133707,7 +133707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133736,7 +133736,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133764,7 +133764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133793,7 +133793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133821,7 +133821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133850,7 +133850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133878,7 +133878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133907,7 +133907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133935,7 +133935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133964,7 +133964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -133992,7 +133992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134021,7 +134021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134049,7 +134049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134078,7 +134078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134106,7 +134106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134135,7 +134135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134163,7 +134163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134192,7 +134192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134220,7 +134220,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134249,7 +134249,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134277,7 +134277,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134306,7 +134306,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134334,7 +134334,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134363,7 +134363,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134391,7 +134391,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134420,7 +134420,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134448,7 +134448,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134477,7 +134477,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134505,7 +134505,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134534,7 +134534,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134562,7 +134562,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134591,7 +134591,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134619,7 +134619,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134648,7 +134648,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134676,7 +134676,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134705,7 +134705,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134733,7 +134733,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134762,7 +134762,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134790,7 +134790,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134819,7 +134819,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134847,7 +134847,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134876,7 +134876,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134904,7 +134904,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134933,7 +134933,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134961,7 +134961,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -134990,7 +134990,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135018,7 +135018,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135047,7 +135047,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135075,7 +135075,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135104,7 +135104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135132,7 +135132,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135161,7 +135161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135189,7 +135189,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135218,7 +135218,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135246,7 +135246,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135275,7 +135275,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135303,7 +135303,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135331,7 +135331,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135360,7 +135360,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135388,7 +135388,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135417,7 +135417,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135446,7 +135446,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135474,7 +135474,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135503,7 +135503,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135531,7 +135531,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135560,7 +135560,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135588,7 +135588,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135617,7 +135617,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135645,7 +135645,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135674,7 +135674,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135702,7 +135702,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135731,7 +135731,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135759,7 +135759,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135788,7 +135788,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135816,7 +135816,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135845,7 +135845,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135877,7 +135877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135906,7 +135906,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135934,7 +135934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135963,7 +135963,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -135991,7 +135991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136020,7 +136020,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136048,7 +136048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136077,7 +136077,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136105,7 +136105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136134,7 +136134,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136162,7 +136162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136191,7 +136191,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136219,7 +136219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136248,7 +136248,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136276,7 +136276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136305,7 +136305,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136333,7 +136333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136362,7 +136362,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136390,7 +136390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136419,7 +136419,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136447,7 +136447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136476,7 +136476,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136504,7 +136504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136533,7 +136533,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136561,7 +136561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136590,7 +136590,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136618,7 +136618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136647,7 +136647,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136675,7 +136675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136704,7 +136704,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136732,7 +136732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136761,7 +136761,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136789,7 +136789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136818,7 +136818,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136846,7 +136846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136875,7 +136875,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136903,7 +136903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136932,7 +136932,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136960,7 +136960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -136989,7 +136989,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137017,7 +137017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137046,7 +137046,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137074,7 +137074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137103,7 +137103,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137131,7 +137131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137160,7 +137160,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137188,7 +137188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137217,7 +137217,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137245,7 +137245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137274,7 +137274,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137302,7 +137302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137331,7 +137331,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137359,7 +137359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137388,7 +137388,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137416,7 +137416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137445,7 +137445,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137473,7 +137473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137502,7 +137502,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137530,7 +137530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137559,7 +137559,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137587,7 +137587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137616,7 +137616,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137644,7 +137644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137673,7 +137673,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137701,7 +137701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137730,7 +137730,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137758,7 +137758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137787,7 +137787,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137815,7 +137815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137844,7 +137844,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137872,7 +137872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137901,7 +137901,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137929,7 +137929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137958,7 +137958,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -137986,7 +137986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138015,7 +138015,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138043,7 +138043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138072,7 +138072,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138100,7 +138100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138129,7 +138129,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138157,7 +138157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138186,7 +138186,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138214,7 +138214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138243,7 +138243,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138271,7 +138271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138300,7 +138300,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138328,7 +138328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138357,7 +138357,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138376,7 +138376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138404,7 +138404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138433,7 +138433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138461,7 +138461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -138490,7 +138490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -138518,7 +138518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138547,7 +138547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138575,7 +138575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138604,7 +138604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138632,7 +138632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138661,7 +138661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138689,7 +138689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138718,7 +138718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138746,7 +138746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138775,7 +138775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138803,7 +138803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138832,7 +138832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138860,7 +138860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138889,7 +138889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138917,7 +138917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138946,7 +138946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138965,7 +138965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -138993,7 +138993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139022,7 +139022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139050,7 +139050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139079,7 +139079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139107,7 +139107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139136,7 +139136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139164,7 +139164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139193,7 +139193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139221,7 +139221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139250,7 +139250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139278,7 +139278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139307,7 +139307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139335,7 +139335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139364,7 +139364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139392,7 +139392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139421,7 +139421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139449,7 +139449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139478,7 +139478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139506,7 +139506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139535,7 +139535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139563,7 +139563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139592,7 +139592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139620,7 +139620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139649,7 +139649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139677,7 +139677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139706,7 +139706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139734,7 +139734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139763,7 +139763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139791,7 +139791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139820,7 +139820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139848,7 +139848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139877,7 +139877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139905,7 +139905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139934,7 +139934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139962,7 +139962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -139991,7 +139991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140019,7 +140019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140048,7 +140048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140076,7 +140076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140105,7 +140105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140133,7 +140133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140162,7 +140162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140190,7 +140190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140219,7 +140219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140247,7 +140247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140276,7 +140276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140304,7 +140304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140333,7 +140333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140361,7 +140361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140390,7 +140390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140409,7 +140409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140437,7 +140437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140466,7 +140466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140494,7 +140494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140523,7 +140523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140551,7 +140551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140580,7 +140580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140608,7 +140608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140637,7 +140637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140665,7 +140665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140694,7 +140694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140722,7 +140722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140751,7 +140751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140779,7 +140779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140808,7 +140808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140836,7 +140836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140865,7 +140865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140893,7 +140893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140922,7 +140922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140950,7 +140950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -140979,7 +140979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141007,7 +141007,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141036,7 +141036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141064,7 +141064,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141093,7 +141093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141121,7 +141121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141150,7 +141150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141178,7 +141178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141207,7 +141207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141235,7 +141235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141264,7 +141264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141292,7 +141292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141321,7 +141321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141349,7 +141349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141378,7 +141378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141406,7 +141406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141435,7 +141435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141463,7 +141463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141492,7 +141492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141520,7 +141520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141549,7 +141549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141577,7 +141577,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141606,7 +141606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141634,7 +141634,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141663,7 +141663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141691,7 +141691,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141720,7 +141720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141748,7 +141748,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141777,7 +141777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141805,7 +141805,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141834,7 +141834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141862,7 +141862,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141891,7 +141891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141919,7 +141919,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141948,7 +141948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -141976,7 +141976,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142005,7 +142005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142033,7 +142033,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142062,7 +142062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142090,7 +142090,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142119,7 +142119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142147,7 +142147,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142176,7 +142176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142204,7 +142204,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142233,7 +142233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142261,7 +142261,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142290,7 +142290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142318,7 +142318,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142347,7 +142347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142375,7 +142375,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142404,7 +142404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142432,7 +142432,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142461,7 +142461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142489,7 +142489,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142518,7 +142518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142546,7 +142546,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142575,7 +142575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142603,7 +142603,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142632,7 +142632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142660,7 +142660,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142689,7 +142689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142717,7 +142717,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142746,7 +142746,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142774,7 +142774,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142803,7 +142803,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142831,7 +142831,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142860,7 +142860,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142888,7 +142888,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142917,7 +142917,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142945,7 +142945,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -142974,7 +142974,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143002,7 +143002,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143031,7 +143031,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143059,7 +143059,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143088,7 +143088,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143116,7 +143116,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143145,7 +143145,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143173,7 +143173,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143202,7 +143202,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143230,7 +143230,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143259,7 +143259,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143287,7 +143287,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143316,7 +143316,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143344,7 +143344,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143373,7 +143373,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143401,7 +143401,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143429,7 +143429,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143458,7 +143458,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143486,7 +143486,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143515,7 +143515,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143544,7 +143544,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143572,7 +143572,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143601,7 +143601,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143629,7 +143629,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143658,7 +143658,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143686,7 +143686,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143715,7 +143715,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143743,7 +143743,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143772,7 +143772,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143800,7 +143800,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143829,7 +143829,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143857,7 +143857,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143886,7 +143886,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143914,7 +143914,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143943,7 +143943,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -143971,7 +143971,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144000,7 +144000,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144028,7 +144028,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144057,7 +144057,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144085,7 +144085,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144114,7 +144114,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144142,7 +144142,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144171,7 +144171,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144199,7 +144199,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144228,7 +144228,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144256,7 +144256,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144285,7 +144285,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144313,7 +144313,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144342,7 +144342,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144370,7 +144370,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144399,7 +144399,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144427,7 +144427,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144456,7 +144456,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144484,7 +144484,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144513,7 +144513,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144541,7 +144541,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144570,7 +144570,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144598,7 +144598,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144627,7 +144627,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144655,7 +144655,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144684,7 +144684,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144712,7 +144712,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144741,7 +144741,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144769,7 +144769,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144798,7 +144798,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144826,7 +144826,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144855,7 +144855,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144883,7 +144883,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144912,7 +144912,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144940,7 +144940,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144969,7 +144969,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -144997,7 +144997,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145026,7 +145026,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145054,7 +145054,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145083,7 +145083,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145111,7 +145111,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145140,7 +145140,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145168,7 +145168,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145197,7 +145197,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145225,7 +145225,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145254,7 +145254,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145282,7 +145282,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145311,7 +145311,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145339,7 +145339,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145368,7 +145368,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145396,7 +145396,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145425,7 +145425,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145453,7 +145453,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145482,7 +145482,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145510,7 +145510,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145539,7 +145539,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145567,7 +145567,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145596,7 +145596,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145624,7 +145624,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145653,7 +145653,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145681,7 +145681,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145710,7 +145710,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145738,7 +145738,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145767,7 +145767,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145795,7 +145795,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145824,7 +145824,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145852,7 +145852,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145881,7 +145881,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145909,7 +145909,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145938,7 +145938,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145966,7 +145966,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -145995,7 +145995,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146023,7 +146023,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146052,7 +146052,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146080,7 +146080,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146109,7 +146109,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146137,7 +146137,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146166,7 +146166,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146194,7 +146194,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146223,7 +146223,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146251,7 +146251,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146280,7 +146280,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146308,7 +146308,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146337,7 +146337,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146365,7 +146365,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146394,7 +146394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146422,7 +146422,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146451,7 +146451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146479,7 +146479,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146508,7 +146508,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146536,7 +146536,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146565,7 +146565,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146593,7 +146593,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146622,7 +146622,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146650,7 +146650,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146678,7 +146678,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146707,7 +146707,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146735,7 +146735,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146764,7 +146764,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146793,7 +146793,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146821,7 +146821,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146850,7 +146850,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146878,7 +146878,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146907,7 +146907,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146935,7 +146935,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146964,7 +146964,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -146992,7 +146992,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147021,7 +147021,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147049,7 +147049,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147078,7 +147078,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147106,7 +147106,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147135,7 +147135,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147163,7 +147163,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147192,7 +147192,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147224,7 +147224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147253,7 +147253,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147281,7 +147281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147310,7 +147310,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147338,7 +147338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147367,7 +147367,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147395,7 +147395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147424,7 +147424,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147452,7 +147452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147481,7 +147481,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147509,7 +147509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147538,7 +147538,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147566,7 +147566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147595,7 +147595,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147623,7 +147623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147652,7 +147652,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147680,7 +147680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147709,7 +147709,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147737,7 +147737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147766,7 +147766,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147794,7 +147794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147823,7 +147823,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147851,7 +147851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147880,7 +147880,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147908,7 +147908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147937,7 +147937,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147965,7 +147965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -147994,7 +147994,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148022,7 +148022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148051,7 +148051,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148079,7 +148079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148108,7 +148108,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148136,7 +148136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148165,7 +148165,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148193,7 +148193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148222,7 +148222,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148250,7 +148250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148279,7 +148279,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148307,7 +148307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148336,7 +148336,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148364,7 +148364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148393,7 +148393,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148421,7 +148421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148450,7 +148450,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148478,7 +148478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148507,7 +148507,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148535,7 +148535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148564,7 +148564,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148592,7 +148592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148621,7 +148621,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148649,7 +148649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148678,7 +148678,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148706,7 +148706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148735,7 +148735,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148763,7 +148763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148792,7 +148792,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148820,7 +148820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148849,7 +148849,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148877,7 +148877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148906,7 +148906,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148934,7 +148934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148963,7 +148963,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -148991,7 +148991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149020,7 +149020,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149048,7 +149048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149077,7 +149077,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149105,7 +149105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149134,7 +149134,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149162,7 +149162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149191,7 +149191,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149219,7 +149219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149248,7 +149248,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149276,7 +149276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149305,7 +149305,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149333,7 +149333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149362,7 +149362,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149390,7 +149390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149419,7 +149419,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149447,7 +149447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149476,7 +149476,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149504,7 +149504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149533,7 +149533,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149561,7 +149561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149590,7 +149590,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149618,7 +149618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149647,7 +149647,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149675,7 +149675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149704,7 +149704,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149723,7 +149723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149751,7 +149751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149780,7 +149780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149808,7 +149808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -149837,7 +149837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -149865,7 +149865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149894,7 +149894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149922,7 +149922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149951,7 +149951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -149979,7 +149979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150008,7 +150008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150036,7 +150036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150065,7 +150065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150093,7 +150093,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150122,7 +150122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150150,7 +150150,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150179,7 +150179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150207,7 +150207,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150236,7 +150236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150264,7 +150264,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150293,7 +150293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150321,7 +150321,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150350,7 +150350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150378,7 +150378,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150407,7 +150407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150435,7 +150435,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150464,7 +150464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150492,7 +150492,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150521,7 +150521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150549,7 +150549,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150578,7 +150578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150606,7 +150606,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150635,7 +150635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150663,7 +150663,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150692,7 +150692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150720,7 +150720,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150749,7 +150749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150777,7 +150777,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150806,7 +150806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150834,7 +150834,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150863,7 +150863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150891,7 +150891,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150920,7 +150920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150948,7 +150948,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -150977,7 +150977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151005,7 +151005,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151034,7 +151034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151062,7 +151062,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151091,7 +151091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151119,7 +151119,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151148,7 +151148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151176,7 +151176,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151205,7 +151205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151233,7 +151233,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151262,7 +151262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151290,7 +151290,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151319,7 +151319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151347,7 +151347,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151376,7 +151376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151404,7 +151404,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151433,7 +151433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151461,7 +151461,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151490,7 +151490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151518,7 +151518,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151547,7 +151547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151575,7 +151575,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151604,7 +151604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151632,7 +151632,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151661,7 +151661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151689,7 +151689,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151718,7 +151718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151737,7 +151737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151765,7 +151765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151794,7 +151794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151822,7 +151822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151851,7 +151851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151879,7 +151879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151908,7 +151908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151936,7 +151936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151965,7 +151965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -151993,7 +151993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152022,7 +152022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152050,7 +152050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152079,7 +152079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152107,7 +152107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152136,7 +152136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152164,7 +152164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152193,7 +152193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152221,7 +152221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152250,7 +152250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152278,7 +152278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152307,7 +152307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152335,7 +152335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152364,7 +152364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152392,7 +152392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152421,7 +152421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152449,7 +152449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152478,7 +152478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152506,7 +152506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152535,7 +152535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152563,7 +152563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152592,7 +152592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152620,7 +152620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152649,7 +152649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152677,7 +152677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152706,7 +152706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152734,7 +152734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152763,7 +152763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152791,7 +152791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152820,7 +152820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152848,7 +152848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152877,7 +152877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152905,7 +152905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152934,7 +152934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152962,7 +152962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -152991,7 +152991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153019,7 +153019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153048,7 +153048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153076,7 +153076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153105,7 +153105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153133,7 +153133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153162,7 +153162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153190,7 +153190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153219,7 +153219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153247,7 +153247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153276,7 +153276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153304,7 +153304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153333,7 +153333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153361,7 +153361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153390,7 +153390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153418,7 +153418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153447,7 +153447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153475,7 +153475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153504,7 +153504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153532,7 +153532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153561,7 +153561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153589,7 +153589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153618,7 +153618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153646,7 +153646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153675,7 +153675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153703,7 +153703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153732,7 +153732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153760,7 +153760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153789,7 +153789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153817,7 +153817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153846,7 +153846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153874,7 +153874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153903,7 +153903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153931,7 +153931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153960,7 +153960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -153988,7 +153988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154017,7 +154017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154045,7 +154045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154074,7 +154074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154102,7 +154102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154131,7 +154131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154159,7 +154159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154188,7 +154188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154216,7 +154216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154245,7 +154245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154273,7 +154273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154302,7 +154302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154330,7 +154330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154359,7 +154359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154387,7 +154387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154416,7 +154416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154444,7 +154444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154473,7 +154473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154501,7 +154501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154530,7 +154530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154558,7 +154558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154587,7 +154587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154615,7 +154615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154644,7 +154644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154672,7 +154672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154701,7 +154701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154729,7 +154729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154757,7 +154757,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154786,7 +154786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154814,7 +154814,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154843,7 +154843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154872,7 +154872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154900,7 +154900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154929,7 +154929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154957,7 +154957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -154986,7 +154986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155014,7 +155014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155043,7 +155043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155071,7 +155071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155100,7 +155100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155128,7 +155128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155157,7 +155157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155185,7 +155185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155214,7 +155214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155242,7 +155242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155271,7 +155271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155299,7 +155299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155328,7 +155328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155356,7 +155356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155385,7 +155385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155413,7 +155413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155442,7 +155442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155470,7 +155470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155499,7 +155499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155527,7 +155527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155556,7 +155556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155584,7 +155584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155613,7 +155613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155641,7 +155641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155670,7 +155670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155698,7 +155698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155727,7 +155727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155755,7 +155755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155784,7 +155784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155812,7 +155812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155841,7 +155841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155869,7 +155869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155898,7 +155898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155926,7 +155926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155955,7 +155955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -155983,7 +155983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156012,7 +156012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156040,7 +156040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156069,7 +156069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156097,7 +156097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156126,7 +156126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156154,7 +156154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156183,7 +156183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156211,7 +156211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156240,7 +156240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156268,7 +156268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156297,7 +156297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156325,7 +156325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156354,7 +156354,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156382,7 +156382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156411,7 +156411,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156439,7 +156439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156468,7 +156468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156496,7 +156496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156525,7 +156525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156553,7 +156553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156582,7 +156582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156610,7 +156610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156639,7 +156639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156667,7 +156667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156696,7 +156696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156724,7 +156724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156753,7 +156753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156781,7 +156781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156810,7 +156810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156838,7 +156838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156867,7 +156867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156895,7 +156895,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156924,7 +156924,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156952,7 +156952,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -156981,7 +156981,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157009,7 +157009,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157038,7 +157038,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157066,7 +157066,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157095,7 +157095,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157123,7 +157123,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157152,7 +157152,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157180,7 +157180,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157209,7 +157209,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157237,7 +157237,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157266,7 +157266,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157294,7 +157294,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157323,7 +157323,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157351,7 +157351,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157380,7 +157380,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157408,7 +157408,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157437,7 +157437,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157465,7 +157465,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157494,7 +157494,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157522,7 +157522,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157551,7 +157551,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157579,7 +157579,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157608,7 +157608,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157636,7 +157636,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157665,7 +157665,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157693,7 +157693,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157722,7 +157722,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157750,7 +157750,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157779,7 +157779,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157807,7 +157807,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157836,7 +157836,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157864,7 +157864,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157893,7 +157893,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157921,7 +157921,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157950,7 +157950,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -157978,7 +157978,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158006,7 +158006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158035,7 +158035,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158063,7 +158063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158092,7 +158092,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158121,7 +158121,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158149,7 +158149,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158178,7 +158178,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158206,7 +158206,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158235,7 +158235,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158263,7 +158263,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158292,7 +158292,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158320,7 +158320,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158349,7 +158349,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158377,7 +158377,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158406,7 +158406,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158434,7 +158434,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158463,7 +158463,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158491,7 +158491,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158520,7 +158520,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158552,7 +158552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158581,7 +158581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158609,7 +158609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158638,7 +158638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158666,7 +158666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158695,7 +158695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158723,7 +158723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158752,7 +158752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158780,7 +158780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158809,7 +158809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158837,7 +158837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158866,7 +158866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158894,7 +158894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158923,7 +158923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158951,7 +158951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -158980,7 +158980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159008,7 +159008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159037,7 +159037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159065,7 +159065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159094,7 +159094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159122,7 +159122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159151,7 +159151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159179,7 +159179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159208,7 +159208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159236,7 +159236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159265,7 +159265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159293,7 +159293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159322,7 +159322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159350,7 +159350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159379,7 +159379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159407,7 +159407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159436,7 +159436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159464,7 +159464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159493,7 +159493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159521,7 +159521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159550,7 +159550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159578,7 +159578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159607,7 +159607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159635,7 +159635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159664,7 +159664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159692,7 +159692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159721,7 +159721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159749,7 +159749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159778,7 +159778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159806,7 +159806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159835,7 +159835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159863,7 +159863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159892,7 +159892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159920,7 +159920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159949,7 +159949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -159977,7 +159977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160006,7 +160006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160034,7 +160034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160063,7 +160063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160091,7 +160091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160120,7 +160120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160148,7 +160148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160177,7 +160177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160205,7 +160205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160234,7 +160234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160262,7 +160262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160291,7 +160291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160319,7 +160319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160348,7 +160348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160376,7 +160376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160405,7 +160405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160433,7 +160433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160462,7 +160462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160490,7 +160490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160519,7 +160519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160547,7 +160547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160576,7 +160576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160604,7 +160604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160633,7 +160633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160661,7 +160661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160690,7 +160690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160718,7 +160718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160747,7 +160747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160775,7 +160775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160804,7 +160804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160832,7 +160832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160861,7 +160861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160889,7 +160889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160918,7 +160918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160946,7 +160946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -160975,7 +160975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161003,7 +161003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161032,7 +161032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161051,7 +161051,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161079,7 +161079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161108,7 +161108,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161136,7 +161136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -161165,7 +161165,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -161193,7 +161193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161222,7 +161222,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161250,7 +161250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161279,7 +161279,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161307,7 +161307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161336,7 +161336,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161364,7 +161364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161393,7 +161393,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161421,7 +161421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161450,7 +161450,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161478,7 +161478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161507,7 +161507,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161535,7 +161535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161564,7 +161564,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161592,7 +161592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161621,7 +161621,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161640,7 +161640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161668,7 +161668,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161697,7 +161697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161725,7 +161725,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161754,7 +161754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161782,7 +161782,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161811,7 +161811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161839,7 +161839,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161868,7 +161868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161896,7 +161896,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161925,7 +161925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161953,7 +161953,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -161982,7 +161982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162010,7 +162010,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162039,7 +162039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162067,7 +162067,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162096,7 +162096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162124,7 +162124,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162153,7 +162153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162181,7 +162181,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162210,7 +162210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162238,7 +162238,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162267,7 +162267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162295,7 +162295,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162324,7 +162324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162352,7 +162352,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162381,7 +162381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162409,7 +162409,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162438,7 +162438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162466,7 +162466,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162495,7 +162495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162523,7 +162523,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162552,7 +162552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162580,7 +162580,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162609,7 +162609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162637,7 +162637,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162666,7 +162666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162694,7 +162694,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162723,7 +162723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162751,7 +162751,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162780,7 +162780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162808,7 +162808,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162837,7 +162837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162865,7 +162865,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162894,7 +162894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162922,7 +162922,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162951,7 +162951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -162979,7 +162979,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163008,7 +163008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163036,7 +163036,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163065,7 +163065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163084,7 +163084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163112,7 +163112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163141,7 +163141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163169,7 +163169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163198,7 +163198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163226,7 +163226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163255,7 +163255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163283,7 +163283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163312,7 +163312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163340,7 +163340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163369,7 +163369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163397,7 +163397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163426,7 +163426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163454,7 +163454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163483,7 +163483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163511,7 +163511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163540,7 +163540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163568,7 +163568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163597,7 +163597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163625,7 +163625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163654,7 +163654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163682,7 +163682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163711,7 +163711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163739,7 +163739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163768,7 +163768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163796,7 +163796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163825,7 +163825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163853,7 +163853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163882,7 +163882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163910,7 +163910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163939,7 +163939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163967,7 +163967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -163996,7 +163996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164024,7 +164024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164053,7 +164053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164081,7 +164081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164110,7 +164110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164138,7 +164138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164167,7 +164167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164195,7 +164195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164224,7 +164224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164252,7 +164252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164281,7 +164281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164309,7 +164309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164338,7 +164338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164366,7 +164366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164395,7 +164395,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164423,7 +164423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164452,7 +164452,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164480,7 +164480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164509,7 +164509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164537,7 +164537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164566,7 +164566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164594,7 +164594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164623,7 +164623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164651,7 +164651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164680,7 +164680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164708,7 +164708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164737,7 +164737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164765,7 +164765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164794,7 +164794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164822,7 +164822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164851,7 +164851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164879,7 +164879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164908,7 +164908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164936,7 +164936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164965,7 +164965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -164993,7 +164993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165022,7 +165022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165050,7 +165050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165079,7 +165079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165107,7 +165107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165136,7 +165136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165164,7 +165164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165193,7 +165193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165221,7 +165221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165250,7 +165250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165278,7 +165278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165307,7 +165307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165335,7 +165335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165364,7 +165364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165392,7 +165392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165421,7 +165421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165449,7 +165449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165478,7 +165478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165506,7 +165506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165535,7 +165535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165563,7 +165563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165592,7 +165592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165620,7 +165620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165649,7 +165649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165677,7 +165677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165706,7 +165706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165734,7 +165734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165763,7 +165763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165791,7 +165791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165820,7 +165820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165848,7 +165848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165877,7 +165877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165905,7 +165905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165934,7 +165934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165962,7 +165962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -165991,7 +165991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166019,7 +166019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166048,7 +166048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166076,7 +166076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166104,7 +166104,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166133,7 +166133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166161,7 +166161,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166190,7 +166190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166219,7 +166219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166247,7 +166247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166276,7 +166276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166304,7 +166304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166333,7 +166333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166361,7 +166361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166390,7 +166390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166418,7 +166418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166447,7 +166447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166475,7 +166475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166504,7 +166504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166532,7 +166532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166561,7 +166561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166589,7 +166589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166618,7 +166618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166646,7 +166646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166675,7 +166675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166703,7 +166703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166732,7 +166732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166760,7 +166760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166789,7 +166789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166817,7 +166817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166846,7 +166846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166874,7 +166874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166903,7 +166903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166931,7 +166931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166960,7 +166960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -166988,7 +166988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167017,7 +167017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167045,7 +167045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167074,7 +167074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167102,7 +167102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167131,7 +167131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167159,7 +167159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167188,7 +167188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167216,7 +167216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167245,7 +167245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167273,7 +167273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167302,7 +167302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167330,7 +167330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167359,7 +167359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167387,7 +167387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167416,7 +167416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167444,7 +167444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167473,7 +167473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167501,7 +167501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167530,7 +167530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167558,7 +167558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167587,7 +167587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167615,7 +167615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167644,7 +167644,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167672,7 +167672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167701,7 +167701,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167729,7 +167729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167758,7 +167758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167786,7 +167786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167815,7 +167815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167843,7 +167843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167872,7 +167872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167900,7 +167900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167929,7 +167929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167957,7 +167957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -167986,7 +167986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168014,7 +168014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168043,7 +168043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168071,7 +168071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168100,7 +168100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168128,7 +168128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168157,7 +168157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168185,7 +168185,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168214,7 +168214,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168242,7 +168242,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168271,7 +168271,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168299,7 +168299,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168328,7 +168328,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168356,7 +168356,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168385,7 +168385,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168413,7 +168413,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168442,7 +168442,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168470,7 +168470,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168499,7 +168499,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168527,7 +168527,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168556,7 +168556,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168584,7 +168584,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168613,7 +168613,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168641,7 +168641,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168670,7 +168670,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168698,7 +168698,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168727,7 +168727,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168755,7 +168755,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168784,7 +168784,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168812,7 +168812,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168841,7 +168841,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168869,7 +168869,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168898,7 +168898,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168926,7 +168926,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168955,7 +168955,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -168983,7 +168983,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169012,7 +169012,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169040,7 +169040,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169069,7 +169069,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169097,7 +169097,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169126,7 +169126,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169154,7 +169154,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169183,7 +169183,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169211,7 +169211,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169240,7 +169240,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169268,7 +169268,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169297,7 +169297,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169325,7 +169325,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169353,7 +169353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169382,7 +169382,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169410,7 +169410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169439,7 +169439,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169468,7 +169468,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169496,7 +169496,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169525,7 +169525,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169553,7 +169553,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169582,7 +169582,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169610,7 +169610,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169639,7 +169639,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169667,7 +169667,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169696,7 +169696,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169724,7 +169724,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169753,7 +169753,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169781,7 +169781,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169810,7 +169810,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169838,7 +169838,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169867,7 +169867,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169899,7 +169899,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169928,7 +169928,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169956,7 +169956,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -169985,7 +169985,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170013,7 +170013,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170042,7 +170042,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170070,7 +170070,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170099,7 +170099,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170127,7 +170127,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170156,7 +170156,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170184,7 +170184,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170213,7 +170213,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170241,7 +170241,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170270,7 +170270,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170298,7 +170298,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170327,7 +170327,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170355,7 +170355,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170384,7 +170384,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170412,7 +170412,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170441,7 +170441,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170469,7 +170469,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170498,7 +170498,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170526,7 +170526,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170555,7 +170555,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170583,7 +170583,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170612,7 +170612,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170640,7 +170640,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170669,7 +170669,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170697,7 +170697,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170726,7 +170726,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170754,7 +170754,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170783,7 +170783,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170811,7 +170811,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170840,7 +170840,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170868,7 +170868,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170897,7 +170897,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170925,7 +170925,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170954,7 +170954,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -170982,7 +170982,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171011,7 +171011,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171039,7 +171039,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171068,7 +171068,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171096,7 +171096,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171125,7 +171125,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171153,7 +171153,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171182,7 +171182,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171210,7 +171210,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171239,7 +171239,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171267,7 +171267,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171296,7 +171296,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171324,7 +171324,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171353,7 +171353,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171381,7 +171381,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171410,7 +171410,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171438,7 +171438,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171467,7 +171467,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171495,7 +171495,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171524,7 +171524,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171552,7 +171552,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171581,7 +171581,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171609,7 +171609,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171638,7 +171638,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171666,7 +171666,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171695,7 +171695,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171723,7 +171723,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171752,7 +171752,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171780,7 +171780,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171809,7 +171809,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171837,7 +171837,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171866,7 +171866,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171894,7 +171894,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171923,7 +171923,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171951,7 +171951,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -171980,7 +171980,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172008,7 +172008,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172037,7 +172037,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172065,7 +172065,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172094,7 +172094,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172122,7 +172122,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172151,7 +172151,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172179,7 +172179,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172208,7 +172208,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172236,7 +172236,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172265,7 +172265,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172293,7 +172293,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172322,7 +172322,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172350,7 +172350,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172379,7 +172379,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172407,7 +172407,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172436,7 +172436,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172464,7 +172464,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -172493,7 +172493,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 14400, "io_timeout": 3600 } @@ -172521,7 +172521,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172550,7 +172550,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172578,7 +172578,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172607,7 +172607,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172635,7 +172635,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172664,7 +172664,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172692,7 +172692,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172721,7 +172721,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172749,7 +172749,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172778,7 +172778,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172806,7 +172806,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172835,7 +172835,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172863,7 +172863,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172892,7 +172892,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172920,7 +172920,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172949,7 +172949,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -172977,7 +172977,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173006,7 +173006,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173034,7 +173034,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173063,7 +173063,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173091,7 +173091,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173120,7 +173120,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173148,7 +173148,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173177,7 +173177,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173205,7 +173205,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173234,7 +173234,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173262,7 +173262,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173291,7 +173291,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173319,7 +173319,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173348,7 +173348,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173376,7 +173376,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173405,7 +173405,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173433,7 +173433,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173462,7 +173462,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173490,7 +173490,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173519,7 +173519,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173547,7 +173547,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173576,7 +173576,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173604,7 +173604,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173633,7 +173633,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173661,7 +173661,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173690,7 +173690,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173718,7 +173718,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173747,7 +173747,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173775,7 +173775,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173804,7 +173804,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173832,7 +173832,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173861,7 +173861,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173889,7 +173889,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173918,7 +173918,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173946,7 +173946,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -173975,7 +173975,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174003,7 +174003,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174032,7 +174032,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174060,7 +174060,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174089,7 +174089,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174117,7 +174117,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174146,7 +174146,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174174,7 +174174,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174203,7 +174203,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174231,7 +174231,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174260,7 +174260,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174288,7 +174288,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174317,7 +174317,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174345,7 +174345,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174374,7 +174374,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174402,7 +174402,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174431,7 +174431,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174459,7 +174459,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174488,7 +174488,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174516,7 +174516,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174545,7 +174545,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174573,7 +174573,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174602,7 +174602,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174630,7 +174630,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174659,7 +174659,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174687,7 +174687,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174716,7 +174716,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174744,7 +174744,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174773,7 +174773,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174801,7 +174801,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174830,7 +174830,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174858,7 +174858,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174887,7 +174887,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174915,7 +174915,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174944,7 +174944,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -174972,7 +174972,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175001,7 +175001,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175029,7 +175029,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175058,7 +175058,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175086,7 +175086,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175115,7 +175115,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175143,7 +175143,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175172,7 +175172,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175200,7 +175200,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175229,7 +175229,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175257,7 +175257,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175286,7 +175286,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175314,7 +175314,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175343,7 +175343,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175371,7 +175371,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175400,7 +175400,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175428,7 +175428,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175457,7 +175457,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175485,7 +175485,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175514,7 +175514,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175542,7 +175542,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175571,7 +175571,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175599,7 +175599,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175628,7 +175628,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175656,7 +175656,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175685,7 +175685,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175713,7 +175713,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175742,7 +175742,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175770,7 +175770,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175799,7 +175799,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175827,7 +175827,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175856,7 +175856,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175884,7 +175884,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175913,7 +175913,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175941,7 +175941,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175970,7 +175970,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -175998,7 +175998,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176027,7 +176027,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176055,7 +176055,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176084,7 +176084,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176112,7 +176112,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176141,7 +176141,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176169,7 +176169,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176198,7 +176198,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176226,7 +176226,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176255,7 +176255,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176283,7 +176283,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176312,7 +176312,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176340,7 +176340,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176369,7 +176369,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176397,7 +176397,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176426,7 +176426,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176454,7 +176454,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176483,7 +176483,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176511,7 +176511,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176540,7 +176540,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176568,7 +176568,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176597,7 +176597,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176625,7 +176625,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176654,7 +176654,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176682,7 +176682,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176711,7 +176711,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176739,7 +176739,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176768,7 +176768,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176796,7 +176796,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176825,7 +176825,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176853,7 +176853,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176882,7 +176882,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176910,7 +176910,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176939,7 +176939,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176967,7 +176967,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -176996,7 +176996,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177024,7 +177024,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177053,7 +177053,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177081,7 +177081,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177110,7 +177110,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177138,7 +177138,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177167,7 +177167,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177195,7 +177195,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177224,7 +177224,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177252,7 +177252,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177281,7 +177281,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177309,7 +177309,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177338,7 +177338,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177366,7 +177366,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177394,7 +177394,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177423,7 +177423,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177451,7 +177451,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177480,7 +177480,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177509,7 +177509,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177537,7 +177537,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177566,7 +177566,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177594,7 +177594,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177623,7 +177623,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177651,7 +177651,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177680,7 +177680,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177708,7 +177708,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177737,7 +177737,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177765,7 +177765,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177794,7 +177794,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177822,7 +177822,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177851,7 +177851,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177879,7 +177879,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177908,7 +177908,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177936,7 +177936,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177965,7 +177965,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -177993,7 +177993,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178022,7 +178022,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178050,7 +178050,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178079,7 +178079,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178107,7 +178107,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178136,7 +178136,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178164,7 +178164,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178193,7 +178193,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178221,7 +178221,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178250,7 +178250,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178278,7 +178278,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178307,7 +178307,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178335,7 +178335,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178364,7 +178364,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178392,7 +178392,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178421,7 +178421,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178449,7 +178449,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178478,7 +178478,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178506,7 +178506,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178535,7 +178535,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178563,7 +178563,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178592,7 +178592,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178620,7 +178620,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178649,7 +178649,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178677,7 +178677,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178706,7 +178706,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178734,7 +178734,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178763,7 +178763,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178791,7 +178791,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178820,7 +178820,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178848,7 +178848,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178877,7 +178877,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178905,7 +178905,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178934,7 +178934,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178962,7 +178962,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -178991,7 +178991,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179019,7 +179019,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179048,7 +179048,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179076,7 +179076,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179105,7 +179105,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179133,7 +179133,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179162,7 +179162,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179190,7 +179190,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179219,7 +179219,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179247,7 +179247,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179276,7 +179276,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179304,7 +179304,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179333,7 +179333,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179361,7 +179361,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179390,7 +179390,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179418,7 +179418,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179447,7 +179447,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179475,7 +179475,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179504,7 +179504,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179532,7 +179532,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179561,7 +179561,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179589,7 +179589,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179618,7 +179618,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179646,7 +179646,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179675,7 +179675,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179703,7 +179703,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179732,7 +179732,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179760,7 +179760,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179789,7 +179789,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179817,7 +179817,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179846,7 +179846,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179874,7 +179874,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179903,7 +179903,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179931,7 +179931,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179960,7 +179960,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -179988,7 +179988,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180017,7 +180017,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180045,7 +180045,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180074,7 +180074,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180102,7 +180102,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180131,7 +180131,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180159,7 +180159,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180188,7 +180188,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180216,7 +180216,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180245,7 +180245,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180273,7 +180273,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180302,7 +180302,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180330,7 +180330,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180359,7 +180359,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180387,7 +180387,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180416,7 +180416,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180444,7 +180444,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180473,7 +180473,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180501,7 +180501,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180530,7 +180530,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180558,7 +180558,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180587,7 +180587,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180615,7 +180615,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180643,7 +180643,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180672,7 +180672,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180700,7 +180700,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180729,7 +180729,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180758,7 +180758,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180786,7 +180786,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180815,7 +180815,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180843,7 +180843,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180872,7 +180872,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180900,7 +180900,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180929,7 +180929,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180957,7 +180957,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -180986,7 +180986,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181014,7 +181014,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181043,7 +181043,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181071,7 +181071,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181100,7 +181100,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181128,7 +181128,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 } @@ -181157,7 +181157,7 @@ "pool": "Chrome-perf" } ], - "expiration": 25200, + "expiration": 36000, "hard_timeout": 7200, "io_timeout": 3600 }
diff --git a/testing/variations/README.md b/testing/variations/README.md index 655f4750..044bc07 100644 --- a/testing/variations/README.md +++ b/testing/variations/README.md
@@ -1,14 +1,14 @@ # Field Trial Testing Configuration -This directory contains the field trial configuration used to ensure testing -coverage of the experiments defined in `fieldtrial_testing_config.json`. +This directory contains the `fieldtrial_testing_config.json` configuration file, +which is used to ensure test coverage of active field trials. -Note that these apply specifically for Chromium builds. Chrome branded / -official builds do not use these definitions. +For each study, the first available experiment after platform filtering is used +as the default experiment for Chromium builds. This experiment is also used for +perf bots and browser tests in the waterfall. -The first available experiment after platform filtering and concatenation is the -default experiment for Chromium builds. This experiment is also used for perf -bots and browser tests in the waterfall. +> Note: This configuration applies specifically to Chromium developer builds. +> Chrome branded / official builds do not use these definitions. ## Config File Format @@ -35,27 +35,55 @@ ``` The config file is a dictionary at the top level mapping a study name to an -array of *study configurations*. The study name should match the Field Trial -study name. +array of *study configurations*. The study name in the configuration file should +match the FieldTrial name used in the Chromium client code. + +> Note: Many newer studies do not use study names in the client code at all, and +> rely on the [Feature List API][FeatureListAPI] instead. Nonetheless, if a +> study has a server-side configuration, the study `name` specified here should +> match the name specified in the server-side configuration; this is used to +> implement sanity-checks on the server. ### Study Configurations -Each *study configuration* is a dictionary containing both `platform` and +Each *study configuration* is a dictionary containing `platforms` and `experiments`. -`platform` is an array of strings of valid platforms and the +`platforms` is an array of strings, indicating the targetted platforms. The strings may be `android`, `chromeos`, `ios`, `linux`, `mac`, or `windows`. `experiments` is an array containing the *experiments*. -The converter uses the platforms array to determine what experiments to include -for the study. All matching platforms will have their experiments concatenated -together for the study. +The converter uses the `platforms` array to determine which experiment to use +for the study. The first experiment matching the active platform will be used. + +> Note: While `experiments` is defined as an array, currently only the first +> entry is used*\**. We would love to be able to test all possible study +> configurations, but don't currently have the buildbot resources to do so. +> Hence, the current best-practice is to identify which experiment group is the +> most likely candidate for ultimate launch, and to test that configuration. If +> there is a server-side configuration for this study, it's typically +> appropriate to copy/paste one of the experiment definitions into this file. +> +> *\** +> <small> +> Technically, there is one exception: If there's a forcing_flag group +> specified in the config, that group will be used if there's a corresponding +> forcing_flag specified on the command line. You, dear reader, should +> probably not use this fancy mechanism unless you're <em>quite</em> sure you +> know what you're doing =) +> </small> ### Experiments (Groups) Each *experiment* is a dictionary that must contain the `name` key, identifying -the experiment group name which should match the Field Trial experiment group -name. +the experiment group name. This name should match the FieldTrial experiment +group name used in the Chromium client code. + +> Note: Many newer studies do not use experiment names in the client code at +> all, and rely on the [Feature List API][FeatureListAPI] instead. Nonetheless, +> if a study has a server-side configuration, the experiment `name` specified +> here should match the name specified in the server-side configuration; this is +> used to implement sanity-checks on the server. The remaining keys, `params`, `enable_features`, and `disable_features` are optional. @@ -63,11 +91,14 @@ `params` is a dictionary mapping parameter name to parameter. `enable_features` and `disable_features` indicate which features should be -enabled and disabled respectively through the -[Feature List API](https://cs.chromium.org/chromium/src/base/feature_list.h). As -a reminder, as the variations framework does not actually fetch the Field Trial -definitions from the server for Chromium builds, so any feature enabling or -disabling must be done here. +enabled and disabled, respectively, through the +[Feature List API][FeatureListAPI]. + +> Reminder: The variations framework does not actually fetch any field trial +> definitions from the server for Chromium builds, so any feature enabling or +> disabling must be configured here. + +[FeatureListAPI]: https://cs.chromium.org/chromium/src/base/feature_list.h #### Comments
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3c9d78c..a8adec45 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2355,6 +2355,31 @@ ] } ], + "SafeBrowsingThreatDomDetailsTagAttributes": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "win" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "tag_attribute_csv": "div,id,iframe,id" + }, + "enable_features": [ + "ThreatDomDetailsTagAttributes" + ] + }, + { + "name": "Default" + } + ] + } + ], "SafeBrowsingUseLocalBlacklist": [ { "platforms": [ @@ -3044,6 +3069,12 @@ "name": "TunedClippingLevelMin070", "enable_features": [ "TunedClippingLevelMin70" + ], + "disable_features": [ + "TunedClippingLevelMin110", + "TunedClippingLevelMin150", + "TunedClippingLevelMin170", + "TunedClippingLevelMin30" ] } ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation index de4a2d4..e4c81a06 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
@@ -16,7 +16,5 @@ crbug.com/690946 virtual/mojo-loading/http/tests/security/contentSecurityPolicy/frame-src-cross-origin-load.html [ Failure ] # These tests are flaky. -Bug(none) http/tests/misc/window-open-then-write.html [ Timeout ] Bug(none) http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ] -Bug(none) virtual/mojo-loading/http/tests/misc/window-open-then-write.html [ Timeout ] Bug(none) virtual/mojo-loading/http/tests/security/popup-allowed-by-sandbox-can-navigate.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests index 798cc64..be68baa 100644 --- a/third_party/WebKit/LayoutTests/NeverFixTests +++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -334,3 +334,6 @@ # This W3C EME test fetches a file which is not allowed #external/wpt/encrypted-media/idlharness.html [ WontFix ] + +[ Win7 Debug ] virtual/disable-spinvalidation/compositing/perpendicular-layer-sorting.html [ WontFix ] +
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 4d4fe69..fd0e4f4 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -125,8 +125,6 @@ # A real bug with a Skia assert crbug.com/671048 virtual/color_space/fast/canvas/color-space/display_linear-rgb.html [ Pass Failure Crash ] -crbug.com/701800 [ Win7 ] virtual/disable-spinvalidation/compositing/perpendicular-layer-sorting.html [ Pass Failure ] - crbug.com/702006 paint/invalidation/compositing/scrolling-neg-z-index-descendants-should-cause-repaint.html [ Failure ] crbug.com/702006 virtual/disable-spinvalidation/paint/invalidation/compositing/scrolling-neg-z-index-descendants-should-cause-repaint.html [ Failure ] @@ -482,6 +480,7 @@ crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-to-block-flow-and-ensure-layout-on-containers-of-removed-floats.html [ Skip ] crbug.com/635619 virtual/layout_ng/fast/block/float/add-inline-to-block-flow-with-block-children-that-do-not-need-anonymous-boxes.html [ Skip ] crbug.com/635619 virtual/layout_ng/fast/block/float/add-inlines-in-block-children-block.html [ Skip ] +crbug.com/635619 virtual/layout_ng/fast/block/float/assert-when-moving-float.html [ Skip ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-2.html [ Skip ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-3.html [ Skip ] crbug.com/635619 virtual/layout_ng/fast/block/float/avoid-floats-when-negative-margin-top-4.html [ Skip ] @@ -787,6 +786,8 @@ crbug.com/538697 [ Win7 Debug ] virtual/threaded/printing/webgl-oversized-printing.html [ Failure Crash ] crbug.com/538697 [ Win7 Debug ] printing/webgl-oversized-printing.html [ Failure Crash ] +crbug.com/630695 virtual/gpu/fast/canvas/canvas-toDataURL-webp-alpha.html [ NeedsManualRebaseline ] + crbug.com/417782 [ Linux Win ] virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-offset-fixed-position-non-composited.html [ Failure ] crbug.com/492664 [ Linux ] external/csswg-test/css-writing-modes-3/box-offsets-rel-pos-vlr-005.xht [ Failure ] crbug.com/492664 [ Linux ] external/csswg-test/css-writing-modes-3/box-offsets-rel-pos-vrl-004.xht [ Failure ] @@ -2678,3 +2679,6 @@ crbug.com/674720 virtual/mojo-loading/http/tests/loading/preload-img-test.html [ Pass Failure ] crbug.com/703650 virtual/enable_wasm/http/tests/wasm/wasm_serialization_tests.html [ Skip ] crbug.com/703650 virtual/enable_wasm/http/tests/wasm/wasm_indexeddb_test.html [ Skip ] + +crbug.com/v8/5808 inspector/coverage/gutter-js.html [ NeedsManualRebaseline ] +crbug.com/v8/5808 inspector/coverage/multiple-instances-merge.html [ NeedsManualRebaseline ]
diff --git a/third_party/WebKit/LayoutTests/battery-status/resources/mock-battery-monitor.js b/third_party/WebKit/LayoutTests/battery-status/resources/mock-battery-monitor.js index e6739ef..73753f7 100644 --- a/third_party/WebKit/LayoutTests/battery-status/resources/mock-battery-monitor.js +++ b/third_party/WebKit/LayoutTests/battery-status/resources/mock-battery-monitor.js
@@ -1,20 +1,19 @@ "use strict"; -let mockBatteryMonitor = loadMojoModules( - 'mockBatteryMonitor', - ['device/battery/battery_monitor.mojom', - 'device/battery/battery_status.mojom', - 'mojo/public/js/bindings', - ]).then(mojo => { - let [batteryMonitor, batteryStatus, bindings] = mojo.modules; +let mockBatteryMonitor = loadMojoModules('mockBatteryMonitor', [ + 'device/battery/battery_monitor.mojom', + 'device/battery/battery_status.mojom', + 'services/device/public/interfaces/constants.mojom', + 'mojo/public/js/bindings', + ]).then(mojo => { + let [batteryMonitor, batteryStatus, deviceConstants, bindings] = mojo.modules; class MockBatteryMonitor { - constructor(interfaceProvider) { - interfaceProvider.addInterfaceOverrideForTesting( - batteryMonitor.BatteryMonitor.name, + constructor(connector) { + connector.addInterfaceOverrideForTesting( + deviceConstants.kServiceName, batteryMonitor.BatteryMonitor.name, handle => this.bindingSet_.addBinding(this, handle)); - this.interfaceProvider_ = interfaceProvider; this.pendingRequests_ = []; this.status_ = null; this.bindingSet_ = new bindings.BindingSet(batteryMonitor.BatteryMonitor); @@ -45,7 +44,7 @@ this.status_ = null; } } - return new MockBatteryMonitor(mojo.interfaces); + return new MockBatteryMonitor(mojo.connector); }); let batteryInfo;
diff --git a/third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/concurrent-starts-and-receive-notification.html b/third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/concurrent-starts-and-receive-notification.html new file mode 100644 index 0000000..0533632 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/characteristic/notifications/concurrent-starts-and-receive-notification.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<script src="../../../resources/bluetooth/bluetooth-helpers.js"></script> +<script> +'use strict'; +let char; +promise_test(() => { + return setBluetoothFakeAdapter('HeartRateAdapter') + .then(() => requestDeviceWithKeyDown({ + filters: [{services: ['heart_rate']}]})) + .then(device => device.gatt.connect()) + .then(gattServer => gattServer.getPrimaryService('heart_rate')) + .then(service => service.getCharacteristic('heart_rate_measurement')) + .then(characteristic => { + char = characteristic; + return Promise.all([ + characteristic.startNotifications(), + characteristic.startNotifications() + ]); + }) + .then(() => { + return new Promise(resolve => { + let event_listener = () => { + char.removeEventListener('characteristicvaluechanged', event_listener); + resolve(); + }; + char.addEventListener('characteristicvaluechanged', event_listener); + }) + }); +}, 'Starting notification concurrently still can receive notification.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/server/connect/connect-twice.html b/third_party/WebKit/LayoutTests/bluetooth/server/connect/connect-twice.html new file mode 100644 index 0000000..727628f --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/server/connect/connect-twice.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<script src="../../../resources/bluetooth/bluetooth-helpers.js"></script> +<script> + 'use strict'; + promise_test(t => { + return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter') + .then(() => requestDeviceWithKeyDown({ + filters: [{services: ['health_thermometer']}], + optionalServices: [request_disconnection_service_uuid] + })) + .then(device => { + return device.gatt.connect() + .then(gattServer => gattServer.connect()) + .then(gattServer => get_request_disconnection(gattServer)) + .then(requestDisconnection => { + // This promise hangs unless gattserverdisconnected is fired. + let disconnected = eventPromise(device, 'gattserverdisconnected'); + return Promise.all([requestDisconnection(), + disconnected]); + }) + .then(([, disconnected]) => assert_true(disconnected.bubbles)); + }); + }, 'A device disconnecting after connected twice should fire the gattserverdisconnected event.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/server/connect/same-gatt-server-both-receive-disconnect-event.html b/third_party/WebKit/LayoutTests/bluetooth/server/connect/same-gatt-server-both-receive-disconnect-event.html new file mode 100644 index 0000000..3a4d936 --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/server/connect/same-gatt-server-both-receive-disconnect-event.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<script src="../../../resources/bluetooth/bluetooth-helpers.js"></script> +<script> +'use strict'; +var device; +promise_test(() => { + return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter') + .then(() => requestDeviceWithKeyDown({ + filters: [{services: ['health_thermometer']}], + optionalServices: [request_disconnection_service_uuid] + })) + .then(requestedDevice => { + device = requestedDevice; + return Promise.all([device.gatt.connect(), device.gatt.connect()]); + }) + .then(gattServers => get_request_disconnection(gattServers[0])) + .then(requestDisconnection => { + // This promise hangs unless gattserverdisconnected is fired. + let disconnected = eventPromise(device, 'gattserverdisconnected'); + return Promise.all([requestDisconnection(), disconnected]); + }); +}, 'A device disconnecting after two consecutive connect requests should fire an event.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/bluetooth/server/disconnect/disconnect-after-request-disconnection.html b/third_party/WebKit/LayoutTests/bluetooth/server/disconnect/disconnect-after-request-disconnection.html new file mode 100644 index 0000000..f35c0fed --- /dev/null +++ b/third_party/WebKit/LayoutTests/bluetooth/server/disconnect/disconnect-after-request-disconnection.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> +<script src="../../../resources/bluetooth/bluetooth-helpers.js"></script> +<script> +'use strict'; +var device; +var server; +var numEvents = 0; +promise_test(() => { + return setBluetoothFakeAdapter('DisconnectingHealthThermometerAdapter') + .then(() => requestDeviceWithKeyDown({ + filters: [{services: ['health_thermometer']}], + optionalServices: [request_disconnection_service_uuid] + })) + .then(requestedDevice => { + device = requestedDevice; + return device.gatt.connect(); + }) + .then(gattServer => { + server = gattServer; + return get_request_disconnection(gattServer); + }) + .then(requestDisconnection => { + let eventCounter = () => { ++numEvents; }; + device.addEventListener('gattserverdisconnected', eventCounter); + return Promise.all([requestDisconnection(), server.disconnect()]); + }) + .then(() => assert_equals(numEvents, 1)); +}, 'A device disconnects while the platform is disconnecting that device, ' + + 'only one gattserverdisconnected event should fire.'); +</script>
diff --git a/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.string-expected.txt b/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.string-expected.txt index ae2bcca..9aa3e60 100644 --- a/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.string-expected.txt +++ b/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.string-expected.txt
@@ -1 +1 @@ -Failed assertion: expected exception of type TYPE_MISMATCH_ERR, got: Failed to execute 'createPattern' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)' +Failed assertion: expected exception of type TYPE_MISMATCH_ERR, got: Failed to execute 'createPattern' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)'
diff --git a/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.undefined-expected.txt b/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.undefined-expected.txt index ae2bcca..9aa3e60 100644 --- a/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.undefined-expected.txt +++ b/third_party/WebKit/LayoutTests/canvas/philip/tests/2d.pattern.image.undefined-expected.txt
@@ -1 +1 @@ -Failed assertion: expected exception of type TYPE_MISMATCH_ERR, got: Failed to execute 'createPattern' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)' +Failed assertion: expected exception of type TYPE_MISMATCH_ERR, got: Failed to execute 'createPattern' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)'
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js new file mode 100644 index 0000000..e3404c2e --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.js
@@ -0,0 +1,112 @@ +/* +Copyright © 2001-2004 World Wide Web Consortium, +(Massachusetts Institute of Technology, European Research Consortium +for Informatics and Mathematics, Keio University). All +Rights Reserved. This work is distributed under the W3C® Software License [1] in the +hope that it will be useful, but WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 +*/ + + /** + * Gets URI that identifies the test. + * @return uri identifier of test + */ +function getTargetURI() { + return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi02"; + } + +var docsLoaded = -1000000; +var builder = null; + +// +// This function is called by the testing framework before +// running the test suite. +// +// If there are no configuration exceptions, asynchronous +// document loading is started. Otherwise, the status +// is set to complete and the exception is immediately +// raised when entering the body of the test. +// +function setUpPage() { + setUpPageStatus = 'running'; + try { + // + // creates test document builder, may throw exception + // + builder = createConfiguredBuilder(); + + docsLoaded = 0; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + docsLoaded += preload(docRef, "doc", "hc_staff"); + + if (docsLoaded == 1) { + setUpPageStatus = 'complete'; + } + } catch(ex) { + catchInitializationError(builder, ex); + setUpPageStatus = 'complete'; + } +} + +// +// This method is called on the completion of +// each asychronous load started in setUpTests. +// +// When every synchronous loaded document has completed, +// the page status is changed which allows the +// body of the test to be executed. +function loadComplete() { + if (++docsLoaded == 1) { + setUpPageStatus = 'complete'; + } +} + +/** +* + Create a new Document, retrieve its documentURI, and verify if it is null. + +* @author IBM +* @author Neil Delima +* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI +*/ +function documentgetdocumenturi02() { + var success; + if(checkInitialization(builder, "documentgetdocumenturi02") != null) return; + var doc; + var newDoc; + var docURI; + var domImpl; + var nullDocType = null; + + var docElem; + var rootNS; + var rootName; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + doc = load(docRef, "doc", "hc_staff"); + docElem = doc.documentElement; + + rootNS = docElem.namespaceURI; + + rootName = docElem.tagName; + + domImpl = doc.implementation; +newDoc = domImpl.createDocument(rootNS,rootName,nullDocType); + docURI = newDoc.documentURI; + + assertNull("documentgetdocumenturi02",docURI); + +} + +function runTest() { + documentgetdocumenturi02(); +}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml new file mode 100644 index 0000000..8249bcdf --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi02.xhtml
@@ -0,0 +1,73 @@ +<?xml version="1.0"?><?TEST-STYLE PIDATA?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "xhtml1-strict.dtd" [ + <!ENTITY alpha "α"> + <!ENTITY beta "β"> + <!ENTITY gamma "γ"> + <!ENTITY delta "δ"> + <!ENTITY epsilon "ε"> + <!ENTITY alpha "ζ"> + <!NOTATION notation1 PUBLIC "notation1File"> + <!NOTATION notation2 SYSTEM "notation2File"> + <!ATTLIST p + dir CDATA 'rtl' + xmlns:dmstc CDATA #IMPLIED + xmlns:nm CDATA #IMPLIED + xmlns:emp2 CDATA #IMPLIED> + <!ATTLIST html + xmlns:xsi CDATA #IMPLIED + xsi:schemaLocation CDATA #IMPLIED> + <!ATTLIST acronym xsi:noNamespaceSchemaLocation CDATA #IMPLIED> + <!ENTITY ent4 "<span xmlns='http://www.w3.org/1999/xhtml'>Element data</span><?PItarget PIdata?>"> + <!ATTLIST span xmlns CDATA #IMPLIED> +]> +<!-- This is comment number 1.--> +<html xmlns='http://www.w3.org/1999/xhtml' + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.w3.org/1999/xhtml hc_staff.xsd"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>hc_staff</title><script type="text/javascript" src="selfxhtml.js"/><script charset="UTF-8" type="text/javascript" src="documentgetdocumenturi02.js"/><script type='text/javascript'>function loadComplete() { startTest(); }</script></head><body onload="loadComplete()"> + <p xmlns:dmstc="http://www.usa.com"> + <em>EMP0001</em> + <strong>Margaret Martin</strong> + <code>Accountant</code> + <sup>56,000</sup> + <var>Female</var> + <acronym title="Yes" xsi:noNamespaceSchemaLocation="Yes">1230 North Ave. Dallas, Texas 98551</acronym> + </p> + <p xmlns:dmstc="http://www.usa.com"> + <em>EMP0002</em> + <strong>Martha Raynolds +<![CDATA[This is a CDATASection with EntityReference number 2 &ent2;]]> +<![CDATA[This is an adjacent CDATASection with a reference to a tab &tab;]]></strong> + <code>Secretary</code> + <sup>35,000</sup> + <var>Female</var> + <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">β Dallas, γ + 98554</acronym> + </p> + <p xmlns:dmstc="http://www.netzero.com"> + <em>EMP0003</em> + <strong>Roger + Jones</strong> + <code>Department Manager</code> + <sup>100,000</sup> + <var>&ent4;</var> + <acronym title="Yes" class="No" id="_98553" xsi:noNamespaceSchemaLocation="Yes">PO Box 27 Irving, texas 98553</acronym> + </p> + <p xmlns:nm="http://www.altavista.com"> + <em>EMP0004</em> + <strong>Jeny Oconnor</strong> + <code>Personnel Director</code> + <sup>95,000</sup> + <var>Female</var> + <acronym title="Yes" class="Yα" id="_98556" xsi:noNamespaceSchemaLocation="Yes">27 South Road. Dallas, Texas 98556</acronym> + </p> + <p xmlns:emp2="http://www.nist.gov"> + <em>EMP0005</em> + <strong>Robert Myers</strong> + <code>Computer Specialist</code> + <sup>90,000</sup> + <var>male</var> + <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">1821 Nordic. Road, Irving Texas 98558</acronym> + </p> +</body></html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt new file mode 100644 index 0000000..4b4a283 --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03-expected.txt
@@ -0,0 +1,2 @@ +Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi03 +Status Success
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js new file mode 100644 index 0000000..4749742 --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.js
@@ -0,0 +1,118 @@ +/* +Copyright © 2001-2004 World Wide Web Consortium, +(Massachusetts Institute of Technology, European Research Consortium +for Informatics and Mathematics, Keio University). All +Rights Reserved. This work is distributed under the W3C® Software License [1] in the +hope that it will be useful, but WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 +*/ + + /** + * Gets URI that identifies the test. + * @return uri identifier of test + */ +function getTargetURI() { + return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetdocumenturi03"; + } + +var docsLoaded = -1000000; +var builder = null; + +// +// This function is called by the testing framework before +// running the test suite. +// +// If there are no configuration exceptions, asynchronous +// document loading is started. Otherwise, the status +// is set to complete and the exception is immediately +// raised when entering the body of the test. +// +function setUpPage() { + setUpPageStatus = 'running'; + try { + // + // creates test document builder, may throw exception + // + builder = createConfiguredBuilder(); + + docsLoaded = 0; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + docsLoaded += preload(docRef, "doc", "hc_staff"); + + if (docsLoaded == 1) { + setUpPageStatus = 'complete'; + } + } catch(ex) { + catchInitializationError(builder, ex); + setUpPageStatus = 'complete'; + } +} + +// +// This method is called on the completion of +// each asychronous load started in setUpTests. +// +// When every synchronous loaded document has completed, +// the page status is changed which allows the +// body of the test to be executed. +function loadComplete() { + if (++docsLoaded == 1) { + setUpPageStatus = 'complete'; + } +} + +/** +* + Import the documentElement node of this document into a new document. Since this node is + now owned by the importing document, its documentURI attribute value should be null + +* @author IBM +* @author Neil Delima +* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI +*/ +function documentgetdocumenturi03() { + var success; + if(checkInitialization(builder, "documentgetdocumenturi03") != null) return; + var doc; + var newDoc; + var importedOwner; + var docElem; + var docElemImported; + var docURI; + var domImpl; + var nullDocType = null; + + var rootNS; + var rootName; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + doc = load(docRef, "doc", "hc_staff"); + domImpl = doc.implementation; +docElem = doc.documentElement; + + rootNS = docElem.namespaceURI; + + rootName = docElem.tagName; + + newDoc = domImpl.createDocument(rootNS,rootName,nullDocType); + docElemImported = newDoc.importNode(docElem,false); + importedOwner = docElemImported.ownerDocument; + + docURI = importedOwner.documentURI; + + assertNull("documentgetdocumenturi03",docURI); + +} + +function runTest() { + documentgetdocumenturi03(); +}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml new file mode 100644 index 0000000..b4af585ca --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentgetdocumenturi03.xhtml
@@ -0,0 +1,73 @@ +<?xml version="1.0"?><?TEST-STYLE PIDATA?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "xhtml1-strict.dtd" [ + <!ENTITY alpha "α"> + <!ENTITY beta "β"> + <!ENTITY gamma "γ"> + <!ENTITY delta "δ"> + <!ENTITY epsilon "ε"> + <!ENTITY alpha "ζ"> + <!NOTATION notation1 PUBLIC "notation1File"> + <!NOTATION notation2 SYSTEM "notation2File"> + <!ATTLIST p + dir CDATA 'rtl' + xmlns:dmstc CDATA #IMPLIED + xmlns:nm CDATA #IMPLIED + xmlns:emp2 CDATA #IMPLIED> + <!ATTLIST html + xmlns:xsi CDATA #IMPLIED + xsi:schemaLocation CDATA #IMPLIED> + <!ATTLIST acronym xsi:noNamespaceSchemaLocation CDATA #IMPLIED> + <!ENTITY ent4 "<span xmlns='http://www.w3.org/1999/xhtml'>Element data</span><?PItarget PIdata?>"> + <!ATTLIST span xmlns CDATA #IMPLIED> +]> +<!-- This is comment number 1.--> +<html xmlns='http://www.w3.org/1999/xhtml' + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.w3.org/1999/xhtml hc_staff.xsd"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>hc_staff</title><script type="text/javascript" src="selfxhtml.js"/><script charset="UTF-8" type="text/javascript" src="documentgetdocumenturi03.js"/><script type='text/javascript'>function loadComplete() { startTest(); }</script></head><body onload="loadComplete()"> + <p xmlns:dmstc="http://www.usa.com"> + <em>EMP0001</em> + <strong>Margaret Martin</strong> + <code>Accountant</code> + <sup>56,000</sup> + <var>Female</var> + <acronym title="Yes" xsi:noNamespaceSchemaLocation="Yes">1230 North Ave. Dallas, Texas 98551</acronym> + </p> + <p xmlns:dmstc="http://www.usa.com"> + <em>EMP0002</em> + <strong>Martha Raynolds +<![CDATA[This is a CDATASection with EntityReference number 2 &ent2;]]> +<![CDATA[This is an adjacent CDATASection with a reference to a tab &tab;]]></strong> + <code>Secretary</code> + <sup>35,000</sup> + <var>Female</var> + <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">β Dallas, γ + 98554</acronym> + </p> + <p xmlns:dmstc="http://www.netzero.com"> + <em>EMP0003</em> + <strong>Roger + Jones</strong> + <code>Department Manager</code> + <sup>100,000</sup> + <var>&ent4;</var> + <acronym title="Yes" class="No" id="_98553" xsi:noNamespaceSchemaLocation="Yes">PO Box 27 Irving, texas 98553</acronym> + </p> + <p xmlns:nm="http://www.altavista.com"> + <em>EMP0004</em> + <strong>Jeny Oconnor</strong> + <code>Personnel Director</code> + <sup>95,000</sup> + <var>Female</var> + <acronym title="Yes" class="Yα" id="_98556" xsi:noNamespaceSchemaLocation="Yes">27 South Road. Dallas, Texas 98556</acronym> + </p> + <p xmlns:emp2="http://www.nist.gov"> + <em>EMP0005</em> + <strong>Robert Myers</strong> + <code>Computer Specialist</code> + <sup>90,000</sup> + <var>male</var> + <acronym title="Yes" class="Yes" xsi:noNamespaceSchemaLocation="Yes">1821 Nordic. Road, Irving Texas 98558</acronym> + </p> +</body></html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt new file mode 100644 index 0000000..8a3e30b9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03-expected.txt
@@ -0,0 +1,3 @@ +Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentsetdocumenturi03 +Status failure +Message documentsetdocumenturi03: assertEquals failed, actual null, expected somestring.
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js new file mode 100644 index 0000000..697c555a --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.js
@@ -0,0 +1,117 @@ +/* +Copyright © 2001-2004 World Wide Web Consortium, +(Massachusetts Institute of Technology, European Research Consortium +for Informatics and Mathematics, Keio University). All +Rights Reserved. This work is distributed under the W3C® Software License [1] in the +hope that it will be useful, but WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 +*/ + + /** + * Gets URI that identifies the test. + * @return uri identifier of test + */ +function getTargetURI() { + return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentsetdocumenturi03"; + } + +var docsLoaded = -1000000; +var builder = null; + +// +// This function is called by the testing framework before +// running the test suite. +// +// If there are no configuration exceptions, asynchronous +// document loading is started. Otherwise, the status +// is set to complete and the exception is immediately +// raised when entering the body of the test. +// +function setUpPage() { + setUpPageStatus = 'running'; + try { + // + // creates test document builder, may throw exception + // + builder = createConfiguredBuilder(); + + docsLoaded = 0; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + docsLoaded += preload(docRef, "doc", "barfoo"); + + if (docsLoaded == 1) { + setUpPageStatus = 'complete'; + } + } catch(ex) { + catchInitializationError(builder, ex); + setUpPageStatus = 'complete'; + } +} + +// +// This method is called on the completion of +// each asychronous load started in setUpTests. +// +// When every synchronous loaded document has completed, +// the page status is changed which allows the +// body of the test to be executed. +function loadComplete() { + if (++docsLoaded == 1) { + setUpPageStatus = 'complete'; + } +} + +/** +* + The setDocmentURI method set the location of the document. + + Create a new document and set its documentURI to a valid string. Retrieve the documentURI + and verify if it is was correctly set. + +* @author IBM +* @author Neil Delima +* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-documentURI +*/ +function documentsetdocumenturi03() { + var success; + if(checkInitialization(builder, "documentsetdocumenturi03") != null) return; + var doc; + var newDoc; + var domImpl; + var docURI; + var nullDocType = null; + + var docElem; + var rootNS; + var rootName; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + doc = load(docRef, "doc", "barfoo"); + docElem = doc.documentElement; + + rootNS = docElem.namespaceURI; + + rootName = docElem.tagName; + + domImpl = doc.implementation; +newDoc = domImpl.createDocument(rootNS,rootName,nullDocType); + newDoc.documentURI = "somestring"; + + docURI = newDoc.documentURI; + + assertEquals("documentsetdocumenturi03","somestring",docURI); + +} + +function runTest() { + documentsetdocumenturi03(); +}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml new file mode 100644 index 0000000..1bb2f2c --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/documentsetdocumenturi03.xhtml
@@ -0,0 +1,25 @@ +<!DOCTYPE html [ +<!ENTITY ent1 'foo'> +<!ENTITY ent2 'foo<br/>'> +<!ELEMENT html (head, body)> +<!ATTLIST html xmlns CDATA #IMPLIED> +<!ELEMENT head (title,script*)> +<!ELEMENT script (#PCDATA)> +<!ATTLIST script + src CDATA #IMPLIED + type CDATA #IMPLIED + charset CDATA #IMPLIED> +<!ELEMENT title (#PCDATA)> +<!ELEMENT body (p)> +<!ATTLIST body onload CDATA #IMPLIED> +<!ELEMENT p (#PCDATA|br)*> +<!ELEMENT br EMPTY> +]> +<html xmlns='http://www.w3.org/1999/xhtml'> +<head> +<title>replaceWholeText sample</title> +<script type='text/javascript' src='selfxhtml.js'></script><script charset='UTF-8' type='text/javascript' src='documentsetdocumenturi03.js'></script><script type='text/javascript'>function loadComplete() { startTest(); }</script></head> +<body onload="loadComplete()"> +<p>bar</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt new file mode 100644 index 0000000..65f196b --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02-expected.txt
@@ -0,0 +1,3 @@ +Test http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri02 +Status error +Message Line undefined: TypeError
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js new file mode 100644 index 0000000..2574da2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.js
@@ -0,0 +1,119 @@ +/* +Copyright © 2001-2004 World Wide Web Consortium, +(Massachusetts Institute of Technology, European Research Consortium +for Informatics and Mathematics, Keio University). All +Rights Reserved. This work is distributed under the W3C® Software License [1] in the +hope that it will be useful, but WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 +*/ + + /** + * Gets URI that identifies the test. + * @return uri identifier of test + */ +function getTargetURI() { + return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/nodegetbaseuri02"; + } + +var docsLoaded = -1000000; +var builder = null; + +// +// This function is called by the testing framework before +// running the test suite. +// +// If there are no configuration exceptions, asynchronous +// document loading is started. Otherwise, the status +// is set to complete and the exception is immediately +// raised when entering the body of the test. +// +function setUpPage() { + setUpPageStatus = 'running'; + try { + // + // creates test document builder, may throw exception + // + builder = createConfiguredBuilder(); + + docsLoaded = 0; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + docsLoaded += preload(docRef, "doc", "barfoo"); + + if (docsLoaded == 1) { + setUpPageStatus = 'complete'; + } + } catch(ex) { + catchInitializationError(builder, ex); + setUpPageStatus = 'complete'; + } +} + +// +// This method is called on the completion of +// each asychronous load started in setUpTests. +// +// When every synchronous loaded document has completed, +// the page status is changed which allows the +// body of the test to be executed. +function loadComplete() { + if (++docsLoaded == 1) { + setUpPageStatus = 'complete'; + } +} + +/** +* + Using getBaseURI check if the baseURI attribute of a new Document node is null + and if affected by changes in Document.documentURI. + +* @author IBM +* @author Neil Delima +* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Node3-baseURI +* @see http://www.w3.org/Bugs/Public/show_bug.cgi?id=419 +* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/infoset-mapping#Infoset2Document +*/ +function nodegetbaseuri02() { + var success; + if(checkInitialization(builder, "nodegetbaseuri02") != null) return; + var doc; + var newDoc; + var domImpl; + var baseURI; + var rootNS; + var rootName; + var docElem; + var nullDocType = null; + + var docRef = null; + if (typeof(this.doc) != 'undefined') { + docRef = this.doc; + } + doc = load(docRef, "doc", "barfoo"); + docElem = doc.documentElement; + + rootNS = docElem.namespaceURI; + + rootName = docElem.tagName; + + domImpl = doc.implementation; +newDoc = domImpl.createDocument(rootNS,rootName,nullDocType); + baseURI = newDoc.baseURI; + + assertNull("baseURIIsNull",baseURI); + newDoc.documentURI = "http://www.example.com/sample.xml"; + + baseURI = newDoc.baseURI; + + assertEquals("baseURISameAsDocURI","http://www.example.com/sample.xml".toLowerCase(),baseURI.toLowerCase()); + +} + +function runTest() { + nodegetbaseuri02(); +}
diff --git a/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml new file mode 100644 index 0000000..8cd4f20 --- /dev/null +++ b/third_party/WebKit/LayoutTests/dom/legacy_dom_conformance/xhtml/level3/core/nodegetbaseuri02.xhtml
@@ -0,0 +1,25 @@ +<!DOCTYPE html [ +<!ENTITY ent1 'foo'> +<!ENTITY ent2 'foo<br/>'> +<!ELEMENT html (head, body)> +<!ATTLIST html xmlns CDATA #IMPLIED> +<!ELEMENT head (title,script*)> +<!ELEMENT script (#PCDATA)> +<!ATTLIST script + src CDATA #IMPLIED + type CDATA #IMPLIED + charset CDATA #IMPLIED> +<!ELEMENT title (#PCDATA)> +<!ELEMENT body (p)> +<!ATTLIST body onload CDATA #IMPLIED> +<!ELEMENT p (#PCDATA|br)*> +<!ELEMENT br EMPTY> +]> +<html xmlns='http://www.w3.org/1999/xhtml'> +<head> +<title>replaceWholeText sample</title> +<script type='text/javascript' src='selfxhtml.js'></script><script charset='UTF-8' type='text/javascript' src='nodegetbaseuri02.js'></script><script type='text/javascript'>function loadComplete() { startTest(); }</script></head> +<body onload="loadComplete()"> +<p>bar</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003-expected.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003-expected.xht index 51961d2..e141b6e 100644 --- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003-expected.xht +++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vlr-003-expected.xht
@@ -11,26 +11,35 @@ <meta content="image" name="flags" /> <meta name="DC.date.created" content="2017-02-25T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2017-02-28T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2017-03-22T09:54:03+11:00" scheme="W3CDTF" /> <style type="text/css"><![CDATA[ p { - margin: 8px; + left: 16px; + position: absolute; + top: -8px; } - div + img { - margin-left: 270px; /* 278px minus 8px */ - margin-top: 40px; /* 8px + 40px + 8px + 40px == 88px */ + vertical-align: top; } + + img + img + { + left: 16px; + position: relative; + top: 80px; + } + ]]></style> </head> <body> - <p><img src="support/pass-cdts-abs-pos-non-replaced.png" width="246" height="36" alt="Image download support must be enabled" /></p> + <p><img src="support/pass-cdts-abs-pos-non-replaced.png" width="246" height="36" alt="Image download support must be enabled" /><img src="support/swatch-green.png" width="80" height="80" alt="Image download support must be enabled" /></p> <!-- The image says: @@ -38,7 +47,5 @@ green square and <strong>no red</strong>. --> - <div><img src="support/swatch-green.png" width="80" height="80" alt="Image download support must be enabled" /></div> - </body> </html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002-expected.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002-expected.xht index b6398f97..aed33af 100644 --- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002-expected.xht +++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-ltr-top-bottom-vrl-002-expected.xht
@@ -11,7 +11,7 @@ <meta content="image" name="flags" /> <meta name="DC.date.created" content="2017-02-25T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2017-02-28T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2017-03-22T09:54:03+11:00" scheme="W3CDTF" /> <style type="text/css"><![CDATA[ html @@ -21,13 +21,21 @@ p { - margin: 8px; + position: absolute; + right: 16px; + top: -8px; } - div + img { - margin-right: 270px; /* 278px minus 8px */ - margin-top: 40px; /* 8px + 40px + 8px + 40px == 88px */ + vertical-align: top; + } + + img + img + { + position: relative; + right: 16px; + top: 80px; } ]]></style> @@ -35,7 +43,7 @@ <body> - <p><img src="support/pass-cdts-abs-pos-non-replaced.png" width="246" height="36" alt="Image download support must be enabled" /></p> + <p><img src="support/pass-cdts-abs-pos-non-replaced.png" width="246" height="36" alt="Image download support must be enabled" /><img src="support/swatch-green.png" width="80" height="80" alt="Image download support must be enabled" /></p> <!-- The image says: @@ -43,7 +51,5 @@ green square and <strong>no red</strong>. --> - <div><img src="support/swatch-green.png" width="80" height="80" alt="Image download support must be enabled" /></div> - </body> </html>
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009-expected.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009-expected.xht index d960003..b7dd97c 100644 --- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009-expected.xht +++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vlr-009-expected.xht
@@ -11,22 +11,21 @@ <meta content="image" name="flags" /> <meta name="DC.date.created" content="2017-02-25T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2017-02-28T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2017-03-22T09:54:03+11:00" scheme="W3CDTF" /> <style type="text/css"><![CDATA[ p { - bottom: 0px; - margin: 4px 8px; - /* - margin bottom is 4px which is the baseline (descender space) of the image; - this 4px value is not perfectly reliable. More reliable is to set - vertical-align: (top | bottom) for all images of tests and associated - reference files - */ + bottom: -8px; + left: 16px; position: absolute; } + img + { + vertical-align: bottom; + } + img + img { left: 96px;
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008-expected.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008-expected.xht index e6f33bb..9bd4acfd 100644 --- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008-expected.xht +++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-left-right-vrl-008-expected.xht
@@ -11,7 +11,7 @@ <meta content="image" name="flags" /> <meta name="DC.date.created" content="2017-02-25T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2017-02-28T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2017-03-22T09:54:03+11:00" scheme="W3CDTF" /> <style type="text/css"><![CDATA[ html @@ -21,15 +21,14 @@ p { - bottom: 0px; - margin: 4px 8px; - /* - margin bottom is 4px which is the baseline (descender space) of the image; - this 4px value is not perfectly reliable. More reliable is to set - vertical-align: (top | bottom) for all images of tests and associated - reference files - */ + bottom: -8px; position: absolute; + right: 16px; + } + + img + { + vertical-align: bottom; } img + img
diff --git a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007-expected.xht b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007-expected.xht index 6572e947..dedb684 100644 --- a/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007-expected.xht +++ b/third_party/WebKit/LayoutTests/external/csswg-test/css-writing-modes-3/overconstrained-rel-pos-rtl-top-bottom-vlr-007-expected.xht
@@ -11,22 +11,21 @@ <meta content="image" name="flags" /> <meta name="DC.date.created" content="2017-02-25T09:54:03+11:00" scheme="W3CDTF" /> - <meta name="DC.date.modified" content="2017-02-28T09:54:03+11:00" scheme="W3CDTF" /> + <meta name="DC.date.modified" content="2017-03-22T09:54:03+11:00" scheme="W3CDTF" /> <style type="text/css"><![CDATA[ p { - bottom: 0px; - margin: 4px 8px; - /* - margin bottom is 4px which is the baseline (descender space) of the image; - this 4px value is not perfectly reliable. More reliable is to set - vertical-align: (top | bottom) for all images of tests and associated - reference files - */ + bottom: -8px; + left: 16px; position: absolute; } + img + { + vertical-align: bottom; + } + img + img { bottom: 80px;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt index 37f7c80..53c250d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1609 tests; 1423 PASS, 186 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Event interface: existence and properties of interface object PASS Event interface object length PASS Event interface object name @@ -24,7 +24,7 @@ PASS Event interface: operation preventDefault() PASS Event interface: attribute defaultPrevented PASS Event interface: attribute timeStamp -FAIL Event interface: operation initEvent(DOMString,boolean,boolean) assert_equals: property has wrong .length expected 1 but got 0 +PASS Event interface: operation initEvent(DOMString,boolean,boolean) PASS Event must be primary interface of document.createEvent("Event") PASS Stringification of document.createEvent("Event") PASS Event interface: document.createEvent("Event") must inherit property "type" with the proper type (0) @@ -44,9 +44,7 @@ PASS Event interface: document.createEvent("Event") must have own property "isTrusted" PASS Event interface: document.createEvent("Event") must inherit property "timeStamp" with the proper type (15) PASS Event interface: document.createEvent("Event") must inherit property "initEvent" with the proper type (16) -FAIL Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { - fn.apply(obj, args); - }" did not throw +PASS Event interface: calling initEvent(DOMString,boolean,boolean) on document.createEvent("Event") with too few arguments must throw TypeError PASS Event must be primary interface of new Event("foo") PASS Stringification of new Event("foo") PASS Event interface: new Event("foo") must inherit property "type" with the proper type (0) @@ -66,16 +64,14 @@ PASS Event interface: new Event("foo") must have own property "isTrusted" PASS Event interface: new Event("foo") must inherit property "timeStamp" with the proper type (15) PASS Event interface: new Event("foo") must inherit property "initEvent" with the proper type (16) -FAIL Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { - fn.apply(obj, args); - }" did not throw +PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new Event("foo") with too few arguments must throw TypeError PASS CustomEvent interface: existence and properties of interface object PASS CustomEvent interface object length PASS CustomEvent interface object name FAIL CustomEvent interface: existence and properties of interface prototype object assert_equals: class string of CustomEvent.prototype expected "[object CustomEventPrototype]" but got "[object CustomEvent]" PASS CustomEvent interface: existence and properties of interface prototype object's "constructor" property PASS CustomEvent interface: attribute detail -FAIL CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) assert_equals: property has wrong .length expected 1 but got 4 +PASS CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any) PASS CustomEvent must be primary interface of new CustomEvent("foo") PASS Stringification of new CustomEvent("foo") PASS CustomEvent interface: new CustomEvent("foo") must inherit property "detail" with the proper type (0) @@ -98,9 +94,7 @@ PASS Event interface: new CustomEvent("foo") must have own property "isTrusted" PASS Event interface: new CustomEvent("foo") must inherit property "timeStamp" with the proper type (15) PASS Event interface: new CustomEvent("foo") must inherit property "initEvent" with the proper type (16) -FAIL Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () { - fn.apply(obj, args); - }" did not throw +PASS Event interface: calling initEvent(DOMString,boolean,boolean) on new CustomEvent("foo") with too few arguments must throw TypeError PASS EventTarget interface: existence and properties of interface object PASS EventTarget interface object length PASS EventTarget interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt index 20db23f..3c6b78e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createDocument-expected.txt
@@ -1,21 +1,21 @@ This is a testharness.js-based test. -Found 391 tests; 389 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 391 tests; 299 PASS, 92 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS DOMImplementation.createDocument(namespace, qualifiedName, doctype) PASS createDocument test: null,null,null,null -PASS createDocument test: metadata for null,null,null +FAIL createDocument test: metadata for null,null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,null PASS createDocument test: null,undefined,null,null -PASS createDocument test: metadata for null,undefined,null +FAIL createDocument test: metadata for null,undefined,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,undefined,null PASS createDocument test: null,"foo",null,null -PASS createDocument test: metadata for null,"foo",null +FAIL createDocument test: metadata for null,"foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"foo",null PASS createDocument test: null,"1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: null,"f1oo",null,null -PASS createDocument test: metadata for null,"f1oo",null +FAIL createDocument test: metadata for null,"f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"f1oo",null PASS createDocument test: null,"foo1",null,null -PASS createDocument test: metadata for null,"foo1",null +FAIL createDocument test: metadata for null,"foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"foo1",null PASS createDocument test: null,"ெfoo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: null,"}foo",null,"INVALID_CHARACTER_ERR" @@ -38,54 +38,54 @@ PASS createDocument test: null,"f:o:o",null,"NAMESPACE_ERR" PASS createDocument test: null,":",null,"NAMESPACE_ERR" PASS createDocument test: null,"xml",null,null -PASS createDocument test: metadata for null,"xml",null +FAIL createDocument test: metadata for null,"xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"xml",null PASS createDocument test: null,"xmlns",null,"NAMESPACE_ERR" PASS createDocument test: null,"xmlfoo",null,null -PASS createDocument test: metadata for null,"xmlfoo",null +FAIL createDocument test: metadata for null,"xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"xmlfoo",null PASS createDocument test: null,"xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: null,"xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: null,"xmlfoo:bar",null,"NAMESPACE_ERR" PASS createDocument test: null,"null:xml",null,"NAMESPACE_ERR" PASS createDocument test: "",null,null,null -PASS createDocument test: metadata for "",null,null +FAIL createDocument test: metadata for "",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "",null,null PASS createDocument test: "",":foo",null,"NAMESPACE_ERR" PASS createDocument test: "","f:oo",null,"NAMESPACE_ERR" PASS createDocument test: "","foo:",null,"NAMESPACE_ERR" PASS createDocument test: undefined,null,null,null -PASS createDocument test: metadata for undefined,null,null +FAIL createDocument test: metadata for undefined,null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,null,null PASS createDocument test: undefined,undefined,null,null -PASS createDocument test: metadata for undefined,undefined,null +FAIL createDocument test: metadata for undefined,undefined,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,undefined,null PASS createDocument test: undefined,"foo",null,null -PASS createDocument test: metadata for undefined,"foo",null +FAIL createDocument test: metadata for undefined,"foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"foo",null PASS createDocument test: undefined,"1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: undefined,"f1oo",null,null -PASS createDocument test: metadata for undefined,"f1oo",null +FAIL createDocument test: metadata for undefined,"f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"f1oo",null PASS createDocument test: undefined,"foo1",null,null -PASS createDocument test: metadata for undefined,"foo1",null +FAIL createDocument test: metadata for undefined,"foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"foo1",null PASS createDocument test: undefined,":foo",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"f:oo",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"foo:",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"f::oo",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"xml",null,null -PASS createDocument test: metadata for undefined,"xml",null +FAIL createDocument test: metadata for undefined,"xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"xml",null PASS createDocument test: undefined,"xmlns",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"xmlfoo",null,null -PASS createDocument test: metadata for undefined,"xmlfoo",null +FAIL createDocument test: metadata for undefined,"xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"xmlfoo",null PASS createDocument test: undefined,"xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: undefined,"xmlfoo:bar",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","foo",null,null -PASS createDocument test: metadata for "http://example.com/","foo",null +FAIL createDocument test: metadata for "http://example.com/","foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","foo",null PASS createDocument test: "http://example.com/","1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/","<foo>",null,"INVALID_CHARACTER_ERR" @@ -93,14 +93,14 @@ PASS createDocument test: "http://example.com/","-foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/",".foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/","f1oo",null,null -PASS createDocument test: metadata for "http://example.com/","f1oo",null +FAIL createDocument test: metadata for "http://example.com/","f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","f1oo",null PASS createDocument test: "http://example.com/","foo1",null,null -PASS createDocument test: metadata for "http://example.com/","foo1",null +FAIL createDocument test: metadata for "http://example.com/","foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","foo1",null PASS createDocument test: "http://example.com/",":foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","f:oo",null,null -PASS createDocument test: metadata for "http://example.com/","f:oo",null +FAIL createDocument test: metadata for "http://example.com/","f:oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","f:oo",null PASS createDocument test: "http://example.com/","f:o:o",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","foo:",null,"NAMESPACE_ERR" @@ -108,68 +108,68 @@ FAIL createDocument test: "http://example.com/","a:0",null,"NAMESPACE_ERR" assert_throws: function "function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }" threw object "InvalidCharacterError: Failed to execute 'createDocument' on 'DOMImplementation': The qualified name provided ('a:0') contains the invalid name-start character '0'." that is not a DOMException NAMESPACE_ERR: property "code" is equal to 5, expected 14 PASS createDocument test: "http://example.com/","0:a",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/","a:_",null,null -PASS createDocument test: metadata for "http://example.com/","a:_",null +FAIL createDocument test: metadata for "http://example.com/","a:_",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","a:_",null FAIL createDocument test: "http://example.com/","a:ெ",null,"NAMESPACE_ERR" assert_throws: function "function () { document.implementation.createDocument(namespace, qualifiedName, doctype) }" threw object "InvalidCharacterError: Failed to execute 'createDocument' on 'DOMImplementation': The qualified name provided ('a:ெ') contains the invalid name-start character 'ெ'." that is not a DOMException NAMESPACE_ERR: property "code" is equal to 5, expected 14 PASS createDocument test: "http://example.com/","ெ:a",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/","a:aெ",null,null -PASS createDocument test: metadata for "http://example.com/","a:aெ",null +FAIL createDocument test: metadata for "http://example.com/","a:aெ",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","a:aெ",null PASS createDocument test: "http://example.com/","aெ:a",null,null -PASS createDocument test: metadata for "http://example.com/","aெ:a",null +FAIL createDocument test: metadata for "http://example.com/","aெ:a",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","aெ:a",null PASS createDocument test: "http://example.com/","xml:test",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","xmlns:test",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","test:xmlns",null,null -PASS createDocument test: metadata for "http://example.com/","test:xmlns",null +FAIL createDocument test: metadata for "http://example.com/","test:xmlns",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","test:xmlns",null PASS createDocument test: "http://example.com/","xmlns",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","_:_",null,null -PASS createDocument test: metadata for "http://example.com/","_:_",null +FAIL createDocument test: metadata for "http://example.com/","_:_",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","_:_",null PASS createDocument test: "http://example.com/","_:h0",null,null -PASS createDocument test: metadata for "http://example.com/","_:h0",null +FAIL createDocument test: metadata for "http://example.com/","_:h0",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","_:h0",null PASS createDocument test: "http://example.com/","_:test",null,null -PASS createDocument test: metadata for "http://example.com/","_:test",null +FAIL createDocument test: metadata for "http://example.com/","_:test",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","_:test",null PASS createDocument test: "http://example.com/","l_:_",null,null -PASS createDocument test: metadata for "http://example.com/","l_:_",null +FAIL createDocument test: metadata for "http://example.com/","l_:_",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","l_:_",null PASS createDocument test: "http://example.com/","ns:_0",null,null -PASS createDocument test: metadata for "http://example.com/","ns:_0",null +FAIL createDocument test: metadata for "http://example.com/","ns:_0",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","ns:_0",null PASS createDocument test: "http://example.com/","ns:a0",null,null -PASS createDocument test: metadata for "http://example.com/","ns:a0",null +FAIL createDocument test: metadata for "http://example.com/","ns:a0",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","ns:a0",null PASS createDocument test: "http://example.com/","ns0:test",null,null -PASS createDocument test: metadata for "http://example.com/","ns0:test",null +FAIL createDocument test: metadata for "http://example.com/","ns0:test",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","ns0:test",null PASS createDocument test: "http://example.com/","a.b:c",null,null -PASS createDocument test: metadata for "http://example.com/","a.b:c",null +FAIL createDocument test: metadata for "http://example.com/","a.b:c",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","a.b:c",null PASS createDocument test: "http://example.com/","a-b:c",null,null -PASS createDocument test: metadata for "http://example.com/","a-b:c",null +FAIL createDocument test: metadata for "http://example.com/","a-b:c",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","a-b:c",null PASS createDocument test: "http://example.com/","xml",null,null -PASS createDocument test: metadata for "http://example.com/","xml",null +FAIL createDocument test: metadata for "http://example.com/","xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","xml",null PASS createDocument test: "http://example.com/","XMLNS",null,null -PASS createDocument test: metadata for "http://example.com/","XMLNS",null +FAIL createDocument test: metadata for "http://example.com/","XMLNS",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","XMLNS",null PASS createDocument test: "http://example.com/","xmlfoo",null,null -PASS createDocument test: metadata for "http://example.com/","xmlfoo",null +FAIL createDocument test: metadata for "http://example.com/","xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","xmlfoo",null PASS createDocument test: "http://example.com/","xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","XML:foo",null,null -PASS createDocument test: metadata for "http://example.com/","XML:foo",null +FAIL createDocument test: metadata for "http://example.com/","XML:foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","XML:foo",null PASS createDocument test: "http://example.com/","xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","XMLNS:foo",null,null -PASS createDocument test: metadata for "http://example.com/","XMLNS:foo",null +FAIL createDocument test: metadata for "http://example.com/","XMLNS:foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","XMLNS:foo",null PASS createDocument test: "http://example.com/","xmlfoo:bar",null,null -PASS createDocument test: metadata for "http://example.com/","xmlfoo:bar",null +FAIL createDocument test: metadata for "http://example.com/","xmlfoo:bar",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","xmlfoo:bar",null PASS createDocument test: "http://example.com/","prefix::local",null,"NAMESPACE_ERR" PASS createDocument test: "http://example.com/","namespaceURI:{",null,"INVALID_CHARACTER_ERR" @@ -200,60 +200,60 @@ PASS createDocument test: "http://example.com/","namespaceURI:a ",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://example.com/","namespaceURI:\"",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "/","foo",null,null -PASS createDocument test: metadata for "/","foo",null +FAIL createDocument test: metadata for "/","foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","foo",null PASS createDocument test: "/","1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "/","f1oo",null,null -PASS createDocument test: metadata for "/","f1oo",null +FAIL createDocument test: metadata for "/","f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","f1oo",null PASS createDocument test: "/","foo1",null,null -PASS createDocument test: metadata for "/","foo1",null +FAIL createDocument test: metadata for "/","foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","foo1",null PASS createDocument test: "/",":foo",null,"NAMESPACE_ERR" PASS createDocument test: "/","f:oo",null,null -PASS createDocument test: metadata for "/","f:oo",null +FAIL createDocument test: metadata for "/","f:oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","f:oo",null PASS createDocument test: "/","foo:",null,"NAMESPACE_ERR" PASS createDocument test: "/","xml",null,null -PASS createDocument test: metadata for "/","xml",null +FAIL createDocument test: metadata for "/","xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","xml",null PASS createDocument test: "/","xmlns",null,"NAMESPACE_ERR" PASS createDocument test: "/","xmlfoo",null,null -PASS createDocument test: metadata for "/","xmlfoo",null +FAIL createDocument test: metadata for "/","xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","xmlfoo",null PASS createDocument test: "/","xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: "/","xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: "/","xmlfoo:bar",null,null -PASS createDocument test: metadata for "/","xmlfoo:bar",null +FAIL createDocument test: metadata for "/","xmlfoo:bar",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","xmlfoo:bar",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","foo",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "http://www.w3.org/XML/1998/namespace","f1oo",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f1oo",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","f1oo",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo1",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo1",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","foo1",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace",":foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/XML/1998/namespace","f:oo",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f:oo",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","f:oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","f:oo",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","foo:",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xml",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xml",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlns",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlfoo",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xmlfoo",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xml:foo",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml:foo",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xml:foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xml:foo",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null PASS createDocument test: "http://www.w3.org/XML/1998/namespaces","xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/xml/1998/namespace","xml:foo",null,"NAMESPACE_ERR" @@ -266,126 +266,126 @@ PASS createDocument test: "http://www.w3.org/2000/xmlns/","foo:",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/2000/xmlns/","xml",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlns",null,null -PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns",null +FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","xmlns",null PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlfoo",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/2000/xmlns/","xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlns:foo",null,null -PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns:foo",null +FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","xmlns:foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","xmlns:foo",null PASS createDocument test: "http://www.w3.org/2000/xmlns/","xmlfoo:bar",null,"NAMESPACE_ERR" PASS createDocument test: "http://www.w3.org/2000/xmlns/","foo:xmlns",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","foo",null,null -PASS createDocument test: metadata for "foo:","foo",null +FAIL createDocument test: metadata for "foo:","foo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","foo",null PASS createDocument test: "foo:","1foo",null,"INVALID_CHARACTER_ERR" PASS createDocument test: "foo:","f1oo",null,null -PASS createDocument test: metadata for "foo:","f1oo",null +FAIL createDocument test: metadata for "foo:","f1oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","f1oo",null PASS createDocument test: "foo:","foo1",null,null -PASS createDocument test: metadata for "foo:","foo1",null +FAIL createDocument test: metadata for "foo:","foo1",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","foo1",null PASS createDocument test: "foo:",":foo",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","f:oo",null,null -PASS createDocument test: metadata for "foo:","f:oo",null +FAIL createDocument test: metadata for "foo:","f:oo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","f:oo",null PASS createDocument test: "foo:","foo:",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","xml",null,null -PASS createDocument test: metadata for "foo:","xml",null +FAIL createDocument test: metadata for "foo:","xml",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","xml",null PASS createDocument test: "foo:","xmlns",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","xmlfoo",null,null -PASS createDocument test: metadata for "foo:","xmlfoo",null +FAIL createDocument test: metadata for "foo:","xmlfoo",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","xmlfoo",null PASS createDocument test: "foo:","xml:foo",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","xmlns:foo",null,"NAMESPACE_ERR" PASS createDocument test: "foo:","xmlfoo:bar",null,null -PASS createDocument test: metadata for "foo:","xmlfoo:bar",null +FAIL createDocument test: metadata for "foo:","xmlfoo:bar",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","xmlfoo:bar",null PASS createDocument test: null,null,false,object "TypeError" PASS createDocument test: null,"",null,null -PASS createDocument test: metadata for null,"",null +FAIL createDocument test: metadata for null,"",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"",null PASS createDocument test: undefined,null,undefined,null -PASS createDocument test: metadata for undefined,null,undefined +FAIL createDocument test: metadata for undefined,null,undefined assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,null,undefined PASS createDocument test: undefined,undefined,undefined,null -PASS createDocument test: metadata for undefined,undefined,undefined +FAIL createDocument test: metadata for undefined,undefined,undefined assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,undefined,undefined PASS createDocument test: undefined,"",undefined,null -PASS createDocument test: metadata for undefined,"",undefined +FAIL createDocument test: metadata for undefined,"",undefined assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for undefined,"",undefined PASS createDocument test: "http://example.com/",null,null,null -PASS createDocument test: metadata for "http://example.com/",null,null +FAIL createDocument test: metadata for "http://example.com/",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/",null,null PASS createDocument test: "http://example.com/","",null,null -PASS createDocument test: metadata for "http://example.com/","",null +FAIL createDocument test: metadata for "http://example.com/","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://example.com/","",null PASS createDocument test: "/",null,null,null -PASS createDocument test: metadata for "/",null,null +FAIL createDocument test: metadata for "/",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/",null,null PASS createDocument test: "/","",null,null -PASS createDocument test: metadata for "/","",null +FAIL createDocument test: metadata for "/","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "/","",null PASS createDocument test: "http://www.w3.org/XML/1998/namespace",null,null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace",null,null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace",null,null PASS createDocument test: "http://www.w3.org/XML/1998/namespace","",null,null -PASS createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","",null +FAIL createDocument test: metadata for "http://www.w3.org/XML/1998/namespace","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/XML/1998/namespace","",null PASS createDocument test: "http://www.w3.org/2000/xmlns/",null,null,null -PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/",null,null +FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/",null,null PASS createDocument test: "http://www.w3.org/2000/xmlns/","",null,null -PASS createDocument test: metadata for "http://www.w3.org/2000/xmlns/","",null +FAIL createDocument test: metadata for "http://www.w3.org/2000/xmlns/","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/xmlns/","",null PASS createDocument test: "foo:",null,null,null -PASS createDocument test: metadata for "foo:",null,null +FAIL createDocument test: metadata for "foo:",null,null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:",null,null PASS createDocument test: "foo:","",null,null -PASS createDocument test: metadata for "foo:","",null +FAIL createDocument test: metadata for "foo:","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo:","",null PASS createDocument test: null,null,DocumentType node <!DOCTYPE foo>,null -PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE foo> +FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE foo> PASS createDocument test: null,null,DocumentType node <!DOCTYPE html>,null -PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE html> +FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE html> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE html> PASS createDocument test: null,null,DocumentType node <!DOCTYPE bar>,null -PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE bar> +FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE bar> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE bar> PASS createDocument test: null,null,DocumentType node <!DOCTYPE baz>,null -PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE baz> +FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE baz> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE baz> PASS createDocument test: null,null,DocumentType node <!DOCTYPE quz>,null -PASS createDocument test: metadata for null,null,DocumentType node <!DOCTYPE quz> +FAIL createDocument test: metadata for null,null,DocumentType node <!DOCTYPE quz> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,null,DocumentType node <!DOCTYPE quz> PASS createDocument test: null,"foo",DocumentType node <!DOCTYPE foo>,null -PASS createDocument test: metadata for null,"foo",DocumentType node <!DOCTYPE foo> +FAIL createDocument test: metadata for null,"foo",DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"foo",DocumentType node <!DOCTYPE foo> PASS createDocument test: "foo",null,DocumentType node <!DOCTYPE foo>,null -PASS createDocument test: metadata for "foo",null,DocumentType node <!DOCTYPE foo> +FAIL createDocument test: metadata for "foo",null,DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo",null,DocumentType node <!DOCTYPE foo> PASS createDocument test: "foo","bar",DocumentType node <!DOCTYPE foo>,null -PASS createDocument test: metadata for "foo","bar",DocumentType node <!DOCTYPE foo> +FAIL createDocument test: metadata for "foo","bar",DocumentType node <!DOCTYPE foo> assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "foo","bar",DocumentType node <!DOCTYPE foo> PASS createDocument test: "http://www.w3.org/1999/xhtml","",null,null -PASS createDocument test: metadata for "http://www.w3.org/1999/xhtml","",null +FAIL createDocument test: metadata for "http://www.w3.org/1999/xhtml","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/1999/xhtml","",null PASS createDocument test: "http://www.w3.org/2000/svg","",null,null -PASS createDocument test: metadata for "http://www.w3.org/2000/svg","",null +FAIL createDocument test: metadata for "http://www.w3.org/2000/svg","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/2000/svg","",null PASS createDocument test: "http://www.w3.org/1998/Math/MathML","",null,null -PASS createDocument test: metadata for "http://www.w3.org/1998/Math/MathML","",null +FAIL createDocument test: metadata for "http://www.w3.org/1998/Math/MathML","",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for "http://www.w3.org/1998/Math/MathML","",null PASS createDocument test: null,"html",null,null -PASS createDocument test: metadata for null,"html",null +FAIL createDocument test: metadata for null,"html",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"html",null PASS createDocument test: null,"svg",null,null -PASS createDocument test: metadata for null,"svg",null +FAIL createDocument test: metadata for null,"svg",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"svg",null PASS createDocument test: null,"math",null,null -PASS createDocument test: metadata for null,"math",null +FAIL createDocument test: metadata for null,"math",null assert_equals: expected "about:blank" but got "" PASS createDocument test: characterSet aliases for null,"math",null PASS createDocument test: null,"",DocumentType node <!DOCTYPE html -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> PASS createDocument test: null,"",DocumentType node <!DOCTYPE svg -//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt new file mode 100644 index 0000000..fb7b8e501c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/DOMImplementation-createHTMLDocument-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +PASS createHTMLDocument test 0: "","","" +PASS createHTMLDocument test 1: null,"null","null" +PASS createHTMLDocument test 2: undefined,undefined,"" +PASS createHTMLDocument test 3: "foo bar baz","foo bar baz","foo bar baz" +PASS createHTMLDocument test 4: "foo\t\tbar baz","foo\t\tbar baz","foo bar baz" +PASS createHTMLDocument test 5: "foo\n\nbar baz","foo\n\nbar baz","foo bar baz" +PASS createHTMLDocument test 6: "foo\f\fbar baz","foo\f\fbar baz","foo bar baz" +PASS createHTMLDocument test 7: "foo\r\rbar baz","foo\r\rbar baz","foo bar baz" +PASS Missing title argument +FAIL createHTMLDocument(): metadata assert_equals: expected "about:blank" but got "" +PASS createHTMLDocument(): characterSet aliases +PASS createHTMLDocument(): URL parsing +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt index 1424f3a5..2ec229e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-cloneNode-expected.txt
@@ -130,7 +130,7 @@ PASS createElementNS non-HTML PASS createProcessingInstruction PASS implementation.createDocumentType -FAIL implementation.createDocument assert_equals: expected "null" but got "http://web-platform.test:8001" +FAIL implementation.createDocument assert_equals: expected "about:blank" but got "" PASS implementation.createHTMLDocument PASS node with children Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt new file mode 100644 index 0000000..bd197bf --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Node-properties-expected.txt
@@ -0,0 +1,703 @@ +This is a testharness.js-based test. +Found 699 tests; 695 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS testDiv.nodeType +PASS testDiv.ownerDocument +PASS testDiv.parentNode +PASS testDiv.parentElement +PASS testDiv.childNodes.length +PASS testDiv.childNodes[0] +PASS testDiv.childNodes[1] +PASS testDiv.childNodes[2] +PASS testDiv.childNodes[3] +PASS testDiv.childNodes[4] +PASS testDiv.childNodes[5] +PASS testDiv.previousSibling +PASS testDiv.nextSibling +PASS testDiv.textContent +PASS testDiv.namespaceURI +PASS testDiv.prefix +PASS testDiv.localName +PASS testDiv.tagName +PASS testDiv.id +PASS testDiv.children[0] +PASS testDiv.children[1] +PASS testDiv.children[2] +PASS testDiv.children[3] +PASS testDiv.children[4] +PASS testDiv.previousElementSibling +PASS testDiv.childElementCount +PASS testDiv.nodeName +PASS testDiv.nodeValue +PASS testDiv.children.length +PASS testDiv.className +PASS testDiv.firstElementChild +PASS testDiv.lastElementChild +PASS testDiv.firstChild +PASS testDiv.lastChild +PASS testDiv.hasChildNodes() +PASS detachedDiv.nodeType +PASS detachedDiv.ownerDocument +PASS detachedDiv.parentNode +PASS detachedDiv.parentElement +PASS detachedDiv.childNodes.length +PASS detachedDiv.childNodes[0] +PASS detachedDiv.childNodes[1] +PASS detachedDiv.previousSibling +PASS detachedDiv.nextSibling +PASS detachedDiv.textContent +PASS detachedDiv.namespaceURI +PASS detachedDiv.prefix +PASS detachedDiv.localName +PASS detachedDiv.tagName +PASS detachedDiv.children[0] +PASS detachedDiv.children[1] +PASS detachedDiv.previousElementSibling +PASS detachedDiv.nextElementSibling +PASS detachedDiv.childElementCount +PASS detachedDiv.nodeName +PASS detachedDiv.nodeValue +PASS detachedDiv.children.length +PASS detachedDiv.id +PASS detachedDiv.className +PASS detachedDiv.firstElementChild +PASS detachedDiv.lastElementChild +PASS detachedDiv.firstChild +PASS detachedDiv.lastChild +PASS detachedDiv.hasChildNodes() +PASS detachedPara1.nodeType +PASS detachedPara1.ownerDocument +PASS detachedPara1.parentNode +PASS detachedPara1.parentElement +PASS detachedPara1.childNodes.length +PASS detachedPara1.previousSibling +PASS detachedPara1.nextSibling +PASS detachedPara1.textContent +PASS detachedPara1.namespaceURI +PASS detachedPara1.prefix +PASS detachedPara1.localName +PASS detachedPara1.tagName +PASS detachedPara1.previousElementSibling +PASS detachedPara1.nextElementSibling +PASS detachedPara1.childElementCount +PASS detachedPara1.nodeName +PASS detachedPara1.nodeValue +PASS detachedPara1.children.length +PASS detachedPara1.id +PASS detachedPara1.className +PASS detachedPara1.lastElementChild +PASS detachedPara1.firstElementChild +PASS detachedPara1.firstChild +PASS detachedPara1.lastChild +PASS detachedPara1.hasChildNodes() +PASS detachedPara2.nodeType +PASS detachedPara2.ownerDocument +PASS detachedPara2.parentNode +PASS detachedPara2.parentElement +PASS detachedPara2.childNodes.length +PASS detachedPara2.previousSibling +PASS detachedPara2.nextSibling +PASS detachedPara2.textContent +PASS detachedPara2.namespaceURI +PASS detachedPara2.prefix +PASS detachedPara2.localName +PASS detachedPara2.tagName +PASS detachedPara2.previousElementSibling +PASS detachedPara2.nextElementSibling +PASS detachedPara2.childElementCount +PASS detachedPara2.nodeName +PASS detachedPara2.nodeValue +PASS detachedPara2.children.length +PASS detachedPara2.id +PASS detachedPara2.className +PASS detachedPara2.lastElementChild +PASS detachedPara2.firstElementChild +PASS detachedPara2.firstChild +PASS detachedPara2.lastChild +PASS detachedPara2.hasChildNodes() +PASS document.nodeType +PASS document.childNodes.length +PASS document.childNodes[0] +PASS document.childNodes[1] +PASS document.URL +PASS document.compatMode +PASS document.characterSet +PASS document.contentType +PASS document.doctype +PASS document.nodeName +PASS document.textContent +PASS document.nodeValue +PASS document.nextSibling +PASS document.previousSibling +PASS document.parentElement +PASS document.parentNode +PASS document.ownerDocument +PASS document.documentURI +PASS document.inputEncoding +PASS document.charset +PASS document.firstChild +PASS document.lastChild +PASS document.hasChildNodes() +PASS foreignDoc.nodeType +PASS foreignDoc.childNodes.length +PASS foreignDoc.childNodes[0] +PASS foreignDoc.childNodes[1] +PASS foreignDoc.childNodes[2] +FAIL foreignDoc.URL assert_equals: expected "about:blank" but got "" +PASS foreignDoc.compatMode +PASS foreignDoc.characterSet +PASS foreignDoc.contentType +PASS foreignDoc.nodeName +PASS foreignDoc.textContent +PASS foreignDoc.nodeValue +PASS foreignDoc.nextSibling +PASS foreignDoc.previousSibling +PASS foreignDoc.parentElement +PASS foreignDoc.parentNode +PASS foreignDoc.ownerDocument +FAIL foreignDoc.documentURI assert_equals: expected (string) "about:blank" but got (object) null +PASS foreignDoc.inputEncoding +PASS foreignDoc.charset +PASS foreignDoc.firstChild +PASS foreignDoc.lastChild +PASS foreignDoc.hasChildNodes() +PASS foreignPara1.nodeType +PASS foreignPara1.ownerDocument +PASS foreignPara1.parentNode +PASS foreignPara1.parentElement +PASS foreignPara1.childNodes.length +PASS foreignPara1.previousSibling +PASS foreignPara1.nextSibling +PASS foreignPara1.textContent +PASS foreignPara1.namespaceURI +PASS foreignPara1.prefix +PASS foreignPara1.localName +PASS foreignPara1.tagName +PASS foreignPara1.previousElementSibling +PASS foreignPara1.nextElementSibling +PASS foreignPara1.childElementCount +PASS foreignPara1.nodeName +PASS foreignPara1.nodeValue +PASS foreignPara1.children.length +PASS foreignPara1.id +PASS foreignPara1.className +PASS foreignPara1.lastElementChild +PASS foreignPara1.firstElementChild +PASS foreignPara1.firstChild +PASS foreignPara1.lastChild +PASS foreignPara1.hasChildNodes() +PASS foreignPara2.nodeType +PASS foreignPara2.ownerDocument +PASS foreignPara2.parentNode +PASS foreignPara2.parentElement +PASS foreignPara2.childNodes.length +PASS foreignPara2.previousSibling +PASS foreignPara2.nextSibling +PASS foreignPara2.textContent +PASS foreignPara2.namespaceURI +PASS foreignPara2.prefix +PASS foreignPara2.localName +PASS foreignPara2.tagName +PASS foreignPara2.previousElementSibling +PASS foreignPara2.nextElementSibling +PASS foreignPara2.childElementCount +PASS foreignPara2.nodeName +PASS foreignPara2.nodeValue +PASS foreignPara2.children.length +PASS foreignPara2.id +PASS foreignPara2.className +PASS foreignPara2.lastElementChild +PASS foreignPara2.firstElementChild +PASS foreignPara2.firstChild +PASS foreignPara2.lastChild +PASS foreignPara2.hasChildNodes() +PASS xmlDoc.nodeType +PASS xmlDoc.childNodes.length +PASS xmlDoc.childNodes[0] +PASS xmlDoc.childNodes[1] +PASS xmlDoc.childNodes[2] +PASS xmlDoc.childNodes[3] +FAIL xmlDoc.URL assert_equals: expected "about:blank" but got "" +PASS xmlDoc.compatMode +PASS xmlDoc.characterSet +PASS xmlDoc.contentType +PASS xmlDoc.nodeName +PASS xmlDoc.textContent +PASS xmlDoc.nodeValue +PASS xmlDoc.nextSibling +PASS xmlDoc.previousSibling +PASS xmlDoc.parentElement +PASS xmlDoc.parentNode +PASS xmlDoc.ownerDocument +FAIL xmlDoc.documentURI assert_equals: expected (string) "about:blank" but got (object) null +PASS xmlDoc.inputEncoding +PASS xmlDoc.charset +PASS xmlDoc.firstChild +PASS xmlDoc.lastChild +PASS xmlDoc.hasChildNodes() +PASS xmlElement.nodeType +PASS xmlElement.ownerDocument +PASS xmlElement.parentNode +PASS xmlElement.parentElement +PASS xmlElement.childNodes.length +PASS xmlElement.childNodes[0] +PASS xmlElement.previousSibling +PASS xmlElement.nextSibling +PASS xmlElement.textContent +PASS xmlElement.namespaceURI +PASS xmlElement.prefix +PASS xmlElement.localName +PASS xmlElement.tagName +PASS xmlElement.previousElementSibling +PASS xmlElement.nextElementSibling +PASS xmlElement.childElementCount +PASS xmlElement.nodeName +PASS xmlElement.nodeValue +PASS xmlElement.children.length +PASS xmlElement.id +PASS xmlElement.className +PASS xmlElement.lastElementChild +PASS xmlElement.firstElementChild +PASS xmlElement.firstChild +PASS xmlElement.lastChild +PASS xmlElement.hasChildNodes() +PASS detachedXmlElement.nodeType +PASS detachedXmlElement.ownerDocument +PASS detachedXmlElement.parentNode +PASS detachedXmlElement.parentElement +PASS detachedXmlElement.childNodes.length +PASS detachedXmlElement.previousSibling +PASS detachedXmlElement.nextSibling +PASS detachedXmlElement.textContent +PASS detachedXmlElement.namespaceURI +PASS detachedXmlElement.prefix +PASS detachedXmlElement.localName +PASS detachedXmlElement.tagName +PASS detachedXmlElement.previousElementSibling +PASS detachedXmlElement.nextElementSibling +PASS detachedXmlElement.childElementCount +PASS detachedXmlElement.nodeName +PASS detachedXmlElement.nodeValue +PASS detachedXmlElement.children.length +PASS detachedXmlElement.id +PASS detachedXmlElement.className +PASS detachedXmlElement.lastElementChild +PASS detachedXmlElement.firstElementChild +PASS detachedXmlElement.lastChild +PASS detachedXmlElement.firstChild +PASS detachedXmlElement.hasChildNodes() +PASS detachedTextNode.nodeType +PASS detachedTextNode.ownerDocument +PASS detachedTextNode.parentNode +PASS detachedTextNode.parentElement +PASS detachedTextNode.previousSibling +PASS detachedTextNode.nextSibling +PASS detachedTextNode.nodeValue +PASS detachedTextNode.wholeText +PASS detachedTextNode.nodeName +PASS detachedTextNode.childNodes.length +PASS detachedTextNode.data +PASS detachedTextNode.textContent +PASS detachedTextNode.length +PASS detachedTextNode.lastChild +PASS detachedTextNode.firstChild +PASS detachedTextNode.hasChildNodes() +PASS foreignTextNode.nodeType +PASS foreignTextNode.ownerDocument +PASS foreignTextNode.parentNode +PASS foreignTextNode.parentElement +PASS foreignTextNode.previousSibling +PASS foreignTextNode.nextSibling +PASS foreignTextNode.nodeValue +PASS foreignTextNode.wholeText +PASS foreignTextNode.nodeName +PASS foreignTextNode.childNodes.length +PASS foreignTextNode.data +PASS foreignTextNode.textContent +PASS foreignTextNode.length +PASS foreignTextNode.lastChild +PASS foreignTextNode.firstChild +PASS foreignTextNode.hasChildNodes() +PASS detachedForeignTextNode.nodeType +PASS detachedForeignTextNode.ownerDocument +PASS detachedForeignTextNode.parentNode +PASS detachedForeignTextNode.parentElement +PASS detachedForeignTextNode.previousSibling +PASS detachedForeignTextNode.nextSibling +PASS detachedForeignTextNode.nodeValue +PASS detachedForeignTextNode.wholeText +PASS detachedForeignTextNode.nodeName +PASS detachedForeignTextNode.childNodes.length +PASS detachedForeignTextNode.data +PASS detachedForeignTextNode.textContent +PASS detachedForeignTextNode.length +PASS detachedForeignTextNode.lastChild +PASS detachedForeignTextNode.firstChild +PASS detachedForeignTextNode.hasChildNodes() +PASS xmlTextNode.nodeType +PASS xmlTextNode.ownerDocument +PASS xmlTextNode.parentNode +PASS xmlTextNode.parentElement +PASS xmlTextNode.previousSibling +PASS xmlTextNode.nextSibling +PASS xmlTextNode.nodeValue +PASS xmlTextNode.wholeText +PASS xmlTextNode.nodeName +PASS xmlTextNode.childNodes.length +PASS xmlTextNode.data +PASS xmlTextNode.textContent +PASS xmlTextNode.length +PASS xmlTextNode.lastChild +PASS xmlTextNode.firstChild +PASS xmlTextNode.hasChildNodes() +PASS detachedXmlTextNode.nodeType +PASS detachedXmlTextNode.ownerDocument +PASS detachedXmlTextNode.parentNode +PASS detachedXmlTextNode.parentElement +PASS detachedXmlTextNode.previousSibling +PASS detachedXmlTextNode.nextSibling +PASS detachedXmlTextNode.nodeValue +PASS detachedXmlTextNode.wholeText +PASS detachedXmlTextNode.nodeName +PASS detachedXmlTextNode.childNodes.length +PASS detachedXmlTextNode.data +PASS detachedXmlTextNode.textContent +PASS detachedXmlTextNode.length +PASS detachedXmlTextNode.lastChild +PASS detachedXmlTextNode.firstChild +PASS detachedXmlTextNode.hasChildNodes() +PASS processingInstruction.nodeType +PASS processingInstruction.ownerDocument +PASS processingInstruction.parentNode +PASS processingInstruction.parentElement +PASS processingInstruction.previousSibling +PASS processingInstruction.nextSibling +PASS processingInstruction.nodeValue +PASS processingInstruction.target +PASS processingInstruction.nodeName +PASS processingInstruction.childNodes.length +PASS processingInstruction.data +PASS processingInstruction.textContent +PASS processingInstruction.length +PASS processingInstruction.lastChild +PASS processingInstruction.firstChild +PASS processingInstruction.hasChildNodes() +PASS detachedProcessingInstruction.nodeType +PASS detachedProcessingInstruction.ownerDocument +PASS detachedProcessingInstruction.parentNode +PASS detachedProcessingInstruction.parentElement +PASS detachedProcessingInstruction.previousSibling +PASS detachedProcessingInstruction.nextSibling +PASS detachedProcessingInstruction.nodeValue +PASS detachedProcessingInstruction.target +PASS detachedProcessingInstruction.nodeName +PASS detachedProcessingInstruction.childNodes.length +PASS detachedProcessingInstruction.data +PASS detachedProcessingInstruction.textContent +PASS detachedProcessingInstruction.length +PASS detachedProcessingInstruction.lastChild +PASS detachedProcessingInstruction.firstChild +PASS detachedProcessingInstruction.hasChildNodes() +PASS comment.nodeType +PASS comment.ownerDocument +PASS comment.parentNode +PASS comment.parentElement +PASS comment.previousSibling +PASS comment.nextSibling +PASS comment.nodeValue +PASS comment.nodeName +PASS comment.childNodes.length +PASS comment.data +PASS comment.textContent +PASS comment.length +PASS comment.lastChild +PASS comment.firstChild +PASS comment.hasChildNodes() +PASS detachedComment.nodeType +PASS detachedComment.ownerDocument +PASS detachedComment.parentNode +PASS detachedComment.parentElement +PASS detachedComment.previousSibling +PASS detachedComment.nextSibling +PASS detachedComment.nodeValue +PASS detachedComment.nodeName +PASS detachedComment.childNodes.length +PASS detachedComment.data +PASS detachedComment.textContent +PASS detachedComment.length +PASS detachedComment.lastChild +PASS detachedComment.firstChild +PASS detachedComment.hasChildNodes() +PASS foreignComment.nodeType +PASS foreignComment.ownerDocument +PASS foreignComment.parentNode +PASS foreignComment.parentElement +PASS foreignComment.previousSibling +PASS foreignComment.nextSibling +PASS foreignComment.nodeValue +PASS foreignComment.nodeName +PASS foreignComment.childNodes.length +PASS foreignComment.data +PASS foreignComment.textContent +PASS foreignComment.length +PASS foreignComment.lastChild +PASS foreignComment.firstChild +PASS foreignComment.hasChildNodes() +PASS detachedForeignComment.nodeType +PASS detachedForeignComment.ownerDocument +PASS detachedForeignComment.parentNode +PASS detachedForeignComment.parentElement +PASS detachedForeignComment.previousSibling +PASS detachedForeignComment.nextSibling +PASS detachedForeignComment.nodeValue +PASS detachedForeignComment.nodeName +PASS detachedForeignComment.childNodes.length +PASS detachedForeignComment.data +PASS detachedForeignComment.textContent +PASS detachedForeignComment.length +PASS detachedForeignComment.lastChild +PASS detachedForeignComment.firstChild +PASS detachedForeignComment.hasChildNodes() +PASS xmlComment.nodeType +PASS xmlComment.ownerDocument +PASS xmlComment.parentNode +PASS xmlComment.parentElement +PASS xmlComment.previousSibling +PASS xmlComment.nextSibling +PASS xmlComment.nodeValue +PASS xmlComment.nodeName +PASS xmlComment.childNodes.length +PASS xmlComment.data +PASS xmlComment.textContent +PASS xmlComment.length +PASS xmlComment.lastChild +PASS xmlComment.firstChild +PASS xmlComment.hasChildNodes() +PASS detachedXmlComment.nodeType +PASS detachedXmlComment.ownerDocument +PASS detachedXmlComment.parentNode +PASS detachedXmlComment.parentElement +PASS detachedXmlComment.previousSibling +PASS detachedXmlComment.nextSibling +PASS detachedXmlComment.nodeValue +PASS detachedXmlComment.nodeName +PASS detachedXmlComment.childNodes.length +PASS detachedXmlComment.data +PASS detachedXmlComment.textContent +PASS detachedXmlComment.length +PASS detachedXmlComment.lastChild +PASS detachedXmlComment.firstChild +PASS detachedXmlComment.hasChildNodes() +PASS docfrag.nodeType +PASS docfrag.ownerDocument +PASS docfrag.childNodes.length +PASS docfrag.textContent +PASS docfrag.nodeName +PASS docfrag.nodeValue +PASS docfrag.nextSibling +PASS docfrag.previousSibling +PASS docfrag.parentElement +PASS docfrag.parentNode +PASS docfrag.lastChild +PASS docfrag.firstChild +PASS docfrag.hasChildNodes() +PASS foreignDocfrag.nodeType +PASS foreignDocfrag.ownerDocument +PASS foreignDocfrag.childNodes.length +PASS foreignDocfrag.textContent +PASS foreignDocfrag.nodeName +PASS foreignDocfrag.nodeValue +PASS foreignDocfrag.nextSibling +PASS foreignDocfrag.previousSibling +PASS foreignDocfrag.parentElement +PASS foreignDocfrag.parentNode +PASS foreignDocfrag.lastChild +PASS foreignDocfrag.firstChild +PASS foreignDocfrag.hasChildNodes() +PASS xmlDocfrag.nodeType +PASS xmlDocfrag.ownerDocument +PASS xmlDocfrag.childNodes.length +PASS xmlDocfrag.textContent +PASS xmlDocfrag.nodeName +PASS xmlDocfrag.nodeValue +PASS xmlDocfrag.nextSibling +PASS xmlDocfrag.previousSibling +PASS xmlDocfrag.parentElement +PASS xmlDocfrag.parentNode +PASS xmlDocfrag.lastChild +PASS xmlDocfrag.firstChild +PASS xmlDocfrag.hasChildNodes() +PASS doctype.nodeType +PASS doctype.ownerDocument +PASS doctype.parentNode +PASS doctype.previousSibling +PASS doctype.nextSibling +PASS doctype.name +PASS doctype.publicId +PASS doctype.systemId +PASS doctype.nodeName +PASS doctype.childNodes.length +PASS doctype.textContent +PASS doctype.nodeValue +PASS doctype.parentElement +PASS doctype.lastChild +PASS doctype.firstChild +PASS doctype.hasChildNodes() +PASS foreignDoctype.nodeType +PASS foreignDoctype.ownerDocument +PASS foreignDoctype.parentNode +PASS foreignDoctype.previousSibling +PASS foreignDoctype.nextSibling +PASS foreignDoctype.name +PASS foreignDoctype.publicId +PASS foreignDoctype.systemId +PASS foreignDoctype.nodeName +PASS foreignDoctype.childNodes.length +PASS foreignDoctype.textContent +PASS foreignDoctype.nodeValue +PASS foreignDoctype.parentElement +PASS foreignDoctype.lastChild +PASS foreignDoctype.firstChild +PASS foreignDoctype.hasChildNodes() +PASS xmlDoctype.nodeType +PASS xmlDoctype.ownerDocument +PASS xmlDoctype.parentNode +PASS xmlDoctype.previousSibling +PASS xmlDoctype.nextSibling +PASS xmlDoctype.name +PASS xmlDoctype.publicId +PASS xmlDoctype.systemId +PASS xmlDoctype.nodeName +PASS xmlDoctype.childNodes.length +PASS xmlDoctype.textContent +PASS xmlDoctype.nodeValue +PASS xmlDoctype.parentElement +PASS xmlDoctype.lastChild +PASS xmlDoctype.firstChild +PASS xmlDoctype.hasChildNodes() +PASS paras[0].nodeType +PASS paras[0].ownerDocument +PASS paras[0].parentNode +PASS paras[0].parentElement +PASS paras[0].childNodes.length +PASS paras[0].previousSibling +PASS paras[0].nextSibling +PASS paras[0].textContent +PASS paras[0].namespaceURI +PASS paras[0].prefix +PASS paras[0].localName +PASS paras[0].tagName +PASS paras[0].id +PASS paras[0].previousElementSibling +PASS paras[0].nextElementSibling +PASS paras[0].childElementCount +PASS paras[0].nodeName +PASS paras[0].nodeValue +PASS paras[0].children.length +PASS paras[0].className +PASS paras[0].lastElementChild +PASS paras[0].firstElementChild +PASS paras[0].firstChild +PASS paras[0].lastChild +PASS paras[0].hasChildNodes() +PASS paras[1].nodeType +PASS paras[1].ownerDocument +PASS paras[1].parentNode +PASS paras[1].parentElement +PASS paras[1].childNodes.length +PASS paras[1].previousSibling +PASS paras[1].nextSibling +PASS paras[1].textContent +PASS paras[1].namespaceURI +PASS paras[1].prefix +PASS paras[1].localName +PASS paras[1].tagName +PASS paras[1].id +PASS paras[1].previousElementSibling +PASS paras[1].nextElementSibling +PASS paras[1].childElementCount +PASS paras[1].nodeName +PASS paras[1].nodeValue +PASS paras[1].children.length +PASS paras[1].className +PASS paras[1].lastElementChild +PASS paras[1].firstElementChild +PASS paras[1].firstChild +PASS paras[1].lastChild +PASS paras[1].hasChildNodes() +PASS paras[2].nodeType +PASS paras[2].ownerDocument +PASS paras[2].parentNode +PASS paras[2].parentElement +PASS paras[2].childNodes.length +PASS paras[2].previousSibling +PASS paras[2].nextSibling +PASS paras[2].textContent +PASS paras[2].namespaceURI +PASS paras[2].prefix +PASS paras[2].localName +PASS paras[2].tagName +PASS paras[2].id +PASS paras[2].previousElementSibling +PASS paras[2].nextElementSibling +PASS paras[2].childElementCount +PASS paras[2].nodeName +PASS paras[2].nodeValue +PASS paras[2].children.length +PASS paras[2].className +PASS paras[2].lastElementChild +PASS paras[2].firstElementChild +PASS paras[2].firstChild +PASS paras[2].lastChild +PASS paras[2].hasChildNodes() +PASS paras[3].nodeType +PASS paras[3].ownerDocument +PASS paras[3].parentNode +PASS paras[3].parentElement +PASS paras[3].childNodes.length +PASS paras[3].previousSibling +PASS paras[3].nextSibling +PASS paras[3].textContent +PASS paras[3].namespaceURI +PASS paras[3].prefix +PASS paras[3].localName +PASS paras[3].tagName +PASS paras[3].id +PASS paras[3].previousElementSibling +PASS paras[3].nextElementSibling +PASS paras[3].childElementCount +PASS paras[3].nodeName +PASS paras[3].nodeValue +PASS paras[3].children.length +PASS paras[3].className +PASS paras[3].lastElementChild +PASS paras[3].firstElementChild +PASS paras[3].firstChild +PASS paras[3].lastChild +PASS paras[3].hasChildNodes() +PASS paras[4].nodeType +PASS paras[4].ownerDocument +PASS paras[4].parentNode +PASS paras[4].parentElement +PASS paras[4].childNodes.length +PASS paras[4].previousSibling +PASS paras[4].nextSibling +PASS paras[4].textContent +PASS paras[4].namespaceURI +PASS paras[4].prefix +PASS paras[4].localName +PASS paras[4].tagName +PASS paras[4].id +PASS paras[4].previousElementSibling +PASS paras[4].nextElementSibling +PASS paras[4].childElementCount +PASS paras[4].nodeName +PASS paras[4].nodeValue +PASS paras[4].children.length +PASS paras[4].className +PASS paras[4].lastElementChild +PASS paras[4].firstElementChild +PASS paras[4].firstChild +PASS paras[4].lastChild +PASS paras[4].hasChildNodes() +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt index 56f960e..17b7bc5 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https-expected.txt
@@ -20,6 +20,8 @@ PASS MediaStreamTrack interface: attribute muted PASS MediaStreamTrack interface: attribute onmute PASS MediaStreamTrack interface: attribute onunmute +FAIL MediaStreamTrack interface: attribute readonly assert_true: The prototype object must have a property "readonly" expected true got false +PASS MediaStreamTrack interface: attribute remote PASS MediaStreamTrack interface: attribute readyState PASS MediaStreamTrack interface: attribute onended FAIL MediaStreamTrack interface: attribute onoverconstrained assert_true: The prototype object must have a property "onoverconstrained" expected true got false @@ -38,15 +40,17 @@ PASS MediaStreamTrack interface: track must inherit property "muted" with the proper type (4) FAIL MediaStreamTrack interface: track must inherit property "onmute" with the proper type (5) Unrecognized type EventHandler FAIL MediaStreamTrack interface: track must inherit property "onunmute" with the proper type (6) Unrecognized type EventHandler -FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type (7) Unrecognized type MediaStreamTrackState -FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type (8) Unrecognized type EventHandler -FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type (9) assert_inherits: property "onoverconstrained" not found in prototype chain -PASS MediaStreamTrack interface: track must inherit property "clone" with the proper type (10) -PASS MediaStreamTrack interface: track must inherit property "stop" with the proper type (11) -PASS MediaStreamTrack interface: track must inherit property "getCapabilities" with the proper type (12) -PASS MediaStreamTrack interface: track must inherit property "getConstraints" with the proper type (13) -PASS MediaStreamTrack interface: track must inherit property "getSettings" with the proper type (14) -PASS MediaStreamTrack interface: track must inherit property "applyConstraints" with the proper type (15) +FAIL MediaStreamTrack interface: track must inherit property "readonly" with the proper type (7) assert_inherits: property "readonly" not found in prototype chain +PASS MediaStreamTrack interface: track must inherit property "remote" with the proper type (8) +FAIL MediaStreamTrack interface: track must inherit property "readyState" with the proper type (9) Unrecognized type MediaStreamTrackState +FAIL MediaStreamTrack interface: track must inherit property "onended" with the proper type (10) Unrecognized type EventHandler +FAIL MediaStreamTrack interface: track must inherit property "onoverconstrained" with the proper type (11) assert_inherits: property "onoverconstrained" not found in prototype chain +PASS MediaStreamTrack interface: track must inherit property "clone" with the proper type (12) +PASS MediaStreamTrack interface: track must inherit property "stop" with the proper type (13) +PASS MediaStreamTrack interface: track must inherit property "getCapabilities" with the proper type (14) +PASS MediaStreamTrack interface: track must inherit property "getConstraints" with the proper type (15) +PASS MediaStreamTrack interface: track must inherit property "getSettings" with the proper type (16) +PASS MediaStreamTrack interface: track must inherit property "applyConstraints" with the proper type (17) PASS MediaStreamTrack interface: calling applyConstraints(MediaTrackConstraints) on track with too few arguments must throw TypeError PASS EventTarget interface: track must inherit property "addEventListener" with the proper type (0) PASS EventTarget interface: calling addEventListener(DOMString,EventListener,boolean) on track with too few arguments must throw TypeError
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https.html b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https.html index 2be2d81..3aa12052 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/MediaStreamTrack-init.https.html
@@ -40,6 +40,8 @@ readonly attribute boolean muted;\ attribute EventHandler onmute;\ attribute EventHandler onunmute;\ + readonly attribute boolean _readonly;\ + readonly attribute boolean remote;\ readonly attribute MediaStreamTrackState readyState;\ attribute EventHandler onended;\ attribute EventHandler onoverconstrained;\
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https-expected.txt new file mode 100644 index 0000000..504f980 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +PASS ServiceWorkerGlobalScope: ExtendableMessageEvent Constructor +FAIL no initializer specified Cannot read property 'length' of null +PASS `bubbles` is specified +PASS `cancelable` is specified +PASS `data` is specified +PASS `origin` is specified +PASS `lastEventId` is specified +PASS `source` is specified +FAIL `ports` is specified Cannot read property 'length' of null +PASS all initial values are specified +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https.html new file mode 100644 index 0000000..525245f --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event-constructor.https.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<title>ServiceWorkerGlobalScope: ExtendableMessageEvent Constructor</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script src='../resources/test-helpers.sub.js'></script> +<script> +service_worker_test( + 'resources/extendable-message-event-constructor-worker.js', document.title + ); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html new file mode 100644 index 0000000..89efd7a --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/extendable-message-event.https.html
@@ -0,0 +1,226 @@ +<!DOCTYPE html> +<title>ServiceWorkerGlobalScope: ExtendableMessageEvent</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script src='../resources/test-helpers.sub.js'></script> +<script src='./resources/extendable-message-event-utils.js'></script> +<script> +promise_test(function(t) { + var script = 'resources/extendable-message-event-worker.js'; + var scope = 'resources/scope/extendable-message-event-from-toplevel'; + var registration; + + return service_worker_unregister_and_register(t, script, scope) + .then(function(r) { + registration = r; + add_completion_callback(function() { registration.unregister(); }); + return wait_for_state(t, registration.installing, 'activated'); + }) + .then(function() { + var saw_message = new Promise(function(resolve) { + navigator.serviceWorker.onmessage = + function(event) { resolve(event.data); } + }); + var channel = new MessageChannel; + registration.active.postMessage('', [channel.port1]); + return saw_message; + }) + .then(function(results) { + var expected = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'WindowClient' }, + frameType: 'top-level', + url: location.href, + visibilityState: 'visible', + focused: true + }, + ports: [ { constructor: { name: 'MessagePort' } } ] + }; + ExtendableMessageEventUtils.assert_equals(results, expected); + }); + }, 'Post an extendable message from a top-level client'); + +promise_test(function(t) { + var script = 'resources/extendable-message-event-worker.js'; + var scope = 'resources/scope/extendable-message-event-from-nested'; + var frame; + + return service_worker_unregister_and_register(t, script, scope) + .then(function(registration) { + add_completion_callback(function() { registration.unregister(); }); + return wait_for_state(t, registration.installing, 'activated'); + }) + .then(function() { return with_iframe(scope); }) + .then(function(f) { + frame = f; + add_completion_callback(function() { frame.remove(); }); + var saw_message = new Promise(function(resolve) { + frame.contentWindow.navigator.serviceWorker.onmessage = + function(event) { resolve(event.data); } + }); + f.contentWindow.navigator.serviceWorker.controller.postMessage(''); + return saw_message; + }) + .then(function(results) { + var expected = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'WindowClient' }, + url: frame.contentWindow.location.href, + frameType: 'nested', + visibilityState: 'visible', + focused: false + }, + ports: [] + }; + ExtendableMessageEventUtils.assert_equals(results, expected); + }); + }, 'Post an extendable message from a nested client'); + +promise_test(function(t) { + var script = 'resources/extendable-message-event-loopback-worker.js'; + var scope = 'resources/scope/extendable-message-event-loopback'; + var registration; + + return service_worker_unregister_and_register(t, script, scope) + .then(function(r) { + registration = r; + add_completion_callback(function() { registration.unregister(); }); + return wait_for_state(t, registration.installing, 'activated'); + }) + .then(function() { + var results = []; + var saw_message = new Promise(function(resolve) { + navigator.serviceWorker.onmessage = function(event) { + switch (event.data.type) { + case 'record': + results.push(event.data.results); + break; + case 'finish': + resolve(results); + break; + } + }; + }); + registration.active.postMessage({type: 'start'}); + return saw_message; + }) + .then(function(results) { + assert_equals(results.length, 2); + + var expected_trial_1 = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'ServiceWorker' }, + scriptURL: normalizeURL(script), + state: 'activated' + }, + ports: [] + }; + assert_equals(results[0].trial, 1); + ExtendableMessageEventUtils.assert_equals( + results[0].event, expected_trial_1 + ); + + var expected_trial_2 = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'ServiceWorker' }, + scriptURL: normalizeURL(script), + state: 'activated' + }, + ports: [], + }; + assert_equals(results[1].trial, 2); + ExtendableMessageEventUtils.assert_equals( + results[1].event, expected_trial_2 + ); + }); + }, 'Post loopback extendable messages'); + +promise_test(function(t) { + var script1 = 'resources/extendable-message-event-ping-worker.js'; + var script2 = 'resources/extendable-message-event-pong-worker.js'; + var scope = 'resources/scope/extendable-message-event-pingpong'; + var registration; + + return service_worker_unregister_and_register(t, script1, scope) + .then(function(r) { + registration = r; + add_completion_callback(function() { registration.unregister(); }); + return wait_for_state(t, registration.installing, 'activated'); + }) + .then(function() { + // A controlled frame is necessary for keeping a waiting worker. + return with_iframe(scope); + }) + .then(function(frame) { + add_completion_callback(function() { frame.remove(); }); + return navigator.serviceWorker.register(script2, {scope: scope}); + }) + .then(function(r) { + return wait_for_state(t, r.installing, 'installed'); + }) + .then(function() { + var results = []; + var saw_message = new Promise(function(resolve) { + navigator.serviceWorker.onmessage = function(event) { + switch (event.data.type) { + case 'record': + results.push(event.data.results); + break; + case 'finish': + resolve(results); + break; + } + }; + }); + registration.active.postMessage({type: 'start'}); + return saw_message; + }) + .then(function(results) { + assert_equals(results.length, 2); + + var expected_ping = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'ServiceWorker' }, + scriptURL: normalizeURL(script1), + state: 'activated' + }, + ports: [] + }; + assert_equals(results[0].pingOrPong, 'ping'); + ExtendableMessageEventUtils.assert_equals( + results[0].event, expected_ping + ); + + var expected_pong = { + constructor: { name: 'ExtendableMessageEvent' }, + origin: location.origin, + lastEventId: '', + source: { + constructor: { name: 'ServiceWorker' }, + scriptURL: normalizeURL(script2), + state: 'installed' + }, + ports: [] + }; + assert_equals(results[1].pingOrPong, 'pong'); + ExtendableMessageEventUtils.assert_equals( + results[1].event, expected_pong + ); + }); + }, 'Post extendable messages among service workers'); +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js new file mode 100644 index 0000000..55de70dcf --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js
@@ -0,0 +1,193 @@ +importScripts('/resources/testharness.js'); + +const TEST_OBJECT = { wanwan: 123 }; +const CHANNEL1 = new MessageChannel(); +const CHANNEL2 = new MessageChannel(); +const PORTS = [CHANNEL1.port1, CHANNEL1.port2, CHANNEL2.port1]; +function createEvent(initializer) { + if (initializer === undefined) + return new ExtendableMessageEvent('type'); + return new ExtendableMessageEvent('type', initializer); +} + +// These test cases are mostly copied from the following file in the Chromium +// project (as of commit 848ad70823991e0f12b437d789943a4ab24d65bb): +// third_party/WebKit/LayoutTests/fast/events/constructors/message-event-constructor.html + +test(function() { + assert_false(createEvent().bubbles); + assert_false(createEvent().cancelable); + assert_equals(createEvent().data, null); + assert_equals(createEvent().origin, ''); + assert_equals(createEvent().lastEventId, ''); + assert_equals(createEvent().source, null); + assert_array_equals(createEvent().ports, []); +}, 'no initializer specified'); + +test(function() { + assert_false(createEvent({ bubbles: false }).bubbles); + assert_true(createEvent({ bubbles: true }).bubbles); +}, '`bubbles` is specified'); + +test(function() { + assert_false(createEvent({ cancelable: false }).cancelable); + assert_true(createEvent({ cancelable: true }).cancelable); +}, '`cancelable` is specified'); + +test(function() { + assert_equals(createEvent({ data: TEST_OBJECT }).data, TEST_OBJECT); + assert_equals(createEvent({ data: undefined }).data, null); + assert_equals(createEvent({ data: null }).data, null); + assert_equals(createEvent({ data: false }).data, false); + assert_equals(createEvent({ data: true }).data, true); + assert_equals(createEvent({ data: '' }).data, ''); + assert_equals(createEvent({ data: 'chocolate' }).data, 'chocolate'); + assert_equals(createEvent({ data: 12345 }).data, 12345); + assert_equals(createEvent({ data: 18446744073709551615 }).data, + 18446744073709552000); + assert_equals(createEvent({ data: NaN }).data, NaN); + // Note that valueOf() is not called, when the left hand side is + // evaluated. + assert_false( + createEvent({ data: { + valueOf: function() { return TEST_OBJECT; } } }).data == + TEST_OBJECT); + assert_equals(createEvent({ get data(){ return 123; } }).data, 123); + assert_throws({ name: 'Error' }, function() { + createEvent({ get data() { throw { name: 'Error' }; } }); }); +}, '`data` is specified'); + +test(function() { + assert_equals(createEvent({ origin: 'melancholy' }).origin, 'melancholy'); + assert_equals(createEvent({ origin: '' }).origin, ''); + assert_equals(createEvent({ origin: null }).origin, 'null'); + assert_equals(createEvent({ origin: false }).origin, 'false'); + assert_equals(createEvent({ origin: true }).origin, 'true'); + assert_equals(createEvent({ origin: 12345 }).origin, '12345'); + assert_equals( + createEvent({ origin: 18446744073709551615 }).origin, + '18446744073709552000'); + assert_equals(createEvent({ origin: NaN }).origin, 'NaN'); + assert_equals(createEvent({ origin: [] }).origin, ''); + assert_equals(createEvent({ origin: [1, 2, 3] }).origin, '1,2,3'); + assert_equals( + createEvent({ origin: { melancholy: 12345 } }).origin, + '[object Object]'); + // Note that valueOf() is not called, when the left hand side is + // evaluated. + assert_equals( + createEvent({ origin: { + valueOf: function() { return 'melancholy'; } } }).origin, + '[object Object]'); + assert_equals( + createEvent({ get origin() { return 123; } }).origin, '123'); + assert_throws({ name: 'Error' }, function() { + createEvent({ get origin() { throw { name: 'Error' }; } }); }); +}, '`origin` is specified'); + +test(function() { + assert_equals( + createEvent({ lastEventId: 'melancholy' }).lastEventId, 'melancholy'); + assert_equals(createEvent({ lastEventId: '' }).lastEventId, ''); + assert_equals(createEvent({ lastEventId: null }).lastEventId, 'null'); + assert_equals(createEvent({ lastEventId: false }).lastEventId, 'false'); + assert_equals(createEvent({ lastEventId: true }).lastEventId, 'true'); + assert_equals(createEvent({ lastEventId: 12345 }).lastEventId, '12345'); + assert_equals( + createEvent({ lastEventId: 18446744073709551615 }).lastEventId, + '18446744073709552000'); + assert_equals(createEvent({ lastEventId: NaN }).lastEventId, 'NaN'); + assert_equals(createEvent({ lastEventId: [] }).lastEventId, ''); + assert_equals( + createEvent({ lastEventId: [1, 2, 3] }).lastEventId, '1,2,3'); + assert_equals( + createEvent({ lastEventId: { melancholy: 12345 } }).lastEventId, + '[object Object]'); + // Note that valueOf() is not called, when the left hand side is + // evaluated. + assert_equals( + createEvent({ lastEventId: { + valueOf: function() { return 'melancholy'; } } }).lastEventId, + '[object Object]'); + assert_equals( + createEvent({ get lastEventId() { return 123; } }).lastEventId, + '123'); + assert_throws({ name: 'Error' }, function() { + createEvent({ get lastEventId() { throw { name: 'Error' }; } }); }); +}, '`lastEventId` is specified'); + +test(function() { + assert_equals(createEvent({ source: CHANNEL1.port1 }).source, CHANNEL1.port1); + assert_equals( + createEvent({ source: self.registration.active }).source, + self.registration.active); + assert_equals( + createEvent({ source: CHANNEL1.port1 }).source, CHANNEL1.port1); + assert_throws( + { name: 'TypeError' }, function() { createEvent({ source: this }); }, + 'source should be Client or ServiceWorker or MessagePort'); +}, '`source` is specified'); + +test(function() { + // Valid message ports. + var passed_ports = createEvent({ ports: PORTS}).ports; + assert_equals(passed_ports[0], CHANNEL1.port1); + assert_equals(passed_ports[1], CHANNEL1.port2); + assert_equals(passed_ports[2], CHANNEL2.port1); + assert_array_equals(createEvent({ ports: [] }).ports, []); + assert_array_equals(createEvent({ ports: undefined }).ports, []); + + // Invalid message ports. + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: [1, 2, 3] }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: TEST_OBJECT }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: null }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: this }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: false }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: true }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: '' }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: 'chocolate' }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: 12345 }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: 18446744073709551615 }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ ports: NaN }); }); + assert_throws({ name: 'TypeError' }, + function() { createEvent({ get ports() { return 123; } }); }); + assert_throws({ name: 'Error' }, function() { + createEvent({ get ports() { throw { name: 'Error' }; } }); }); + // Note that valueOf() is not called, when the left hand side is + // evaluated. + var valueOf = function() { return PORTS; }; + assert_throws({ name: 'TypeError' }, function() { + createEvent({ ports: { valueOf: valueOf } }); }); +}, '`ports` is specified'); + +test(function() { + var initializers = { + bubbles: true, + cancelable: true, + data: TEST_OBJECT, + origin: 'wonderful', + lastEventId: 'excellent', + source: CHANNEL1.port1, + ports: PORTS + }; + assert_equals(createEvent(initializers).bubbles, true); + assert_equals(createEvent(initializers).cancelable, true); + assert_equals(createEvent(initializers).data, TEST_OBJECT); + assert_equals(createEvent(initializers).origin, 'wonderful'); + assert_equals(createEvent(initializers).lastEventId, 'excellent'); + assert_equals(createEvent(initializers).source, CHANNEL1.port1); + assert_equals(createEvent(initializers).ports[0], PORTS[0]); + assert_equals(createEvent(initializers).ports[1], PORTS[1]); + assert_equals(createEvent(initializers).ports[2], PORTS[2]); +}, 'all initial values are specified');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js new file mode 100644 index 0000000..13cae88 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js
@@ -0,0 +1,36 @@ +importScripts('./extendable-message-event-utils.js'); + +self.addEventListener('message', function(event) { + switch (event.data.type) { + case 'start': + self.registration.active.postMessage( + {type: '1st', client_id: event.source.id}); + break; + case '1st': + // 1st loopback message via ServiceWorkerRegistration.active. + var results = { + trial: 1, + event: ExtendableMessageEventUtils.serialize(event) + }; + var client_id = event.data.client_id; + event.source.postMessage({type: '2nd', client_id: client_id}); + event.waitUntil(clients.get(client_id) + .then(function(client) { + client.postMessage({type: 'record', results: results}); + })); + break; + case '2nd': + // 2nd loopback message via ExtendableMessageEvent.source. + var results = { + trial: 2, + event: ExtendableMessageEventUtils.serialize(event) + }; + var client_id = event.data.client_id; + event.waitUntil(clients.get(client_id) + .then(function(client) { + client.postMessage({type: 'record', results: results}); + client.postMessage({type: 'finish'}); + })); + break; + } + });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js similarity index 60% rename from third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js rename to third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js index eb3f064..d07b229 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-ping-worker.js
@@ -1,3 +1,5 @@ +importScripts('./extendable-message-event-utils.js'); + self.addEventListener('message', function(event) { switch (event.data.type) { case 'start': @@ -6,15 +8,10 @@ {type: 'ping', client_id: event.source.id}); break; case 'pong': - var results = [ - 'Pong message: ' + event, - ' event.origin: ' + event.origin, - ' event.lastEventId: ' + event.lastEventId, - ' event.source: ' + event.source, - ' event.source.scriptURL: ' + event.source.scriptURL, - ' event.source.state: ' + event.source.state, - ' event.ports: ' + event.ports, - ]; + var results = { + pingOrPong: 'pong', + event: ExtendableMessageEventUtils.serialize(event) + }; var client_id = event.data.client_id; event.waitUntil(clients.get(client_id) .then(function(client) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js new file mode 100644 index 0000000..5e9669e --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js
@@ -0,0 +1,18 @@ +importScripts('./extendable-message-event-utils.js'); + +self.addEventListener('message', function(event) { + switch (event.data.type) { + case 'ping': + var results = { + pingOrPong: 'ping', + event: ExtendableMessageEventUtils.serialize(event) + }; + var client_id = event.data.client_id; + event.waitUntil(clients.get(client_id) + .then(function(client) { + client.postMessage({type: 'record', results: results}); + event.source.postMessage({type: 'pong', client_id: client_id}); + })); + break; + } + });
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-utils.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-utils.js new file mode 100644 index 0000000..d6a3b483 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-utils.js
@@ -0,0 +1,78 @@ +var ExtendableMessageEventUtils = {}; + +// Create a representation of a given ExtendableMessageEvent that is suitable +// for transmission via the `postMessage` API. +ExtendableMessageEventUtils.serialize = function(event) { + var ports = event.ports.map(function(port) { + return { constructor: { name: port.constructor.name } }; + }); + return { + constructor: { + name: event.constructor.name + }, + origin: event.origin, + lastEventId: event.lastEventId, + source: { + constructor: { + name: event.source.constructor.name + }, + url: event.source.url, + frameType: event.source.frameType, + visibilityState: event.source.visibilityState, + focused: event.source.focused + }, + ports: ports + }; +}; + +// Compare the actual and expected values of an ExtendableMessageEvent that has +// been transformed using the `serialize` function defined in this file. +ExtendableMessageEventUtils.assert_equals = function(actual, expected) { + assert_equals( + actual.constructor.name, expected.constructor.name, 'event constructor' + ); + assert_equals(actual.origin, expected.origin, 'event `origin` property'); + assert_equals( + actual.lastEventId, + expected.lastEventId, + 'event `lastEventId` property' + ); + + assert_equals( + actual.source.constructor.name, + expected.source.constructor.name, + 'event `source` property constructor' + ); + assert_equals( + actual.source.url, expected.source.url, 'event `source` property `url`' + ); + assert_equals( + actual.source.frameType, + expected.source.frameType, + 'event `source` property `frameType`' + ); + assert_equals( + actual.source.visibilityState, + expected.source.visibilityState, + 'event `source` property `visibilityState`' + ); + assert_equals( + actual.source.focused, + expected.source.focused, + 'event `source` property `focused`' + ); + + assert_equals( + actual.ports.length, + expected.ports.length, + 'event `ports` property length' + ); + + for (var idx = 0; idx < expected.ports.length; ++idx) { + assert_equals( + actual.ports[idx].constructor.name, + expected.ports[idx].constructor.name, + 'MessagePort #' + idx + ' constructor' + ); + } +};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js new file mode 100644 index 0000000..f5e7647 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js
@@ -0,0 +1,5 @@ +importScripts('./extendable-message-event-utils.js'); + +self.addEventListener('message', function(event) { + event.source.postMessage(ExtendableMessageEventUtils.serialize(event)); + });
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float-expected.txt b/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float-expected.txt new file mode 100644 index 0000000..63491848 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float-expected.txt
@@ -0,0 +1 @@ +foo crbug.com/641334: Passes if it does not assert.
diff --git a/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float.html b/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float.html new file mode 100644 index 0000000..c9ae80e1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/block/float/assert-when-moving-float.html
@@ -0,0 +1,12 @@ +<div style="width: 5px;"> + <img id="makeTaller" style="height: 50px; width: 1px"><img id="removeThis" style="width: 5px; height: 5px;"> + <div style="float: left; background-color: green;">foo</div> + crbug.com/641334: Passes if it does not assert. +</div> +<script> +if (window.testRunner) + testRunner.dumpAsText(); +removeThis.offsetTop; +removeThis.parentNode.removeChild(removeThis); +makeTaller.style.height = '55px'; +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg-expected.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg-expected.html new file mode 100644 index 0000000..98eba5f6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg-expected.html
@@ -0,0 +1,31 @@ +<!doctype html> +<style> +svg { + border: 1px solid black; +} +#img4 { + display: none; +} +</style> +<svg id="s1" width="20px" height="20px"> + <image id="img1" href="resources/pattern.png" x="0" y="0" width="20px" height="20px" /> +</svg> +<svg id="s2" width="20px" height="20px"> + <image id="img1" href="resources/pattern.png" x="10" y="10" width="20px" height="20px" /> +</svg> +<svg id="s3" width="20px" height="20px"> + <image id="img3" href="resources/pattern.png" x="0" y="0" width="20px" height="20px" /> +</svg> +<svg id="s4" width="20px" height="20px"> + <image id="img4" href="invalid" x="0" y="0" width="20px" height="20px" /> +</svg> +<svg id="s5" width="20px" height="20px"> +</svg> +<svg id="s6" width="20px" height="20px"> + <image href="resources/rect.svg" x="0" y="0" width="20px" height="20px" /> + +</svg> +<svg id="s7" width="20px" height="20px"> +</svg> +<svg id="s8" width="20px" height="20px"> +</svg>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg.html b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg.html new file mode 100644 index 0000000..243b1f2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/canvas-drawImage-svg.html
@@ -0,0 +1,49 @@ +<!doctype html> +<style> +svg { + display: none; +} +canvas { + border: 1px solid black; +} +</style> + +<svg id="s1" width="200px" height="20px"> + <image id="img1" href="resources/pattern.png" x="0" y="0" width="20px" height="20px" /> + <image id="img2" href="resources/pattern.png" x="20" y="0" width="40px" height="40px" /> + <image id="img3" href="resources/pattern.png" x="40" y="0" width="40px" height="40px" /> + <image id="img4" href="invalid" x="60" y="0" width="20px" height="20px" /> + <image id="img5" href="resources/pattern.png" x="80" y="0" width="20px" height="20px" /> + <image id="img6" href="resources/rect.svg" x="100" y="0" width="20px" height="20px" /> + <image id="img7" href="resources/empty.svg" x="120" y="0" width="20px" height="20px" /> + <image id="img8" href="resources/zeroSize.svg" x="140" y="0" width="20px" height="20px" /> +</svg> + +<canvas id="c1" width="20" height="20"></canvas> +<canvas id="c2" width="20" height="20"></canvas> +<canvas id="c3" width="20" height="20"></canvas> +<canvas id="c4" width="20" height="20"></canvas> +<canvas id="c5" width="20" height="20"></canvas> +<canvas id="c6" width="20" height="20"></canvas> +<canvas id="c7" width="20" height="20"></canvas> +<canvas id="c8" width="20" height="20"></canvas> + +<script> +var draw = function(target, img, x, y) { + document.getElementById(img).addEventListener("load", function() { + document.getElementById(target).getContext("2d").drawImage( + document.getElementById(img), x || 0, y || 0); + }); +}; + +draw("c1", "img1"); +draw("c2", "img2", 10, 10); +draw("c3", "img3"); +draw("c4", "img4"); +document.getElementById("c5").getContext("2d").drawImage( + document.getElementById("img5"), 0, 0); +draw("c6", "img6"); +draw("c7", "img7"); +draw("c8", "img8"); + +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/resources/rect.svg b/third_party/WebKit/LayoutTests/fast/canvas/resources/rect.svg new file mode 100644 index 0000000..04549f0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/resources/rect.svg
@@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <rect x="0" y="0" width="100%" height="100%" style="fill:blue;" /> +</svg>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt index 1769da5..5df2b39 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null-expected.txt
@@ -1,7 +1,7 @@ This test setting various attributes of documents to JavaScript null. TEST SUCCEEDED: Got the expected exception (9). [tested Document.xmlVersion] -TEST SUCCEEDED: The value was the string 'about:blank'. [tested Document.documentURI] +TEST SUCCEEDED: The value was null. [tested Document.documentURI] TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.charset] TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.characterSet] TEST SUCCEEDED: The value was the string 'UTF-8'. [tested Document.inputEncoding]
diff --git a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html index 3c617d0d..e9acb7e 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html +++ b/third_party/WebKit/LayoutTests/fast/dom/document-attribute-js-null.html
@@ -67,7 +67,7 @@ docToUse: xmlDoc, attributes: [ {name: 'xmlVersion', expectedExceptionCode: 9}, - {name: 'documentURI', expectedNull: 'about:blank'}, + {name: 'documentURI', expectedNull: null}, {name: 'charset', expectedNull: 'UTF-8'}, {name: 'characterSet', expectedNull: 'UTF-8'}, {name: 'inputEncoding', expectedNull: 'UTF-8'},
diff --git a/third_party/WebKit/LayoutTests/fast/files/blob-reading-from-form-file.html b/third_party/WebKit/LayoutTests/fast/files/blob-reading-from-form-file.html new file mode 100644 index 0000000..ae4f61c --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/files/blob-reading-from-form-file.html
@@ -0,0 +1,52 @@ +<form id="form"> + <input id="file" multiple type="file" name="file"> +</form> + +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script type="text/javascript"> + +promise_test((t) => { + eventSender.beginDragWithFiles( + ['resources/UTF8.txt', 'resources/UTF8-2.txt']); + eventSender.mouseMoveTo(10, 10); + eventSender.mouseUp(); + + var form = document.getElementById('form'); + var formData = new FormData(form); + var request = new Request('/', { + method: 'POST', + body: formData + }); + return request.text().then(text => { + assert_true(text.search('WebKitFormBoundary') > 0, + 'the boundary is contained'); + assert_true(text.search('Hello') > 0, 'UTF8.txt is contained'); + assert_true(text.search('Wonderful') > 0, 'UTF8-2.txt is contained'); + }); +}, "Reading a text from form files."); + + +promise_test((t) => { + eventSender.beginDragWithFiles(['resources/UTF8.txt']); + eventSender.mouseMoveTo(10, 10); + eventSender.mouseUp(); + + var file = document.getElementById('file'); + var formData = new FormData(); + formData.append('file', file.files[0]); + assert_equals(file.files[0].size, 5, 'file size'); + var request = new Request('/', { + method: 'POST', + body: formData + }); + return request.text().then(text => { + assert_true(text.search('WebKitFormBoundary') > 0, + 'the boundary is contained'); + assert_true(text.search('Hello') > 0, 'UTF8.txt is contained'); + assert_true(text.search('Wonderful') < 0, 'UTF8-2.txt is not contained'); + }); +}, "Reading a text from a generated form data."); + +</script> +
diff --git a/third_party/WebKit/LayoutTests/fast/filesystem/form-reading-from-file.html b/third_party/WebKit/LayoutTests/fast/filesystem/form-reading-from-file.html new file mode 100644 index 0000000..fd41bf7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/filesystem/form-reading-from-file.html
@@ -0,0 +1,42 @@ +<!doctype html> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="resources/file-writer-utils.js"></script> +<script> +promise_test(t => { + const name = 'foo'; + let filesystem; + return new Promise((resolve, reject) => { + webkitRequestFileSystem(TEMPORARY, 1024, resolve, reject); + }).then(fs => { + filesystem = fs; + return new Promise((resolve, reject) => { + fs.root.getFile(name, {create: true}, resolve, reject); + }); + }).then(entry => { + return new Promise((resolve, reject) => { + entry.createWriter(resolve, reject); + }); + }).then(writer => { + return new Promise((resolve, reject) => { + writer.onwriteend = resolve; + writer.error = reject; + writer.write(new Blob(['hello'])); + }); + }).then(() => { + return new Promise((resolve, reject) => { + filesystem.root.getFile(name, {}, resolve, reject); + }); + }).then(entry => { + return new Promise((resolve, reject) => { + entry.file(resolve, reject); + }); + }).then(file => { + const form = new FormData(); + form.append('name', file); + return new Response(form).text(); + }).then(text => { + assert_true(text.search('hello') >= 0, 'text should contain "hello"'); + }, 'Response.text() for a form containing a file got from FileSystem API.'); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/media/mq-hover-expected.txt b/third_party/WebKit/LayoutTests/fast/media/mq-hover-expected.txt index eedd70ed..5fa512ee8 100644 --- a/third_party/WebKit/LayoutTests/fast/media/mq-hover-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/media/mq-hover-expected.txt
@@ -1,31 +1,11 @@ Test the (hover) media features. See Bug 136119 for details. -------------- with 'on-demand' hover ------------- -Query "(hover)": true -Query "(Hover)": true -Query "(hover:none)": false -Query "(hover:NoNe)": false -Query "(hover:on-demand)": true -Query "(hover:oN-dEmAnd)": true -Query "(hover:bogusvalue)": false -Query "(hover:hover)": false -Query "(hover:HoveR)": false -Query "(any-hover)": true -Query "(any-Hover)": true -Query "(any-hover:none)": false -Query "(any-hover:NoNe)": false -Query "(any-hover:on-demand)": true -Query "(any-hover:oN-dEmAnd)": true -Query "(any-hover:bogusvalue)": false -Query "(any-hover:hover)": false -Query "(any-hover:HoveR)": false ------------- with 'hover' hover ------------- Query "(hover)": true Query "(Hover)": true Query "(hover:none)": false Query "(hover:NoNe)": false Query "(hover:on-demand)": false -Query "(hover:oN-dEmAnd)": false Query "(hover:bogusvalue)": false Query "(hover:hover)": true Query "(hover:HoveR)": true @@ -34,55 +14,15 @@ Query "(any-hover:none)": false Query "(any-hover:NoNe)": false Query "(any-hover:on-demand)": false -Query "(any-hover:oN-dEmAnd)": false Query "(any-hover:bogusvalue)": false Query "(any-hover:hover)": true Query "(any-hover:HoveR)": true -------------- with 'on-demand' and 'hover' hover, 'hover' is primary ------------- -Query "(hover)": true -Query "(Hover)": true -Query "(hover:none)": false -Query "(hover:NoNe)": false -Query "(hover:on-demand)": false -Query "(hover:oN-dEmAnd)": false -Query "(hover:bogusvalue)": false -Query "(hover:hover)": true -Query "(hover:HoveR)": true -Query "(any-hover)": true -Query "(any-Hover)": true -Query "(any-hover:none)": false -Query "(any-hover:NoNe)": false -Query "(any-hover:on-demand)": true -Query "(any-hover:oN-dEmAnd)": true -Query "(any-hover:bogusvalue)": false -Query "(any-hover:hover)": true -Query "(any-hover:HoveR)": true -------------- with 'on-demand' and 'hover' hover, 'on-demand' is primary ------------- -Query "(hover)": true -Query "(Hover)": true -Query "(hover:none)": false -Query "(hover:NoNe)": false -Query "(hover:on-demand)": true -Query "(hover:oN-dEmAnd)": true -Query "(hover:bogusvalue)": false -Query "(hover:hover)": false -Query "(hover:HoveR)": false -Query "(any-hover)": true -Query "(any-Hover)": true -Query "(any-hover:none)": false -Query "(any-hover:NoNe)": false -Query "(any-hover:on-demand)": true -Query "(any-hover:oN-dEmAnd)": true -Query "(any-hover:bogusvalue)": false -Query "(any-hover:hover)": true -Query "(any-hover:HoveR)": true -------------- with 'none', 'on-demand' and 'hover' hover, 'none' is primary ------------- +------------- with 'none' and 'hover' hover, 'none' is primary ------------- Query "(hover)": false Query "(Hover)": false Query "(hover:none)": true Query "(hover:NoNe)": true Query "(hover:on-demand)": false -Query "(hover:oN-dEmAnd)": false Query "(hover:bogusvalue)": false Query "(hover:hover)": false Query "(hover:HoveR)": false @@ -90,8 +30,7 @@ Query "(any-Hover)": true Query "(any-hover:none)": true Query "(any-hover:NoNe)": true -Query "(any-hover:on-demand)": true -Query "(any-hover:oN-dEmAnd)": true +Query "(any-hover:on-demand)": false Query "(any-hover:bogusvalue)": false Query "(any-hover:hover)": true Query "(any-hover:HoveR)": true @@ -101,7 +40,6 @@ Query "(hover:none)": true Query "(hover:NoNe)": true Query "(hover:on-demand)": false -Query "(hover:oN-dEmAnd)": false Query "(hover:bogusvalue)": false Query "(hover:hover)": false Query "(hover:HoveR)": false @@ -110,7 +48,6 @@ Query "(any-hover:none)": true Query "(any-hover:NoNe)": true Query "(any-hover:on-demand)": false -Query "(any-hover:oN-dEmAnd)": false Query "(any-hover:bogusvalue)": false Query "(any-hover:hover)": false Query "(any-hover:HoveR)": false
diff --git a/third_party/WebKit/LayoutTests/fast/media/mq-hover.html b/third_party/WebKit/LayoutTests/fast/media/mq-hover.html index 2fae680..d19c3df 100644 --- a/third_party/WebKit/LayoutTests/fast/media/mq-hover.html +++ b/third_party/WebKit/LayoutTests/fast/media/mq-hover.html
@@ -20,7 +20,6 @@ "(hover:none)", "(hover:NoNe)", "(hover:on-demand)", - "(hover:oN-dEmAnd)", "(hover:bogusvalue)", "(hover:hover)", "(hover:HoveR)", @@ -29,7 +28,6 @@ "(any-hover:none)", "(any-hover:NoNe)", "(any-hover:on-demand)", - "(any-hover:oN-dEmAnd)", "(any-hover:bogusvalue)", "(any-hover:hover)", "(any-hover:HoveR)" @@ -45,29 +43,14 @@ if (!window.internals) return; - log("------------- with 'on-demand' hover -------------"); - internals.settings.setPrimaryHoverType('on-demand'); - internals.settings.setAvailableHoverTypes('on-demand'); - testQueries(); - log("------------- with 'hover' hover -------------"); internals.settings.setPrimaryHoverType('hover'); internals.settings.setAvailableHoverTypes('hover'); testQueries(); - log("------------- with 'on-demand' and 'hover' hover, 'hover' is primary -------------"); - internals.settings.setPrimaryHoverType('hover'); - internals.settings.setAvailableHoverTypes('on-demand,hover'); - testQueries(); - - log("------------- with 'on-demand' and 'hover' hover, 'on-demand' is primary -------------"); - internals.settings.setPrimaryHoverType('on-demand'); - internals.settings.setAvailableHoverTypes('on-demand,hover'); - testQueries(); - - log("------------- with 'none', 'on-demand' and 'hover' hover, 'none' is primary -------------"); + log("------------- with 'none' and 'hover' hover, 'none' is primary -------------"); internals.settings.setPrimaryHoverType('none'); - internals.settings.setAvailableHoverTypes('none,on-demand,hover'); + internals.settings.setAvailableHoverTypes('none,hover'); testQueries(); log("------------- with 'none' hover -------------");
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams-expected.txt b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams-expected.txt new file mode 100644 index 0000000..a758bb0c --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams-expected.txt
@@ -0,0 +1,27 @@ +Tests that an RTCPeerConnection can signal that remote streams are added and removed. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + + +PASS local_stream.getAudioTracks()[0].remote is false +PASS local_stream.getVideoTracks()[0].remote is false +PASS pc.setRemoteDescription(sessionDescription, requestSucceeded1, requestFailedUnexpectedly); did not throw exception. +PASS remote stream was added +PASS event.stream.getVideoTracks().length is 1 +PASS event.stream.getAudioTracks().length is 1 +PASS event.stream.active is true +PASS event.stream.getAudioTracks()[0].remote is true +PASS event.stream.getVideoTracks()[0].remote is true +PASS requestSucceeded was called. +PASS pc.getRemoteStreams().length is 1 +PASS pc.setRemoteDescription(sessionDescription, requestSucceeded2, requestFailedUnexpectedly); did not throw exception. +PASS remote stream was removed +PASS event.stream.getVideoTracks().length is 0 +PASS event.stream.getAudioTracks().length is 0 +PASS event.stream.active is false +PASS requestSucceeded was called. +PASS pc.getRemoteStreams().length is 0 +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams.html new file mode 100644 index 0000000..a693e494 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-remotestreams.html
@@ -0,0 +1,86 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<script src="../../resources/js-test.js"></script> +</head> +<body> +<script> +description("Tests that an RTCPeerConnection can signal that remote streams are added and removed."); + +var pc = null; +var local_stream = null; + +function error() { + testFailed('Stream generation failed.'); + finishJSTest(); +} + +function getUserMedia(dictionary, callback) { + try { + navigator.webkitGetUserMedia(dictionary, callback, error); + } catch (e) { + testFailed('webkitGetUserMedia threw exception :' + e); + finishJSTest(); + } +} + +function requestSucceeded2() +{ + testPassed('requestSucceeded was called.'); + shouldBeEqualToNumber('pc.getRemoteStreams().length', 0); + finishJSTest(); +} + +function requestSucceeded1() +{ + testPassed('requestSucceeded was called.'); + shouldBeEqualToNumber('pc.getRemoteStreams().length', 1); + + sessionDescription = new RTCSessionDescription({type:"offer", sdp:"remote"}); + shouldNotThrow('pc.setRemoteDescription(sessionDescription, requestSucceeded2, requestFailedUnexpectedly);'); +} + +function requestFailedUnexpectedly() +{ + testFailed('requestFailed was called.'); + finishJSTest(); +} + +function gotStream(stream) { + local_stream = stream; + shouldBeFalse('local_stream.getAudioTracks()[0].remote'); + shouldBeFalse('local_stream.getVideoTracks()[0].remote'); + pc.addStream(local_stream); + + sessionDescription = new RTCSessionDescription({type:"answer", sdp:"remote"}); + shouldNotThrow('pc.setRemoteDescription(sessionDescription, requestSucceeded1, requestFailedUnexpectedly);'); +} + +function onAddStream(event) { + testPassed('remote stream was added'); + shouldBeEqualToNumber('event.stream.getVideoTracks().length', 1); + shouldBeEqualToNumber('event.stream.getAudioTracks().length', 1); + shouldBeTrue('event.stream.active') + shouldBeTrue('event.stream.getAudioTracks()[0].remote'); + shouldBeTrue('event.stream.getVideoTracks()[0].remote'); + pc.removeStream(local_stream); +} + +function onRemoveStream(event) { + testPassed('remote stream was removed'); + shouldBeEqualToNumber('event.stream.getVideoTracks().length', 0); + shouldBeEqualToNumber('event.stream.getAudioTracks().length', 0); + shouldBeFalse('event.stream.active') +} + +pc = new RTCPeerConnection(); +pc.onaddstream = onAddStream; +pc.onremovestream = onRemoveStream; +getUserMedia({audio:true, video:true}, gotStream); + + +window.jsTestIsAsync = true; +window.successfullyParsed = true; +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/bindings/bindings-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/bindings/bindings-test.js index c32efc5..e00a11539 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/bindings/bindings-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/bindings/bindings-test.js
@@ -85,10 +85,6 @@ } } -InspectorTest.markStep = function(title) { - InspectorTest.addResult('\nRunning: ' + title); -} - InspectorTest.addSniffer(Bindings.CompilerScriptMapping.prototype, "_sourceMapAttachedForTest", onSourceMap, true); InspectorTest.addSniffer(Bindings.SASSSourceMapping.prototype, "_sourceMapAttachedForTest", onSourceMap, true); var sourceMapCallbacks = new Map();
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js index 4d88e816..fc04cf6 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -23,6 +23,10 @@ InspectorTest.addResult(new Error(message).stack); } +InspectorTest.markStep = function(title) { + InspectorTest.addResult('\nRunning: ' + title); +} + InspectorTest.startDumpingProtocolMessages = function() { Protocol.InspectorBackend.Connection.prototype._dumpProtocolMessage = testRunner.logToStderr.bind(testRunner);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js index 3b0d95e4..33e368f 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/sources-test.js
@@ -32,6 +32,26 @@ } } +InspectorTest.testJavascriptOutline = function(text) { + var fulfill; + var promise = new Promise(x => fulfill = x); + Common.formatterWorkerPool.javaScriptOutline(text, onChunk); + var items = []; + return promise; + + function onChunk(isLastChunk, outlineItems) { + items.pushAll(outlineItems); + if (!isLastChunk) + return; + InspectorTest.addResult('Text:'); + InspectorTest.addResult(text.split('\n').map(line => ' ' + line).join('\n')); + InspectorTest.addResult('Outline:'); + for (var item of items) + InspectorTest.addResult(' ' + item.name + item.arguments + ':' + item.line + ':' + item.column); + fulfill(); + } +} + InspectorTest.dumpSwatchPositions = function(sourceFrame, bookmarkType) { var textEditor = sourceFrame.textEditor;
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/canvas-remote-read-remote-svg-image.html b/third_party/WebKit/LayoutTests/http/tests/security/canvas-remote-read-remote-svg-image.html new file mode 100644 index 0000000..9cb00eb --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/security/canvas-remote-read-remote-svg-image.html
@@ -0,0 +1,31 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body></body> +<script> + +async_test(function(t) { + var canvas = document.createElement("canvas"); + canvas.width = canvas.height = 100; + + var svg = document.createElementNS('http://www.w3.org/2000/svg','svg'); + var image = document.createElementNS("http://www.w3.org/2000/svg", "image"); + svg.appendChild(image); + image.setAttribute('href', + 'http://localhost:8000/security/resources/red200x100.png'); + + var ctx = canvas.getContext("2d"); + + image.addEventListener('load', t.step_func_done(function() { + ctx.drawImage(image, 0, 0); + + assert_throws("SecurityError", function() { + var c = ctx.getImageData(0, 0, 1, 1); + }, "We are trying cross-origin getImageData"); + })); + + document.body.appendChild(canvas); + document.body.appendChild(svg); +}, "Checks no cross-origin on tainted canvas due to SVG image"); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/report-uri-effective-directive-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/report-uri-effective-directive-expected.txt index 534a0537..4c8b934 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/report-uri-effective-directive-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/1.1/report-uri-effective-directive-expected.txt
@@ -5,4 +5,4 @@ HTTP_REFERER: http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/report-uri-effective-directive.php REQUEST_METHOD: POST === POST DATA === -{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/report-uri-effective-directive.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"default-src 'self'; report-uri ../resources/save-report.php?test=report-uri-effective-directive.php","disposition":"enforce","blocked-uri":"inline","line-number":6,"status-code":200,"sample":""}} +{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/1.1/report-uri-effective-directive.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"default-src 'self'; report-uri ../resources/save-report.php?test=report-uri-effective-directive.php","disposition":"enforce","blocked-uri":"inline","line-number":6,"status-code":200,"script-sample":""}}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/eval-blocked-and-sends-report-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/eval-blocked-and-sends-report-expected.txt index 598f31c..1888a55 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/eval-blocked-and-sends-report-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/eval-blocked-and-sends-report-expected.txt
@@ -6,4 +6,4 @@ HTTP_REFERER: http://127.0.0.1:8000/security/contentSecurityPolicy/eval-blocked-and-sends-report.php REQUEST_METHOD: POST === POST DATA === -{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/eval-blocked-and-sends-report.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"script-src 'self' 'unsafe-inline'; report-uri resources/save-report.php?test=eval-blocked-and-sends-report.php","disposition":"enforce","blocked-uri":"eval","line-number":8,"column-number":13,"source-file":"http://127.0.0.1:8000/security/contentSecurityPolicy/eval-blocked-and-sends-report.php","status-code":200,"sample":""}} +{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/eval-blocked-and-sends-report.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"script-src 'self' 'unsafe-inline'; report-uri resources/save-report.php?test=eval-blocked-and-sends-report.php","disposition":"enforce","blocked-uri":"eval","line-number":8,"column-number":13,"source-file":"http://127.0.0.1:8000/security/contentSecurityPolicy/eval-blocked-and-sends-report.php","status-code":200,"script-sample":""}}
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-only-from-header-expected.txt b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-only-from-header-expected.txt index 0ef037b..d2189ac 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-only-from-header-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/security/contentSecurityPolicy/report-only-from-header-expected.txt
@@ -6,4 +6,4 @@ HTTP_REFERER: http://127.0.0.1:8000/security/contentSecurityPolicy/report-only-from-header.php REQUEST_METHOD: POST === POST DATA === -{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-only-from-header.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"script-src 'self'; report-uri resources/save-report.php?test=report-only-from-header.php","disposition":"report","blocked-uri":"inline","line-number":1,"status-code":200,"sample":""}} +{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/report-only-from-header.php","referrer":"","violated-directive":"script-src","effective-directive":"script-src","original-policy":"script-src 'self'; report-uri resources/save-report.php?test=report-only-from-header.php","disposition":"report","blocked-uri":"inline","line-number":1,"status-code":200,"script-sample":""}}
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/extendable-message-event.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/extendable-message-event.html deleted file mode 100644 index 78078c53..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/extendable-message-event.html +++ /dev/null
@@ -1,215 +0,0 @@ -<!DOCTYPE html> -<title>ServiceWorkerGlobalScope: ExtendableMessageEvent</title> -<script src='../../resources/testharness.js'></script> -<script src='../../resources/testharnessreport.js'></script> -<script src='../resources/test-helpers.js'></script> -<script> - -promise_test(function(t) { - var script = 'resources/extendable-message-event-constructor-worker.js'; - var scope = 'resources/scope/extendable-message-event-constructor'; - var registration; - - return service_worker_unregister_and_register(t, script, scope) - .then(function(r) { - registration = r; - add_completion_callback(function() { registration.unregister(); }); - return wait_for_state(t, registration.installing, 'activated'); - }) - .then(function() { - var saw_message = new Promise(function(resolve) { - navigator.serviceWorker.onmessage = - function(event) { resolve(event.data); }; - }); - registration.active.postMessage(''); - return saw_message; - }) - .then(function(result) { - assert_equals(result, 'success'); - }); - }, 'Test the constructor for ExtendableMessageEvent'); - -promise_test(function(t) { - var script = 'resources/extendable-message-event-worker.js'; - var scope = 'resources/scope/extendable-message-event-from-toplevel'; - var registration; - - return service_worker_unregister_and_register(t, script, scope) - .then(function(r) { - registration = r; - add_completion_callback(function() { registration.unregister(); }); - return wait_for_state(t, registration.installing, 'activated'); - }) - .then(function() { - var saw_message = new Promise(function(resolve) { - navigator.serviceWorker.onmessage = - function(event) { resolve(event.data); } - }); - var channel = new MessageChannel; - registration.active.postMessage('', [channel.port1]); - return saw_message; - }) - .then(function(results) { - var expected_results = [ - 'Client message: [object ExtendableMessageEvent]', - ' event.origin: ' + location.origin, - ' event.lastEventId: ', - ' event.source: [object WindowClient]', - ' event.source.url: ' + location.href, - ' event.source.frameType: top-level', - ' event.source.visibilityState: visible', - ' event.source.focused: true', - ' event.ports: [object MessagePort]', - ]; - assert_array_equals(results, expected_results); - }); - }, 'Post an extendable message from a top-level client'); - -promise_test(function(t) { - var script = 'resources/extendable-message-event-worker.js'; - var scope = 'resources/scope/extendable-message-event-from-nested'; - var frame; - - return service_worker_unregister_and_register(t, script, scope) - .then(function(registration) { - add_completion_callback(function() { registration.unregister(); }); - return wait_for_state(t, registration.installing, 'activated'); - }) - .then(function() { return with_iframe(scope); }) - .then(function(f) { - frame = f; - add_completion_callback(function() { frame.remove(); }); - var saw_message = new Promise(function(resolve) { - frame.contentWindow.navigator.serviceWorker.onmessage = - function(event) { resolve(event.data); } - }); - f.contentWindow.navigator.serviceWorker.controller.postMessage(''); - return saw_message; - }) - .then(function(results) { - var expected_results = [ - 'Client message: [object ExtendableMessageEvent]', - ' event.origin: ' + frame.contentWindow.location.origin, - ' event.lastEventId: ', - ' event.source: [object WindowClient]', - ' event.source.url: ' + frame.contentWindow.location.href, - ' event.source.frameType: nested', - ' event.source.visibilityState: visible', - ' event.source.focused: false', - ' event.ports: ', - ]; - assert_array_equals(results, expected_results); - }); - }, 'Post an extendable message from a nested client'); - -promise_test(function(t) { - var script = 'resources/extendable-message-event-loopback-worker.js'; - var scope = 'resources/scope/extendable-message-event-loopback'; - var registration; - - return service_worker_unregister_and_register(t, script, scope) - .then(function(r) { - registration = r; - add_completion_callback(function() { registration.unregister(); }); - return wait_for_state(t, registration.installing, 'activated'); - }) - .then(function() { - var results = []; - var saw_message = new Promise(function(resolve) { - navigator.serviceWorker.onmessage = function(event) { - switch (event.data.type) { - case 'record': - Array.prototype.push.apply(results, event.data.results); - break; - case 'finish': - resolve(results); - break; - } - }; - }); - registration.active.postMessage({type: 'start'}); - return saw_message; - }) - .then(function(results) { - var expected_results = [ - '1st loopback: [object ExtendableMessageEvent]', - ' event.origin: ' + location.origin, - ' event.lastEventId: ', - ' event.source: [object ServiceWorker]', - ' event.source.scriptURL: ' + normalizeURL(script), - ' event.source.state: activated', - ' event.ports: ', - '2nd loopback: [object ExtendableMessageEvent]', - ' event.origin: ' + location.origin, - ' event.lastEventId: ', - ' event.source: [object ServiceWorker]', - ' event.source.scriptURL: ' + normalizeURL(script), - ' event.source.state: activated', - ' event.ports: ', - ]; - assert_array_equals(results, expected_results); - }); - }, 'Post loopback extendable messages'); - -promise_test(function(t) { - var script1 = 'resources/extendable-message-event-ping-worker.js'; - var script2 = 'resources/extendable-message-event-pong-worker.js'; - var scope = 'resources/scope/extendable-message-event-pingpong'; - var registration; - - return service_worker_unregister_and_register(t, script1, scope) - .then(function(r) { - registration = r; - add_completion_callback(function() { registration.unregister(); }); - return wait_for_state(t, registration.installing, 'activated'); - }) - .then(function() { - // A controlled frame is necessary for keeping a waiting worker. - return with_iframe(scope); - }) - .then(function(frame) { - add_completion_callback(function() { frame.remove(); }); - return navigator.serviceWorker.register(script2, {scope: scope}); - }) - .then(function(r) { - return wait_for_state(t, r.installing, 'installed'); - }) - .then(function() { - var results = []; - var saw_message = new Promise(function(resolve) { - navigator.serviceWorker.onmessage = function(event) { - switch (event.data.type) { - case 'record': - Array.prototype.push.apply(results, event.data.results); - break; - case 'finish': - resolve(results); - break; - } - }; - }); - registration.active.postMessage({type: 'start'}); - return saw_message; - }) - .then(function(results) { - var expected_results = [ - 'Ping message: [object ExtendableMessageEvent]', - ' event.origin: ' + location.origin, - ' event.lastEventId: ', - ' event.source: [object ServiceWorker]', - ' event.source.scriptURL: ' + normalizeURL(script1), - ' event.source.state: activated', - ' event.ports: ', - 'Pong message: [object ExtendableMessageEvent]', - ' event.origin: ' + location.origin, - ' event.lastEventId: ', - ' event.source: [object ServiceWorker]', - ' event.source.scriptURL: ' + normalizeURL(script2), - ' event.source.state: installed', - ' event.ports: ', - ]; - assert_array_equals(results, expected_results); - }); - }, 'Post extendable messages among service workers'); - -</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js deleted file mode 100644 index ebef428..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-constructor-worker.js +++ /dev/null
@@ -1,190 +0,0 @@ -importScripts('../../resources/worker-testharness.js'); - -function createEvent(initializer) { - if (initializer === undefined) - return new ExtendableMessageEvent('type'); - return new ExtendableMessageEvent('type', initializer); -} - -self.addEventListener('message', function(event) { - try { - // These test cases are mostly copied from - // fast/events/constructors/message-event-constructor.html. - - var test_object = { wanwan: 123 }; - var channel1 = new MessageChannel(); - var channel2 = new MessageChannel(); - - // No initializer is passed. - assert_false(createEvent().bubbles); - assert_false(createEvent().cancelable); - assert_equals(createEvent().data, null); - assert_equals(createEvent().origin, ''); - assert_equals(createEvent().lastEventId, ''); - assert_equals(createEvent().source, null); - assert_equals(createEvent().ports, null); - - // bubbles is passed. - assert_false(createEvent({ bubbles: false }).bubbles); - assert_true(createEvent({ bubbles: true }).bubbles); - - // cancelable is passed. - assert_false(createEvent({ cancelable: false }).cancelable); - assert_true(createEvent({ cancelable: true }).cancelable); - - // data is passed. - assert_equals(createEvent({ data: test_object }).data, test_object); - assert_equals(createEvent({ data: undefined }).data, null); - assert_equals(createEvent({ data: null }).data, null); - assert_equals(createEvent({ data: false }).data, false); - assert_equals(createEvent({ data: true }).data, true); - assert_equals(createEvent({ data: '' }).data, ''); - assert_equals(createEvent({ data: 'chocolate' }).data, 'chocolate'); - assert_equals(createEvent({ data: 12345 }).data, 12345); - assert_equals(createEvent({ data: 18446744073709551615 }).data, - 18446744073709552000); - assert_equals(createEvent({ data: NaN }).data, NaN); - // Note that valueOf() is not called, when the left hand side is - // evaluated. - assert_false( - createEvent({ data: { - valueOf: function() { return test_object; } } }).data == - test_object); - assert_equals(createEvent({ get data(){ return 123; } }).data, 123); - assert_throws({ name: 'Error' }, function() { - createEvent({ get data() { throw { name: 'Error' }; } }); }); - - // origin is passed. - assert_equals(createEvent({ origin: 'melancholy' }).origin, 'melancholy'); - assert_equals(createEvent({ origin: '' }).origin, ''); - assert_equals(createEvent({ origin: null }).origin, 'null'); - assert_equals(createEvent({ origin: false }).origin, 'false'); - assert_equals(createEvent({ origin: true }).origin, 'true'); - assert_equals(createEvent({ origin: 12345 }).origin, '12345'); - assert_equals( - createEvent({ origin: 18446744073709551615 }).origin, - '18446744073709552000'); - assert_equals(createEvent({ origin: NaN }).origin, 'NaN'); - assert_equals(createEvent({ origin: [] }).origin, ''); - assert_equals(createEvent({ origin: [1, 2, 3] }).origin, '1,2,3'); - assert_equals( - createEvent({ origin: { melancholy: 12345 } }).origin, - '[object Object]'); - // Note that valueOf() is not called, when the left hand side is - // evaluated. - assert_equals( - createEvent({ origin: { - valueOf: function() { return 'melancholy'; } } }).origin, - '[object Object]'); - assert_equals( - createEvent({ get origin() { return 123; } }).origin, '123'); - assert_throws({ name: 'Error' }, function() { - createEvent({ get origin() { throw { name: 'Error' }; } }); }); - - // lastEventId is passed. - assert_equals( - createEvent({ lastEventId: 'melancholy' }).lastEventId, 'melancholy'); - assert_equals(createEvent({ lastEventId: '' }).lastEventId, ''); - assert_equals(createEvent({ lastEventId: null }).lastEventId, 'null'); - assert_equals(createEvent({ lastEventId: false }).lastEventId, 'false'); - assert_equals(createEvent({ lastEventId: true }).lastEventId, 'true'); - assert_equals(createEvent({ lastEventId: 12345 }).lastEventId, '12345'); - assert_equals( - createEvent({ lastEventId: 18446744073709551615 }).lastEventId, - '18446744073709552000'); - assert_equals(createEvent({ lastEventId: NaN }).lastEventId, 'NaN'); - assert_equals(createEvent({ lastEventId: [] }).lastEventId, ''); - assert_equals( - createEvent({ lastEventId: [1, 2, 3] }).lastEventId, '1,2,3'); - assert_equals( - createEvent({ lastEventId: { melancholy: 12345 } }).lastEventId, - '[object Object]'); - // Note that valueOf() is not called, when the left hand side is - // evaluated. - assert_equals( - createEvent({ lastEventId: { - valueOf: function() { return 'melancholy'; } } }).lastEventId, - '[object Object]'); - assert_equals( - createEvent({ get lastEventId() { return 123; } }).lastEventId, - '123'); - assert_throws({ name: 'Error' }, function() { - createEvent({ get lastEventId() { throw { name: 'Error' }; } }); }); - - // source is passed. - assert_equals(createEvent({ source: event.source }).source, event.source); - assert_equals( - createEvent({ source: self.registration.active }).source, - self.registration.active); - assert_equals( - createEvent({ source: channel1.port1 }).source, channel1.port1); - assert_throws( - { name: 'TypeError' }, function() { createEvent({ source: this }); }, - 'source should be Client or ServiceWorker or MessagePort'); - - // port is passed. - // Valid message ports. - var ports = [channel1.port1, channel1.port2, channel2.port1]; - var passed_ports = createEvent({ ports: ports}).ports; - assert_equals(passed_ports[0], channel1.port1); - assert_equals(passed_ports[1], channel1.port2); - assert_equals(passed_ports[2], channel2.port1); - assert_equals(createEvent({ ports: [] }).ports.length, 0); - assert_equals(createEvent({ ports: undefined }).ports, null); - assert_equals(createEvent({ ports: null }).ports, null); - - // Invalid message ports. - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: [1, 2, 3] }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: test_object }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: this }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: false }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: true }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: '' }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: 'chocolate' }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: 12345 }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: 18446744073709551615 }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ ports: NaN }); }); - assert_throws({ name: 'TypeError' }, - function() { createEvent({ get ports() { return 123; } }); }); - assert_throws({ name: 'Error' }, function() { - createEvent({ get ports() { throw { name: 'Error' }; } }); }); - // Note that valueOf() is not called, when the left hand side is - // evaluated. - assert_throws({ name: 'TypeError' }, function() { - createEvent({ ports: { valueOf: function() { return ports; } } }); }); - - // All initializers are passed. - var initializers = { - bubbles: true, - cancelable: true, - data: test_object, - origin: 'wonderful', - lastEventId: 'excellent', - source: event.source, - ports: ports - }; - assert_equals(createEvent(initializers).bubbles, true); - assert_equals(createEvent(initializers).cancelable, true); - assert_equals(createEvent(initializers).data, test_object); - assert_equals(createEvent(initializers).origin, 'wonderful'); - assert_equals(createEvent(initializers).lastEventId, 'excellent'); - assert_equals(createEvent(initializers).source, event.source); - assert_equals(createEvent(initializers).ports[0], ports[0]); - assert_equals(createEvent(initializers).ports[1], ports[1]); - assert_equals(createEvent(initializers).ports[2], ports[2]); - - event.source.postMessage('success'); - } catch(e) { - event.source.postMessage('failure: ' + e.message); - } - });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js deleted file mode 100644 index a888516..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-loopback-worker.js +++ /dev/null
@@ -1,44 +0,0 @@ -self.addEventListener('message', function(event) { - switch (event.data.type) { - case 'start': - self.registration.active.postMessage( - {type: '1st', client_id: event.source.id}); - break; - case '1st': - // 1st loopback message via ServiceWorkerRegistration.active. - var results = [ - '1st loopback: ' + event, - ' event.origin: ' + event.origin, - ' event.lastEventId: ' + event.lastEventId, - ' event.source: ' + event.source, - ' event.source.scriptURL: ' + event.source.scriptURL, - ' event.source.state: ' + event.source.state, - ' event.ports: ' + event.ports, - ]; - var client_id = event.data.client_id; - event.source.postMessage({type: '2nd', client_id: client_id}); - event.waitUntil(clients.get(client_id) - .then(function(client) { - client.postMessage({type: 'record', results: results}); - })); - break; - case '2nd': - // 2nd loopback message via ExtendableMessageEvent.source. - var results = [ - '2nd loopback: ' + event, - ' event.origin: ' + event.origin, - ' event.lastEventId: ' + event.lastEventId, - ' event.source: ' + event.source, - ' event.source.scriptURL: ' + event.source.scriptURL, - ' event.source.state: ' + event.source.state, - ' event.ports: ' + event.ports, - ]; - var client_id = event.data.client_id; - event.waitUntil(clients.get(client_id) - .then(function(client) { - client.postMessage({type: 'record', results: results}); - client.postMessage({type: 'finish'}); - })); - break; - } - });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js deleted file mode 100644 index bc2a00a..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-pong-worker.js +++ /dev/null
@@ -1,21 +0,0 @@ -self.addEventListener('message', function(event) { - switch (event.data.type) { - case 'ping': - var results = [ - 'Ping message: ' + event, - ' event.origin: ' + event.origin, - ' event.lastEventId: ' + event.lastEventId, - ' event.source: ' + event.source, - ' event.source.scriptURL: ' + event.source.scriptURL, - ' event.source.state: ' + event.source.state, - ' event.ports: ' + event.ports, - ]; - var client_id = event.data.client_id; - event.waitUntil(clients.get(client_id) - .then(function(client) { - client.postMessage({type: 'record', results: results}); - event.source.postMessage({type: 'pong', client_id: client_id}); - })); - break; - } - });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js deleted file mode 100644 index e7491b1..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/ServiceWorkerGlobalScope/resources/extendable-message-event-worker.js +++ /dev/null
@@ -1,14 +0,0 @@ -self.addEventListener('message', function(event) { - var results = [ - 'Client message: ' + event, - ' event.origin: ' + event.origin, - ' event.lastEventId: ' + event.lastEventId, - ' event.source: ' + event.source, - ' event.source.url: ' + event.source.url, - ' event.source.frameType: ' + event.source.frameType, - ' event.source.visibilityState: ' + event.source.visibilityState, - ' event.source.focused: ' + event.source.focused, - ' event.ports: ' + event.ports, - ]; - event.source.postMessage(results); - });
diff --git a/third_party/WebKit/LayoutTests/images/resources/crbug702934.png b/third_party/WebKit/LayoutTests/images/resources/crbug702934.png new file mode 100644 index 0000000..7b9bcf9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/images/resources/crbug702934.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt new file mode 100644 index 0000000..55d64d6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt
@@ -0,0 +1,31 @@ + +Node: { + attributes : [ + [0] : type + [1] : text + [2] : style + [3] : position:absolute;top:0;left:0;width:100;height:100 + ] + backendNodeId : <number> + childNodeCount : 0 + children : [ + ] + localName : input + nodeName : INPUT + nodeType : 1 + nodeValue : + parentId : <number> + shadowRoots : [ + [0] : { + backendNodeId : <number> + childNodeCount : 1 + localName : + nodeId : <number> + nodeName : #document-fragment + nodeType : 11 + nodeValue : + shadowRootType : user-agent + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html new file mode 100644 index 0000000..eb41785 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html
@@ -0,0 +1,42 @@ +<html> +<head> +<script type="text/javascript" src="../../http/tests/inspector-protocol/inspector-protocol-test.js"></script> +<script> + +function test() +{ + var nodeInfo = {}; + InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes; + InspectorTest.sendCommand("DOM.enable", {}); + InspectorTest.sendCommand("DOM.getNodeForLocation", { "x": 10, "y": 10, "includeUserAgentShadowDOM": false }, onGetNodeForLocation); + + function onGetNodeForLocation(message) + { + if (message.error) { + InspectorTest.log(message.error.message); + InspectorTest.completeTest(); + return; + } + var nodeId = message.result.nodeId; + InspectorTest.logObject(nodeInfo[nodeId], "Node: ", ["backendNodeId", "parentId", "nodeId"]); + InspectorTest.completeTest(); + } + + function setChildNodes(message) + { + var nodes = message.params.nodes; + for (var i = 0; i < nodes.length; ++i) { + nodeInfo[nodes[i].nodeId] = nodes[i]; + delete nodes[i].nodeId; + } + } +} + +</script> +</head> +<body onload="runTest()"> +<form action="#"> + <input type="text" style="position:absolute;top:0;left:0;width:100;height:100" /> +</form> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/components/cookies-table-expected.txt b/third_party/WebKit/LayoutTests/inspector/components/cookies-table-expected.txt index 7ea7923..270df13 100644 --- a/third_party/WebKit/LayoutTests/inspector/components/cookies-table-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/components/cookies-table-expected.txt
@@ -1,5 +1,77 @@ Tests inspector cookies table + +-------- RebuildTable -------- + + +--- Empty test --- + +# of node.appendChild calls: 0 +# of node.removeChildren calls: 2 + +--- Null test --- + +# of node.appendChild calls: 0 +# of node.removeChildren calls: 2 + +--- Ascending no selection test --- + +# of node.appendChild calls: 6 +# of node.removeChildren calls: 2 +node.appendChild call: cookieA 11 +node.appendChild call: cookieB 2 +node.appendChild call: cookieC foo +node.appendChild call: cookieD {other} +node.appendChild call: cookieE zz +node.appendChild call: cookieF null + +--- Descending selection test --- + +# of node.appendChild calls: 6 +# of node.removeChildren calls: 2 +node.appendChild call: cookieF null +node.appendChild call: cookieE zz +node.appendChild call: cookieD {other} +node.appendChild call: cookieC foo [selected] +node.appendChild call: cookieB 2 +node.appendChild call: cookieA 11 + +--- Neighbor selection test --- + +# of node.appendChild calls: 6 +# of node.removeChildren calls: 2 +node.appendChild call: cookieA 11 [selected] +node.appendChild call: cookieB 2 +node.appendChild call: cookieC foo +node.appendChild call: cookieD {other} +node.appendChild call: cookieE zz +node.appendChild call: cookieF null + +--- Previous neighbor selection test --- + +# of node.appendChild calls: 6 +# of node.removeChildren calls: 2 +node.appendChild call: cookieA 11 +node.appendChild call: cookieB 2 +node.appendChild call: cookieC foo +node.appendChild call: cookieD {other} +node.appendChild call: cookieE zz [selected] +node.appendChild call: cookieF null + +--- Inactive node test --- + +# of node.appendChild calls: 7 +# of node.removeChildren calls: 2 +node.appendChild call: cookieA 11 +node.appendChild call: cookieB 2 +node.appendChild call: cookieC foo +node.appendChild call: cookieD {other} +node.appendChild call: cookieE zz +node.appendChild call: cookieF null +node.appendChild call: missing cookie [selected] + +-------- Sort cookies -------- + params: name desc cookieF,cookieE,cookieD,cookieC,cookieB,cookieA params: value asc
diff --git a/third_party/WebKit/LayoutTests/inspector/components/cookies-table.html b/third_party/WebKit/LayoutTests/inspector/components/cookies-table.html index ce9d6c9c..3796d2b4 100644 --- a/third_party/WebKit/LayoutTests/inspector/components/cookies-table.html +++ b/third_party/WebKit/LayoutTests/inspector/components/cookies-table.html
@@ -4,10 +4,74 @@ <script type="text/javascript"> var test = function () { - function dumpResults(cookies) { + function dumpCookies(cookies) { InspectorTest.addResult(cookies.map(x => x.name()).join(',')); } + function dumpNodeCalls(calls) { + InspectorTest.addResult(`# of node.appendChild calls: ${calls.appendChild.length}`); + InspectorTest.addResult(`# of node.removeChildren calls: ${calls.removeChildren.length}`); + calls.appendChild.forEach(node => { + const data = node._data; + const selected = node._selected ? '[selected]' : ''; + InspectorTest.addResult(`node.appendChild call: ${data.name} ${data.value} ${selected}`.trim()); + }); + } + + function mockNode(options) { + var calls = { + appendChild: [], + removeChildren: [], + }; + + var mockNode = { + _calls: calls, + dataGrid: options.dataGrid, + cookie: options.cookie, + deselect: () => undefined, + traverseNextNode: () => options.nextNeighbor, + traversePreviousNode: () => options.previousNeighbor, + appendChild: function (node) { + node.dataGrid = mockNode.dataGrid; + calls.appendChild.push(node); + }, + removeChildren: function () { + if (mockNode.dataGrid) { + mockNode.dataGrid.selectedNode = null; + } + + calls.removeChildren.push(arguments); + }, + }; + + return mockNode; + } + + function mockDataGrid(options) { + var calls = { + addCreationNode: [], + startEditingNextEditableColumnOfDataGridNode: [], + }; + + var dataGrid = { + rootNode: () => { + options.rootNode.dataGrid = dataGrid + return options.rootNode; + }, + selectedNode: options.selectedNode, + isSortOrderAscending: () => options.isAsc, + sortColumnId: () => options.sortColumn, + addCreationNode: function () { calls.addCreationNode.push(arguments); }, + dispatchEventToListeners: () => undefined, + startEditingNextEditableColumnOfDataGridNode: function () { + calls.startEditingNextEditableColumnOfDataGridNode.push(arguments); + }, + _calls: calls, + }; + + return dataGrid; + } + function createCookie(data) { const cookie = new SDK.Cookie(data.name, data.value); for (let key in data) { @@ -19,13 +83,53 @@ return cookie; } - function createSortAndDumpCookies(cookieData, column, isAsc) { + function createSortAndDumpCookies(cookieData, sortColumn, isAsc) { const table = new CookieTable.CookiesTable(SDK.targetManager.mainTarget(), true); const cookies = cookieData.map(createCookie); - table._dataGrid = {isSortOrderAscending: () => isAsc, sortColumnId: () => column}; + table._dataGrid = mockDataGrid({sortColumn, isAsc}); table._sortCookies(cookies); - InspectorTest.addResult(`params: ${column} ${isAsc ? 'asc' : 'desc'}`); - dumpResults(cookies); + InspectorTest.addResult(`params: ${sortColumn} ${isAsc ? 'asc' : 'desc'}`); + dumpCookies(cookies); + } + + function createBuildAndDumpTable(cookieData, selectedNode, isAsc, lastEditedColumn) { + const table = new CookieTable.CookiesTable(SDK.targetManager.mainTarget(), true); + const cookies = cookieData && cookieData.map(createCookie); + const rootNode = mockNode({}); + table._lastEditedColumnId = lastEditedColumn || null; + table._dataGrid = mockDataGrid({ + isAsc: Boolean(isAsc), + sortColumn: 'name', + rootNode: rootNode, + selectedNode: selectedNode, + }); + table.setCookies(cookies); + dumpNodeCalls(rootNode._calls); + } + + function testSortCookies(cookieData) { + createSortAndDumpCookies(cookieData, 'name', false); + createSortAndDumpCookies(cookieData, 'value', true); + createSortAndDumpCookies(cookieData, 'path', false); + createSortAndDumpCookies(cookieData, 'domain', true); + createSortAndDumpCookies(cookieData, null, true); + } + + function testRebuildTable(cookieData) { + InspectorTest.addResult('\n--- Empty test ---\n'); + createBuildAndDumpTable([], null, true); + InspectorTest.addResult('\n--- Null test ---\n'); + createBuildAndDumpTable(null, null, true); + InspectorTest.addResult('\n--- Ascending no selection test ---\n'); + createBuildAndDumpTable(cookieData, null, true); + InspectorTest.addResult('\n--- Descending selection test ---\n'); + createBuildAndDumpTable(cookieData, mockNode({cookie: createCookie(cookieData[2])}), false); + InspectorTest.addResult('\n--- Neighbor selection test ---\n'); + createBuildAndDumpTable(cookieData, mockNode({nextNeighbor: {cookie: createCookie(cookieData[0])}}), true); + InspectorTest.addResult('\n--- Previous neighbor selection test ---\n'); + createBuildAndDumpTable(cookieData, mockNode({nextNeighbor: {}, previousNeighbor: {cookie: createCookie(cookieData[4])}}), true); + InspectorTest.addResult('\n--- Inactive node test ---\n'); + createBuildAndDumpTable(cookieData, mockNode({cookie: createCookie({name: 'missing', value: 'cookie'})}), true, 'name'); } function run() { @@ -37,12 +141,10 @@ {name: 'cookieE', value: 'zz', path: '/gg', domain: 'z.example.com'}, {name: 'cookieF', value: 'null', path: '/', domain: 'example.com'}, ]; - - createSortAndDumpCookies(cookieData, 'name', false); - createSortAndDumpCookies(cookieData, 'value', true); - createSortAndDumpCookies(cookieData, 'path', false); - createSortAndDumpCookies(cookieData, 'domain', true); - createSortAndDumpCookies(cookieData, null, true); + InspectorTest.addResult('\n-------- RebuildTable --------\n'); + testRebuildTable(cookieData); + InspectorTest.addResult('\n-------- Sort cookies --------\n'); + testSortCookies(cookieData); InspectorTest.completeTest(); }
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt index e74556b1..21c8ec41 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6-expected.txt
@@ -24,6 +24,8 @@ CONSOLE MESSAGE: line 12: [object Set] CONSOLE MESSAGE: line 11: [object Map] CONSOLE MESSAGE: line 12: [object Map] +CONSOLE MESSAGE: line 11: [object Generator] +CONSOLE MESSAGE: line 12: [object Generator] Tests that console properly displays information about ES6 features. console-format-es6.html:11 Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: -0} @@ -78,6 +80,10 @@ console-format-es6.html:12 [Map(6)] globals[12] Map(6) {" from str " => " to str ", undefined => undefined, null => null, 42 => 42, Object {foo: "from"} => Object {foo: "to"}…} +console-format-es6.html:11 genFunction {[[GeneratorStatus]]: "suspended"} +console-format-es6.html:12 [genFunction] +globals[13] +genFunction {[[GeneratorStatus]]: "suspended"} Expanded all messages console-format-es6.html:11 Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: -0} __proto__: Promise @@ -282,4 +288,23 @@ 4: {Object => Object} 5: {Array(1) => Array(1)} length: 6 +console-format-es6.html:11 genFunction {[[GeneratorStatus]]: "suspended"} + __proto__: Generator + [[GeneratorStatus]]: "suspended" + [[GeneratorFunction]]: function* () + [[GeneratorReceiver]]: Window + [[GeneratorLocation]]: console-format-es6.html:56 + [[Scopes]]: Scopes[2] +console-format-es6.html:12 [genFunction] + 0: genFunction + length: 1 + __proto__: Array(0) +globals[13] +genFunction {[[GeneratorStatus]]: "suspended"} + __proto__: Generator + [[GeneratorStatus]]: "suspended" + [[GeneratorFunction]]: function* () + [[GeneratorReceiver]]: Window + [[GeneratorLocation]]: console-format-es6.html:56 + [[Scopes]]: Scopes[2]
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6.html b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6.html index 64437fd..1a3ea11 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-format-es6.html +++ b/third_party/WebKit/LayoutTests/inspector/console/console-format-es6.html
@@ -14,6 +14,9 @@ function onload() { + var p = Promise.reject(-0); + p.catch(function() {}); + var smb1 = Symbol(); var smb2 = Symbol("a"); var obj = { @@ -50,12 +53,15 @@ bigmap.set({foo:"from"}, {foo:"to"}); bigmap.set(["from"], ["to"]); - var p = Promise.reject(-0); - p.catch(function() {}); + var genFunction = function *() { + yield 1; + yield 2; + } + var generator = genFunction(); globals = [ p, smb1, smb2, obj, map, weakMap, set, weakSet, - mapMap0, mapMap, setSet0, setSet, bigmap, + mapMap0, mapMap, setSet0, setSet, bigmap, generator ]; runTest();
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view-expected.txt b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view-expected.txt index f7d5684..d8afd46a 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view-expected.txt
@@ -1,5 +1,5 @@ Tests the coverage list view after finishing recording in the Coverage view. -.../inspector/coverage/resources/coverage.js JS used: 241 unused: 157 total: 402 -.../inspector/coverage/resources/highlight-in-source.css CSS used: 67 unused: 132 total: 209 +.../inspector/coverage/resources/coverage.js JS used: 241 unused: 161 total: 402 +.../inspector/coverage/resources/highlight-in-source.css CSS used: 67 unused: 142 total: 209
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter-expected.txt b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter-expected.txt index bfcea6a..3e042ee 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter-expected.txt
@@ -26,5 +26,5 @@ 21: - notUsed2 { 22: - color: white 23: - } -24: +24: -
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-script-formatter-expected.txt b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-script-formatter-expected.txt index b09db4d..da3f8121 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-script-formatter-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-script-formatter-expected.txt
@@ -31,5 +31,5 @@ 26: - function outer2() { 27: - return outer(0)(0); 28: - } -29: +29: -
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js-expected.txt b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js-expected.txt index e3e37f5..49f39f4 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js-expected.txt
@@ -22,5 +22,5 @@ 17: - } function outer2() { 18: - return outer(0)(0); 19: - } -20: +20: -
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/multiple-instances-merge-expected.txt b/third_party/WebKit/LayoutTests/inspector/coverage/multiple-instances-merge-expected.txt index 3e45310..4276ed25 100644 --- a/third_party/WebKit/LayoutTests/inspector/coverage/multiple-instances-merge-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/coverage/multiple-instances-merge-expected.txt
@@ -1,8 +1,8 @@ Tests the coverage list view after finishing recording in the Coverage view. -.../inspector/coverage/resources/coverage.js JS used: 277 unused: 121 total: 402 -.../inspector/coverage/resources/highlight-in-source.css CSS used: 90 unused: 109 total: 209 +.../inspector/coverage/resources/coverage.js JS used: 277 unused: 125 total: 402 +.../inspector/coverage/resources/highlight-in-source.css CSS used: 90 unused: 119 total: 209 0: + body { 1: + background-color: lightblue; 2: * } @@ -47,5 +47,5 @@ 17: - } function outer2() { 18: - return outer(0)(0); 19: - } -20: +20: -
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host-expected.txt b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host-expected.txt new file mode 100644 index 0000000..4efa88b --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host-expected.txt
@@ -0,0 +1,3 @@ +Sheet added: data:text/css,#x{color:pink} +Sheet removed: data:text/css,#x{color:pink} +
diff --git a/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host.html b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host.html new file mode 100644 index 0000000..2a72053 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/elements/styles-3/remove-shadow-host.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<script src="../../../http/tests/inspector/inspector-test.js"></script> +<script src="../../../http/tests/inspector/elements-test.js"></script> +<script> + function addShadow() { + var root = host.attachShadow({mode:"open"}); + root.innerHTML = '<link rel="stylesheet" href="data:text/css,#x{color:pink}">'; + } + + function test() { + InspectorTest.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetAdded, sheetAdded); + InspectorTest.cssModel.addEventListener(SDK.CSSModel.Events.StyleSheetRemoved, sheetRemoved); + InspectorTest.evaluateInPage("addShadow()"); + + function sheetAdded(event) { + InspectorTest.addResult("Sheet added: "+event.data.sourceURL); + InspectorTest.evaluateInPage("host.remove()"); + } + + function sheetRemoved(event) { + InspectorTest.addResult("Sheet removed: "+event.data.sourceURL); + InspectorTest.completeTest(); + } + } +</script> +<body onload="runTest()"> +<div id="host"></div> +
diff --git a/third_party/WebKit/LayoutTests/inspector/help/release-note-expected.txt b/third_party/WebKit/LayoutTests/inspector/help/release-note-expected.txt index 7c45882..314f930 100644 --- a/third_party/WebKit/LayoutTests/inspector/help/release-note-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/help/release-note-expected.txt
@@ -4,12 +4,11 @@ 0 Dumping release note text: -Chrome has been updated. -Here's what's new in DevTools: +New since the last update Improved Performance and Memory panels Edit cookies directly from the Application panel +LEARN MORECLOSE -Learn moreClose Last version of release note seen should be updated: 99
diff --git a/third_party/WebKit/LayoutTests/inspector/help/release-note.html b/third_party/WebKit/LayoutTests/inspector/help/release-note.html index b8e77fda..4051607 100644 --- a/third_party/WebKit/LayoutTests/inspector/help/release-note.html +++ b/third_party/WebKit/LayoutTests/inspector/help/release-note.html
@@ -8,33 +8,17 @@ version: 99, highlights: [ { - contents: [ - { - text: 'Improved', - }, - { - text: 'Performance and Memory panels', - link: 'https://developers.google.com/web/tools/chrome-devtools/', - } - ], - featured: true, + title: 'Improved Performance and Memory panels', + subtitle: '', + link: 'https://developers.google.com/web/tools/chrome-devtools/', }, { - contents: [ - { - text: 'Edit cookies directly', - link: 'https://developers.google.com/web/tools/chrome-devtools/', - }, - { - text: 'from the Application panel', - }, - ], + title: 'Edit cookies directly from the Application panel', + subtitle: '', + link: 'https://developers.google.com/web/tools/chrome-devtools/', }, ], link: 'https://developers.google.com/web/tools/chrome-devtools/', - image: { - src: './resources/test.png', - }, }, ];
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane-expected.txt b/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane-expected.txt new file mode 100644 index 0000000..fe1d48414 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane-expected.txt
@@ -0,0 +1,17 @@ +Tests cookie pane rendering in Network panel + +-------------------------- +Name +Value +Domain +Path +Expires / Max-Age +Size +HTTP +Secure +SameSite +Request Cookies 33 +mycookie myvalue N/A N/A N/A 17 +myother myvalue2 N/A N/A N/A 16 +Response Cookies 0 +
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane.html b/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane.html new file mode 100644 index 0000000..ac8a966 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/network/network-cookies-pane.html
@@ -0,0 +1,40 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/network-test.js"></script> +<script> +function test() { + function run() { + var panel = UI.panels.network; + var target = panel._networkLogView; + var types = Common.resourceTypes; + + var requestFoo = new SDK.NetworkRequest(SDK.targetManager.mainTarget(), "", "", "", "", ""); + requestFoo.setResourceType(types.XHR); + requestFoo.setRequestId("foo"); + requestFoo.setRequestHeaders([{name: 'Cookie', value: 'mycookie=myvalue;myother=myvalue2'}]); + panel._showRequest(requestFoo); + panel._networkItemView._selectTab('cookies'); + + // Ensure this runs after all Promise.resolve + setTimeout(() => { + InspectorTest.addResult("--------------------------"); + const value = panel._detailsWidget.element.innerText + .split('\n') + .map(line => line.trim()) + .join('\n') + .trim(); + InspectorTest.addResult(value); + InspectorTest.completeTest(); + }, 0); + } + + self.runtime.loadModulePromise('cookie_table').then(run); +} + +</script> +</head> +<body onload="runTest()"> +<p>Tests cookie pane rendering in Network panel</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt new file mode 100644 index 0000000..22a5e66 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1-expected.txt
@@ -0,0 +1,34 @@ +Verify javascript outline + + +Running: testSimpleFunction +Text: + function foo(a, b, c) {} +Outline: + foo(a, b, c):0:9 + +Running: testSpreadOperator +Text: + function foo(a, b, ...c) {} +Outline: + foo(a, b, ...c):0:9 + +Running: testVariableDeclaration +Text: + var a = function(a,b) { } +Outline: + a(a, b):0:8 + +Running: testMultipleVariableDeclaration +Text: + var a = function(a,b) { }, b = function(c,d) { } +Outline: + a(a, b):0:8 + b(c, d):0:31 + +Running: testObjectProperty +Text: + a.b.c = function(d, e) { } +Outline: + c(d, e):0:8 +
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1.html new file mode 100644 index 0000000..ee43a46 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-1.html
@@ -0,0 +1,37 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/sources-test.js"></script> + +<script> + +async function test() +{ + var test = InspectorTest.testJavascriptOutline; + + InspectorTest.markStep('testSimpleFunction'); + await test('function foo(a, b, c) {}'); + + InspectorTest.markStep('testSpreadOperator'); + await test('function foo(a, b, ...c) {}'); + + InspectorTest.markStep('testVariableDeclaration'); + await test('var a = function(a,b) { }'); + + InspectorTest.markStep('testMultipleVariableDeclaration'); + await test('var a = function(a,b) { }, b = function(c,d) { }'); + + InspectorTest.markStep('testObjectProperty'); + await test('a.b.c = function(d, e) { }'); + + InspectorTest.completeTest(); +} + +</script> + +</head> + +<body onload="runTest()"> +<p>Verify javascript outline</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt new file mode 100644 index 0000000..b9f8333 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2-expected.txt
@@ -0,0 +1,35 @@ +Verify javascript outline + + +Running: testNamedFunctionVariableAssignment +Text: + var a = function foo(...bar) { } +Outline: + foo(...bar):0:17 + +Running: testArrowFunction +Text: + var a = x => x + 2 +Outline: + +Running: testArrowFunctionWithMultipleArguments +Text: + var a = (x, y) => x + y +Outline: + +Running: testInnerFunctions +Text: + function foo(){ function bar() {} function baz() { }} +Outline: + foo():0:9 + bar():0:25 + baz():0:43 + +Running: testObjectProperties +Text: + x = { run: function() { }, get count() { }, set count(value) { }} +Outline: + run():0:11 + get count():0:31 + set count(value):0:48 +
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2.html new file mode 100644 index 0000000..22b53ed --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-2.html
@@ -0,0 +1,37 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/sources-test.js"></script> + +<script> + +async function test() +{ + var test = InspectorTest.testJavascriptOutline; + + InspectorTest.markStep('testNamedFunctionVariableAssignment'); + await test('var a = function foo(...bar) { }'); + + InspectorTest.markStep('testArrowFunction'); + await test('var a = x => x + 2'); + + InspectorTest.markStep('testArrowFunctionWithMultipleArguments'); + await test('var a = (x, y) => x + y'); + + InspectorTest.markStep('testInnerFunctions'); + await test('function foo(){ function bar() {} function baz() { }}'); + + InspectorTest.markStep('testObjectProperties'); + await test('x = { run: function() { }, get count() { }, set count(value) { }}'); + + InspectorTest.completeTest(); +} + +</script> + +</head> + +<body onload="runTest()"> +<p>Verify javascript outline</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt new file mode 100644 index 0000000..c6994fd --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3-expected.txt
@@ -0,0 +1,28 @@ +Verify javascript outline + + +Running: testClassConstructor +Text: + class Test { constructor(foo, bar) { }} +Outline: + +Running: testClassMethods +Text: + class Test { foo() {} bar() { }} +Outline: + +Running: testAnonymousClass +Text: + var test = class { constructor(foo, bar) { }} +Outline: + +Running: testClassExtends +Text: + var A = class extends B { foo() { }} +Outline: + +Running: testStaticMethod +Text: + class Test { static foo() { }} +Outline: +
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3.html new file mode 100644 index 0000000..8ae1b97 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-3.html
@@ -0,0 +1,37 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/sources-test.js"></script> + +<script> + +async function test() +{ + var test = InspectorTest.testJavascriptOutline; + + InspectorTest.markStep('testClassConstructor'); + await test('class Test { constructor(foo, bar) { }}'); + + InspectorTest.markStep('testClassMethods'); + await test('class Test { foo() {} bar() { }}'); + + InspectorTest.markStep('testAnonymousClass'); + await test('var test = class { constructor(foo, bar) { }}'); + + InspectorTest.markStep('testClassExtends'); + await test('var A = class extends B { foo() { }}'); + + InspectorTest.markStep('testStaticMethod'); + await test('class Test { static foo() { }}'); + + InspectorTest.completeTest(); +} + +</script> + +</head> + +<body onload="runTest()"> +<p>Verify javascript outline</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt new file mode 100644 index 0000000..810ae02 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4-expected.txt
@@ -0,0 +1,39 @@ +Verify javascript outline + + +Running: testAsyncFunction +Text: + async function foo() { } +Outline: + foo():0:15 + +Running: testGeneratorFunction +Text: + function* foo() { } +Outline: + +Running: testMismatchBrackets +Text: + + function foo(a, b) { + if (a > b) { + return a; + } + + function bar(eee) { + foo(eee, 2 * eee); + } + +Outline: + foo(a, b):1:9 + bar(eee):6:9 + +Running: testSyntaxError +Text: + + function notAGenerator(a, b) { + yield 10; + } +Outline: + notAGenerator(a, b):1:9 +
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html new file mode 100644 index 0000000..f40a8d4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sources/outline-javascript-4.html
@@ -0,0 +1,46 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/sources-test.js"></script> + +<script> + +async function test() +{ + var test = InspectorTest.testJavascriptOutline; + + InspectorTest.markStep('testAsyncFunction'); + await test('async function foo() { }'); + + InspectorTest.markStep('testGeneratorFunction'); + await test('function* foo() { }'); + + InspectorTest.markStep('testMismatchBrackets'); + await test(` +function foo(a, b) { + if (a > b) { + return a; +} + +function bar(eee) { + foo(eee, 2 * eee); +} +`); + + InspectorTest.markStep('testSyntaxError'); + await test(` +function notAGenerator(a, b) { + yield 10; +}`); + + InspectorTest.completeTest(); +} + +</script> + +</head> + +<body onload="runTest()"> +<p>Verify javascript outline</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt index 54244f0..7292a484 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,182) size 219x125 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,182) size 219x125 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 219.00: "SVG" LayoutSVGText {text} at (200,213) size 198.66x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,213) size 198.66x15
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.txt index 242cc54..21625a9 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/smallFonts-expected.txt
@@ -133,7 +133,6 @@ LayoutSVGText {text} at (0,-0.72) size 2.63x0.91 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-0.22,-0.12)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 LayoutSVGInlineText {#text} at (0,-0.72) size 2.63x0.91 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 2.63: "Shadow" LayoutSVGText {text} at (0,-0.72) size 2.58x0.91 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-0.72) size 2.58x0.91
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect-expected.txt index 1430d31..9192ade0 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect-expected.txt
@@ -36,12 +36,10 @@ LayoutSVGText {text} at (45.97,312) size 148.03x60 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (31.17,306) size 177.64x72 LayoutSVGInlineText {#text} at (45.97,312) size 148.03x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (31.17,306) size 177.64x72 chunk 1 (middle anchor) text run 1 at (45.98,360.00) startOffset 0 endOffset 5 width 148.04: "BATIK" LayoutSVGText {text} at (252.45,312) size 155.08x61 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (236.95,305.90) size 186.09x73.20 LayoutSVGInlineText {#text} at (252.45,312) size 155.08x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (236.95,305.90) size 186.09x73.20 chunk 1 (middle anchor) text run 1 at (252.46,360.00) startOffset 0 endOffset 5 width 155.09: "BATIK" LayoutSVGText {text} at (87.50,388) size 65x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (87.50,388) size 65x15
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect3-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect3-expected.txt index 8bba9ca..aad90cc 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textEffect3-expected.txt
@@ -84,13 +84,11 @@ LayoutSVGText {text} at (54.50,292) size 146.23x80 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (39.88,284) size 175.48x96 LayoutSVGInlineText {#text} at (54.50,312) size 35x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (51,306) size 42x72 chunk 1 (middle anchor) text run 1 at (54.50,360.00) startOffset 0 endOffset 1 width 35.00: "B" LayoutSVGTSpan {tspan} at (54.50,292) size 146.23x80 LayoutSVGInlineText {#text} at (88.50,314) size 20x32 chunk 1 (middle anchor) text run 1 at (89.50,340.00) startOffset 0 endOffset 1 width 18.00: "A" LayoutSVGInlineText {#text} at (107.50,292) size 32x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (104.30,286) size 38.40x72 chunk 1 (middle anchor) text run 1 at (107.50,340.00) startOffset 0 endOffset 1 width 32.00: "T" LayoutSVGTSpan {tspan} at (54.50,292) size 146.23x80 LayoutSVGInlineText {#text} at (139.50,304) size 11x45 @@ -99,17 +97,14 @@ LayoutSVGInlineText {#text} at (146.39,294.89) size 54.34x68.69 chunk 1 (middle anchor) text run 1 at (150.50,340.00) startOffset 0 endOffset 1 width 35.00: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (261,292) size 153.05x81 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (245.70,283.90) size 183.66x97.20 LayoutSVGInlineText {#text} at (261,312) size 35x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (257.50,305.90) size 42x73.20 chunk 1 (middle anchor) text run 1 at (261.00,360.00) startOffset 0 endOffset 1 width 35.00: "B" LayoutSVGTSpan {tspan} at (261,292) size 153.05x81 LayoutSVGInlineText {#text} at (296,316) size 20x31 chunk 1 (middle anchor) text run 1 at (296.00,340.00) startOffset 0 endOffset 1 width 20.00: "A" LayoutSVGInlineText {#text} at (316,292) size 32x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (312.80,285.90) size 38.40x73.20 chunk 1 (middle anchor) text run 1 at (316.00,340.00) startOffset 0 endOffset 1 width 32.00: "T" LayoutSVGTSpan {tspan} at (261,292) size 153.05x81 LayoutSVGInlineText {#text} at (348,304) size 13x46 @@ -118,7 +113,6 @@ LayoutSVGInlineText {#text} at (356.55,294.89) size 57.50x70.66 chunk 1 (middle anchor) text run 1 at (361.00,340.00) startOffset 0 endOffset 1 width 38.00: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (87.50,388) size 65x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (87.50,388) size 65x15 chunk 1 (middle anchor) text run 1 at (87.50,400.00) startOffset 0 endOffset 13 width 65.00: "(System font)"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.txt index 6acf2d3..91aad0fdf 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/batik/text/textFeatures-expected.txt
@@ -148,7 +148,6 @@ LayoutSVGText {text} at (0,-36.11) size 131.58x45.58 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-11.03,-6.00)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 LayoutSVGInlineText {#text} at (0,-36.11) size 131.58x45.58 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 131.58: "Shadow" LayoutSVGText {text} at (0,-36) size 129x46 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-36) size 129x46
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-clippath-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-clippath-expected.txt index 4746d36..0ffb615 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-clippath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-clippath-expected.txt
@@ -5,13 +5,11 @@ LayoutSVGHiddenContainer {defs} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_0"] [clipPathUnits=userSpaceOnUse] LayoutSVGRect {rect} at (50,0) size 50x50 [x=50.00] [y=0.00] [width=50.00] [height=50.00] - [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_1"] [clipPathUnits=userSpaceOnUse] LayoutSVGContainer {use} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] - [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-mask-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-mask-expected.txt index 57dd205..3fd5fd49 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-mask-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/recursive-mask-expected.txt
@@ -7,7 +7,6 @@ LayoutSVGRect {rect} at (0,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=0.00] [width=50.00] [height=50.00] LayoutSVGResourceMasker {mask} [id="mask2"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (100,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=100.00] [y=0.00] [width=50.00] [height=50.00] - [masker="mask2"] LayoutSVGResourceMasker {mask} at (100,0) size 50x50 LayoutSVGResourceMasker {mask} [id="mask3"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 0x0 @@ -18,7 +17,6 @@ LayoutSVGResourceMasker {mask} [id="mask4"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGContainer {use} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] - [masker="mask4"] LayoutSVGResourceMasker {mask} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 50x50 LayoutSVGRect {rect} at (100,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=100.00] [y=0.00] [width=100.00] [height=100.00]
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-clip-expected.txt index c4352b2..bb3378c 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-clip-expected.txt
@@ -12,5 +12,4 @@ LayoutSVGText {text} at (0,76) size 643.91x62 contains 1 chunk(s) [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 LayoutSVGInlineText {#text} at (0,76) size 643.91x62 - [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 chunk 1 text run 1 at (0.00,125.00) startOffset 0 endOffset 28 width 643.92: "FAIL (should be clipped out)"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-filter-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-filter-expected.txt index f4bb0845..881a4e8 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-filter-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/custom/text-filter-expected.txt
@@ -9,5 +9,4 @@ LayoutSVGText {text} at (4,11) size 563.42x62 contains 1 chunk(s) [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52.34,4.80) size 676.11x74.40 LayoutSVGInlineText {#text} at (4,11) size 563.42x62 - [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52.34,4.80) size 676.11x74.40 chunk 1 text run 1 at (4.00,60.00) startOffset 0 endOffset 26 width 563.43: "This text should be blury."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-filter-for-text-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-filter-for-text-expected.txt index 77a13aa..b07bb7d 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-filter-for-text-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-filter-for-text-expected.txt
@@ -9,13 +9,10 @@ LayoutSVGText {text} at (30,13) size 206x22 contains 1 chunk(s) [filter="filter"] LayoutSVGResourceFilter {filter} at (9.40,10.80) size 247.20x26.40 LayoutSVGInlineText {#text} at (30,13) size 135x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (16.50,10.80) size 162x26.40 chunk 1 text run 1 at (30.00,30.00) startOffset 0 endOffset 19 width 135.00: "This is for filter " LayoutSVGTSpan {tspan} at (30,13) size 206x22 [filter="filter"] LayoutSVGResourceFilter {filter} at (9.40,10.80) size 247.20x26.40 LayoutSVGInlineText {#text} at (165,13) size 66x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (158.40,10.80) size 79.20x26.40 chunk 1 text run 1 at (165.00,30.00) startOffset 0 endOffset 9 width 66.00: "on filter" LayoutSVGInlineText {#text} at (231,13) size 5x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (230.50,10.80) size 6x26.40 chunk 1 text run 1 at (231.00,30.00) startOffset 0 endOffset 1 width 5.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-tspan-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-tspan-expected.txt index 096e6f6..1e15423 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-tspan-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/filters/filter-on-tspan-expected.txt
@@ -11,7 +11,6 @@ LayoutSVGTSpan {tspan} at (100,85) size 97.88x19 [filter="filter"] LayoutSVGResourceFilter {filter} at (90.21,83.10) size 117.45x22.80 LayoutSVGInlineText {#text} at (168,85) size 26.31x19 - [filter="filter"] LayoutSVGResourceFilter {filter} at (165.37,83.10) size 31.58x22.80 chunk 1 text run 1 at (168.00,100.00) startOffset 0 endOffset 4 width 25.88: "Test" LayoutSVGInlineText {#text} at (193.88,85) size 4x19 chunk 1 text run 1 at (193.88,100.00) startOffset 0 endOffset 1 width 4.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.txt index d35b866..ab0b151 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,181.61) size 219.59x124.80 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,181.61) size 219.59x124.80 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 219.60: "SVG" LayoutSVGText {text} at (200,213) size 202.66x15.59 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,213) size 202.66x15.59
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt index 2e905df7..53c250d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/external/wpt/dom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1609 tests; 1429 PASS, 180 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Event interface: existence and properties of interface object PASS Event interface object length PASS Event interface object name @@ -405,7 +405,7 @@ PASS Stringification of xmlDoc PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) -PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) +FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object" PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5)
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt index 2e905df7..53c250d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-retina/external/wpt/dom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1609 tests; 1429 PASS, 180 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Event interface: existence and properties of interface object PASS Event interface object length PASS Event interface object name @@ -405,7 +405,7 @@ PASS Stringification of xmlDoc PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) -PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) +FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object" PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5)
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt index 3276951d..7387f91f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,180) size 220.05x128 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,180) size 220.05x128 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 220.05: "SVG" LayoutSVGText {text} at (200,214) size 195.42x14 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,214) size 195.42x14
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.txt index 3ed6c46..a9b5822 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/smallFonts-expected.txt
@@ -133,7 +133,6 @@ LayoutSVGText {text} at (0,-0.72) size 2.56x0.92 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-0.22,-0.12)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 LayoutSVGInlineText {#text} at (0,-0.72) size 2.56x0.92 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 2.58: "Shadow" LayoutSVGText {text} at (0,-0.72) size 2.56x0.91 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-0.72) size 2.56x0.91
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect-expected.txt index d31bc63..15dd7a6b 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect-expected.txt
@@ -36,12 +36,10 @@ LayoutSVGText {text} at (44.92,312) size 150.14x59 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (29.91,306.10) size 180.17x70.80 LayoutSVGInlineText {#text} at (44.92,312) size 150.14x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (29.91,306.10) size 180.17x70.80 chunk 1 (middle anchor) text run 1 at (44.93,360.00) startOffset 0 endOffset 5 width 150.15: "BATIK" LayoutSVGText {text} at (251.48,312) size 157.02x61 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (235.78,305.90) size 188.42x73.20 LayoutSVGInlineText {#text} at (251.48,312) size 157.02x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (235.78,305.90) size 188.42x73.20 chunk 1 (middle anchor) text run 1 at (251.49,360.00) startOffset 0 endOffset 5 width 157.02: "BATIK" LayoutSVGText {text} at (87.16,389) size 65.66x14 contains 1 chunk(s) LayoutSVGInlineText {#text} at (87.16,389) size 65.66x14
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect3-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect3-expected.txt index 77ca649d..75895c5 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textEffect3-expected.txt
@@ -84,13 +84,11 @@ LayoutSVGText {text} at (53.69,292) size 146.88x79 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (39,284.10) size 176.25x94.80 LayoutSVGInlineText {#text} at (53.69,312) size 35.56x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (50.13,306.10) size 42.67x70.80 chunk 1 (middle anchor) text run 1 at (53.69,360.00) startOffset 0 endOffset 1 width 35.57: "B" LayoutSVGTSpan {tspan} at (53.69,292) size 146.88x79 LayoutSVGInlineText {#text} at (89.22,316) size 17.86x30 chunk 1 (middle anchor) text run 1 at (89.26,340.00) startOffset 0 endOffset 1 width 17.78: "A" LayoutSVGInlineText {#text} at (107.03,292) size 32.56x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (103.78,286.10) size 39.08x70.80 chunk 1 (middle anchor) text run 1 at (107.05,340.00) startOffset 0 endOffset 1 width 32.58: "T" LayoutSVGTSpan {tspan} at (53.69,292) size 146.88x79 LayoutSVGInlineText {#text} at (139.61,304) size 11.11x44 @@ -99,17 +97,14 @@ LayoutSVGInlineText {#text} at (146.97,294.89) size 53.59x67.59 chunk 1 (middle anchor) text run 1 at (150.74,340.00) startOffset 0 endOffset 1 width 35.57: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (260.38,292) size 153.33x81 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (245.04,283.90) size 184x97.20 LayoutSVGInlineText {#text} at (260.38,312) size 35.56x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (256.82,305.90) size 42.67x73.20 chunk 1 (middle anchor) text run 1 at (260.38,360.00) startOffset 0 endOffset 1 width 35.57: "B" LayoutSVGTSpan {tspan} at (260.38,292) size 153.33x81 LayoutSVGInlineText {#text} at (295.95,316) size 19.25x31 chunk 1 (middle anchor) text run 1 at (295.95,340.00) startOffset 0 endOffset 1 width 19.25: "A" LayoutSVGInlineText {#text} at (315.20,292) size 32.56x61 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (311.95,285.90) size 39.08x73.20 chunk 1 (middle anchor) text run 1 at (315.21,340.00) startOffset 0 endOffset 1 width 32.58: "T" LayoutSVGTSpan {tspan} at (260.38,292) size 153.33x81 LayoutSVGInlineText {#text} at (347.78,304) size 13.31x46 @@ -118,7 +113,6 @@ LayoutSVGInlineText {#text} at (356.66,294.89) size 57.05x70.48 chunk 1 (middle anchor) text run 1 at (361.10,340.00) startOffset 0 endOffset 1 width 38.51: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (87.16,389) size 65.66x14 contains 1 chunk(s) LayoutSVGInlineText {#text} at (87.16,389) size 65.66x14 chunk 1 (middle anchor) text run 1 at (87.17,400.00) startOffset 0 endOffset 13 width 65.66: "(System font)"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.txt index 155d466..0902e89a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/batik/text/textFeatures-expected.txt
@@ -148,7 +148,6 @@ LayoutSVGText {text} at (0,-36.11) size 128.88x46.44 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-11.03,-6.00)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 LayoutSVGInlineText {#text} at (0,-36.11) size 128.88x46.44 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 128.88: "Shadow" LayoutSVGText {text} at (0,-36) size 128.88x46 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-36) size 128.88x46
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-clippath-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-clippath-expected.txt index deff595..4b2c8b3 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-clippath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-clippath-expected.txt
@@ -5,13 +5,11 @@ LayoutSVGHiddenContainer {defs} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_0"] [clipPathUnits=userSpaceOnUse] LayoutSVGRect {rect} at (50,0) size 50x50 [x=50.00] [y=0.00] [width=50.00] [height=50.00] - [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_1"] [clipPathUnits=userSpaceOnUse] LayoutSVGContainer {use} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] - [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-mask-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-mask-expected.txt index d5f4fb84..6e2b01a2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-mask-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/recursive-mask-expected.txt
@@ -7,7 +7,6 @@ LayoutSVGRect {rect} at (0,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=0.00] [width=50.00] [height=50.00] LayoutSVGResourceMasker {mask} [id="mask2"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (100,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=100.00] [y=0.00] [width=50.00] [height=50.00] - [masker="mask2"] LayoutSVGResourceMasker {mask} at (100,0) size 50x50 LayoutSVGResourceMasker {mask} [id="mask3"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 0x0 @@ -18,7 +17,6 @@ LayoutSVGResourceMasker {mask} [id="mask4"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGContainer {use} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] - [masker="mask4"] LayoutSVGResourceMasker {mask} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 50x50 LayoutSVGRect {rect} at (100,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=100.00] [y=0.00] [width=100.00] [height=100.00]
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-clip-expected.txt index 3037990..04a7de1 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-clip-expected.txt
@@ -12,5 +12,4 @@ LayoutSVGText {text} at (0,76) size 640.55x63 contains 1 chunk(s) [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 LayoutSVGInlineText {#text} at (0,76) size 640.55x63 - [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 chunk 1 text run 1 at (0.00,125.00) startOffset 0 endOffset 28 width 640.56: "FAIL (should be clipped out)"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-filter-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-filter-expected.txt index c809f8df..6e37cd6a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-filter-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/custom/text-filter-expected.txt
@@ -9,5 +9,4 @@ LayoutSVGText {text} at (4,11) size 560.11x63 contains 1 chunk(s) [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52,4.70) size 672.13x75.60 LayoutSVGInlineText {#text} at (4,11) size 560.11x63 - [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52,4.70) size 672.13x75.60 chunk 1 text run 1 at (4.00,60.00) startOffset 0 endOffset 26 width 560.12: "This text should be blury."
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-filter-for-text-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-filter-for-text-expected.txt index 176aea3..6df7faa 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-filter-for-text-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-filter-for-text-expected.txt
@@ -9,13 +9,10 @@ LayoutSVGText {text} at (30,12) size 197.75x23 contains 1 chunk(s) [filter="filter"] LayoutSVGResourceFilter {filter} at (10.23,9.70) size 237.30x27.60 LayoutSVGInlineText {#text} at (30,12) size 129.98x23 - [filter="filter"] LayoutSVGResourceFilter {filter} at (17,9.70) size 155.98x27.60 chunk 1 text run 1 at (30.00,30.00) startOffset 0 endOffset 19 width 129.99: "This is for filter " LayoutSVGTSpan {tspan} at (30,12) size 197.75x23 [filter="filter"] LayoutSVGResourceFilter {filter} at (10.23,9.70) size 237.30x27.60 LayoutSVGInlineText {#text} at (159.98,12) size 62.83x23 - [filter="filter"] LayoutSVGResourceFilter {filter} at (153.70,9.70) size 75.39x27.60 chunk 1 text run 1 at (159.99,30.00) startOffset 0 endOffset 9 width 62.77: "on filter" LayoutSVGInlineText {#text} at (222.75,12) size 5x23 - [filter="filter"] LayoutSVGResourceFilter {filter} at (222.25,9.70) size 6x27.60 chunk 1 text run 1 at (222.76,30.00) startOffset 0 endOffset 1 width 5.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-tspan-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-tspan-expected.txt index b798290c..6498aa2 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-tspan-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/filters/filter-on-tspan-expected.txt
@@ -11,7 +11,6 @@ LayoutSVGTSpan {tspan} at (100,86) size 100.19x18 [filter="filter"] LayoutSVGResourceFilter {filter} at (89.98,84.20) size 120.22x21.60 LayoutSVGInlineText {#text} at (169.77,86) size 26.44x18 - [filter="filter"] LayoutSVGResourceFilter {filter} at (167.12,84.20) size 31.73x21.60 chunk 1 text run 1 at (169.77,100.00) startOffset 0 endOffset 4 width 26.43: "Test" LayoutSVGInlineText {#text} at (196.19,86) size 4x18 chunk 1 text run 1 at (196.20,100.00) startOffset 0 endOffset 1 width 4.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.txt index f4e5ae88..9138cc0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,180.41) size 220.03x127.19 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,180.41) size 220.03x127.19 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 220.04: "SVG" LayoutSVGText {text} at (200,214.20) size 195.42x13.31 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,214.20) size 195.42x13.31
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt index d076e8db..db63b37 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3437,6 +3437,7 @@ getter onmute getter onunmute getter readyState + getter remote method clone method constructor method getConstraints
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt index 2e905df7..53c250d 100644 --- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/external/wpt/dom/interfaces-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1609 tests; 1429 PASS, 180 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1609 tests; 1428 PASS, 181 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Event interface: existence and properties of interface object PASS Event interface object length PASS Event interface object name @@ -405,7 +405,7 @@ PASS Stringification of xmlDoc PASS Document interface: xmlDoc must inherit property "implementation" with the proper type (0) PASS Document interface: xmlDoc must inherit property "URL" with the proper type (1) -PASS Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) +FAIL Document interface: xmlDoc must inherit property "documentURI" with the proper type (2) assert_equals: expected "string" but got "object" PASS Document interface: xmlDoc must inherit property "origin" with the proper type (3) PASS Document interface: xmlDoc must inherit property "compatMode" with the proper type (4) PASS Document interface: xmlDoc must inherit property "characterSet" with the proper type (5)
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt index 955ca3b..5933d9a 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,182) size 220.05x122 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,182) size 220.05x122 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 220.05: "SVG" LayoutSVGText {text} at (200,213) size 200.66x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,213) size 200.66x15
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.txt index 076ac0a..74ec614 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/smallFonts-expected.txt
@@ -133,7 +133,6 @@ LayoutSVGText {text} at (0,-0.70) size 2.58x0.88 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-0.22,-0.12)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 LayoutSVGInlineText {#text} at (0,-0.70) size 2.58x0.88 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-1.60) size 4x2 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 2.58: "Shadow" LayoutSVGText {text} at (0,-0.72) size 2.58x0.89 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-0.72) size 2.58x0.89
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect-expected.txt index be68529..6d1f2b36 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect-expected.txt
@@ -36,12 +36,10 @@ LayoutSVGText {text} at (44.92,312) size 150.14x59 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (29.91,306.10) size 180.17x70.80 LayoutSVGInlineText {#text} at (44.92,312) size 150.14x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (29.91,306.10) size 180.17x70.80 chunk 1 (middle anchor) text run 1 at (44.93,360.00) startOffset 0 endOffset 5 width 150.15: "BATIK" LayoutSVGText {text} at (251.48,312) size 157.02x60 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (235.78,306) size 188.42x72 LayoutSVGInlineText {#text} at (251.48,312) size 157.02x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (235.78,306) size 188.42x72 chunk 1 (middle anchor) text run 1 at (251.49,360.00) startOffset 0 endOffset 5 width 157.02: "BATIK" LayoutSVGText {text} at (86.50,388) size 67x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (86.50,388) size 67x15
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect3-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect3-expected.txt index f67e152..a647525 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect3-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textEffect3-expected.txt
@@ -84,13 +84,11 @@ LayoutSVGText {text} at (53.69,292) size 146.88x79 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (39,284.10) size 176.25x94.80 LayoutSVGInlineText {#text} at (53.69,312) size 35.56x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (50.13,306.10) size 42.67x70.80 chunk 1 (middle anchor) text run 1 at (53.69,360.00) startOffset 0 endOffset 1 width 35.57: "B" LayoutSVGTSpan {tspan} at (53.69,292) size 146.88x79 LayoutSVGInlineText {#text} at (89.25,316) size 17.78x30 chunk 1 (middle anchor) text run 1 at (89.26,340.00) startOffset 0 endOffset 1 width 17.78: "A" LayoutSVGInlineText {#text} at (107.03,292) size 32.56x59 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (103.78,286.10) size 39.08x70.80 chunk 1 (middle anchor) text run 1 at (107.05,340.00) startOffset 0 endOffset 1 width 32.58: "T" LayoutSVGTSpan {tspan} at (53.69,292) size 146.88x79 LayoutSVGInlineText {#text} at (139.61,304) size 11.11x44 @@ -99,17 +97,14 @@ LayoutSVGInlineText {#text} at (146.97,294.89) size 53.59x67.59 chunk 1 (middle anchor) text run 1 at (150.74,340.00) startOffset 0 endOffset 1 width 35.57: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (260.38,292) size 153.31x80 contains 1 chunk(s) [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (245.04,284) size 183.98x96 LayoutSVGInlineText {#text} at (260.38,312) size 35.56x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (256.82,306) size 42.67x72 chunk 1 (middle anchor) text run 1 at (260.38,360.00) startOffset 0 endOffset 1 width 35.57: "B" LayoutSVGTSpan {tspan} at (260.38,292) size 153.31x80 LayoutSVGInlineText {#text} at (295.95,316) size 19.25x30 chunk 1 (middle anchor) text run 1 at (295.95,340.00) startOffset 0 endOffset 1 width 19.25: "A" LayoutSVGInlineText {#text} at (315.20,292) size 32.56x60 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (311.95,286) size 39.08x72 chunk 1 (middle anchor) text run 1 at (315.21,340.00) startOffset 0 endOffset 1 width 32.58: "T" LayoutSVGTSpan {tspan} at (260.38,292) size 153.31x80 LayoutSVGInlineText {#text} at (347.78,304) size 13.31x45 @@ -118,7 +113,6 @@ LayoutSVGInlineText {#text} at (356.98,294.89) size 56.70x69.55 chunk 1 (middle anchor) text run 1 at (361.10,340.00) startOffset 0 endOffset 1 width 38.51: "K" LayoutSVGInlineText {#text} at (0,0) size 0x0 - [filter="dropShadow"] LayoutSVGResourceFilter {filter} at (0,0) size 0x0 LayoutSVGText {text} at (86.50,388) size 67x15 contains 1 chunk(s) LayoutSVGInlineText {#text} at (86.50,388) size 67x15 chunk 1 (middle anchor) text run 1 at (86.50,400.00) startOffset 0 endOffset 13 width 67.00: "(System font)"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.txt index 410dcfc..ac05f9af 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/batik/text/textFeatures-expected.txt
@@ -148,7 +148,6 @@ LayoutSVGText {text} at (0,-35.25) size 129.23x43.86 [transform={m=((1.00,0.00)(0.84,1.00)) t=(-11.03,-6.00)}] [opacity=0.70] contains 1 chunk(s) [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 LayoutSVGInlineText {#text} at (0,-35.25) size 129.23x43.86 [opacity=0.70] - [filter="blur"] LayoutSVGResourceFilter {filter} at (0,-80) size 200x100 chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 6 width 128.88: "Shadow" LayoutSVGText {text} at (0,-36) size 129x45 contains 1 chunk(s) LayoutSVGInlineText {#text} at (0,-36) size 129x45
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-clippath-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-clippath-expected.txt index 35c72f7..7256e48 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-clippath-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-clippath-expected.txt
@@ -5,13 +5,11 @@ LayoutSVGHiddenContainer {defs} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_0"] [clipPathUnits=userSpaceOnUse] LayoutSVGRect {rect} at (50,0) size 50x50 [x=50.00] [y=0.00] [width=50.00] [height=50.00] - [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGResourceClipper {clipPath} [id="clipPath_1"] [clipPathUnits=userSpaceOnUse] LayoutSVGContainer {use} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,150) size 50x50 [x=50.00] [y=150.00] [width=50.00] [height=50.00] - [clipPath="clipPath_1"] LayoutSVGResourceClipper {clipPath} at (50,150) size 50x50 LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] LayoutSVGRect {rect} at (50,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=50.00] [y=0.00] [width=100.00] [height=100.00] [clipPath="clipPath_0"] LayoutSVGResourceClipper {clipPath} at (50,0) size 50x50
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-mask-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-mask-expected.txt index ec2a9fe..d41615f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-mask-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/recursive-mask-expected.txt
@@ -7,7 +7,6 @@ LayoutSVGRect {rect} at (0,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=0.00] [width=50.00] [height=50.00] LayoutSVGResourceMasker {mask} [id="mask2"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (100,0) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=100.00] [y=0.00] [width=50.00] [height=50.00] - [masker="mask2"] LayoutSVGResourceMasker {mask} at (100,0) size 50x50 LayoutSVGResourceMasker {mask} [id="mask3"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 0x0 @@ -18,7 +17,6 @@ LayoutSVGResourceMasker {mask} [id="mask4"] [maskUnits=objectBoundingBox] [maskContentUnits=userSpaceOnUse] LayoutSVGContainer {use} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,100) size 50x50 [fill={[type=SOLID] [color=#FFFFFF]}] [x=0.00] [y=100.00] [width=50.00] [height=50.00] - [masker="mask4"] LayoutSVGResourceMasker {mask} at (0,100) size 50x50 LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] [masker="mask1"] LayoutSVGResourceMasker {mask} at (0,0) size 50x50 LayoutSVGRect {rect} at (100,0) size 100x100 [fill={[type=SOLID] [color=#0000FF]}] [x=100.00] [y=0.00] [width=100.00] [height=100.00]
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-clip-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-clip-expected.txt index 7335a2ec..0a6b1b0 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-clip-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-clip-expected.txt
@@ -12,5 +12,4 @@ LayoutSVGText {text} at (0,76) size 640.52x61 contains 1 chunk(s) [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 LayoutSVGInlineText {#text} at (0,76) size 640.52x61 - [clipPath="myclip"] LayoutSVGResourceClipper {clipPath} at (200,200) size 100x200 chunk 1 text run 1 at (0.00,125.00) startOffset 0 endOffset 28 width 640.53: "FAIL (should be clipped out)"
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-filter-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-filter-expected.txt index 300ee0a01..fac5a2c 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-filter-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/custom/text-filter-expected.txt
@@ -9,5 +9,4 @@ LayoutSVGText {text} at (4,11) size 560.11x61 contains 1 chunk(s) [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52,4.90) size 672.13x73.20 LayoutSVGInlineText {#text} at (4,11) size 560.11x61 - [filter="myfilter"] LayoutSVGResourceFilter {filter} at (-52,4.90) size 672.13x73.20 chunk 1 text run 1 at (4.00,60.00) startOffset 0 endOffset 26 width 560.12: "This text should be blury."
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-filter-for-text-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-filter-for-text-expected.txt index 51d99d7..e6c348e1 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-filter-for-text-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-filter-for-text-expected.txt
@@ -9,13 +9,10 @@ LayoutSVGText {text} at (30,12) size 199.94x22 contains 1 chunk(s) [filter="filter"] LayoutSVGResourceFilter {filter} at (10,9.80) size 239.93x26.40 LayoutSVGInlineText {#text} at (30,12) size 131.08x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (16.89,9.80) size 157.29x26.40 chunk 1 text run 1 at (30.00,30.00) startOffset 0 endOffset 19 width 131.08: "This is for filter " LayoutSVGTSpan {tspan} at (30,12) size 199.94x22 [filter="filter"] LayoutSVGResourceFilter {filter} at (10,9.80) size 239.93x26.40 LayoutSVGInlineText {#text} at (161.08,12) size 64.20x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (154.66,9.80) size 77.04x26.40 chunk 1 text run 1 at (161.08,30.00) startOffset 0 endOffset 9 width 63.87: "on filter" LayoutSVGInlineText {#text} at (224.94,12) size 5x22 - [filter="filter"] LayoutSVGResourceFilter {filter} at (224.44,9.80) size 6x26.40 chunk 1 text run 1 at (224.95,30.00) startOffset 0 endOffset 1 width 5.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-tspan-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-tspan-expected.txt index 7fbe5ef8..4adccff 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-tspan-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/filters/filter-on-tspan-expected.txt
@@ -11,7 +11,6 @@ LayoutSVGTSpan {tspan} at (100,86) size 100.19x17 [filter="filter"] LayoutSVGResourceFilter {filter} at (89.98,84.30) size 120.22x20.40 LayoutSVGInlineText {#text} at (169.77,86) size 26.42x17 - [filter="filter"] LayoutSVGResourceFilter {filter} at (167.12,84.30) size 31.71x20.40 chunk 1 text run 1 at (169.77,100.00) startOffset 0 endOffset 4 width 26.43: "Test" LayoutSVGInlineText {#text} at (196.19,86) size 4x17 chunk 1 text run 1 at (196.20,100.00) startOffset 0 endOffset 1 width 4.00: "."
diff --git a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.txt b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.txt index 4c01a33e..7cf7799 100644 --- a/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.txt
@@ -41,7 +41,6 @@ LayoutSVGText {text} at (60,181.61) size 220.03x122.39 contains 1 chunk(s) [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 LayoutSVGInlineText {#text} at (60,181.61) size 220.03x122.39 - [masker="mask3"] LayoutSVGResourceMasker {mask} at (60,200) size 200x100 chunk 1 text run 1 at (60.00,280.00) startOffset 0 endOffset 3 width 220.04: "SVG" LayoutSVGText {text} at (200,213) size 206.27x15.59 contains 1 chunk(s) LayoutSVGInlineText {#text} at (200,213) size 206.27x15.59
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt index 1fd34d1..37c557f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3366,6 +3366,7 @@ getter onmute getter onunmute getter readyState + getter remote method clone method constructor method getConstraints
diff --git a/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header-expected.html b/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header-expected.html new file mode 100644 index 0000000..258001c --- /dev/null +++ b/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header-expected.html
@@ -0,0 +1,133 @@ +<!DOCTYPE html> +<body> +<style> +body { + margin: 0px; +} +td { + border: 1px solid black; + height: 40px; +} +.header { + break-inside: avoid; +} +</style> +<script> +if (window.testRunner) + testRunner.setPrinting(); +</script> +<!-- crbug.com/702605: Header uses offset intended for rows. The first header row should be at the top of the first page. --> +<table> + <tr> + <td>header 1</td> + <td>header 2</td> + <td>header 3</td> + </tr> + <tr> + <td>1-1</td> + <td>2-1</td> + <td>3-1</td> + </tr> + <tr> + <td>1-2</td> + <td>2-2</td> + <td>3-2</td> + </tr> + <tr> + <td>1-3</td> + <td>2-3</td> + <td>3-3</td> + </tr> + <tr> + <td>1-4</td> + <td>2-4</td> + <td>3-4</td> + </tr> + <tr> + <td>1-5</td> + <td>2-5</td> + <td>3-5</td> + </tr> + <tr> + <td>1-6</td> + <td>2-6</td> + <td>3-6</td> + </tr> + <tr> + <td>1-7</td> + <td>2-7</td> + <td>3-7</td> + </tr> + <tr> + <td>1-8</td> + <td>2-8</td> + <td>3-8</td> + </tr> + <tr> + <td>1-9</td> + <td>2-9</td> + <td>3-9</td> + </tr> + <tr> + <td>1-10</td> + <td>2-10</td> + <td>3-10</td> + </tr> + <tr> + <td>1-11</td> + <td>2-11</td> + <td>3-11</td> + </tr> + <tr> + <td>1-12</td> + <td>2-12</td> + <td>3-12</td> + </tr> + <tr> + <td>1-13</td> + <td>2-13</td> + <td>3-13</td> + </tr> + <tr> + <td>1-14</td> + <td>2-14</td> + <td>3-14</td> + </tr> + <tr> + <td>1-15</td> + <td>2-15</td> + <td>3-15</td> + </tr> + <tr> + <td>1-16</td> + <td>2-16</td> + <td>3-16</td> + </tr> + <tr class="header"> + <td>header 1</td> + <td>header 2</td> + <td>header 3</td> + </tr> + <tr> + <td>1-17</td> + <td>2-17</td> + <td>3-17</td> + </tr> + <tr> + <td>1-18</td> + <td>2-18</td> + <td>3-18</td> + </tr> + <tr> + <td>1-19</td> + <td>2-19</td> + <td>3-19</td> + </tr> + <tr> + <td>1-20</td> + <td>2-20</td> + <td>3-20</td> + </tr> + </tbody> + </table> +</body>
diff --git a/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header.html b/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header.html new file mode 100644 index 0000000..86cb8891 --- /dev/null +++ b/third_party/WebKit/LayoutTests/printing/avoid-setting-header-offset-on-header.html
@@ -0,0 +1,128 @@ +<!DOCTYPE html> +<body> +<style> +body { + margin: 0px; +} +td { + border: 1px solid black; + height: 40px; +} +</style> +<script> +if (window.testRunner) + testRunner.setPrinting(); +</script> +<!-- crbug.com/702605: Header uses offset intended for rows. The first header row should be at the top of the first page. --> +<table> + <thead> + <tr> + <td>header 1</td> + <td>header 2</td> + <td>header 3</td> + </tr> + </thead> + <tbody> + <tr> + <td>1-1</td> + <td>2-1</td> + <td>3-1</td> + </tr> + <tr> + <td>1-2</td> + <td>2-2</td> + <td>3-2</td> + </tr> + <tr> + <td>1-3</td> + <td>2-3</td> + <td>3-3</td> + </tr> + <tr> + <td>1-4</td> + <td>2-4</td> + <td>3-4</td> + </tr> + <tr> + <td>1-5</td> + <td>2-5</td> + <td>3-5</td> + </tr> + <tr> + <td>1-6</td> + <td>2-6</td> + <td>3-6</td> + </tr> + <tr> + <td>1-7</td> + <td>2-7</td> + <td>3-7</td> + </tr> + <tr> + <td>1-8</td> + <td>2-8</td> + <td>3-8</td> + </tr> + <tr> + <td>1-9</td> + <td>2-9</td> + <td>3-9</td> + </tr> + <tr> + <td>1-10</td> + <td>2-10</td> + <td>3-10</td> + </tr> + <tr> + <td>1-11</td> + <td>2-11</td> + <td>3-11</td> + </tr> + <tr> + <td>1-12</td> + <td>2-12</td> + <td>3-12</td> + </tr> + <tr> + <td>1-13</td> + <td>2-13</td> + <td>3-13</td> + </tr> + <tr> + <td>1-14</td> + <td>2-14</td> + <td>3-14</td> + </tr> + <tr> + <td>1-15</td> + <td>2-15</td> + <td>3-15</td> + </tr> + <tr> + <td>1-16</td> + <td>2-16</td> + <td>3-16</td> + </tr> + <tr> + <td>1-17</td> + <td>2-17</td> + <td>3-17</td> + </tr> + <tr> + <td>1-18</td> + <td>2-18</td> + <td>3-18</td> + </tr> + <tr> + <td>1-19</td> + <td>2-19</td> + <td>3-19</td> + </tr> + <tr> + <td>1-20</td> + <td>2-20</td> + <td>3-20</td> + </tr> + </tbody> + </table> +</body>
diff --git a/third_party/WebKit/LayoutTests/resources/mojo-helpers.js b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js index 92ddd8d..95c1c60f 100644 --- a/third_party/WebKit/LayoutTests/resources/mojo-helpers.js +++ b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js
@@ -27,34 +27,40 @@ } })(); -define('Mojo Helpers', [ - 'mojo/public/js/core', - 'mojo/public/js/router', - 'mojo/public/js/support', - 'content/public/renderer/frame_interfaces', - 'content/public/renderer/interfaces', - 'content/shell/renderer/layout_test/frame_interface_registry', - 'content/shell/renderer/layout_test/interface_registry', -], (core, router, support, frameInterfaces, interfaces, frameInterfaceRegistry, - interfaceRegistry) => { - let tearDown = () => { - frameInterfaces.clearInterfaceOverridesForTesting(); - interfaces.clearInterfaceOverridesForTesting(); - }; - addEventListener('unload', tearDown); - if (window.add_completion_callback) - add_completion_callback(tearDown); +define( + 'Mojo Helpers', + [ + 'mojo/public/js/core', + 'mojo/public/js/router', + 'mojo/public/js/support', + 'content/public/renderer/connector', + 'content/public/renderer/frame_interfaces', + 'content/public/renderer/interfaces', + 'content/shell/renderer/layout_test/frame_interface_registry', + 'content/shell/renderer/layout_test/interface_registry', + ], + (core, router, support, connector, frameInterfaces, interfaces, + frameInterfaceRegistry, interfaceRegistry) => { + let tearDown = () => { + connector.clearInterfaceOverridesForTesting(); + frameInterfaces.clearInterfaceOverridesForTesting(); + interfaces.clearInterfaceOverridesForTesting(); + }; + addEventListener('unload', tearDown); + if (window.add_completion_callback) + add_completion_callback(tearDown); - return { - core, - router, - support, - frameInterfaces, - frameInterfaceRegistry, - interfaces, - interfaceRegistry, - }; -}); + return { + core, + router, + support, + connector, + frameInterfaces, + frameInterfaceRegistry, + interfaces, + interfaceRegistry, + }; + }); // Returns a promise to an object that exposes common Mojo module interfaces. // Additional modules to load can be specified in the |modules| parameter. The
diff --git a/third_party/WebKit/LayoutTests/svg/animations/target-move-crash-expected.txt b/third_party/WebKit/LayoutTests/svg/animations/target-move-crash-expected.txt new file mode 100644 index 0000000..ddad5eaf --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/animations/target-move-crash-expected.txt
@@ -0,0 +1 @@ +PASS if no crash
diff --git a/third_party/WebKit/LayoutTests/svg/animations/target-move-crash.html b/third_party/WebKit/LayoutTests/svg/animations/target-move-crash.html new file mode 100644 index 0000000..0187635 --- /dev/null +++ b/third_party/WebKit/LayoutTests/svg/animations/target-move-crash.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<script> +if (window.testRunner) { + testRunner.dumpAsText(); + testRunner.waitUntilDone(); +} + +var done = false; +function repeatHandler() { + if (done && window.testRunner) + testRunner.notifyDone() +} +function handler() { + group.before(firstroot); + done = true; +} +</script> +<svg id="firstroot"></svg> +<svg> + <g id="group"> + <set attributeName="stroke-dashoffset" xlink:href="#firstroot" onbegin="handler()"/> + </g> + <animate attributeName="stroke-linejoin" dur="0.1s" repeatDur="indefinite" onrepeat="repeatHandler()"> +</svg> +<p>PASS if no crash</p>
diff --git a/third_party/WebKit/LayoutTests/svg/clip-path/clip-path-recursive-call-by-child-expected.txt b/third_party/WebKit/LayoutTests/svg/clip-path/clip-path-recursive-call-by-child-expected.txt index a093dfde..ad7ef816 100644 --- a/third_party/WebKit/LayoutTests/svg/clip-path/clip-path-recursive-call-by-child-expected.txt +++ b/third_party/WebKit/LayoutTests/svg/clip-path/clip-path-recursive-call-by-child-expected.txt
@@ -5,7 +5,6 @@ LayoutSVGHiddenContainer {defs} at (0,0) size 0x0 LayoutSVGResourceClipper {clipPath} [id="clip"] [clipPathUnits=userSpaceOnUse] LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] - [clipPath="clip"] LayoutSVGResourceClipper {clipPath} at (0,0) size 100x100 LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] LayoutSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00] [clipPath="clip"] LayoutSVGResourceClipper {clipPath} at (0,0) size 100x100
diff --git a/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html index 57a45f8..c284544 100644 --- a/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html +++ b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html
@@ -31,17 +31,18 @@ audit.define('preload-arraybuffer', (task, should) => { Promise .all([ - Audit.loadFileFromUrl(validAudioFileUrl), - Audit.loadFileFromUrl(invalidAudioFileUrl) + should(Audit.loadFileFromUrl(validAudioFileUrl), + "Loading valid audio file") + .beResolved(), + should(Audit.loadFileFromUrl(invalidAudioFileUrl), + "loading invalid audio file") + .beResolved() ]) .then((arrayBuffers) => { validArrayBuffer = arrayBuffers[0]; invalidArrayBuffer = arrayBuffers[1]; - context.decodeAudioData(validArrayBuffer).then((audioBuffer) => { - referenceDecodedAudioBuffer = audioBuffer; - task.done(); - }) - }); + }) + .then(() => task.done()); }); // Decode a valid encoded file and verify that the promise succeeds @@ -51,12 +52,14 @@ // we do not care about it in this test. Promise .all([ - should(context.decodeAudioData(validArrayBuffer), + // Do not use the original arrayBuffers for decoding; decode a copy + // because decodeAudioData will detach the buffers. + should(context.decodeAudioData(validArrayBuffer.slice(0)), 'Decoding a valid audio file') .beResolved(), - should(context.decodeAudioData(invalidArrayBuffer), + should(context.decodeAudioData(invalidArrayBuffer.slice(0)), 'Decoding an invalid audio file') - .beRejected('EncodingError'), + .beRejectedWith('EncodingError'), should(context.decodeAudioData(null), 'Decoding null AudioBuffer') .beRejected() ]) @@ -81,7 +84,7 @@ }; // Step 1: Decode a file with callback functions. - let step1 = context.decodeAudioData(validArrayBuffer, + let step1 = context.decodeAudioData(validArrayBuffer.slice(), successOrErrorCallback, successOrErrorCallback); @@ -112,7 +115,7 @@ }; let decodeAudioDataPromise = context.decodeAudioData( - invalidArrayBuffer, successOrErrorCallback, successOrErrorCallback); + invalidArrayBuffer.slice(), successOrErrorCallback, successOrErrorCallback); should(decodeAudioDataPromise, 'decodeAudioData promise') .beRejected('EncodingError')
diff --git a/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-neuter.html b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-neuter.html new file mode 100644 index 0000000..0374bef --- /dev/null +++ b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-neuter.html
@@ -0,0 +1,68 @@ +<!doctype html> +<html> + <head> + <script src="../../resources/testharness.js"></script> + <script src="../../resources/testharnessreport.js"></script> + <script src="../resources/audit.js"></script> + <title>Test Neutering by decodeAudioData </title> + </head> + + <body> + <script> + // Any valid rate will do. Just need something to create an offline + // context. + let sampleRate = 44100; + + let audit = Audit.createTaskRunner(); + + // Context to use for decodeAudioData + let context; + // The encoded audio file that we want to decode. + let encodedAudio; + + audit.define('initialize', (task, should) => { + // Create the context and load up any valid encoded audio file. + should(() => { + context = new OfflineAudioContext(1, 1, sampleRate); + }, 'Context creation').notThrow(); + + Audit.loadFileFromUrl( + '../resources/hyper-reality/laughter.wav') + .then(response => { + encodedAudio = response; + should(true, 'Loading of encoded audio file') + .message('succeeded', 'failed'); + }) + .then(() => task.done()); + }); + + audit.define('decode-audio-neuters', (task, should) => { + // Decode the audio file and verify that it neuters the array, so that + // it can't be transfered somewhere else. + p = context.decodeAudioData(encodedAudio); + should(() => { + postMessage('', '*', [encodedAudio]); + }, 'Transfer of audio buffer').throw('DataCloneError'); + should(p, 'Decoding of audio').beResolved().then(() => task.done()); + }); + + audit.define('neutered buffer', (task, should) => { + // Any non-empy ArrayBuffer will work. We're going to transfer that + // array before calling decodeAudioData. + let buffer = new ArrayBuffer(1000); + + should(() => { + postMessage('', '*', [buffer]); + }, 'Transfer buffer via postMessage').notThrow(); + + should( + context.decodeAudioData(buffer), + 'decodeAudioData on neutered buffer') + .beRejected('TypeError') + .then(() => task.done()); + }); + + audit.run(); + </script> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index d0fa1fa..ae3f2fcc 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -4112,6 +4112,7 @@ getter onmute getter onunmute getter readyState + getter remote method applyConstraints method clone method constructor
diff --git a/third_party/WebKit/PRESUBMIT.py b/third_party/WebKit/PRESUBMIT.py index ef1cde3..22ffdc9c 100644 --- a/third_party/WebKit/PRESUBMIT.py +++ b/third_party/WebKit/PRESUBMIT.py
@@ -36,28 +36,6 @@ return results -def _CheckForVersionControlConflictsInFile(input_api, f): - pattern = input_api.re.compile('^(?:<<<<<<<|>>>>>>>) |^=======$') - errors = [] - for line_num, line in f.ChangedContents(): - if pattern.match(line): - errors.append(' %s:%d %s' % (f.LocalPath(), line_num, line)) - return errors - - -def _CheckForVersionControlConflicts(input_api, output_api): - """Usually this is not intentional and will cause a compile failure.""" - errors = [] - for f in input_api.AffectedFiles(): - errors.extend(_CheckForVersionControlConflictsInFile(input_api, f)) - - results = [] - if errors: - results.append(output_api.PresubmitError( - 'Version control conflict markers found, please resolve.', errors)) - return results - - def _CheckWatchlist(input_api, output_api): """Check that the WATCHLIST file parses correctly.""" errors = [] @@ -98,25 +76,12 @@ input_api, output_api, excluded_paths=_EXCLUDED_PATHS, maxlen=800, license_header=license_header)) results.extend(_CheckForNonBlinkVariantMojomIncludes(input_api, output_api)) - results.extend(_CheckForVersionControlConflicts(input_api, output_api)) - results.extend(_CheckPatchFiles(input_api, output_api)) results.extend(_CheckTestExpectations(input_api, output_api)) results.extend(_CheckChromiumPlatformMacros(input_api, output_api)) results.extend(_CheckWatchlist(input_api, output_api)) - results.extend(_CheckFilePermissions(input_api, output_api)) return results -def _CheckPatchFiles(input_api, output_api): - problems = [f.LocalPath() for f in input_api.AffectedFiles() - if f.LocalPath().endswith(('.orig', '.rej'))] - if problems: - return [output_api.PresubmitError( - "Don't commit .rej and .orig files.", problems)] - else: - return [] - - def _CheckTestExpectations(input_api, output_api): local_paths = [f.LocalPath() for f in input_api.AffectedFiles()] if any('LayoutTests' in path for path in local_paths): @@ -228,26 +193,6 @@ return errors -def _CheckFilePermissions(input_api, output_api): - """Check that all files have their permissions properly set.""" - if input_api.platform == 'win32': - return [] - args = [input_api.python_executable, - input_api.os_path.join( - input_api.change.RepositoryRoot(), - 'tools/checkperms/checkperms.py'), - '--root', input_api.change.RepositoryRoot()] - for f in input_api.AffectedFiles(): - args += ['--file', f.LocalPath()] - try: - input_api.subprocess.check_output(args) - return [] - except input_api.subprocess.CalledProcessError as error: - return [output_api.PresubmitError( - 'checkperms.py failed:', - long_text=error.output)] - - def _CheckForInvalidPreferenceError(input_api, output_api): pattern = input_api.re.compile('Invalid name for preference: (.+)') results = []
diff --git a/third_party/WebKit/Source/bindings/core/v8/DOMDataStore.h b/third_party/WebKit/Source/bindings/core/v8/DOMDataStore.h index 03d9030..2af77e2 100644 --- a/third_party/WebKit/Source/bindings/core/v8/DOMDataStore.h +++ b/third_party/WebKit/Source/bindings/core/v8/DOMDataStore.h
@@ -120,6 +120,17 @@ return m_wrapperMap->newLocal(isolate, object); } + WARN_UNUSED_RESULT bool set(v8::Isolate* isolate, + ScriptWrappable* object, + const WrapperTypeInfo* wrapperTypeInfo, + v8::Local<v8::Object>& wrapper) { + DCHECK(object); + DCHECK(!wrapper.IsEmpty()); + if (m_isMainWorld) + return object->setWrapper(isolate, wrapperTypeInfo, wrapper); + return m_wrapperMap->set(object, wrapperTypeInfo, wrapper); + } + void markWrapper(ScriptWrappable* scriptWrappable) { m_wrapperMap->markWrapper(scriptWrappable); } @@ -138,17 +149,6 @@ } private: - WARN_UNUSED_RESULT bool set(v8::Isolate* isolate, - ScriptWrappable* object, - const WrapperTypeInfo* wrapperTypeInfo, - v8::Local<v8::Object>& wrapper) { - ASSERT(object); - ASSERT(!wrapper.IsEmpty()); - if (m_isMainWorld) - return object->setWrapper(isolate, wrapperTypeInfo, wrapper); - return m_wrapperMap->set(object, wrapperTypeInfo, wrapper); - } - // We can use a wrapper stored in a ScriptWrappable when we're in the main // world. This method does the fast check if we're in the main world. If this // method returns true, it is guaranteed that we're in the main world. On the
diff --git a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp index c402611..049f2df 100644 --- a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
@@ -220,8 +220,9 @@ // The global object, aka window wrapper object. v8::Local<v8::Object> windowWrapper = globalProxy->GetPrototype().As<v8::Object>(); - windowWrapper = V8DOMWrapper::associateObjectWithWrapper( - isolate(), window, wrapperTypeInfo, windowWrapper); + v8::Local<v8::Object> associatedWrapper = + associateWithWrapper(window, wrapperTypeInfo, windowWrapper); + DCHECK(associatedWrapper == windowWrapper); // The prototype object of Window interface. v8::Local<v8::Object> windowPrototype =
diff --git a/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.cpp index 1a413923..b484ebeb 100644 --- a/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.cpp
@@ -35,12 +35,9 @@ #include "bindings/core/v8/DOMWrapperWorld.h" #include "bindings/core/v8/V8DOMWrapper.h" -#include "bindings/core/v8/V8GCForContextDispose.h" -#include "bindings/core/v8/V8Initializer.h" #include "bindings/core/v8/V8Window.h" #include "platform/Histogram.h" #include "platform/ScriptForbiddenScope.h" -#include "platform/heap/Handle.h" #include "platform/instrumentation/tracing/TraceEvent.h" #include "v8/include/v8.h" #include "wtf/Assertions.h" @@ -56,32 +53,14 @@ if (m_lifecycle != Lifecycle::ContextInitialized) return; - if (behavior == DetachGlobal) { - v8::Local<v8::Context> context = m_scriptState->context(); - // Clean up state on the global proxy, which will be reused. - if (!m_globalProxy.isEmpty()) { - CHECK(m_globalProxy == context->Global()); - CHECK_EQ(toScriptWrappable(context->Global()), - toScriptWrappable( - context->Global()->GetPrototype().As<v8::Object>())); - m_globalProxy.get().SetWrapperClassId(0); - } - V8DOMWrapper::clearNativeInfo(isolate(), context->Global()); - m_scriptState->detachGlobalObject(); - + if (behavior == DetachGlobal && !m_globalProxy.isEmpty()) { + m_globalProxy.get().SetWrapperClassId(0); + V8DOMWrapper::clearNativeInfo(isolate(), m_globalProxy.newLocal(isolate())); #if DCHECK_IS_ON() didDetachGlobalObject(); #endif } - m_scriptState->disposePerContextData(); - - // It's likely that disposing the context has created a lot of - // garbage. Notify V8 about this so it'll have a chance of cleaning - // it up when idle. - V8GCForContextDispose::instance().notifyContextDisposed( - frame()->isMainFrame()); - DCHECK(m_lifecycle == Lifecycle::ContextInitialized); m_lifecycle = Lifecycle::ContextDetached; } @@ -96,20 +75,8 @@ ScriptForbiddenScope::AllowUserAgentScript allowScript; v8::HandleScope handleScope(isolate()); - createContext(); - - ScriptState::Scope scope(m_scriptState.get()); - v8::Local<v8::Context> context = m_scriptState->context(); - if (m_globalProxy.isEmpty()) { - m_globalProxy.set(isolate(), context->Global()); - CHECK(!m_globalProxy.isEmpty()); - } - setupWindowPrototypeChain(); - - // Remote frames always require a full canAccess() check. - context->UseDefaultSecurityToken(); } void RemoteWindowProxy::createContext() { @@ -119,26 +86,24 @@ V8Window::domTemplate(isolate(), *m_world)->InstanceTemplate(); CHECK(!globalTemplate.IsEmpty()); - v8::Local<v8::Context> context; - { - V8PerIsolateData::UseCounterDisabledScope useCounterDisabled( - V8PerIsolateData::from(isolate())); - context = v8::Context::New(isolate(), nullptr, globalTemplate, - m_globalProxy.newLocal(isolate())); - } - CHECK(!context.IsEmpty()); + v8::Local<v8::Object> globalProxy = + v8::Context::NewRemoteContext(isolate(), globalTemplate, + m_globalProxy.newLocal(isolate())) + .ToLocalChecked(); + if (m_globalProxy.isEmpty()) + m_globalProxy.set(isolate(), globalProxy); + else + DCHECK(m_globalProxy.get() == globalProxy); + CHECK(!m_globalProxy.isEmpty()); #if DCHECK_IS_ON() didAttachGlobalObject(); #endif - m_scriptState = ScriptState::create(context, m_world); - // TODO(haraken): Currently we cannot enable the following DCHECK because // an already detached window proxy can be re-initialized. This is wrong. // DCHECK(m_lifecycle == Lifecycle::ContextUninitialized); m_lifecycle = Lifecycle::ContextInitialized; - DCHECK(m_scriptState->contextIsValid()); } void RemoteWindowProxy::setupWindowPrototypeChain() { @@ -146,10 +111,9 @@ // corresponding native DOMWindow object. DOMWindow* window = frame()->domWindow(); const WrapperTypeInfo* wrapperTypeInfo = window->wrapperTypeInfo(); - v8::Local<v8::Context> context = m_scriptState->context(); // The global proxy object. Note this is not the global object. - v8::Local<v8::Object> globalProxy = context->Global(); + v8::Local<v8::Object> globalProxy = m_globalProxy.newLocal(isolate()); CHECK(m_globalProxy == globalProxy); V8DOMWrapper::setNativeInfo(isolate(), globalProxy, wrapperTypeInfo, window); // Mark the handle to be traced by Oilpan, since the global proxy has a @@ -159,22 +123,9 @@ // The global object, aka window wrapper object. v8::Local<v8::Object> windowWrapper = globalProxy->GetPrototype().As<v8::Object>(); - windowWrapper = V8DOMWrapper::associateObjectWithWrapper( - isolate(), window, wrapperTypeInfo, windowWrapper); - - // The prototype object of Window interface. - v8::Local<v8::Object> windowPrototype = - windowWrapper->GetPrototype().As<v8::Object>(); - CHECK(!windowPrototype.IsEmpty()); - V8DOMWrapper::setNativeInfo(isolate(), windowPrototype, wrapperTypeInfo, - window); - - // The named properties object of Window interface. - v8::Local<v8::Object> windowProperties = - windowPrototype->GetPrototype().As<v8::Object>(); - CHECK(!windowProperties.IsEmpty()); - V8DOMWrapper::setNativeInfo(isolate(), windowProperties, wrapperTypeInfo, - window); + v8::Local<v8::Object> associatedWrapper = + associateWithWrapper(window, wrapperTypeInfo, windowWrapper); + DCHECK(associatedWrapper == windowWrapper); } } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.h b/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.h index 3e36140..69b5779 100644 --- a/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.h +++ b/third_party/WebKit/Source/bindings/core/v8/RemoteWindowProxy.h
@@ -32,7 +32,6 @@ #define RemoteWindowProxy_h #include "bindings/core/v8/DOMWrapperWorld.h" -#include "bindings/core/v8/ScriptState.h" #include "bindings/core/v8/WindowProxy.h" #include "core/frame/RemoteFrame.h" #include "v8/include/v8.h" @@ -48,7 +47,6 @@ public: static RemoteWindowProxy* create(v8::Isolate* isolate, RemoteFrame& frame, - RefPtr<DOMWrapperWorld> world) { return new RemoteWindowProxy(isolate, frame, std::move(world)); } @@ -68,8 +66,6 @@ // Associates the window wrapper and its prototype chain with the native // DOMWindow object. Also does some more Window-specific initialization. void setupWindowPrototypeChain(); - - RefPtr<ScriptState> m_scriptState; }; } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h index fd55ed1..a2482f12 100644 --- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h +++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.h
@@ -71,7 +71,9 @@ // Version 8: File.lastModified in milliseconds (seconds-based in earlier // versions.) // Version 9: Added Map and Set support. - static const uint32_t wireFormatVersion = 9; + // [versions skipped] + // Version 16: Separate versioning between V8 and Blink. + static const uint32_t wireFormatVersion = 16; struct SerializeOptions { STACK_ALLOCATED();
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp index a92a918..761b4a5 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp
@@ -147,4 +147,18 @@ } } +v8::Local<v8::Object> WindowProxy::associateWithWrapper( + DOMWindow* window, + const WrapperTypeInfo* wrapperTypeInfo, + v8::Local<v8::Object> wrapper) { + if (m_world->domDataStore().set(m_isolate, window, wrapperTypeInfo, + wrapper)) { + wrapperTypeInfo->wrapperCreated(); + V8DOMWrapper::setNativeInfo(m_isolate, wrapper, wrapperTypeInfo, window); + DCHECK(V8DOMWrapper::hasInternalFieldsSet(wrapper)); + } + SECURITY_CHECK(toScriptWrappable(wrapper) == window); + return wrapper; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h index 8bd716c2..03ce52f 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h
@@ -40,6 +40,7 @@ namespace blink { +class DOMWindow; class Frame; class ScriptController; @@ -163,6 +164,11 @@ enum GlobalDetachmentBehavior { DoNotDetachGlobal, DetachGlobal }; virtual void disposeContext(GlobalDetachmentBehavior) = 0; + WARN_UNUSED_RESULT v8::Local<v8::Object> associateWithWrapper( + DOMWindow*, + const WrapperTypeInfo*, + v8::Local<v8::Object> wrapper); + v8::Isolate* isolate() const { return m_isolate; } Frame* frame() const { return m_frame.get(); }
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp index 5bfb83bf..267a8ab 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp
@@ -26,7 +26,8 @@ namespace blink { // The "Blink-side" serialization version, which defines how Blink will behave -// during the serialization process. The serialization format has two +// during the serialization process, is in +// SerializedScriptValue::wireFormatVersion. The serialization format has two // "envelopes": an outer one controlled by Blink and an inner one by V8. // // They are formatted as follows: @@ -40,7 +41,6 @@ // This version number must be incremented whenever any incompatible changes are // made to how Blink writes data. Purely V8-side changes do not require an // adjustment to this value. -static const uint32_t kLatestVersion = 16; V8ScriptValueSerializer::V8ScriptValueSerializer( RefPtr<ScriptState> scriptState, @@ -68,7 +68,7 @@ // Write out the file header. writeTag(VersionTag); - writeUint32(kLatestVersion); + writeUint32(SerializedScriptValue::wireFormatVersion); m_serializer.WriteHeader(); // Serialize the value and handle errors.
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.h b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.h index b35d7a7e..a1f47f7 100644 --- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.h +++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.h
@@ -41,6 +41,8 @@ RefPtr<SerializedScriptValue> serialize(v8::Local<v8::Value>, ExceptionState&); + static const uint32_t kLatestVersion; + protected: // Returns true if the DOM object was successfully written. // If false is returned and no more specific exception is thrown, a generic
diff --git a/third_party/WebKit/Source/bindings/modules/v8/generated.gni b/third_party/WebKit/Source/bindings/modules/v8/generated.gni index b7536970..bb88d74 100644 --- a/third_party/WebKit/Source/bindings/modules/v8/generated.gni +++ b/third_party/WebKit/Source/bindings/modules/v8/generated.gni
@@ -30,8 +30,8 @@ "$bindings_modules_v8_output_dir/ByteStringSequenceSequenceOrDictionaryOrHeaders.h", "$bindings_modules_v8_output_dir/ClientOrServiceWorkerOrMessagePort.cpp", "$bindings_modules_v8_output_dir/ClientOrServiceWorkerOrMessagePort.h", - "$bindings_modules_v8_output_dir/CSSImageValueOrHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.cpp", - "$bindings_modules_v8_output_dir/CSSImageValueOrHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h", + "$bindings_modules_v8_output_dir/CSSImageValueOrHTMLImageElementOrSVGImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.cpp", + "$bindings_modules_v8_output_dir/CSSImageValueOrHTMLImageElementOrSVGImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h", "$bindings_modules_v8_output_dir/DictionaryOrString.cpp", "$bindings_modules_v8_output_dir/DictionaryOrString.h", "$bindings_modules_v8_output_dir/DoubleOrConstrainDoubleRange.cpp",
diff --git a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py index 092a84d1..a5d1986 100755 --- a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py +++ b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
@@ -11,28 +11,47 @@ import make_style_builder from name_utilities import ( - enum_for_css_keyword, enum_value_name, class_member_name, method_name + enum_for_css_keyword, enum_type_name, enum_value_name, class_member_name, method_name ) # Temporary hard-coded list of fields that are not CSS properties. -# Ideally these would be specified in a .json5 file. -NONPROPERTY_FIELDS = [ - {'name': 'IsLink', 'field_template': 'monotonic_flag'}, +# TODO(shend): Put this into its own JSON5 file. +NONPROPERTIES = [ + {'name': 'IsLink', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, + {'name': 'InsideLink', 'field_template': 'keyword', 'initial_keyword': 'not-inside-link', + 'keywords': ['not-inside-link', 'inside-unvisited-link', 'inside-visited-link'], + 'inherited': True, 'independent': False}, # Style can not be shared. - {'name': 'Unique', 'field_template': 'monotonic_flag'}, + {'name': 'Unique', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, # Whether this style is affected by these pseudo-classes. - {'name': 'AffectedByFocus', 'field_template': 'monotonic_flag'}, - {'name': 'AffectedByHover', 'field_template': 'monotonic_flag'}, - {'name': 'AffectedByActive', 'field_template': 'monotonic_flag'}, - {'name': 'AffectedByDrag', 'field_template': 'monotonic_flag'}, + {'name': 'AffectedByFocus', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, + {'name': 'AffectedByHover', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, + {'name': 'AffectedByActive', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, + {'name': 'AffectedByDrag', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, # A non-inherited property references a variable or @apply is used - {'name': 'HasVariableReferenceFromNonInheritedProperty', 'field_template': 'monotonic_flag'}, + {'name': 'HasVariableReferenceFromNonInheritedProperty', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, # Explicitly inherits a non-inherited property - {'name': 'HasExplicitlyInheritedProperties', 'field_template': 'monotonic_flag'}, + {'name': 'HasExplicitlyInheritedProperties', 'field_template': 'monotonic_flag', + 'inherited': False, 'independent': False}, # These properties only have generated storage, and their methods are handwritten in ComputedStyle. # TODO(shend): Remove these fields and delete the 'storage_only' template. - {'name': 'EmptyState', 'field_template': 'storage_only', 'size': 1} + {'name': 'EmptyState', 'field_template': 'storage_only', 'size': 1, 'default_value': 'false', + 'type_name': 'bool', 'inherited': False, 'independent': False}, + {'name': 'StyleType', 'field_template': 'storage_only', 'size': 6, 'default_value': '0', + 'type_name': 'PseudoId', 'inherited': False, 'independent': False}, + {'name': 'PseudoBits', 'field_template': 'storage_only', 'size': 8, 'default_value': 'PseudoIdNone', + 'type_name': 'PseudoId', 'inherited': False, 'independent': False}, + # True if 'underline solid' is the only text decoration on this element. + {'name': 'HasSimpleUnderline', 'field_template': 'storage_only', 'size': 1, 'default_value': 'false', + 'type_name': 'bool', 'inherited': True, 'independent': False}, ] @@ -82,7 +101,7 @@ assert (self.is_property, self.is_inherited_flag, self.is_nonproperty).count(True) == 1, \ 'Field role has to be exactly one of: property, inherited_flag, nonproperty' - if self.is_property: + if not self.is_inherited_flag: self.is_inherited = kwargs.pop('inherited') self.is_independent = kwargs.pop('independent') assert self.is_inherited or not self.is_independent, 'Only inherited fields can be independent' @@ -133,27 +152,41 @@ return enums -def _create_property_field(property_): +def _create_field(field_role, property_): """ - Create a property field from a CSS property and return the Field object. + Create a property or nonproperty field. """ - bits_needed = math.log(len(property_['keywords']), 2) # TODO: implement for non-enums - type_name = property_['type_name'] + assert field_role in ('property', 'nonproperty') - assert property_['initial_keyword'] is not None, \ - ('MakeComputedStyleBase requires an initial keyword for keyword fields, none specified ' - 'for property ' + property_['name']) - default_value = type_name + '::' + enum_value_name(property_['initial_keyword']) + name_for_methods = property_['name_for_methods'] + + if property_['field_template'] == 'keyword': + assert property_['initial_keyword'] is not None, \ + ('MakeComputedStyleBase requires an initial keyword for keyword fields, none specified ' + 'for property ' + property_['name']) + type_name = property_['type_name'] + default_value = type_name + '::' + enum_value_name(property_['initial_keyword']) + size = int(math.ceil(math.log(len(property_['keywords']), 2))) + elif property_['field_template'] == 'storage_only': + # 'storage_only' fields need to specify a size, type_name and default_value + type_name = property_['type_name'] + default_value = property_['default_value'] + size = property_['size'] + else: + assert property_['field_template'] in ('flag', 'monotonic_flag') + type_name = 'bool' + default_value = 'false' + size = 1 return Field( - 'property', - property_['name_for_methods'], + field_role, + name_for_methods, property_name=property_['name'], inherited=property_['inherited'], independent=property_['independent'], type_name=type_name, field_template=property_['field_template'], - size=int(math.ceil(bits_needed)), + size=size, default_value=default_value, ) @@ -174,35 +207,9 @@ ) -def _create_nonproperty_field(property_): +def _create_fields(field_role, properties): """ - Create a nonproperty field from an entry in NONPROPERTY_FIELDS and return the Field object. - """ - # TODO(shend): Make this work for nonflags - assert property_['field_template'] in ('flag', 'monotonic_flag', 'storage_only'), \ - "Nonproperties with arbitrary templates are not yet supported" - - if property_['field_template'] == 'storage_only': - assert 'size' in property_, 'storage_only fields need to specify a size' - size = property_['size'] - else: - # Otherwise the field must be some type of flag. - size = 1 - - return Field( - 'nonproperty', - property_['name_for_methods'], - property_name=property_['name'], - type_name='bool', - field_template=property_['field_template'], - size=size, - default_value='false', - ) - - -def _create_fields(properties): - """ - Create ComputedStyle fields from CSS properties and return a list of Field objects. + Create ComputedStyle fields from properties or nonproperties and return a list of Field objects. """ fields = [] for property_ in properties: @@ -213,13 +220,7 @@ if property_['independent']: fields.append(_create_inherited_flag_field(property_)) - fields.append(_create_property_field(property_)) - - # TODO(shend): Merge NONPROPERTY_FIELDS with property_values so that properties and - # nonproperties can be treated uniformly. - for property_ in NONPROPERTY_FIELDS: - property_['name_for_methods'] = property_['name'] - fields.append(_create_nonproperty_field(property_)) + fields.append(_create_field(field_role, property_)) return fields @@ -267,6 +268,15 @@ 'CSSValueIDMappingsGenerated.h': self.generate_css_value_mappings, } + # TODO(shend): Remove this once we move NONPROPERTIES to its own JSON file, + # since the JSON5 reader will handle missing fields and defaults. + for property_ in NONPROPERTIES: + property_['name_for_methods'] = property_['name'] + if 'field_type_path' not in property_: + property_['field_type_path'] = None + if 'type_name' not in property_: + property_['type_name'] = 'E' + enum_type_name(property_['name_for_methods']) + property_values = self._properties.values() # Override the type name when field_type_path is specified @@ -274,11 +284,10 @@ if property_['field_type_path']: property_['type_name'] = property_['field_type_path'].split('/')[-1] - # Create all the enums used by properties - self._generated_enums = _create_enums(self._properties.values()) + self._generated_enums = _create_enums(property_values + NONPROPERTIES) - # Create all the fields - all_fields = _create_fields(self._properties.values()) + all_fields = (_create_fields('property', property_values) + + _create_fields('nonproperty', NONPROPERTIES)) # Group fields into buckets field_buckets = _pack_fields(all_fields) @@ -292,13 +301,13 @@ # incorrect value, either the packing algorithm is not optimal or there # is no way to pack the fields such that excess padding space is not # added. - # If this fails, increase extra_padding_bytes by 1, but be aware that + # If this fails, increase padding_bytes by 1, but be aware that # this also increases ComputedStyleBase by 1 word. - # We should be able to bring extra_padding_bytes back to 0 from time to + # We should be able to bring padding_bytes back to 0 from time to # time. - extra_padding_bytes = 0 + padding_bytes = 0 optimal_total_field_bytes = int(math.ceil(sum(f.size for f in all_fields) / 32.0)) - real_total_field_bytes = optimal_total_field_bytes + extra_padding_bytes + real_total_field_bytes = optimal_total_field_bytes + padding_bytes assert self._expected_total_field_bytes == real_total_field_bytes, \ ('The field packing algorithm produced %s bytes, optimal is %s bytes' % (self._expected_total_field_bytes, real_total_field_bytes)) @@ -309,7 +318,7 @@ for field in bucket: self._fields.append(field) - self._include_paths = _get_include_paths(self._properties.values()) + self._include_paths = _get_include_paths(property_values + NONPROPERTIES) @template_expander.use_jinja('ComputedStyleBase.h.tmpl')
diff --git a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.cpp.tmpl index 2f1fc57..5e738d2 100644 --- a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.cpp.tmpl +++ b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.cpp.tmpl
@@ -16,7 +16,7 @@ void ComputedStyleBase::inheritFrom(const ComputedStyleBase& inheritParent, IsAtShadowBoundary isAtShadowBoundary) { - {% for field in fields if field.is_property and field.is_inherited %} + {% for field in fields if field.is_inherited %} {{field.name}} = inheritParent.{{field.name}}; {% endfor %} }
diff --git a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl index c5cc54b..ccdbb47 100644 --- a/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl +++ b/third_party/WebKit/Source/build/scripts/templates/ComputedStyleBase.h.tmpl
@@ -4,7 +4,7 @@ #ifndef ComputedStyleBase_h #define ComputedStyleBase_h -#include "core/ComputedStyleBaseConstants.h" +#include "core/style/ComputedStyleConstants.h" #include "core/CoreExport.h" {% for path in include_paths %} #include "{{path}}" @@ -29,7 +29,7 @@ public: inline bool independentInheritedEqual(const ComputedStyleBase& o) const { return ( - {% for field in fields if field.is_property and field.is_inherited and field.is_independent %} + {% for field in fields if field.is_inherited and field.is_independent %} {{field.name}} == o.{{field.name}}{{print_if(not loop.last, ' &&')}} {% endfor %} ); @@ -37,7 +37,7 @@ inline bool nonIndependentInheritedEqual(const ComputedStyleBase& o) const { return ( - {% for field in fields if field.is_property and field.is_inherited and not field.is_independent %} + {% for field in fields if field.is_inherited and not field.is_independent %} {{field.name}} == o.{{field.name}}{{print_if(not loop.last, ' &&')}} {% endfor %} );
diff --git a/third_party/WebKit/Source/build/scripts/templates/fields/storage_only.tmpl b/third_party/WebKit/Source/build/scripts/templates/fields/storage_only.tmpl index 9639b18..551d2cc1 100644 --- a/third_party/WebKit/Source/build/scripts/templates/fields/storage_only.tmpl +++ b/third_party/WebKit/Source/build/scripts/templates/fields/storage_only.tmpl
@@ -1,3 +1,3 @@ {% macro decl_methods(field) -%} -// Not generated +// Getters and setters not generated {%- endmacro %}
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn index c2e4329..d670e35 100644 --- a/third_party/WebKit/Source/core/BUILD.gn +++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1332,6 +1332,7 @@ "loader/ProgressTrackerTest.cpp", "loader/TextResourceDecoderBuilderTest.cpp", "loader/ThreadableLoaderTest.cpp", + "loader/modulescript/ModuleScriptLoaderTest.cpp", "loader/resource/CSSStyleSheetResourceTest.cpp", "loader/resource/FontResourceTest.cpp", "loader/resource/ImageResourceTest.cpp",
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn index da41d11..cbb07da 100644 --- a/third_party/WebKit/Source/core/css/BUILD.gn +++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -10,9 +10,11 @@ "ActiveStyleSheets.cpp", "ActiveStyleSheets.h", "BasicShapeFunctions.cpp", + "BasicShapeFunctions.h", "BinaryDataFontFaceSource.cpp", "BinaryDataFontFaceSource.h", "CSSBasicShapeValues.cpp", + "CSSBasicShapeValues.h", "CSSBorderImage.cpp", "CSSBorderImage.h", "CSSBorderImageSliceValue.cpp", @@ -22,6 +24,7 @@ "CSSColorValue.cpp", "CSSColorValue.h", "CSSComputedStyleDeclaration.cpp", + "CSSComputedStyleDeclaration.h", "CSSConditionRule.cpp", "CSSConditionRule.h", "CSSContentDistributionValue.cpp", @@ -31,6 +34,7 @@ "CSSCrossfadeValue.cpp", "CSSCrossfadeValue.h", "CSSCursorImageValue.cpp", + "CSSCursorImageValue.h", "CSSCustomFontData.h", "CSSCustomIdentValue.cpp", "CSSCustomIdentValue.h", @@ -72,8 +76,11 @@ "CSSIdentifierValue.cpp", "CSSIdentifierValue.h", "CSSImageGeneratorValue.cpp", + "CSSImageGeneratorValue.h", "CSSImageSetValue.cpp", + "CSSImageSetValue.h", "CSSImageValue.cpp", + "CSSImageValue.h", "CSSImportRule.cpp", "CSSImportRule.h", "CSSInheritedValue.cpp", @@ -106,12 +113,15 @@ "CSSPrimitiveValue.h", "CSSPrimitiveValueMappings.h", "CSSProperty.cpp", + "CSSProperty.h", "CSSPropertyEquality.cpp", "CSSPropertyEquality.h", "CSSPropertySourceData.cpp", + "CSSPropertySourceData.h", "CSSQuadValue.cpp", "CSSQuadValue.h", "CSSReflectValue.cpp", + "CSSReflectValue.h", "CSSRule.cpp", "CSSRule.h", "CSSRuleList.cpp", @@ -119,6 +129,7 @@ "CSSSegmentedFontFace.cpp", "CSSSegmentedFontFace.h", "CSSSelector.cpp", + "CSSSelector.h", "CSSSelectorList.cpp", "CSSSelectorList.h", "CSSShadowValue.cpp", @@ -148,8 +159,10 @@ "CSSUnsetValue.cpp", "CSSUnsetValue.h", "CSSValue.cpp", + "CSSValue.h", "CSSValueIDMappings.h", "CSSValueList.cpp", + "CSSValueList.h", "CSSValuePair.cpp", "CSSValuePair.h", "CSSValuePool.cpp", @@ -201,8 +214,11 @@ "MediaQueryMatcher.cpp", "MediaQueryMatcher.h", "MediaValues.cpp", + "MediaValues.h", "MediaValuesCached.cpp", + "MediaValuesCached.h", "MediaValuesDynamic.cpp", + "MediaValuesDynamic.h", "MediaValuesInitialViewport.cpp", "MediaValuesInitialViewport.h", "PageRuleCollector.cpp", @@ -326,9 +342,11 @@ "parser/CSSParserImpl.h", "parser/CSSParserMode.h", "parser/CSSParserObserverWrapper.cpp", + "parser/CSSParserObserverWrapper.h", "parser/CSSParserSelector.cpp", "parser/CSSParserSelector.h", "parser/CSSParserToken.cpp", + "parser/CSSParserToken.h", "parser/CSSParserTokenRange.cpp", "parser/CSSParserTokenRange.h", "parser/CSSPropertyParser.cpp", @@ -340,15 +358,21 @@ "parser/CSSSupportsParser.cpp", "parser/CSSSupportsParser.h", "parser/CSSTokenizer.cpp", + "parser/CSSTokenizer.h", "parser/CSSTokenizerInputStream.cpp", + "parser/CSSTokenizerInputStream.h", "parser/CSSVariableParser.cpp", "parser/CSSVariableParser.h", "parser/FontVariantLigaturesParser.h", "parser/FontVariantNumericParser.h", "parser/MediaQueryBlockWatcher.cpp", + "parser/MediaQueryBlockWatcher.h", "parser/MediaQueryParser.cpp", + "parser/MediaQueryParser.h", "parser/SizesAttributeParser.cpp", + "parser/SizesAttributeParser.h", "parser/SizesCalcParser.cpp", + "parser/SizesCalcParser.h", "properties/CSSPropertyAPIAlignItems.cpp", "properties/CSSPropertyAPIAlignOrJustifyContent.cpp", "properties/CSSPropertyAPIAlignOrJustifySelf.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSSelectorList.cpp b/third_party/WebKit/Source/core/css/CSSSelectorList.cpp index 3af0331d..7cac8c8 100644 --- a/third_party/WebKit/Source/core/css/CSSSelectorList.cpp +++ b/third_party/WebKit/Source/core/css/CSSSelectorList.cpp
@@ -44,7 +44,7 @@ CSSSelectorList CSSSelectorList::copy() const { CSSSelectorList list; - unsigned length = this->length(); + unsigned length = this->computeLength(); list.m_selectorArray = reinterpret_cast<CSSSelector*>(WTF::Partitions::fastMalloc( sizeof(CSSSelector) * length, kCSSSelectorTypeName)); @@ -94,7 +94,7 @@ return list; } -unsigned CSSSelectorList::length() const { +unsigned CSSSelectorList::computeLength() const { if (!m_selectorArray) return 0; CSSSelector* current = m_selectorArray;
diff --git a/third_party/WebKit/Source/core/css/CSSSelectorList.h b/third_party/WebKit/Source/core/css/CSSSelectorList.h index ad7bc10..3da863d4 100644 --- a/third_party/WebKit/Source/core/css/CSSSelectorList.h +++ b/third_party/WebKit/Source/core/css/CSSSelectorList.h
@@ -81,8 +81,11 @@ String selectorsText() const; + // Selector lists don't know their length, computing it is O(n) and should be + // avoided when possible. Instead iterate from first() and using next(). + unsigned computeLength() const; + private: - unsigned length() const; void deleteSelectorsIfNeeded() { if (m_selectorArray)
diff --git a/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp b/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp index e2b803d..7e8a75f 100644 --- a/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp +++ b/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp
@@ -644,11 +644,7 @@ if (!value.isID) return false; - if (value.id == CSSValueOnDemand) - UseCounter::count(mediaValues.document(), UseCounter::CSSValueOnDemand); - return (hover == HoverTypeNone && value.id == CSSValueNone) || - (hover == HoverTypeOnDemand && value.id == CSSValueOnDemand) || (hover == HoverTypeHover && value.id == CSSValueHover); } @@ -666,9 +662,6 @@ switch (value.id) { case CSSValueNone: return availableHoverTypes & HoverTypeNone; - case CSSValueOnDemand: - UseCounter::count(mediaValues.document(), UseCounter::CSSValueOnDemand); - return availableHoverTypes & HoverTypeOnDemand; case CSSValueHover: return availableHoverTypes & HoverTypeHover; default:
diff --git a/third_party/WebKit/Source/core/css/MediaQueryExp.cpp b/third_party/WebKit/Source/core/css/MediaQueryExp.cpp index ada0478..b20be6a 100644 --- a/third_party/WebKit/Source/core/css/MediaQueryExp.cpp +++ b/third_party/WebKit/Source/core/css/MediaQueryExp.cpp
@@ -55,8 +55,7 @@ ident == CSSValueFine; if (mediaFeature == hoverMediaFeature || mediaFeature == anyHoverMediaFeature) - return ident == CSSValueNone || ident == CSSValueOnDemand || - ident == CSSValueHover; + return ident == CSSValueNone || ident == CSSValueHover; if (mediaFeature == scanMediaFeature) return ident == CSSValueInterlace || ident == CSSValueProgressive;
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn index 05345e2..04c77b67 100644 --- a/third_party/WebKit/Source/core/dom/BUILD.gn +++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -12,10 +12,12 @@ "AXObjectCache.h", "AnimationWorkletProxyClient.h", "Attr.cpp", + "Attr.h", "AttributeCollection.h", "CDATASection.cpp", "CDATASection.h", "CSSSelectorWatch.cpp", + "CSSSelectorWatch.h", "CharacterData.cpp", "ChildFrameDisconnector.cpp", "ChildFrameDisconnector.h", @@ -40,6 +42,7 @@ "CompositorWorkerProxyClient.cpp", "CompositorWorkerProxyClient.h", "ContainerNode.cpp", + "ContainerNode.h", "ContextFeatures.cpp", "ContextFeatures.h", "ContextLifecycleNotifier.cpp", @@ -57,6 +60,7 @@ "DOMException.cpp", "DOMException.h", "DOMImplementation.cpp", + "DOMImplementation.h", "DOMMatrix.cpp", "DOMMatrix.h", "DOMMatrixReadOnly.cpp", @@ -97,6 +101,7 @@ "DocumentEncodingData.cpp", "DocumentEncodingData.h", "DocumentFragment.cpp", + "DocumentFragment.h", "DocumentFullscreen.cpp", "DocumentFullscreen.h", "DocumentInit.cpp", @@ -107,6 +112,7 @@ "DocumentOrderedList.cpp", "DocumentOrderedList.h", "DocumentOrderedMap.cpp", + "DocumentOrderedMap.h", "DocumentParser.cpp", "DocumentParser.h", "DocumentParserTiming.cpp", @@ -120,6 +126,7 @@ "DocumentTiming.cpp", "DocumentTiming.h", "DocumentType.cpp", + "DocumentType.h", "Element.cpp", "Element.h", "ElementData.cpp", @@ -199,6 +206,7 @@ "NameNodeList.cpp", "NameNodeList.h", "NamedNodeMap.cpp", + "NamedNodeMap.h", "Node.cpp", "NodeChildRemovalTracker.cpp", "NodeChildRemovalTracker.h", @@ -223,6 +231,7 @@ "NthIndexCache.h", "ParentNode.h", "PendingScript.cpp", + "PendingScript.h", "PresentationAttributeStyle.cpp", "PresentationAttributeStyle.h", "ProcessingInstruction.cpp", @@ -230,6 +239,7 @@ "PseudoElement.cpp", "PseudoElementData.h", "QualifiedName.cpp", + "QualifiedName.h", "Range.cpp", "RawDataDocumentParser.h", "RemoteSecurityContext.cpp", @@ -269,6 +279,7 @@ "SinkDocument.cpp", "SinkDocument.h", "SpaceSplitString.cpp", + "SpaceSplitString.h", "StaticNodeList.h", "StaticRange.cpp", "StaticRange.h", @@ -286,6 +297,7 @@ "StyleSheetCollection.cpp", "StyleSheetCollection.h", "SuspendableObject.cpp", + "SuspendableObject.h", "SynchronousMutationNotifier.cpp", "SynchronousMutationNotifier.h", "SynchronousMutationObserver.cpp",
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index e416c68..218fbb4 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -2726,9 +2726,15 @@ } } - // PlzNavigate: We should abort ongoing navigations handled by the client. - if (m_frame->loader().hasProvisionalNavigation()) + if (m_frame->loader().hasProvisionalNavigation()) { m_frame->loader().stopAllLoaders(); + // PlzNavigate: navigations handled by the client should also be + // cancelled. + if (m_frame->loader().client() && + m_frame->settings()->getBrowserSideNavigationEnabled()) { + m_frame->loader().client()->abortClientNavigation(); + } + } } removeAllEventListenersRecursively(); @@ -3299,13 +3305,6 @@ MainThreadDebugger::instance()->exceptionThrown(this, event); } -KURL Document::urlForBinding() { - if (!url().isNull()) { - return url(); - } - return blankURL(); -} - void Document::setURL(const KURL& url) { const KURL& newURL = url.isEmpty() ? blankURL() : url; if (newURL == m_url)
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h index a96d14e..83ac390 100644 --- a/third_party/WebKit/Source/core/dom/Document.h +++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -593,14 +593,9 @@ bool wellFormed() const { return m_wellFormed; } - // Return the document URL, or an empty URL if it's unavailable. - // This is not an implementation of web-exposed Document.prototype.URL. const KURL& url() const { return m_url; } void setURL(const KURL&); - // Bind the url to document.url, if unavailable bind to about:blank. - KURL urlForBinding(); - // To understand how these concepts relate to one another, please see the // comments surrounding their declaration. const KURL& baseURL() const { return m_baseURL; }
diff --git a/third_party/WebKit/Source/core/dom/Document.idl b/third_party/WebKit/Source/core/dom/Document.idl index 575e640..68a3907 100644 --- a/third_party/WebKit/Source/core/dom/Document.idl +++ b/third_party/WebKit/Source/core/dom/Document.idl
@@ -37,9 +37,9 @@ // FIXME: Document should have a constructor. crbug.com/238234 interface Document : Node { [SameObject] readonly attribute DOMImplementation implementation; - [ImplementedAs=urlForBinding] readonly attribute DOMString URL; + readonly attribute DOMString URL; // FIXME: documentURI should not be nullable. - [ImplementedAs=urlForBinding] readonly attribute DOMString? documentURI; + [ImplementedAs=url] readonly attribute DOMString? documentURI; [MeasureAs=DocumentOrigin] readonly attribute DOMString origin; [RuntimeEnabled=suborigins] readonly attribute DOMString suborigin; readonly attribute DOMString compatMode;
diff --git a/third_party/WebKit/Source/core/dom/Modulator.h b/third_party/WebKit/Source/core/dom/Modulator.h index 393d2557..353c995 100644 --- a/third_party/WebKit/Source/core/dom/Modulator.h +++ b/third_party/WebKit/Source/core/dom/Modulator.h
@@ -8,6 +8,8 @@ #include "core/CoreExport.h" #include "platform/heap/Handle.h" #include "platform/weborigin/KURL.h" +#include "platform/weborigin/ReferrerPolicy.h" +#include "wtf/text/WTFString.h" namespace blink { @@ -15,7 +17,9 @@ class ModuleScript; class ModuleScriptFetchRequest; class ModuleScriptLoaderClient; +class ScriptModule; class ScriptModuleResolver; +class SecurityOrigin; class WebTaskRunner; // A SingleModuleClient is notified when single module script node (node as in a @@ -41,11 +45,16 @@ virtual ScriptModuleResolver* scriptModuleResolver() = 0; virtual WebTaskRunner* taskRunner() = 0; + virtual ReferrerPolicy referrerPolicy() = 0; + virtual SecurityOrigin* securityOrigin() = 0; // https://html.spec.whatwg.org/#resolve-a-module-specifier static KURL resolveModuleSpecifier(const String& moduleRequest, const KURL& baseURL); + virtual ScriptModule compileModule(const String& script, + const String& urlStr) = 0; + private: friend class ModuleMap;
diff --git a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp index e38f507..c3b21eaf 100644 --- a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp +++ b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp
@@ -131,7 +131,7 @@ } Element* SelectorQuery::closest(Element& targetElement) const { - if (m_selectors.size() == 0) + if (m_selectors.isEmpty()) return nullptr; if (m_needsUpdatedDistribution) targetElement.updateDistribution(); @@ -559,18 +559,11 @@ return WTF::wrapUnique(new SelectorQuery(std::move(selectorList))); } -SelectorQuery::SelectorQuery(CSSSelectorList selectorList) { - m_selectorList = std::move(selectorList); - DCHECK(m_selectors.isEmpty()); - - unsigned selectorCount = 0; - for (const CSSSelector* selector = m_selectorList.first(); selector; - selector = CSSSelectorList::next(*selector)) - selectorCount++; - - m_usesDeepCombinatorOrShadowPseudo = false; - m_needsUpdatedDistribution = false; - m_selectors.reserveInitialCapacity(selectorCount); +SelectorQuery::SelectorQuery(CSSSelectorList selectorList) + : m_selectorList(std::move(selectorList)), + m_usesDeepCombinatorOrShadowPseudo(false), + m_needsUpdatedDistribution(false) { + m_selectors.reserveInitialCapacity(m_selectorList.computeLength()); for (const CSSSelector* selector = m_selectorList.first(); selector; selector = CSSSelectorList::next(*selector)) { if (selector->matchesPseudoElement())
diff --git a/third_party/WebKit/Source/core/dom/SelectorQuery.h b/third_party/WebKit/Source/core/dom/SelectorQuery.h index 3dbe7653..149cf5b3 100644 --- a/third_party/WebKit/Source/core/dom/SelectorQuery.h +++ b/third_party/WebKit/Source/core/dom/SelectorQuery.h
@@ -104,6 +104,10 @@ typename SelectorQueryTrait::OutputType&) const; CSSSelectorList m_selectorList; + // Contains the list of CSSSelector's to match, but without ones that could + // never match like pseudo elements, div::before. This can be empty, while + // m_selectorList will never be empty as SelectorQueryCache::add would have + // thrown an exception. Vector<const CSSSelector*> m_selectors; bool m_usesDeepCombinatorOrShadowPseudo : 1; bool m_needsUpdatedDistribution : 1;
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp index 0de4d370c..b22c20b3 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp +++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp
@@ -345,6 +345,7 @@ m_dirtyTreeScopes.clear(); m_documentScopeDirty = false; m_allTreeScopesDirty = false; + m_treeScopesRemoved = false; } void StyleEngine::updateViewport() { @@ -391,6 +392,7 @@ m_styleSheetCollectionMap.erase(shadowRoot); m_activeTreeScopes.erase(shadowRoot); m_dirtyTreeScopes.erase(shadowRoot); + m_treeScopesRemoved = true; resetAuthorStyle(*shadowRoot); }
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.h b/third_party/WebKit/Source/core/dom/StyleEngine.h index 0df63e6..c2105dd9 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.h +++ b/third_party/WebKit/Source/core/dom/StyleEngine.h
@@ -267,8 +267,8 @@ private: StyleEngine(Document&); bool needsActiveStyleSheetUpdate() const { - return m_allTreeScopesDirty || m_documentScopeDirty || - m_dirtyTreeScopes.size(); + return m_allTreeScopesDirty || m_treeScopesRemoved || + m_documentScopeDirty || m_dirtyTreeScopes.size(); } TreeScopeStyleSheetCollection* ensureStyleSheetCollectionFor(TreeScope&); @@ -353,6 +353,7 @@ bool m_documentScopeDirty = true; bool m_allTreeScopesDirty = false; + bool m_treeScopesRemoved = false; UnorderedTreeScopeSet m_dirtyTreeScopes; UnorderedTreeScopeSet m_activeTreeScopes; DocumentOrderedList m_treeBoundaryCrossingScopes;
diff --git a/third_party/WebKit/Source/core/editing/BUILD.gn b/third_party/WebKit/Source/core/editing/BUILD.gn index 417c089..30eceea 100644 --- a/third_party/WebKit/Source/core/editing/BUILD.gn +++ b/third_party/WebKit/Source/core/editing/BUILD.gn
@@ -17,9 +17,12 @@ "DragCaret.h", "EditingBehavior.cpp", "EditingBehavior.h", + "EditingBehaviorTypes.h", + "EditingBoundary.h", "EditingStrategy.cpp", "EditingStrategy.h", "EditingStyle.cpp", + "EditingStyle.h", "EditingStyleUtilities.cpp", "EditingStyleUtilities.h", "EditingUtilities.cpp", @@ -31,7 +34,9 @@ "FrameCaret.cpp", "FrameCaret.h", "FrameSelection.cpp", + "FrameSelection.h", "GranularityStrategy.cpp", + "GranularityStrategy.h", "InputMethodController.cpp", "InputMethodController.h", "PendingSelection.cpp", @@ -56,6 +61,7 @@ "SelectionEditor.h", "SelectionModifier.cpp", "SelectionModifier.h", + "SelectionStrategy.h", "SelectionTemplate.cpp", "SelectionTemplate.h", "SelectionType.h", @@ -63,9 +69,14 @@ "SurroundingText.h", "TextAffinity.cpp", "TextAffinity.h", + "TextGranularity.h", "VisiblePosition.cpp", + "VisiblePosition.h", "VisibleSelection.cpp", + "VisibleSelection.h", "VisibleUnits.cpp", + "VisibleUnits.h", + "WritingDirection.h", "commands/AppendNodeCommand.cpp", "commands/AppendNodeCommand.h", "commands/ApplyBlockElementCommand.cpp", @@ -90,6 +101,7 @@ "commands/EditingState.cpp", "commands/EditingState.h", "commands/EditorCommand.cpp", + "commands/EditorCommandNames.h", "commands/FormatBlockCommand.cpp", "commands/FormatBlockCommand.h", "commands/IndentOutdentCommand.cpp", @@ -147,16 +159,21 @@ "commands/WrapContentsInDummySpanCommand.cpp", "commands/WrapContentsInDummySpanCommand.h", "iterators/BackwardsCharacterIterator.cpp", + "iterators/BackwardsCharacterIterator.h", "iterators/BackwardsTextBuffer.cpp", "iterators/BackwardsTextBuffer.h", "iterators/BitStack.cpp", + "iterators/BitStack.h", "iterators/CharacterIterator.cpp", + "iterators/CharacterIterator.h", "iterators/ForwardsTextBuffer.cpp", "iterators/ForwardsTextBuffer.h", "iterators/FullyClippedStateStack.cpp", + "iterators/FullyClippedStateStack.h", "iterators/SearchBuffer.cpp", "iterators/SearchBuffer.h", "iterators/SimplifiedBackwardsTextIterator.cpp", + "iterators/SimplifiedBackwardsTextIterator.h", "iterators/TextBufferBase.cpp", "iterators/TextBufferBase.h", "iterators/TextIterator.cpp", @@ -168,6 +185,7 @@ "iterators/TextSearcherICU.cpp", "iterators/TextSearcherICU.h", "iterators/WordAwareIterator.cpp", + "iterators/WordAwareIterator.h", "markers/DocumentMarker.cpp", "markers/DocumentMarker.h", "markers/DocumentMarkerController.cpp", @@ -264,6 +282,7 @@ "iterators/TextIteratorTest.cpp", "iterators/TextSearcherICUTest.cpp", "markers/DocumentMarkerControllerTest.cpp", + "markers/DocumentMarkerTest.cpp", "serializers/StyledMarkupSerializerTest.cpp", "spellcheck/IdleSpellCheckCallbackTest.cpp", "spellcheck/SpellCheckTestBase.cpp", @@ -275,6 +294,7 @@ "state_machines/ForwardCodePointStateMachineTest.cpp", "state_machines/ForwardGraphemeBoundaryStateMachineTest.cpp", "state_machines/StateMachineTestUtil.cpp", + "state_machines/StateMachineTestUtil.h", "state_machines/StateMachineUtilTest.cpp", ]
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarker.h b/third_party/WebKit/Source/core/editing/markers/DocumentMarker.h index 7db49d1..dbcfdf2 100644 --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarker.h +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarker.h
@@ -55,6 +55,46 @@ Composition = 1 << CompositionMarkerIndex, }; + class MarkerTypesIterator + : public std::iterator<std::forward_iterator_tag, MarkerType> { + public: + explicit MarkerTypesIterator(unsigned markerTypes) + : m_remainingTypes(markerTypes) {} + MarkerTypesIterator(const MarkerTypesIterator& other) = default; + + bool operator==(const MarkerTypesIterator& other) { + return m_remainingTypes == other.m_remainingTypes; + } + bool operator!=(const MarkerTypesIterator& other) { + return !operator==(other); + } + + MarkerTypesIterator& operator++() { + DCHECK(m_remainingTypes); + // Turn off least significant 1-bit (from Hacker's Delight 2-1) + // Example: + // 7: 7 & 6 = 6 + // 6: 6 & 5 = 4 + // 4: 4 & 3 = 0 + m_remainingTypes &= (m_remainingTypes - 1); + return *this; + } + + MarkerType operator*() const { + DCHECK(m_remainingTypes); + // Isolate least significant 1-bit (from Hacker's Delight 2-1) + // Example: + // 7: 7 & -7 = 1 + // 6: 6 & -6 = 2 + // 4: 4 & -4 = 4 + return static_cast<MarkerType>(m_remainingTypes & + (~m_remainingTypes + 1)); + } + + private: + unsigned m_remainingTypes; + }; + class MarkerTypes { public: // The constructor is intentionally implicit to allow conversion from the @@ -72,6 +112,9 @@ void add(const MarkerTypes& types) { m_mask |= types.m_mask; } void remove(const MarkerTypes& types) { m_mask &= ~types.m_mask; } + MarkerTypesIterator begin() const { return MarkerTypesIterator(m_mask); } + MarkerTypesIterator end() const { return MarkerTypesIterator(0); } + private: unsigned m_mask; };
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerTest.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerTest.cpp new file mode 100644 index 0000000..f6077a07 --- /dev/null +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerTest.cpp
@@ -0,0 +1,48 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/editing/markers/DocumentMarker.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +class DocumentMarkerTest : public ::testing::Test {}; + +TEST_F(DocumentMarkerTest, MarkerTypeIteratorEmpty) { + DocumentMarker::MarkerTypes types(0); + EXPECT_TRUE(types.begin() == types.end()); +} + +TEST_F(DocumentMarkerTest, MarkerTypeIteratorOne) { + DocumentMarker::MarkerTypes types(DocumentMarker::Spelling); + ASSERT_TRUE(types.begin() != types.end()); + auto it = types.begin(); + EXPECT_EQ(DocumentMarker::Spelling, *it); + ++it; + EXPECT_TRUE(it == types.end()); +} + +TEST_F(DocumentMarkerTest, MarkerTypeIteratorConsecutive) { + DocumentMarker::MarkerTypes types(0b11); // Spelling | Grammar + ASSERT_TRUE(types.begin() != types.end()); + auto it = types.begin(); + EXPECT_EQ(DocumentMarker::Spelling, *it); + ++it; + EXPECT_EQ(DocumentMarker::Grammar, *it); + ++it; + EXPECT_TRUE(it == types.end()); +} + +TEST_F(DocumentMarkerTest, MarkerTypeIteratorDistributed) { + DocumentMarker::MarkerTypes types(0b101); // Spelling | TextMatch + ASSERT_TRUE(types.begin() != types.end()); + auto it = types.begin(); + EXPECT_EQ(DocumentMarker::Spelling, *it); + ++it; + EXPECT_EQ(DocumentMarker::TextMatch, *it); + ++it; + EXPECT_TRUE(it == types.end()); +} +}
diff --git a/third_party/WebKit/Source/core/events/BUILD.gn b/third_party/WebKit/Source/core/events/BUILD.gn index fc898f9e..fb13fee 100644 --- a/third_party/WebKit/Source/core/events/BUILD.gn +++ b/third_party/WebKit/Source/core/events/BUILD.gn
@@ -37,6 +37,7 @@ "EventDispatcher.cpp", "EventDispatcher.h", "EventListenerMap.cpp", + "EventListenerMap.h", "EventPath.cpp", "EventPath.h", "EventQueue.h", @@ -58,6 +59,7 @@ "MessageEvent.cpp", "MessageEvent.h", "MouseEvent.cpp", + "MouseEvent.h", "MutationEvent.cpp", "MutationEvent.h", "NavigatorEvents.cpp", @@ -95,7 +97,9 @@ "TreeScopeEventContext.cpp", "TreeScopeEventContext.h", "UIEvent.cpp", + "UIEvent.h", "UIEventWithKeyState.cpp", + "UIEventWithKeyState.h", "VisualViewportResizeEvent.cpp", "VisualViewportResizeEvent.h", "VisualViewportScrollEvent.cpp",
diff --git a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.idl b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.idl index 0410fc1..1b1a54f 100644 --- a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.idl +++ b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEvent.idl
@@ -45,6 +45,5 @@ [Measure] readonly attribute unsigned short statusCode; readonly attribute long lineNumber; readonly attribute long columnNumber; - [RuntimeEnabled=ExperimentalContentSecurityPolicyFeatures] readonly attribute DOMString sample; };
diff --git a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEventInit.idl b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEventInit.idl index f2d1ed6..777f1a5 100644 --- a/third_party/WebKit/Source/core/events/SecurityPolicyViolationEventInit.idl +++ b/third_party/WebKit/Source/core/events/SecurityPolicyViolationEventInit.idl
@@ -18,6 +18,5 @@ unsigned short statusCode; long lineNumber; long columnNumber; - [RuntimeEnabled=ExperimentalContentSecurityPolicyFeatures] DOMString sample; };
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn index cc8f8861..a7d98ef 100644 --- a/third_party/WebKit/Source/core/frame/BUILD.gn +++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -35,6 +35,7 @@ "Frame.cpp", "Frame.h", "FrameConsole.cpp", + "FrameConsole.h", "FrameHost.cpp", "FrameHost.h", "FrameOwner.h", @@ -43,6 +44,7 @@ "FrameView.cpp", "FrameView.h", "FrameViewAutoSizeInfo.cpp", + "FrameViewAutoSizeInfo.h", "History.cpp", "History.h", "HostsUsingFeatures.cpp", @@ -99,13 +101,18 @@ "SuspendableTimer.cpp", "SuspendableTimer.h", "UseCounter.cpp", + "UseCounter.h", "VisualViewport.cpp", "VisualViewport.h", "csp/CSPDirectiveList.cpp", + "csp/CSPDirectiveList.h", "csp/CSPSource.cpp", + "csp/CSPSource.h", "csp/ContentSecurityPolicy.cpp", "csp/MediaListDirective.cpp", + "csp/MediaListDirective.h", "csp/SourceListDirective.cpp", + "csp/SourceListDirective.h", ] configs += [
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp index 429c136..69f80ab7 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -33,7 +33,7 @@ #include <memory> #include "bindings/core/v8/ScriptController.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/dom/ChildFrameDisconnector.h" #include "core/dom/DocumentType.h" #include "core/dom/StyleChangeReason.h" @@ -869,7 +869,7 @@ m_interfaceProvider(interfaceProvider), m_interfaceRegistry(interfaceRegistry) { if (isLocalRoot()) { - m_instrumentingAgents = new InstrumentingAgents(); + m_instrumentingAgents = new InspectorInstrumentationAgents(); m_performanceMonitor = new PerformanceMonitor(this); } else { m_instrumentingAgents = localFrameRoot()->m_instrumentingAgents;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.h b/third_party/WebKit/Source/core/frame/LocalFrame.h index 6ac90b7c..a2ee86ec 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrame.h +++ b/third_party/WebKit/Source/core/frame/LocalFrame.h
@@ -59,7 +59,7 @@ class FrameSelection; class FrameView; class InputMethodController; -class InstrumentingAgents; +class InspectorInstrumentationAgents; class InterfaceProvider; class InterfaceRegistry; class IntPoint; @@ -164,7 +164,7 @@ // behavior for detached windows. bool isCrossOriginSubframe() const; - InstrumentingAgents* instrumentingAgents() { + InspectorInstrumentationAgents* instrumentingAgents() { return m_instrumentingAgents.get(); } @@ -270,7 +270,7 @@ bool m_inViewSourceMode; - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; Member<PerformanceMonitor> m_performanceMonitor; InterfaceProvider* const m_interfaceProvider;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameClient.h b/third_party/WebKit/Source/core/frame/LocalFrameClient.h index da4d9fd..23adffc 100644 --- a/third_party/WebKit/Source/core/frame/LocalFrameClient.h +++ b/third_party/WebKit/Source/core/frame/LocalFrameClient.h
@@ -342,6 +342,8 @@ virtual BlameContext* frameBlameContext() { return nullptr; } virtual void setHasReceivedUserGesture() {} + + virtual void abortClientNavigation() {} }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp index eeb438f..9c35393 100644 --- a/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp +++ b/third_party/WebKit/Source/core/frame/PerformanceMonitor.cpp
@@ -7,7 +7,7 @@ #include "bindings/core/v8/ScheduledAction.h" #include "bindings/core/v8/ScriptEventListener.h" #include "bindings/core/v8/SourceLocation.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/dom/Document.h" #include "core/dom/ExecutionContext.h" #include "core/events/EventListener.h"
diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp index d296918..b924b89 100644 --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
@@ -1211,7 +1211,7 @@ cspReport->setInteger("status-code", violationData.statusCode()); if (experimentalFeaturesEnabled()) - cspReport->setString("sample", violationData.sample()); + cspReport->setString("script-sample", violationData.sample()); std::unique_ptr<JSONObject> reportObject = JSONObject::create(); reportObject->setObject("csp-report", std::move(cspReport));
diff --git a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp b/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp index 5c35110..8c936f50 100644 --- a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp +++ b/third_party/WebKit/Source/core/html/AutoplayUmaHelper.cpp
@@ -29,7 +29,6 @@ AutoplayUmaHelper::AutoplayUmaHelper(HTMLMediaElement* element) : EventListener(CPPEventListenerType), ContextLifecycleObserver(nullptr), - m_source(AutoplaySource::NumberOfSources), m_element(element), m_mutedVideoPlayMethodVisibilityObserver(nullptr), m_mutedVideoAutoplayOffscreenStartTimeMS(0), @@ -46,38 +45,53 @@ void AutoplayUmaHelper::onAutoplayInitiated(AutoplaySource source) { DEFINE_STATIC_LOCAL(EnumerationHistogram, videoHistogram, ("Media.Video.Autoplay", - static_cast<int>(AutoplaySource::NumberOfSources))); + static_cast<int>(AutoplaySource::NumberOfUmaSources))); DEFINE_STATIC_LOCAL(EnumerationHistogram, mutedVideoHistogram, ("Media.Video.Autoplay.Muted", - static_cast<int>(AutoplaySource::NumberOfSources))); + static_cast<int>(AutoplaySource::NumberOfUmaSources))); DEFINE_STATIC_LOCAL(EnumerationHistogram, audioHistogram, ("Media.Audio.Autoplay", - static_cast<int>(AutoplaySource::NumberOfSources))); + static_cast<int>(AutoplaySource::NumberOfUmaSources))); DEFINE_STATIC_LOCAL( EnumerationHistogram, blockedMutedVideoHistogram, ("Media.Video.Autoplay.Muted.Blocked", AutoplayBlockedReasonMax)); // Autoplay already initiated - // TODO(zqzhang): how about having autoplay attribute and calling `play()` in - // the script? - if (hasSource()) + if (m_sources.count(source)) return; - m_source = source; + m_sources.insert(source); // Record the source. if (m_element->isHTMLVideoElement()) { - videoHistogram.count(static_cast<int>(m_source)); + videoHistogram.count(static_cast<int>(source)); if (m_element->muted()) - mutedVideoHistogram.count(static_cast<int>(m_source)); + mutedVideoHistogram.count(static_cast<int>(source)); } else { - audioHistogram.count(static_cast<int>(m_source)); + audioHistogram.count(static_cast<int>(source)); + } + + // Record dual source. + if (m_sources.size() == + static_cast<size_t>(AutoplaySource::NumberOfSources)) { + if (m_element->isHTMLVideoElement()) { + videoHistogram.count(static_cast<int>(AutoplaySource::DualSource)); + if (m_element->muted()) + mutedVideoHistogram.count(static_cast<int>(AutoplaySource::DualSource)); + } else { + audioHistogram.count(static_cast<int>(AutoplaySource::DualSource)); + } } // Record the child frame and top-level frame URLs for autoplay muted videos // by attribute. if (m_element->isHTMLVideoElement() && m_element->muted()) { - if (source == AutoplaySource::Attribute) { + if (m_sources.size() == + static_cast<size_t>(AutoplaySource::NumberOfSources)) { + Platform::current()->recordRapporURL( + "Media.Video.Autoplay.Muted.DualSource.Frame", + m_element->document().url()); + } else if (source == AutoplaySource::Attribute) { Platform::current()->recordRapporURL( "Media.Video.Autoplay.Muted.Attribute.Frame", m_element->document().url()); @@ -261,8 +275,8 @@ } void AutoplayUmaHelper::maybeStartRecordingMutedVideoPlayMethodBecomeVisible() { - if (m_source != AutoplaySource::Method || !m_element->isHTMLVideoElement() || - !m_element->muted()) + if (!m_sources.count(AutoplaySource::Method) || + !m_element->isHTMLVideoElement() || !m_element->muted()) return; m_mutedVideoPlayMethodVisibilityObserver = new ElementVisibilityObserver( @@ -289,7 +303,8 @@ } void AutoplayUmaHelper::maybeStartRecordingMutedVideoOffscreenDuration() { - if (!m_element->isHTMLVideoElement() || !m_element->muted()) + if (!m_element->isHTMLVideoElement() || !m_element->muted() || + !m_sources.count(AutoplaySource::Method)) return; // Start recording muted video playing offscreen duration. @@ -322,13 +337,14 @@ std::min<int64_t>(m_mutedVideoAutoplayOffscreenDurationMS, std::numeric_limits<int32_t>::max())); - if (m_source == AutoplaySource::Method) { - DEFINE_STATIC_LOCAL( - CustomCountHistogram, durationHistogram, - ("Media.Video.Autoplay.Muted.PlayMethod.OffscreenDuration", 1, - maxOffscreenDurationUmaMS, offscreenDurationUmaBucketCount)); - durationHistogram.count(boundedTime); - } + DCHECK(m_sources.count(AutoplaySource::Method)); + + DEFINE_STATIC_LOCAL( + CustomCountHistogram, durationHistogram, + ("Media.Video.Autoplay.Muted.PlayMethod.OffscreenDuration", 1, + maxOffscreenDurationUmaMS, offscreenDurationUmaBucketCount)); + durationHistogram.count(boundedTime); + m_mutedVideoOffscreenDurationVisibilityObserver->stop(); m_mutedVideoOffscreenDurationVisibilityObserver = nullptr; m_mutedVideoAutoplayOffscreenDurationMS = 0; @@ -363,7 +379,7 @@ bool AutoplayUmaHelper::shouldRecordUserPausedAutoplayingCrossOriginVideo() const { return m_element->isInCrossOriginFrame() && m_element->isHTMLVideoElement() && - m_source != AutoplaySource::NumberOfSources && + !m_sources.empty() && !m_recordedCrossOriginAutoplayResults.count( CrossOriginAutoplayResult::UserPaused); }
diff --git a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.h b/third_party/WebKit/Source/core/html/AutoplayUmaHelper.h index d6f7de8..82130ef 100644 --- a/third_party/WebKit/Source/core/html/AutoplayUmaHelper.h +++ b/third_party/WebKit/Source/core/html/AutoplayUmaHelper.h
@@ -20,8 +20,12 @@ Attribute = 0, // Autoplay comes from `play()` method. Method = 1, - // This enum value must be last. + // Used for checking dual source. NumberOfSources = 2, + // Both sources are used. + DualSource = 2, + // This enum value must be last. + NumberOfUmaSources = 3, }; // These values are used for histograms. Do not reorder. @@ -75,7 +79,7 @@ bool isVisible() const { return m_isVisible; } - bool hasSource() const { return m_source != AutoplaySource::NumberOfSources; } + bool hasSource() const { return !m_sources.empty(); } DECLARE_VIRTUAL_TRACE(); @@ -105,9 +109,9 @@ bool shouldListenToContextDestroyed() const; bool shouldRecordUserPausedAutoplayingCrossOriginVideo() const; - // The autoplay source. Use AutoplaySource::NumberOfSources for invalid - // source. - AutoplaySource m_source; + // The autoplay sources. + std::set<AutoplaySource> m_sources; + // The media element this UMA helper is attached to. |m_element| owns |this|. Member<HTMLMediaElement> m_element;
diff --git a/third_party/WebKit/Source/core/html/AutoplayUmaHelperTest.cpp b/third_party/WebKit/Source/core/html/AutoplayUmaHelperTest.cpp index 83fb27b..28131d6 100644 --- a/third_party/WebKit/Source/core/html/AutoplayUmaHelperTest.cpp +++ b/third_party/WebKit/Source/core/html/AutoplayUmaHelperTest.cpp
@@ -70,7 +70,7 @@ EXPECT_CALL(umaHelper(), handleContextDestroyed()); mediaElement().setMuted(true); - umaHelper().onAutoplayInitiated(AutoplaySource::Attribute); + umaHelper().onAutoplayInitiated(AutoplaySource::Method); umaHelper().handlePlayingEvent(); pageHolder().reset(); ::testing::Mock::VerifyAndClear(&umaHelper());
diff --git a/third_party/WebKit/Source/core/html/BUILD.gn b/third_party/WebKit/Source/core/html/BUILD.gn index f605c3d..81857d11 100644 --- a/third_party/WebKit/Source/core/html/BUILD.gn +++ b/third_party/WebKit/Source/core/html/BUILD.gn
@@ -40,6 +40,7 @@ "HTMLCanvasElement.cpp", "HTMLCanvasElement.h", "HTMLCollection.cpp", + "HTMLCollection.h", "HTMLContentElement.cpp", "HTMLContentElement.h", "HTMLDListElement.cpp", @@ -57,7 +58,9 @@ "HTMLDivElement.cpp", "HTMLDivElement.h", "HTMLDocument.cpp", + "HTMLDocument.h", "HTMLElement.cpp", + "HTMLElement.h", "HTMLEmbedElement.cpp", "HTMLEmbedElement.h", "HTMLFieldSetElement.cpp", @@ -65,13 +68,19 @@ "HTMLFontElement.cpp", "HTMLFontElement.h", "HTMLFormControlElement.cpp", + "HTMLFormControlElement.h", "HTMLFormControlElementWithState.cpp", + "HTMLFormControlElementWithState.h", "HTMLFormControlsCollection.cpp", "HTMLFormControlsCollection.h", "HTMLFormElement.cpp", + "HTMLFormElement.h", "HTMLFrameElement.cpp", + "HTMLFrameElement.h", "HTMLFrameElementBase.cpp", + "HTMLFrameElementBase.h", "HTMLFrameOwnerElement.cpp", + "HTMLFrameOwnerElement.h", "HTMLFrameSetElement.cpp", "HTMLFrameSetElement.h", "HTMLHRElement.cpp", @@ -83,6 +92,7 @@ "HTMLHtmlElement.cpp", "HTMLHtmlElement.h", "HTMLIFrameElement.cpp", + "HTMLIFrameElement.h", "HTMLIFrameElementAllow.cpp", "HTMLIFrameElementAllow.h", "HTMLIFrameElementSandbox.cpp", @@ -94,6 +104,7 @@ "HTMLImageLoader.cpp", "HTMLImageLoader.h", "HTMLInputElement.cpp", + "HTMLInputElement.h", "HTMLLIElement.cpp", "HTMLLIElement.h", "HTMLLabelElement.cpp", @@ -107,6 +118,7 @@ "HTMLMarqueeElement.cpp", "HTMLMarqueeElement.h", "HTMLMediaElement.cpp", + "HTMLMediaElement.h", "HTMLMediaElementControlsList.cpp", "HTMLMediaElementControlsList.h", "HTMLMediaSource.cpp", @@ -144,6 +156,7 @@ "HTMLParamElement.cpp", "HTMLParamElement.h", "HTMLPictureElement.cpp", + "HTMLPictureElement.h", "HTMLPlugInElement.cpp", "HTMLPlugInElement.h", "HTMLPreElement.cpp", @@ -175,11 +188,13 @@ "HTMLTableCaptionElement.cpp", "HTMLTableCaptionElement.h", "HTMLTableCellElement.cpp", + "HTMLTableCellElement.h", "HTMLTableColElement.cpp", "HTMLTableColElement.h", "HTMLTableElement.cpp", "HTMLTableElement.h", "HTMLTablePartElement.cpp", + "HTMLTablePartElement.h", "HTMLTableRowElement.cpp", "HTMLTableRowElement.h", "HTMLTableRowsCollection.cpp", @@ -191,6 +206,7 @@ "HTMLTemplateElement.cpp", "HTMLTemplateElement.h", "HTMLTextAreaElement.cpp", + "HTMLTextAreaElement.h", "HTMLTitleElement.cpp", "HTMLTitleElement.h", "HTMLTrackElement.cpp", @@ -210,6 +226,7 @@ "ImageDocument.cpp", "ImageDocument.h", "LabelableElement.cpp", + "LabelableElement.h", "LabelsNodeList.cpp", "LabelsNodeList.h", "LinkManifest.cpp", @@ -255,6 +272,8 @@ "canvas/CanvasDrawListener.h", "canvas/CanvasFontCache.cpp", "canvas/CanvasFontCache.h", + "canvas/CanvasImageElementSource.cpp", + "canvas/CanvasImageElementSource.h", "canvas/CanvasImageSource.h", "canvas/CanvasRenderingContext.cpp", "canvas/CanvasRenderingContext.h", @@ -386,6 +405,7 @@ "parser/HTMLMetaCharsetParser.cpp", "parser/HTMLMetaCharsetParser.h", "parser/HTMLParserIdioms.cpp", + "parser/HTMLParserIdioms.h", "parser/HTMLParserOptions.cpp", "parser/HTMLParserOptions.h", "parser/HTMLParserReentryPermit.cpp", @@ -417,6 +437,7 @@ "parser/MarkupTokenizerInlines.h", "parser/NestingLevelIncrementer.h", "parser/PreloadRequest.cpp", + "parser/PreloadRequest.h", "parser/ResourcePreloader.cpp", "parser/TextDocumentParser.cpp", "parser/TextDocumentParser.h", @@ -487,6 +508,7 @@ "track/TextTrackCueList.cpp", "track/TextTrackCueList.h", "track/TextTrackList.cpp", + "track/TextTrackList.h", "track/TrackBase.cpp", "track/TrackBase.h", "track/TrackEvent.cpp",
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp index b140a0b3..65a6229 100644 --- a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
@@ -629,63 +629,6 @@ return fastHasAttribute(usemapAttr); } -PassRefPtr<Image> HTMLImageElement::getSourceImageForCanvas( - SourceImageStatus* status, - AccelerationHint, - SnapshotReason, - const FloatSize& defaultObjectSize) const { - if (!complete() || !cachedImage()) { - *status = IncompleteSourceImageStatus; - return nullptr; - } - - if (cachedImage()->errorOccurred()) { - *status = UndecodableSourceImageStatus; - return nullptr; - } - - RefPtr<Image> sourceImage; - if (cachedImage()->getImage()->isSVGImage()) { - UseCounter::count(document(), UseCounter::SVGInCanvas2D); - SVGImage* svgImage = toSVGImage(cachedImage()->getImage()); - IntSize imageSize = - roundedIntSize(svgImage->concreteObjectSize(defaultObjectSize)); - sourceImage = SVGImageForContainer::create( - svgImage, imageSize, 1, document().completeURL(imageSourceURL())); - } else { - sourceImage = cachedImage()->getImage(); - } - - *status = NormalSourceImageStatus; - return sourceImage->imageForDefaultFrame(); -} - -bool HTMLImageElement::isSVGSource() const { - return cachedImage() && cachedImage()->getImage()->isSVGImage(); -} - -bool HTMLImageElement::wouldTaintOrigin( - SecurityOrigin* destinationSecurityOrigin) const { - ImageResourceContent* image = cachedImage(); - if (!image) - return false; - return !image->isAccessAllowed(destinationSecurityOrigin); -} - -FloatSize HTMLImageElement::elementSize( - const FloatSize& defaultObjectSize) const { - ImageResourceContent* image = cachedImage(); - if (!image) - return FloatSize(); - - if (image->getImage() && image->getImage()->isSVGImage()) - return toSVGImage(cachedImage()->getImage()) - ->concreteObjectSize(defaultObjectSize); - - return FloatSize(image->imageSize( - LayoutObject::shouldRespectImageOrientation(layoutObject()), 1.0f)); -} - FloatSize HTMLImageElement::defaultDestinationSize( const FloatSize& defaultObjectSize) const { ImageResourceContent* image = cachedImage(); @@ -816,10 +759,6 @@ ensureCollapsedOrFallbackContent(); } -const KURL& HTMLImageElement::sourceURL() const { - return cachedImage()->response().url(); -} - void HTMLImageElement::didAddUserAgentShadowRoot(ShadowRoot&) { HTMLImageFallbackHelper::createAltTextShadowTree(*this); } @@ -887,27 +826,6 @@ } } -bool HTMLImageElement::isOpaque() const { - Image* image = const_cast<HTMLImageElement*>(this)->imageContents(); - return image && image->currentFrameKnownToBeOpaque(); -} - -int HTMLImageElement::sourceWidth() { - SourceImageStatus status; - FloatSize defaultObjectSize(width(), height()); - RefPtr<Image> image = getSourceImageForCanvas( - &status, PreferNoAcceleration, SnapshotReasonUnknown, defaultObjectSize); - return image->width(); -} - -int HTMLImageElement::sourceHeight() { - SourceImageStatus status; - FloatSize defaultObjectSize(width(), height()); - RefPtr<Image> image = getSourceImageForCanvas( - &status, PreferNoAcceleration, SnapshotReasonUnknown, defaultObjectSize); - return image->height(); -} - IntSize HTMLImageElement::bitmapSourceSize() const { ImageResourceContent* image = cachedImage(); if (!image) @@ -927,4 +845,8 @@ } }; +FloatSize HTMLImageElement::sourceDefaultObjectSize() { + return FloatSize(width(), height()); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.h b/third_party/WebKit/Source/core/html/HTMLImageElement.h index 97e42b4..f4a5c8c 100644 --- a/third_party/WebKit/Source/core/html/HTMLImageElement.h +++ b/third_party/WebKit/Source/core/html/HTMLImageElement.h
@@ -29,7 +29,7 @@ #include "core/html/FormAssociated.h" #include "core/html/HTMLElement.h" #include "core/html/HTMLImageLoader.h" -#include "core/html/canvas/CanvasImageSource.h" +#include "core/html/canvas/CanvasImageElementSource.h" #include "core/imagebitmap/ImageBitmapSource.h" #include "platform/graphics/GraphicsTypes.h" #include "platform/loader/fetch/FetchRequest.h" @@ -44,7 +44,7 @@ class CORE_EXPORT HTMLImageElement final : public HTMLElement, - public CanvasImageSource, + public CanvasImageElementSource, public ImageBitmapSource, public ActiveScriptWrappable<HTMLImageElement>, public FormAssociated { @@ -116,20 +116,9 @@ virtual void ensurePrimaryContent(); bool isCollapsed() const; - // CanvasImageSource implementation - PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, - AccelerationHint, - SnapshotReason, - const FloatSize&) const override; - bool isSVGSource() const override; - bool wouldTaintOrigin(SecurityOrigin*) const override; - FloatSize elementSize(const FloatSize&) const override; + // CanvasImageSource interface implementation. + FloatSize sourceDefaultObjectSize() override; FloatSize defaultDestinationSize(const FloatSize&) const override; - const KURL& sourceURL() const override; - bool isAccelerated() const override { return false; } - bool isOpaque() const override; - int sourceWidth() override; - int sourceHeight() override; // public so that HTMLPictureElement can call this as well. void selectSourceURL(ImageLoader::UpdateFromElementBehavior); @@ -208,7 +197,7 @@ void resetFormOwner(); ImageCandidate findBestFitImageFromPictureParent(); void setBestFitURLAndDPRFromImageCandidate(const ImageCandidate&); - HTMLImageLoader& imageLoader() const { return *m_imageLoader; } + HTMLImageLoader& imageLoader() const override { return *m_imageLoader; } void notifyViewportChanged(); void createMediaQueryListIfDoesNotExist();
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp new file mode 100644 index 0000000..57f78597 --- /dev/null +++ b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp
@@ -0,0 +1,126 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/html/canvas/CanvasImageElementSource.h" + +#include "core/layout/LayoutObject.h" +#include "core/loader/ImageLoader.h" +#include "core/svg/graphics/SVGImageForContainer.h" + +namespace blink { + +ImageResourceContent* CanvasImageElementSource::cachedImage() const { + return imageLoader().image(); +} + +const Element& CanvasImageElementSource::element() const { + return *imageLoader().element(); +} + +bool CanvasImageElementSource::isSVGSource() const { + return cachedImage() && cachedImage()->getImage()->isSVGImage(); +} + +PassRefPtr<Image> CanvasImageElementSource::getSourceImageForCanvas( + SourceImageStatus* status, + AccelerationHint, + SnapshotReason, + const FloatSize& defaultObjectSize) const { + if (!imageLoader().imageComplete() || !cachedImage()) { + *status = IncompleteSourceImageStatus; + return nullptr; + } + + if (cachedImage()->errorOccurred()) { + *status = UndecodableSourceImageStatus; + return nullptr; + } + + RefPtr<Image> sourceImage; + if (cachedImage()->getImage()->isSVGImage()) { + UseCounter::count(element().document(), UseCounter::SVGInCanvas2D); + SVGImage* svgImage = toSVGImage(cachedImage()->getImage()); + IntSize imageSize = + roundedIntSize(svgImage->concreteObjectSize(defaultObjectSize)); + sourceImage = SVGImageForContainer::create( + svgImage, imageSize, 1, + element().document().completeURL(element().imageSourceURL())); + } else { + sourceImage = cachedImage()->getImage(); + } + + *status = NormalSourceImageStatus; + return sourceImage->imageForDefaultFrame(); +} + +bool CanvasImageElementSource::wouldTaintOrigin( + SecurityOrigin* destinationSecurityOrigin) const { + return cachedImage() && + !cachedImage()->isAccessAllowed(destinationSecurityOrigin); +} + +FloatSize CanvasImageElementSource::elementSize( + const FloatSize& defaultObjectSize) const { + ImageResourceContent* image = cachedImage(); + if (!image) + return FloatSize(); + + if (image->getImage() && image->getImage()->isSVGImage()) { + return toSVGImage(cachedImage()->getImage()) + ->concreteObjectSize(defaultObjectSize); + } + + return FloatSize(image->imageSize( + LayoutObject::shouldRespectImageOrientation(element().layoutObject()), + 1.0f)); +} + +FloatSize CanvasImageElementSource::defaultDestinationSize( + const FloatSize& defaultObjectSize) const { + ImageResourceContent* image = cachedImage(); + if (!image) + return FloatSize(); + + if (image->getImage() && image->getImage()->isSVGImage()) { + return toSVGImage(cachedImage()->getImage()) + ->concreteObjectSize(defaultObjectSize); + } + + LayoutSize size; + size = image->imageSize( + LayoutObject::shouldRespectImageOrientation(element().layoutObject()), + 1.0f); + return FloatSize(size); +} + +bool CanvasImageElementSource::isAccelerated() const { + return false; +} + +const KURL& CanvasImageElementSource::sourceURL() const { + return cachedImage()->response().url(); +} + +int CanvasImageElementSource::sourceWidth() { + SourceImageStatus status; + RefPtr<Image> image = + getSourceImageForCanvas(&status, PreferNoAcceleration, + SnapshotReasonUnknown, sourceDefaultObjectSize()); + return image->width(); +} + +int CanvasImageElementSource::sourceHeight() { + SourceImageStatus status; + RefPtr<Image> image = + getSourceImageForCanvas(&status, PreferNoAcceleration, + SnapshotReasonUnknown, sourceDefaultObjectSize()); + return image->height(); +} + +bool CanvasImageElementSource::isOpaque() const { + Image* image = const_cast<Element&>(element()).imageContents(); + return image && image->currentFrameKnownToBeOpaque(); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.h b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.h new file mode 100644 index 0000000..e17a34d --- /dev/null +++ b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.h
@@ -0,0 +1,52 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CanvasImageElementSource_h +#define CanvasImageElementSource_h + +#include "core/CoreExport.h" +#include "core/html/canvas/CanvasImageSource.h" + +namespace blink { + +class Element; +class ImageLoader; +class ImageResourceContent; + +class CORE_EXPORT CanvasImageElementSource : public CanvasImageSource { + public: + virtual ImageLoader& imageLoader() const = 0; + virtual FloatSize sourceDefaultObjectSize() = 0; + + PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, + AccelerationHint, + SnapshotReason, + const FloatSize&) const override; + + bool wouldTaintOrigin( + SecurityOrigin* destinationSecurityOrigin) const override; + + FloatSize elementSize(const FloatSize& defaultObjectSize) const override; + FloatSize defaultDestinationSize( + const FloatSize& defaultObjectSize) const override; + + bool isAccelerated() const override; + + int sourceWidth() override; + int sourceHeight() override; + + bool isSVGSource() const override; + + bool isOpaque() const override; + + const KURL& sourceURL() const override; + + private: + ImageResourceContent* cachedImage() const; + const Element& element() const; +}; + +} // namespace blink + +#endif // CanvasImageElementSource_h
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasImageSource.h b/third_party/WebKit/Source/core/html/canvas/CanvasImageSource.h index cab87e0..ac90b13d 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasImageSource.h +++ b/third_party/WebKit/Source/core/html/canvas/CanvasImageSource.h
@@ -30,6 +30,7 @@ #include "core/CoreExport.h" #include "platform/geometry/FloatSize.h" #include "platform/graphics/GraphicsTypes.h" +#include "platform/weborigin/KURL.h" #include "wtf/PassRefPtr.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/html/forms/EmailInputType.cpp b/third_party/WebKit/Source/core/html/forms/EmailInputType.cpp index 755ae39..52be833 100644 --- a/third_party/WebKit/Source/core/html/forms/EmailInputType.cpp +++ b/third_party/WebKit/Source/core/html/forms/EmailInputType.cpp
@@ -23,6 +23,9 @@ #include "core/html/forms/EmailInputType.h" +#include <unicode/idna.h> +#include <unicode/unistr.h> +#include <unicode/uvernum.h> #include "bindings/core/v8/ScriptRegexp.h" #include "core/InputTypeNames.h" #include "core/html/HTMLInputElement.h" @@ -31,8 +34,10 @@ #include "platform/text/PlatformLocale.h" #include "public/platform/Platform.h" #include "wtf/text/StringBuilder.h" -#include <unicode/idna.h> -#include <unicode/unistr.h> + +#if U_ICU_VERSION_MAJOR_NUM >= 59 +#include <unicode/char16ptr.h> +#endif namespace blink { @@ -87,7 +92,11 @@ StringBuilder builder; builder.append(address, 0, atPosition + 1); +#if U_ICU_VERSION_MAJOR_NUM >= 59 + builder.append(icu::toUCharPtr(domainName.getBuffer()), domainName.length()); +#else builder.append(domainName.getBuffer(), domainName.length()); +#endif String asciiEmail = builder.toString(); return isValidEmailAddress(regexp, asciiEmail) ? asciiEmail : address; }
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp index 41f35c2..17c8c7b 100644 --- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp +++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
@@ -39,8 +39,8 @@ Vector<WebTouchPoint> relatedPoints; for (const auto& touchEvent : coalescedEvents) { for (unsigned i = 0; i < touchEvent.touchesLength; ++i) { - // TODO(nzolghadr): Need to filter out stationary points - if (touchEvent.touches[i].id == id) + if (touchEvent.touches[i].id == id && + touchEvent.touches[i].state != WebTouchPoint::StateStationary) relatedPoints.push_back(touchEvent.touchPointInRootFrame(i)); } }
diff --git a/third_party/WebKit/Source/core/inspector/BUILD.gn b/third_party/WebKit/Source/core/inspector/BUILD.gn index 1a179aafe..38134bc 100644 --- a/third_party/WebKit/Source/core/inspector/BUILD.gn +++ b/third_party/WebKit/Source/core/inspector/BUILD.gn
@@ -34,6 +34,7 @@ "InspectorCSSAgent.cpp", "InspectorCSSAgent.h", "InspectorDOMAgent.cpp", + "InspectorDOMAgent.h", "InspectorDOMDebuggerAgent.cpp", "InspectorDOMDebuggerAgent.h", "InspectorHighlight.cpp", @@ -96,25 +97,27 @@ action("instrumentation_probes") { visibility = [ ":*" ] - script = "InstrumentingProbesCodeGenerator.py" + script = "../../platform/instrumentation/InstrumentingProbesCodeGenerator.py" inputs = [ # Input file for the script. - "InstrumentingProbes.idl", - "InstrumentingProbesImpl_cpp.template", - "InstrumentingProbesImpl_h.template", - "InstrumentingAgents_h.template", + "InspectorInstrumentation.idl", + + # Templates + "../../platform/instrumentation/InstrumentingProbesImpl_cpp.template", + "../../platform/instrumentation/InstrumentingProbesImpl_h.template", + "../../platform/instrumentation/InstrumentingAgents_h.template", ] outputs = [ "$blink_core_output_dir/InspectorInstrumentationInl.h", "$blink_core_output_dir/InspectorOverridesInl.h", - "$blink_core_output_dir/InstrumentingProbesImpl.cpp", - "$blink_core_output_dir/InstrumentingAgents.h", + "$blink_core_output_dir/InspectorInstrumentationImpl.cpp", + "$blink_core_output_dir/InspectorInstrumentationAgents.h", ] args = [ - rebase_path("InstrumentingProbes.idl", root_build_dir), + rebase_path(inputs[0], root_build_dir), "--output_dir", rebase_path(blink_core_output_dir, root_build_dir), ]
diff --git a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h index 2ad507f..f6c2e590 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorBaseAgent.h
@@ -32,7 +32,7 @@ #define InspectorBaseAgent_h #include "core/CoreExport.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/inspector/protocol/Protocol.h" #include "platform/heap/Handle.h" #include "wtf/Forward.h" @@ -53,7 +53,7 @@ virtual void didCommitLoadForLocalFrame(LocalFrame*) {} virtual void flushPendingProtocolNotifications() {} - virtual void init(InstrumentingAgents*, + virtual void init(InspectorInstrumentationAgents*, protocol::UberDispatcher*, protocol::DictionaryValue*) = 0; virtual void dispose() = 0; @@ -65,7 +65,7 @@ public: ~InspectorBaseAgent() override {} - void init(InstrumentingAgents* instrumentingAgents, + void init(InspectorInstrumentationAgents* instrumentingAgents, protocol::UberDispatcher* dispatcher, protocol::DictionaryValue* state) override { m_instrumentingAgents = instrumentingAgents; @@ -102,7 +102,7 @@ typename DomainMetainfo::FrontendClass* frontend() const { return m_frontend.get(); } - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; protocol::DictionaryValue* m_state; private:
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp index dfeeadc2..afcfbc3 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -1471,7 +1471,13 @@ return Response::OK(); } -Response InspectorDOMAgent::getNodeForLocation(int x, int y, int* nodeId) { +Response InspectorDOMAgent::getNodeForLocation( + int x, + int y, + Maybe<bool> optionalIncludeUserAgentShadowDOM, + int* nodeId) { + bool includeUserAgentShadowDOM = + optionalIncludeUserAgentShadowDOM.fromMaybe(false); Response response = pushDocumentUponHandlelessOperation(); if (!response.isSuccess()) return response; @@ -1479,6 +1485,8 @@ HitTestRequest::AllowChildFrameContent); HitTestResult result(request, IntPoint(x, y)); m_document->frame()->contentLayoutItem().hitTest(result); + if (!includeUserAgentShadowDOM) + result.setToShadowHostIfInRestrictedShadowRoot(); Node* node = result.innerPossiblyPseudoNode(); while (node && node->getNodeType() == Node::kTextNode) node = node->parentNode();
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h index f5849ac2..ac155c3 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h
@@ -220,7 +220,11 @@ protocol::Response getBoxModel( int nodeId, std::unique_ptr<protocol::DOM::BoxModel>*) override; - protocol::Response getNodeForLocation(int x, int y, int* outNodeId) override; + protocol::Response getNodeForLocation( + int x, + int y, + protocol::Maybe<bool> includeUserAgentShadowDOM, + int* outNodeId) override; protocol::Response getRelayoutBoundary(int nodeId, int* outNodeId) override; protocol::Response getHighlightObjectForTest( int nodeId,
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp index 607b3a7..a04b05b 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
@@ -30,7 +30,7 @@ #include "core/inspector/InspectorInstrumentation.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/events/Event.h" #include "core/events/EventTarget.h" #include "core/frame/FrameHost.h" @@ -158,7 +158,7 @@ didReceiveResourceResponseButCanceled(frame, loader, identifier, r, resource); } -InstrumentingAgents* instrumentingAgentsFor( +InspectorInstrumentationAgents* instrumentingAgentsFor( WorkerGlobalScope* workerGlobalScope) { if (!workerGlobalScope) return nullptr; @@ -168,7 +168,7 @@ return nullptr; } -InstrumentingAgents* instrumentingAgentsForNonDocumentContext( +InspectorInstrumentationAgents* instrumentingAgentsForNonDocumentContext( ExecutionContext* context) { if (context->isWorkerGlobalScope()) return instrumentingAgentsFor(toWorkerGlobalScope(context));
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.h b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.h index a188d56..8656b3f 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.h +++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.h
@@ -39,7 +39,7 @@ namespace blink { -class InstrumentingAgents; +class InspectorInstrumentationAgents; class Resource; class ThreadDebugger; class WorkerGlobalScope; @@ -76,26 +76,31 @@ }; // Called from generated instrumentation code. -CORE_EXPORT InstrumentingAgents* instrumentingAgentsFor(WorkerGlobalScope*); -CORE_EXPORT InstrumentingAgents* instrumentingAgentsForNonDocumentContext( - ExecutionContext*); +CORE_EXPORT InspectorInstrumentationAgents* instrumentingAgentsFor( + WorkerGlobalScope*); +CORE_EXPORT InspectorInstrumentationAgents* +instrumentingAgentsForNonDocumentContext(ExecutionContext*); -inline InstrumentingAgents* instrumentingAgentsFor(LocalFrame* frame) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor( + LocalFrame* frame) { return frame ? frame->instrumentingAgents() : nullptr; } -inline InstrumentingAgents* instrumentingAgentsFor(Document& document) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor( + Document& document) { LocalFrame* frame = document.frame(); if (!frame && document.templateDocumentHost()) frame = document.templateDocumentHost()->frame(); return instrumentingAgentsFor(frame); } -inline InstrumentingAgents* instrumentingAgentsFor(Document* document) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor( + Document* document) { return document ? instrumentingAgentsFor(*document) : nullptr; } -inline InstrumentingAgents* instrumentingAgentsFor(ExecutionContext* context) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor( + ExecutionContext* context) { if (!context) return nullptr; return context->isDocument() @@ -103,11 +108,12 @@ : instrumentingAgentsForNonDocumentContext(context); } -inline InstrumentingAgents* instrumentingAgentsFor(Node* node) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor(Node* node) { return node ? instrumentingAgentsFor(node->document()) : nullptr; } -inline InstrumentingAgents* instrumentingAgentsFor(EventTarget* eventTarget) { +inline InspectorInstrumentationAgents* instrumentingAgentsFor( + EventTarget* eventTarget) { return eventTarget ? instrumentingAgentsFor(eventTarget->getExecutionContext()) : nullptr; @@ -136,11 +142,10 @@ const ResourceResponse&, Resource*); -} // namespace InspectorInstrumentation +} // namespace probe } // namespace blink #include "core/InspectorInstrumentationInl.h" - #include "core/InspectorOverridesInl.h" #endif // !defined(InspectorInstrumentation_h)
diff --git a/third_party/WebKit/Source/core/inspector/InstrumentingProbes.idl b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl similarity index 98% rename from third_party/WebKit/Source/core/inspector/InstrumentingProbes.idl rename to third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl index 9ed6f71..a0e5f4e 100644 --- a/third_party/WebKit/Source/core/inspector/InstrumentingProbes.idl +++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
@@ -44,7 +44,7 @@ * Examples: DOM, Page, Debugger. * * paramAttr - optional attribute controlling the parameters handling (one attribute per parameter max). -* Keep - pass first parameter (used to access the InstrumentingAgents instance) to agents. +* Keep - pass first parameter (used to access the InspectorInstrumentationAgents instance) to agents. * * returnValue: C++ return value. Only "void" and "bool" are supported. * @@ -64,6 +64,8 @@ #include "core/dom/PseudoElement.h" #include "core/html/HTMLSlotElement.h" +#define PROBE_EXPORT CORE_EXPORT + class ConsoleMessage; class HTMLDocumentParser; class ThreadableLoaderClient; @@ -348,6 +350,9 @@ } interface InspectorOverrides { + +#define PROBE_EXPORT CORE_EXPORT + [CSS] bool forcePseudoState([Keep] Element* element, CSSSelector::PseudoType pseudoState);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorSession.cpp b/third_party/WebKit/Source/core/inspector/InspectorSession.cpp index a7a9374..879f3f7b 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorSession.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorSession.cpp
@@ -18,12 +18,13 @@ const char kV8StateKey[] = "v8"; } -InspectorSession::InspectorSession(Client* client, - InstrumentingAgents* instrumentingAgents, - int sessionId, - v8_inspector::V8Inspector* inspector, - int contextGroupId, - const String* savedState) +InspectorSession::InspectorSession( + Client* client, + InspectorInstrumentationAgents* instrumentingAgents, + int sessionId, + v8_inspector::V8Inspector* inspector, + int contextGroupId, + const String* savedState) : m_client(client), m_v8Session(nullptr), m_sessionId(sessionId),
diff --git a/third_party/WebKit/Source/core/inspector/InspectorSession.h b/third_party/WebKit/Source/core/inspector/InspectorSession.h index 31c5127..95fcb8c 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorSession.h +++ b/third_party/WebKit/Source/core/inspector/InspectorSession.h
@@ -17,7 +17,7 @@ namespace blink { class InspectorAgent; -class InstrumentingAgents; +class InspectorInstrumentationAgents; class LocalFrame; class CORE_EXPORT InspectorSession @@ -37,7 +37,7 @@ }; InspectorSession(Client*, - InstrumentingAgents*, + InspectorInstrumentationAgents*, int sessionId, v8_inspector::V8Inspector*, int contextGroupId, @@ -80,7 +80,7 @@ std::unique_ptr<v8_inspector::V8InspectorSession> m_v8Session; int m_sessionId; bool m_disposed; - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; std::unique_ptr<protocol::UberDispatcher> m_inspectorBackendDispatcher; std::unique_ptr<protocol::DictionaryValue> m_state; HeapVector<Member<InspectorAgent>> m_agents;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp index 294f93c..c975cbb 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.cpp
@@ -89,9 +89,10 @@ v8::Isolate::GetCurrent()->GetCpuProfiler()->CollectSample(); } -void InspectorTraceEvents::init(InstrumentingAgents* instrumentingAgents, - protocol::UberDispatcher*, - protocol::DictionaryValue*) { +void InspectorTraceEvents::init( + InspectorInstrumentationAgents* instrumentingAgents, + protocol::UberDispatcher*, + protocol::DictionaryValue*) { m_instrumentingAgents = instrumentingAgents; m_instrumentingAgents->addInspectorTraceEvents(this); }
diff --git a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h index 44547bc5..29451d1b 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h +++ b/third_party/WebKit/Source/core/inspector/InspectorTraceEvents.h
@@ -72,7 +72,7 @@ public: InspectorTraceEvents() {} - void init(InstrumentingAgents*, + void init(InspectorInstrumentationAgents*, protocol::UberDispatcher*, protocol::DictionaryValue*) override; void dispose() override; @@ -111,7 +111,7 @@ DECLARE_VIRTUAL_TRACE(); private: - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; }; namespace InspectorLayoutEvent {
diff --git a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp index aa6fa92..cd95a9de 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp
@@ -30,7 +30,7 @@ #include "core/inspector/WorkerInspectorController.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/inspector/InspectorInstrumentation.h" #include "core/inspector/InspectorLogAgent.h" #include "core/inspector/InspectorTraceEvents.h" @@ -55,7 +55,7 @@ WorkerThreadDebugger* debugger) : m_debugger(debugger), m_thread(thread), - m_instrumentingAgents(new InstrumentingAgents()) { + m_instrumentingAgents(new InspectorInstrumentationAgents()) { m_instrumentingAgents->addInspectorTraceEvents(new InspectorTraceEvents()); }
diff --git a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h index 9e041853..39e5176 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h +++ b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.h
@@ -41,7 +41,7 @@ namespace blink { -class InstrumentingAgents; +class InspectorInstrumentationAgents; class WorkerThread; class WorkerThreadDebugger; @@ -56,7 +56,7 @@ ~WorkerInspectorController() override; DECLARE_TRACE(); - InstrumentingAgents* instrumentingAgents() const { + InspectorInstrumentationAgents* instrumentingAgents() const { return m_instrumentingAgents.get(); } @@ -81,7 +81,7 @@ WorkerThreadDebugger* m_debugger; WorkerThread* m_thread; - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; Member<InspectorSession> m_session; };
diff --git a/third_party/WebKit/Source/core/inspector/browser_protocol.json b/third_party/WebKit/Source/core/inspector/browser_protocol.json index c7df0bc..cab33894 100644 --- a/third_party/WebKit/Source/core/inspector/browser_protocol.json +++ b/third_party/WebKit/Source/core/inspector/browser_protocol.json
@@ -2556,7 +2556,8 @@ "name": "getNodeForLocation", "parameters": [ { "name": "x", "type": "integer", "description": "X coordinate." }, - { "name": "y", "type": "integer", "description": "Y coordinate." } + { "name": "y", "type": "integer", "description": "Y coordinate." }, + { "name": "includeUserAgentShadowDOM", "type": "boolean", "optional": true, "description": "False to skip to the nearest non-UA shadow root ancestor (default: false)." } ], "returns": [ { "name": "nodeId", "$ref": "NodeId", "description": "Id of the node at given coordinates." }
diff --git a/third_party/WebKit/Source/core/layout/BUILD.gn b/third_party/WebKit/Source/core/layout/BUILD.gn index f62e846..0492231 100644 --- a/third_party/WebKit/Source/core/layout/BUILD.gn +++ b/third_party/WebKit/Source/core/layout/BUILD.gn
@@ -32,6 +32,7 @@ "HitTestCache.cpp", "HitTestCache.h", "HitTestCanvasResult.cpp", + "HitTestCanvasResult.h", "HitTestLocation.cpp", "HitTestLocation.h", "HitTestResult.cpp", @@ -45,10 +46,12 @@ "LayoutAnalyzer.h", "LayoutBR.cpp", "LayoutBlock.cpp", + "LayoutBlock.h", "LayoutBlockFlow.cpp", "LayoutBlockFlowLine.cpp", "LayoutBox.cpp", "LayoutBoxModelObject.cpp", + "LayoutBoxModelObject.h", "LayoutButton.cpp", "LayoutButton.h", "LayoutCounter.cpp", @@ -58,6 +61,7 @@ "LayoutDetailsMarker.cpp", "LayoutDetailsMarker.h", "LayoutEmbeddedObject.cpp", + "LayoutEmbeddedObject.h", "LayoutFieldset.cpp", "LayoutFieldset.h", "LayoutFileUploadControl.cpp", @@ -82,13 +86,17 @@ "LayoutIFrame.cpp", "LayoutIFrame.h", "LayoutImage.cpp", + "LayoutImage.h", "LayoutImageResource.cpp", + "LayoutImageResource.h", "LayoutImageResourceStyleImage.cpp", + "LayoutImageResourceStyleImage.h", "LayoutInline.cpp", "LayoutInline.h", "LayoutListBox.cpp", "LayoutListBox.h", "LayoutListItem.cpp", + "LayoutListItem.h", "LayoutListMarker.cpp", "LayoutListMarker.h", "LayoutMedia.cpp", @@ -103,14 +111,17 @@ "LayoutMultiColumnSpannerPlaceholder.h", "LayoutObject.cpp", "LayoutObjectChildList.cpp", + "LayoutObjectChildList.h", "LayoutPagedFlowThread.cpp", "LayoutPagedFlowThread.h", "LayoutPart.cpp", + "LayoutPart.h", "LayoutProgress.cpp", "LayoutProgress.h", "LayoutQuote.cpp", "LayoutQuote.h", "LayoutReplaced.cpp", + "LayoutReplaced.h", "LayoutRuby.cpp", "LayoutRuby.h", "LayoutRubyBase.cpp", @@ -134,6 +145,7 @@ "LayoutSliderThumb.cpp", "LayoutSliderThumb.h", "LayoutState.cpp", + "LayoutState.h", "LayoutTable.cpp", "LayoutTable.h", "LayoutTableBoxComponent.cpp", @@ -177,6 +189,7 @@ "LayoutVideo.cpp", "LayoutVideo.h", "LayoutView.cpp", + "LayoutView.h", "LayoutWordBreak.cpp", "LayoutWordBreak.h", "ListMarkerText.cpp", @@ -191,6 +204,7 @@ "PointerEventsHitRules.cpp", "PointerEventsHitRules.h", "ScrollAlignment.cpp", + "ScrollAlignment.h", "ScrollAnchor.cpp", "ScrollAnchor.h", "SubtreeLayoutScope.cpp", @@ -274,6 +288,7 @@ "line/InlineIterator.h", "line/InlineTextBox.cpp", "line/LineBoxList.cpp", + "line/LineBoxList.h", "line/LineBreaker.cpp", "line/LineBreaker.h", "line/LineWidth.cpp",
diff --git a/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.h b/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.h index 2a857af4..1ca6859 100644 --- a/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.h +++ b/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.h
@@ -30,7 +30,7 @@ // LayoutObject for embeds and objects, often, but not always, rendered via // plugins. For example, <embed src="foo.html"> does not invoke a plugin. -class LayoutEmbeddedObject : public LayoutPart { +class LayoutEmbeddedObject final : public LayoutPart { public: LayoutEmbeddedObject(Element*); ~LayoutEmbeddedObject() override;
diff --git a/third_party/WebKit/Source/core/layout/LayoutSliderContainer.h b/third_party/WebKit/Source/core/layout/LayoutSliderContainer.h index 00b901e..053dc371 100644 --- a/third_party/WebKit/Source/core/layout/LayoutSliderContainer.h +++ b/third_party/WebKit/Source/core/layout/LayoutSliderContainer.h
@@ -40,7 +40,7 @@ // FIXME: Find a way to cascade appearance and adjust heights, and get rid of // this class. See http://webkit.org/b/62535 -class LayoutSliderContainer : public LayoutFlexibleBox { +class LayoutSliderContainer final : public LayoutFlexibleBox { public: LayoutSliderContainer(SliderContainerElement*); void computeLogicalHeight(LayoutUnit logicalHeight,
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp index 60cd2dda..aaa4687c 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
@@ -2019,7 +2019,7 @@ // If we have a header group we will paint it at the top of each page, // move the rows down to accomodate it. - if (header) + if (header && header != this) paginationStrut += table()->rowOffsetFromRepeatingHeader().toInt(); rowObject.setPaginationStrut(LayoutUnit(paginationStrut));
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h index 580cea0..9a18444 100644 --- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h +++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -1501,6 +1501,12 @@ m_currentStyle->collapseWhiteSpace()) m_trailingObjects.clear(); + if (!m_width.fitsOnLine() && m_width.fitsOnLine(0, ExcludeWhitespace) && + m_ignoringSpaces && m_nextObject) { + m_width.commit(); + m_lineBreak.moveToStartOf(m_nextObject); + } + if (m_width.committedWidth()) { m_atEnd = true; return;
diff --git a/third_party/WebKit/Source/core/layout/svg/BUILD.gn b/third_party/WebKit/Source/core/layout/svg/BUILD.gn index 9c9d3f3..2d3b69aa 100644 --- a/third_party/WebKit/Source/core/layout/svg/BUILD.gn +++ b/third_party/WebKit/Source/core/layout/svg/BUILD.gn
@@ -75,6 +75,7 @@ "SVGResources.cpp", "SVGResources.h", "SVGResourcesCache.cpp", + "SVGResourcesCache.h", "SVGResourcesCycleSolver.cpp", "SVGResourcesCycleSolver.h", "SVGTextChunkBuilder.cpp",
diff --git a/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp b/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp index 8907cba..62fbfabb 100644 --- a/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp +++ b/third_party/WebKit/Source/core/layout/svg/SVGLayoutTreeAsText.cpp
@@ -45,6 +45,8 @@ #include "core/layout/svg/LayoutSVGShape.h" #include "core/layout/svg/LayoutSVGText.h" #include "core/layout/svg/SVGLayoutSupport.h" +#include "core/layout/svg/SVGResources.h" +#include "core/layout/svg/SVGResourcesCache.h" #include "core/layout/svg/line/SVGInlineTextBox.h" #include "core/layout/svg/line/SVGRootInlineBox.h" #include "core/paint/PaintLayer.h" @@ -706,68 +708,50 @@ } void writeResources(TextStream& ts, const LayoutObject& object, int indent) { + SVGResources* resources = + SVGResourcesCache::cachedResourcesForLayoutObject(&object); + if (!resources) + return; const ComputedStyle& style = object.styleRef(); - const SVGComputedStyle& svgStyle = style.svgStyle(); TreeScope& treeScope = object.document(); - SVGTreeScopeResources& treeScopeResources = - treeScope.ensureSVGTreeScopedResources(); - - // FIXME: We want to use SVGResourcesCache to determine which resources are - // present, instead of quering the resource <-> id cache. - // For now leave the DRT output as is, but later on we should change this so - // cycles are properly ignored in the DRT output. - if (!svgStyle.maskerResource().isEmpty()) { - if (LayoutSVGResourceMasker* masker = - getLayoutSVGResourceById<LayoutSVGResourceMasker>( - treeScopeResources, svgStyle.maskerResource())) { - writeIndent(ts, indent); - ts << " "; - writeNameAndQuotedValue(ts, "masker", svgStyle.maskerResource()); - ts << " "; - writeStandardPrefix(ts, *masker, 0); - ts << " " << masker->resourceBoundingBox(&object) << "\n"; - } + if (LayoutSVGResourceMasker* masker = resources->masker()) { + writeIndent(ts, indent); + ts << " "; + writeNameAndQuotedValue(ts, "masker", style.svgStyle().maskerResource()); + ts << " "; + writeStandardPrefix(ts, *masker, 0); + ts << " " << masker->resourceBoundingBox(&object) << "\n"; } - if (ClipPathOperation* clipPathOperation = style.clipPath()) { - if (clipPathOperation->type() == ClipPathOperation::REFERENCE) { - const ReferenceClipPathOperation& clipPathReference = - toReferenceClipPathOperation(*clipPathOperation); - AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( - clipPathReference.url(), treeScope); - if (LayoutSVGResourceClipper* clipper = - getLayoutSVGResourceById<LayoutSVGResourceClipper>( - treeScopeResources, id)) { - writeIndent(ts, indent); - ts << " "; - writeNameAndQuotedValue(ts, "clipPath", id); - ts << " "; - writeStandardPrefix(ts, *clipper, 0); - ts << " " << clipper->resourceBoundingBox(object.objectBoundingBox()) - << "\n"; - } - } + if (LayoutSVGResourceClipper* clipper = resources->clipper()) { + DCHECK(style.clipPath()); + DCHECK_EQ(style.clipPath()->type(), ClipPathOperation::REFERENCE); + const ReferenceClipPathOperation& clipPathReference = + toReferenceClipPathOperation(*style.clipPath()); + AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( + clipPathReference.url(), treeScope); + writeIndent(ts, indent); + ts << " "; + writeNameAndQuotedValue(ts, "clipPath", id); + ts << " "; + writeStandardPrefix(ts, *clipper, 0); + ts << " " << clipper->resourceBoundingBox(object.objectBoundingBox()) + << "\n"; } - if (style.hasFilter()) { - const FilterOperations& filterOperations = style.filter(); - if (filterOperations.size() == 1) { - const FilterOperation& filterOperation = *filterOperations.at(0); - if (filterOperation.type() == FilterOperation::REFERENCE) { - const auto& referenceFilterOperation = - toReferenceFilterOperation(filterOperation); - AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( - referenceFilterOperation.url(), treeScope); - if (LayoutSVGResourceFilter* filter = - getLayoutSVGResourceById<LayoutSVGResourceFilter>( - treeScopeResources, id)) { - writeIndent(ts, indent); - ts << " "; - writeNameAndQuotedValue(ts, "filter", id); - ts << " "; - writeStandardPrefix(ts, *filter, 0); - ts << " " << filter->resourceBoundingBox(&object) << "\n"; - } - } - } + if (LayoutSVGResourceFilter* filter = resources->filter()) { + DCHECK(style.hasFilter()); + DCHECK_EQ(style.filter().size(), 1u); + const FilterOperation& filterOperation = *style.filter().at(0); + DCHECK_EQ(filterOperation.type(), FilterOperation::REFERENCE); + const auto& referenceFilterOperation = + toReferenceFilterOperation(filterOperation); + AtomicString id = SVGURIReference::fragmentIdentifierFromIRIString( + referenceFilterOperation.url(), treeScope); + writeIndent(ts, indent); + ts << " "; + writeNameAndQuotedValue(ts, "filter", id); + ts << " "; + writeStandardPrefix(ts, *filter, 0); + ts << " " << filter->resourceBoundingBox(&object) << "\n"; } }
diff --git a/third_party/WebKit/Source/core/loader/BUILD.gn b/third_party/WebKit/Source/core/loader/BUILD.gn index bde7e116..e08b1f3 100644 --- a/third_party/WebKit/Source/core/loader/BUILD.gn +++ b/third_party/WebKit/Source/core/loader/BUILD.gn
@@ -8,20 +8,26 @@ sources = [ "CookieJar.cpp", "DocumentLoadTiming.cpp", + "DocumentLoadTiming.h", "DocumentLoader.cpp", + "DocumentLoader.h", "DocumentThreadableLoader.cpp", "DocumentThreadableLoader.h", "DocumentThreadableLoaderClient.h", "DocumentWriter.cpp", + "DocumentWriter.h", "EmptyClients.cpp", "EmptyClients.h", "FormSubmission.cpp", + "FormSubmission.h", "FrameFetchContext.cpp", "FrameFetchContext.h", "FrameLoadRequest.cpp", "FrameLoadRequest.h", "FrameLoader.cpp", + "FrameLoader.h", "FrameLoaderStateMachine.cpp", + "FrameLoaderStateMachine.h", "HistoryItem.cpp", "HistoryItem.h", "HttpEquiv.cpp", @@ -36,11 +42,13 @@ "NavigationPolicy.cpp", "NavigationPolicy.h", "NavigationScheduler.cpp", + "NavigationScheduler.h", "PingLoader.cpp", "PingLoader.h", "PrerendererClient.cpp", "PrerendererClient.h", "ProgressTracker.cpp", + "ProgressTracker.h", "SubresourceFilter.cpp", "SubresourceFilter.h", "TextResourceDecoderBuilder.cpp", @@ -60,7 +68,11 @@ "appcache/ApplicationCacheHost.cpp", "appcache/ApplicationCacheHost.h", "modulescript/ModuleScriptFetchRequest.h", + "modulescript/ModuleScriptLoader.cpp", + "modulescript/ModuleScriptLoader.h", "modulescript/ModuleScriptLoaderClient.h", + "modulescript/ModuleScriptLoaderRegistry.cpp", + "modulescript/ModuleScriptLoaderRegistry.h", "private/CrossOriginPreflightResultCache.cpp", "private/CrossOriginPreflightResultCache.h", "private/FrameClientHintsPreferencesContext.cpp",
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp new file mode 100644 index 0000000..675f108 --- /dev/null +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp
@@ -0,0 +1,250 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/loader/modulescript/ModuleScriptLoader.h" + +#include "core/dom/Modulator.h" +#include "core/dom/ModuleScript.h" +#include "core/loader/modulescript/ModuleScriptLoaderClient.h" +#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h" +#include "platform/loader/fetch/FetchUtils.h" +#include "platform/loader/fetch/ResourceFetcher.h" +#include "platform/loader/fetch/ResourceLoadingLog.h" +#include "platform/network/mime/MIMETypeRegistry.h" +#include "platform/weborigin/SecurityPolicy.h" +#include "wtf/text/AtomicString.h" + +namespace blink { + +ModuleScriptLoader::ModuleScriptLoader(Modulator* modulator, + ModuleScriptLoaderRegistry* registry, + ModuleScriptLoaderClient* client) + : m_modulator(modulator), m_registry(registry), m_client(client) { + DCHECK(modulator); + DCHECK(registry); + DCHECK(client); +} + +ModuleScriptLoader::~ModuleScriptLoader() {} + +#if DCHECK_IS_ON() +const char* ModuleScriptLoader::stateToString(ModuleScriptLoader::State state) { + switch (state) { + case State::Initial: + return "Initial"; + case State::Fetching: + return "Fetching"; + case State::Finished: + return "Finished"; + } + NOTREACHED(); + return ""; +} +#endif + +void ModuleScriptLoader::advanceState(ModuleScriptLoader::State newState) { + switch (m_state) { + case State::Initial: + DCHECK_EQ(newState, State::Fetching); + break; + case State::Fetching: + DCHECK_EQ(newState, State::Finished); + break; + case State::Finished: + NOTREACHED(); + break; + } + +#if DCHECK_IS_ON() + RESOURCE_LOADING_DVLOG(1) + << "ModuleLoader[" << m_url.getString() << "]::advanceState(" + << stateToString(m_state) << " -> " << stateToString(newState) << ")"; +#endif + m_state = newState; + + if (m_state == State::Finished) { + m_registry->releaseFinishedLoader(this); + m_client->notifyNewSingleModuleFinished(m_moduleScript); + setResource(nullptr); + } +} + +void ModuleScriptLoader::fetch(const ModuleScriptFetchRequest& moduleRequest, + ResourceFetcher* fetcher, + ModuleGraphLevel level) { + // https://html.spec.whatwg.org/#fetch-a-single-module-script + + // Step 4. Set moduleMap[url] to "fetching". + advanceState(State::Fetching); + + // Step 5. Let request be a new request whose url is url, ... + ResourceRequest resourceRequest(moduleRequest.url()); +#if DCHECK_IS_ON() + m_url = moduleRequest.url(); +#endif + + // TODO(kouhei): handle "destination is destination," + + // ... type is "script", ... + // -> FetchResourceType is specified by ScriptResource::fetch + + // parser metadata is parser state, + ResourceLoaderOptions options; + options.parserDisposition = moduleRequest.parserState(); + // referrer is referrer, + if (!moduleRequest.referrer().isNull()) { + resourceRequest.setHTTPReferrer(SecurityPolicy::generateReferrer( + m_modulator->referrerPolicy(), moduleRequest.url(), + moduleRequest.referrer())); + } + // and client is fetch client settings object. -> set by ResourceFetcher + + // As initiator for module script fetch is not specified in HTML spec, + // we specity "" as initiator per: + // https://fetch.spec.whatwg.org/#concept-request-initiator + const AtomicString& initiatorName = emptyAtom; + + FetchRequest fetchRequest(resourceRequest, initiatorName, options); + // ... cryptographic nonce metadata is cryptographic nonce, ... + fetchRequest.setContentSecurityPolicyNonce(moduleRequest.nonce()); + // Note: The fetch request's "origin" isn't specified in + // https://html.spec.whatwg.org/#fetch-a-single-module-script + // Thus, the "origin" is "client" per + // https://fetch.spec.whatwg.org/#concept-request-origin + // ... mode is "cors", ... + // ... credentials mode is credentials mode, ... + // TODO(tyoshino): FetchCredentialsMode should be used to communicate CORS + // mode. + CrossOriginAttributeValue crossOrigin = + moduleRequest.credentialsMode() == + WebURLRequest::FetchCredentialsModeInclude + ? CrossOriginAttributeUseCredentials + : CrossOriginAttributeAnonymous; + fetchRequest.setCrossOriginAccessControl(m_modulator->securityOrigin(), + crossOrigin); + + // Module scripts are always async. + fetchRequest.setDefer(FetchRequest::LazyLoad); + + // Step 6. If the caller specified custom steps to perform the fetch, + // perform them on request, setting the is top-level flag if the top-level + // module fetch flag is set. Return from this algorithm, and when the custom + // perform the fetch steps complete with response response, run the remaining + // steps. + // Otherwise, fetch request. Return from this algorithm, and run the remaining + // steps as part of the fetch's process response for the response response. + // TODO(ServiceWorker team): Perform the "custom steps" for module usage + // inside service worker. + m_nonce = moduleRequest.nonce(); + m_parserState = moduleRequest.parserState(); + + ScriptResource* resource = ScriptResource::fetch(fetchRequest, fetcher); + if (m_state == State::Finished) { + // ScriptResource::fetch() has succeeded synchronously, + // ::notifyFinished() already took care of the |resource|. + return; + } + + if (!resource) { + // ScriptResource::fetch() has failed synchronously. + advanceState(State::Finished); + return; + } + + // ScriptResource::fetch() is processed asynchronously. + setResource(resource); +} + +bool ModuleScriptLoader::wasModuleLoadSuccessful(Resource* resource) { + // Implements conditions in Step 7 of + // https://html.spec.whatwg.org/#fetch-a-single-module-script + + // - response's type is "error" + if (resource->errorOccurred()) { + return false; + } + + const auto& response = resource->response(); + // - response's status is not an ok status + if (response.isHTTP() && !FetchUtils::isOkStatus(response.httpStatusCode())) { + return false; + } + + // The result of extracting a MIME type from response's header list + // (ignoring parameters) is not a JavaScript MIME type + // Note: For historical reasons, fetching a classic script does not include + // MIME type checking. In contrast, module scripts will fail to load if they + // are not of a correct MIME type. + // We use ResourceResponse::httpContentType() instead of mimeType(), as + // mimeType() may be rewritten by mime sniffer. + if (!MIMETypeRegistry::isSupportedJavaScriptMIMEType( + response.httpContentType())) + return false; + + return true; +} + +// ScriptResourceClient callback handler +void ModuleScriptLoader::notifyFinished(Resource*) { + // Note: "conditions" referred in Step 7 is implemented in + // wasModuleLoadSuccessful(). + // Step 7. If any of the following conditions are met, set moduleMap[url] to + // null, asynchronously complete this algorithm with null, and abort these + // steps. + if (!wasModuleLoadSuccessful(resource())) { + advanceState(State::Finished); + return; + } + + // Step 8. Let source text be the result of UTF-8 decoding response's body. + String sourceText = resource()->script(); + + // Step 9. Let module script be the result of creating a module script given + // source text, module map settings object, response's url, cryptographic + // nonce, parser state, and credentials mode. + m_moduleScript = createModuleScript( + sourceText, resource()->response().url(), m_modulator, m_nonce, + m_parserState, resource()->resourceRequest().fetchCredentialsMode()); + + advanceState(State::Finished); +} + +// https://html.spec.whatwg.org/#creating-a-module-script +ModuleScript* ModuleScriptLoader::createModuleScript( + const String& sourceText, + const KURL& url, + Modulator* modulator, + const String& nonce, + ParserDisposition parserState, + WebURLRequest::FetchCredentialsMode credentialsMode) { + // Step 1. Let script be a new module script that this algorithm will + // subsequently initialize. + // Step 2. Set script's settings object to the environment settings object + // provided. + // Note: "script's settings object" will be "modulator". + + // Delegate to Modulator::compileModule to process Steps 3-6. + ScriptModule result = modulator->compileModule(sourceText, url.getString()); + // Step 6: "...return null, and abort these steps." + if (result.isNull()) + return nullptr; + // Step 7. Set script's module record to result. + // Step 8. Set script's base URL to the script base URL provided. + // Step 9. Set script's cryptographic nonce to the cryptographic nonce + // provided. + // Step 10. Set script's parser state to the parser state. + // Step 11. Set script's credentials mode to the credentials mode provided. + // Step 12. Return script. + return ModuleScript::create(result, url, nonce, parserState, credentialsMode); +} + +DEFINE_TRACE(ModuleScriptLoader) { + visitor->trace(m_modulator); + visitor->trace(m_moduleScript); + visitor->trace(m_registry); + visitor->trace(m_client); + ResourceOwner<ScriptResource>::trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.h b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.h new file mode 100644 index 0000000..2e3cf75a --- /dev/null +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.h
@@ -0,0 +1,104 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ModuleScriptLoader_h +#define ModuleScriptLoader_h + +#include "core/CoreExport.h" +#include "core/loader/modulescript/ModuleScriptFetchRequest.h" +#include "core/loader/resource/ScriptResource.h" +#include "platform/heap/Handle.h" +#include "platform/loader/fetch/ResourceLoaderOptions.h" +#include "platform/loader/fetch/ResourceOwner.h" +#include "platform/weborigin/KURL.h" +#include "public/platform/WebURLRequest.h" + +namespace blink { + +class Modulator; +class ModuleScript; +class ModuleScriptLoaderClient; +class ModuleScriptLoaderRegistry; +enum class ModuleGraphLevel; + +// A ModuleScriptLoader is responsible for loading a new single ModuleScript. +// +// A ModuleScriptLoader constructs and emits FetchRequest to ResourceFetcher +// (via ScriptResource::fetch). Then, it keeps track of the fetch progress by +// being a ScriptResourceClient. Finally, it returns its client a compiled +// ModuleScript. +// +// ModuleScriptLoader(s) should only be used via Modulator and its ModuleMap. +class CORE_EXPORT ModuleScriptLoader final + : public GarbageCollectedFinalized<ModuleScriptLoader>, + public ResourceOwner<ScriptResource> { + WTF_MAKE_NONCOPYABLE(ModuleScriptLoader); + USING_GARBAGE_COLLECTED_MIXIN(ModuleScriptLoader); + + enum class State { + Initial, + // FetchRequest is being processed, and ModuleScriptLoader hasn't + // notifyFinished(). + Fetching, + // Finished successfully or w/ error. + Finished, + }; + + public: + static ModuleScriptLoader* create(Modulator* modulator, + ModuleScriptLoaderRegistry* registry, + ModuleScriptLoaderClient* client) { + return new ModuleScriptLoader(modulator, registry, client); + } + + ~ModuleScriptLoader() override; + + // Note: fetch may notify |m_client| synchronously or asynchronously. + void fetch(const ModuleScriptFetchRequest&, + ResourceFetcher*, + ModuleGraphLevel); + + bool isInitialState() const { return m_state == State::Initial; } + bool hasFinished() const { return m_state == State::Finished; } + + DECLARE_TRACE(); + + private: + ModuleScriptLoader(Modulator*, + ModuleScriptLoaderRegistry*, + ModuleScriptLoaderClient*); + + static ModuleScript* createModuleScript(const String& sourceText, + const KURL&, + Modulator*, + const String& nonce, + ParserDisposition, + WebURLRequest::FetchCredentialsMode); + + void advanceState(State newState); +#if DCHECK_IS_ON() + static const char* stateToString(State); +#endif + + // Implements ScriptResourceClient + void notifyFinished(Resource*) override; + String debugName() const override { return "ModuleScriptLoader"; } + + static bool wasModuleLoadSuccessful(Resource*); + + Member<Modulator> m_modulator; + State m_state = State::Initial; + String m_nonce; + ParserDisposition m_parserState; + Member<ModuleScript> m_moduleScript; + Member<ModuleScriptLoaderRegistry> m_registry; + Member<ModuleScriptLoaderClient> m_client; +#if DCHECK_IS_ON() + KURL m_url; +#endif +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.cpp new file mode 100644 index 0000000..8ca4d6c --- /dev/null +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.cpp
@@ -0,0 +1,38 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h" + +#include "core/loader/modulescript/ModuleScriptLoader.h" + +namespace blink { + +DEFINE_TRACE(ModuleScriptLoaderRegistry) { + visitor->trace(m_activeLoaders); +} + +ModuleScriptLoader* ModuleScriptLoaderRegistry::fetch( + const ModuleScriptFetchRequest& request, + ModuleGraphLevel level, + Modulator* modulator, + ResourceFetcher* fetcher, + ModuleScriptLoaderClient* client) { + ModuleScriptLoader* loader = + ModuleScriptLoader::create(modulator, this, client); + DCHECK(loader->isInitialState()); + m_activeLoaders.insert(loader); + loader->fetch(request, fetcher, level); + return loader; +} + +void ModuleScriptLoaderRegistry::releaseFinishedLoader( + ModuleScriptLoader* loader) { + DCHECK(loader->hasFinished()); + + auto it = m_activeLoaders.find(loader); + DCHECK_NE(it, m_activeLoaders.end()); + m_activeLoaders.erase(it); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.h b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.h new file mode 100644 index 0000000..06b8006 --- /dev/null +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderRegistry.h
@@ -0,0 +1,48 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ModuleScriptLoaderRegistry_h +#define ModuleScriptLoaderRegistry_h + +#include "core/CoreExport.h" +#include "platform/heap/Handle.h" +#include "platform/weborigin/KURL.h" +#include "wtf/HashSet.h" + +namespace blink { + +class Modulator; +class ModuleScriptFetchRequest; +class ModuleScriptLoader; +class ModuleScriptLoaderClient; +class ResourceFetcher; +enum class ModuleGraphLevel; + +// ModuleScriptLoaderRegistry keeps active ModuleLoaders alive. +class CORE_EXPORT ModuleScriptLoaderRegistry final + : public GarbageCollected<ModuleScriptLoaderRegistry> { + public: + static ModuleScriptLoaderRegistry* create() { + return new ModuleScriptLoaderRegistry; + } + DECLARE_TRACE(); + + ModuleScriptLoader* fetch(const ModuleScriptFetchRequest&, + ModuleGraphLevel, + Modulator*, + ResourceFetcher*, + ModuleScriptLoaderClient*); + + private: + ModuleScriptLoaderRegistry() = default; + + friend class ModuleScriptLoader; + void releaseFinishedLoader(ModuleScriptLoader*); + + HeapHashSet<Member<ModuleScriptLoader>> m_activeLoaders; +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp new file mode 100644 index 0000000..42910deb --- /dev/null +++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoaderTest.cpp
@@ -0,0 +1,164 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/loader/modulescript/ModuleScriptLoader.h" + +#include "core/dom/Document.h" +#include "core/dom/Modulator.h" +#include "core/dom/ModuleScript.h" +#include "core/loader/modulescript/ModuleScriptFetchRequest.h" +#include "core/loader/modulescript/ModuleScriptLoaderClient.h" +#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h" +#include "core/testing/DummyModulator.h" +#include "core/testing/DummyPageHolder.h" +#include "platform/heap/Handle.h" +#include "platform/loader/fetch/ResourceFetcher.h" +#include "platform/loader/testing/FetchTestingPlatformSupport.h" +#include "platform/loader/testing/MockFetchContext.h" +#include "platform/testing/URLTestHelpers.h" +#include "platform/testing/UnitTestHelpers.h" +#include "public/platform/Platform.h" +#include "public/platform/WebURLLoaderMockFactory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +namespace { + +class TestModuleScriptLoaderClient final + : public GarbageCollectedFinalized<TestModuleScriptLoaderClient>, + public ModuleScriptLoaderClient { + USING_GARBAGE_COLLECTED_MIXIN(TestModuleScriptLoaderClient); + + public: + TestModuleScriptLoaderClient() = default; + ~TestModuleScriptLoaderClient() override {} + + DEFINE_INLINE_TRACE() { visitor->trace(m_moduleScript); } + + void notifyNewSingleModuleFinished(ModuleScript* moduleScript) override { + m_wasNotifyFinished = true; + m_moduleScript = moduleScript; + } + + bool wasNotifyFinished() const { return m_wasNotifyFinished; } + ModuleScript* moduleScript() { return m_moduleScript; } + + private: + bool m_wasNotifyFinished = false; + Member<ModuleScript> m_moduleScript; +}; + +class ModuleScriptLoaderTestModulator final : public DummyModulator { + public: + ModuleScriptLoaderTestModulator(RefPtr<ScriptState> scriptState, + RefPtr<SecurityOrigin> securityOrigin) + : m_scriptState(std::move(scriptState)), + m_securityOrigin(std::move(securityOrigin)) {} + + ~ModuleScriptLoaderTestModulator() override {} + + SecurityOrigin* securityOrigin() override { return m_securityOrigin.get(); } + + ScriptModule compileModule(const String& script, + const String& urlStr) override { + ScriptState::Scope scope(m_scriptState.get()); + return ScriptModule::compile(m_scriptState->isolate(), + "export default 'foo';", ""); + } + + DECLARE_TRACE(); + + private: + RefPtr<ScriptState> m_scriptState; + RefPtr<SecurityOrigin> m_securityOrigin; +}; + +DEFINE_TRACE(ModuleScriptLoaderTestModulator) { + DummyModulator::trace(visitor); +} + +} // namespace + +class ModuleScriptLoaderTest : public ::testing::Test { + DISALLOW_COPY_AND_ASSIGN(ModuleScriptLoaderTest); + + public: + ModuleScriptLoaderTest() = default; + void SetUp() override; + + LocalFrame& frame() { return m_dummyPageHolder->frame(); } + Document& document() { return m_dummyPageHolder->document(); } + ResourceFetcher* fetcher() { return m_fetcher.get(); } + Modulator* modulator() { return m_modulator.get(); } + + protected: + ScopedTestingPlatformSupport<FetchTestingPlatformSupport> m_platform; + std::unique_ptr<DummyPageHolder> m_dummyPageHolder; + Persistent<ResourceFetcher> m_fetcher; + Persistent<Modulator> m_modulator; +}; + +void ModuleScriptLoaderTest::SetUp() { + m_platform->advanceClockSeconds(1.); // For non-zero DocumentParserTimings + m_dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); + document().setURL(KURL(KURL(), "https://example.test")); + m_fetcher = ResourceFetcher::create( + MockFetchContext::create(MockFetchContext::kShouldLoadNewResource)); + m_modulator = new ModuleScriptLoaderTestModulator( + ScriptState::forMainWorld(&frame()), document().getSecurityOrigin()); +} + +TEST_F(ModuleScriptLoaderTest, fetchDataURL) { + ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); + KURL url(KURL(), "data:text/javascript,export default 'grapes';"); + ModuleScriptFetchRequest moduleRequest( + url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); + TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; + registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, + modulator(), fetcher(), client); + + EXPECT_TRUE(client->wasNotifyFinished()) + << "ModuleScriptLoader should finish synchronously."; + ASSERT_TRUE(client->moduleScript()); + EXPECT_EQ(client->moduleScript()->instantiationState(), + ModuleInstantiationState::Uninstantiated); +} + +TEST_F(ModuleScriptLoaderTest, fetchInvalidURL) { + ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); + KURL url; + EXPECT_FALSE(url.isValid()); + ModuleScriptFetchRequest moduleRequest( + url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); + TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; + registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, + modulator(), fetcher(), client); + + EXPECT_TRUE(client->wasNotifyFinished()) + << "ModuleScriptLoader should finish synchronously."; + EXPECT_FALSE(client->moduleScript()); +} + +TEST_F(ModuleScriptLoaderTest, fetchURL) { + KURL url(ParsedURLString, "http://127.0.0.1:8000/module.js"); + URLTestHelpers::registerMockedURLLoad( + url, testing::webTestDataPath("module.js"), "text/javascript"); + + ModuleScriptLoaderRegistry* registry = ModuleScriptLoaderRegistry::create(); + ModuleScriptFetchRequest moduleRequest( + url, String(), ParserInserted, WebURLRequest::FetchCredentialsModeOmit); + TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient; + registry->fetch(moduleRequest, ModuleGraphLevel::TopLevelModuleFetch, + modulator(), fetcher(), client); + + EXPECT_FALSE(client->wasNotifyFinished()) + << "ModuleScriptLoader unexpectedly finished synchronously."; + m_platform->getURLLoaderMockFactory()->serveAsynchronousRequests(); + + EXPECT_TRUE(client->wasNotifyFinished()); + EXPECT_FALSE(client->moduleScript()); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/page/BUILD.gn b/third_party/WebKit/Source/core/page/BUILD.gn index d79c363f..0eff7b3 100644 --- a/third_party/WebKit/Source/core/page/BUILD.gn +++ b/third_party/WebKit/Source/core/page/BUILD.gn
@@ -11,18 +11,22 @@ "ChromeClient.cpp", "ChromeClient.h", "ContextMenuController.cpp", + "ContextMenuController.h", "ContextMenuProvider.h", "CreateWindow.cpp", "CreateWindow.h", "CustomContextMenuProvider.cpp", "CustomContextMenuProvider.h", "DragController.cpp", + "DragController.h", "DragData.cpp", "EventWithHitTestResults.h", "FocusChangedObserver.cpp", "FocusChangedObserver.h", "FocusController.cpp", + "FocusController.h", "FrameTree.cpp", + "FrameTree.h", "Page.cpp", "Page.h", "PageAnimator.cpp", @@ -41,9 +45,11 @@ "PointerLockController.h", "PopupOpeningObserver.h", "PrintContext.cpp", + "PrintContext.h", "ScopedPageSuspender.cpp", "ScopedPageSuspender.h", "SpatialNavigation.cpp", + "SpatialNavigation.h", "TouchAdjustment.cpp", "TouchAdjustment.h", "TouchDisambiguation.cpp",
diff --git a/third_party/WebKit/Source/core/paint/BUILD.gn b/third_party/WebKit/Source/core/paint/BUILD.gn index 0d3bc16..d6bc5ba2 100644 --- a/third_party/WebKit/Source/core/paint/BUILD.gn +++ b/third_party/WebKit/Source/core/paint/BUILD.gn
@@ -104,7 +104,9 @@ "PaintInvalidator.cpp", "PaintInvalidator.h", "PaintLayer.cpp", + "PaintLayer.h", "PaintLayerClipper.cpp", + "PaintLayerClipper.h", "PaintLayerFragment.h", "PaintLayerPainter.cpp", "PaintLayerPainter.h", @@ -112,8 +114,11 @@ "PaintLayerResourceInfo.cpp", "PaintLayerResourceInfo.h", "PaintLayerScrollableArea.cpp", + "PaintLayerScrollableArea.h", "PaintLayerStackingNode.cpp", + "PaintLayerStackingNode.h", "PaintLayerStackingNodeIterator.cpp", + "PaintLayerStackingNodeIterator.h", "PaintPhase.cpp", "PaintPhase.h", "PaintPropertyTreeBuilder.cpp",
diff --git a/third_party/WebKit/Source/core/style/BUILD.gn b/third_party/WebKit/Source/core/style/BUILD.gn index 60a1f66..bdba137 100644 --- a/third_party/WebKit/Source/core/style/BUILD.gn +++ b/third_party/WebKit/Source/core/style/BUILD.gn
@@ -9,7 +9,9 @@ sources = [ "AppliedTextDecoration.cpp", + "AppliedTextDecoration.h", "BasicShapes.cpp", + "BasicShapes.h", "BorderEdge.cpp", "BorderEdge.h", "BorderImageLength.h", @@ -20,11 +22,14 @@ "ComputedStyle.cpp", "ComputedStyle.h", "ContentData.cpp", + "ContentData.h", "CounterDirectives.cpp", + "CounterDirectives.h", "DataEquivalency.h", "DataPersistent.h", "DataRef.h", "FillLayer.cpp", + "FillLayer.h", "FilterOperation.cpp", "FilterOperation.h", "FilterOperations.cpp", @@ -33,6 +38,7 @@ "GridPositionsResolver.cpp", "GridPositionsResolver.h", "NinePieceImage.cpp", + "NinePieceImage.h", "QuotesData.cpp", "QuotesData.h", "ShadowData.cpp", @@ -40,24 +46,37 @@ "ShadowList.cpp", "ShadowList.h", "StyleBackgroundData.cpp", + "StyleBackgroundData.h", "StyleBoxData.cpp", + "StyleBoxData.h", "StyleContentAlignmentData.h", "StyleDeprecatedFlexibleBoxData.cpp", + "StyleDeprecatedFlexibleBoxData.h", "StyleFetchedImage.cpp", + "StyleFetchedImage.h", "StyleFetchedImageSet.cpp", + "StyleFetchedImageSet.h", "StyleFilterData.cpp", + "StyleFilterData.h", "StyleFlexibleBoxData.cpp", + "StyleFlexibleBoxData.h", "StyleGeneratedImage.cpp", + "StyleGeneratedImage.h", "StyleGridData.cpp", + "StyleGridData.h", "StyleGridItemData.cpp", + "StyleGridItemData.h", "StyleImage.cpp", + "StyleImage.h", "StyleInheritedData.cpp", + "StyleInheritedData.h", "StyleInheritedVariables.cpp", "StyleInheritedVariables.h", "StyleInvalidImage.h", "StyleMotionData.cpp", "StyleMotionData.h", "StyleMultiColData.cpp", + "StyleMultiColData.h", "StyleNonInheritedVariables.cpp", "StyleNonInheritedVariables.h", "StyleOffsetRotation.h", @@ -65,14 +84,20 @@ "StylePath.h", "StylePendingImage.h", "StyleRareInheritedData.cpp", + "StyleRareInheritedData.h", "StyleRareNonInheritedData.cpp", + "StyleRareNonInheritedData.h", "StyleScrollSnapData.cpp", "StyleScrollSnapData.h", "StyleSelfAlignmentData.h", "StyleSurroundData.cpp", + "StyleSurroundData.h", "StyleTransformData.cpp", + "StyleTransformData.h", "StyleVisualData.cpp", + "StyleVisualData.h", "StyleWillChangeData.cpp", + "StyleWillChangeData.h", "TextSizeAdjust.h", ] configs += [ @@ -84,7 +109,9 @@ blink_core_sources("svg") { sources = [ "SVGComputedStyle.cpp", + "SVGComputedStyle.h", "SVGComputedStyleDefs.cpp", + "SVGComputedStyleDefs.h", ] configs += [ # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp index 515e7e8..0a5208f 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp +++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -72,17 +72,13 @@ // re-create the same structure for an accurate size comparison. struct SameSizeAsComputedStyle : public RefCounted<SameSizeAsComputedStyle> { struct ComputedStyleBase { - unsigned m_bitfields[3]; + unsigned m_bitfields[4]; } m_base; void* dataRefs[7]; void* ownPtrs[1]; void* dataRefSvgStyle; - struct InheritedData { - unsigned m_bitfields[1]; - } m_inheritedData; - struct NonInheritedData { unsigned m_bitfields[1]; } m_nonInheritedData; @@ -153,7 +149,6 @@ m_rareInheritedData(o.m_rareInheritedData), m_styleInheritedData(o.m_styleInheritedData), m_svgStyle(o.m_svgStyle), - m_inheritedData(o.m_inheritedData), m_nonInheritedData(o.m_nonInheritedData) {} static StyleRecalcChange diffPseudoStyles(const ComputedStyle& oldStyle, @@ -335,7 +330,6 @@ m_rareInheritedData = inheritParent.m_rareInheritedData; } m_styleInheritedData = inheritParent.m_styleInheritedData; - m_inheritedData = inheritParent.m_inheritedData; if (m_svgStyle != inheritParent.m_svgStyle) m_svgStyle.access()->inheritFrom(inheritParent.m_svgStyle.get()); } @@ -477,7 +471,6 @@ bool ComputedStyle::nonIndependentInheritedEqual( const ComputedStyle& other) const { return ComputedStyleBase::nonIndependentInheritedEqual(other) && - m_inheritedData == other.m_inheritedData && m_styleInheritedData == other.m_styleInheritedData && m_svgStyle->inheritedEqual(*other.m_svgStyle) && m_rareInheritedData == other.m_rareInheritedData; @@ -501,7 +494,6 @@ // This is a fast check that only looks if the data structures are shared. // TODO(sashab): Should ComputedStyleBase have an inheritedDataShared method? return ComputedStyleBase::inheritedEqual(other) && - m_inheritedData == other.m_inheritedData && m_styleInheritedData.get() == other.m_styleInheritedData.get() && m_svgStyle.get() == other.m_svgStyle.get() && m_rareInheritedData.get() == other.m_rareInheritedData.get(); @@ -914,7 +906,7 @@ const ComputedStyle& other) const { if (visibility() != other.visibility() || printColorAdjust() != other.printColorAdjust() || - m_inheritedData.m_insideLink != other.m_inheritedData.m_insideLink || + insideLink() != other.insideLink() || !m_surround->border.visuallyEqual(other.m_surround->border) || *m_background != *other.m_background) return true; @@ -1070,8 +1062,7 @@ if (m_styleInheritedData->color != other.m_styleInheritedData->color || m_styleInheritedData->visitedLinkColor != other.m_styleInheritedData->visitedLinkColor || - m_inheritedData.m_hasSimpleUnderline != - other.m_inheritedData.m_hasSimpleUnderline || + m_hasSimpleUnderline != other.m_hasSimpleUnderline || m_visual->textDecoration != other.m_visual->textDecoration) { diff.setTextDecorationOrColorChanged(); } else if (m_rareNonInheritedData.get() != @@ -1714,7 +1705,7 @@ } TextDecoration ComputedStyle::textDecorationsInEffect() const { - if (m_inheritedData.m_hasSimpleUnderline) + if (m_hasSimpleUnderline) return TextDecorationUnderline; if (!m_rareInheritedData->appliedTextDecorations) return TextDecorationNone; @@ -1731,7 +1722,7 @@ const Vector<AppliedTextDecoration>& ComputedStyle::appliedTextDecorations() const { - if (m_inheritedData.m_hasSimpleUnderline) { + if (m_hasSimpleUnderline) { DEFINE_STATIC_LOCAL( Vector<AppliedTextDecoration>, underline, (1, AppliedTextDecoration( @@ -2016,8 +2007,7 @@ void ComputedStyle::applyTextDecorations(const Color& parentTextDecorationColor, bool overrideExistingColors) { - if (getTextDecoration() == TextDecorationNone && - !m_inheritedData.m_hasSimpleUnderline && + if (getTextDecoration() == TextDecorationNone && !m_hasSimpleUnderline && !m_rareInheritedData->appliedTextDecorations) return; @@ -2025,10 +2015,10 @@ // using m_hasSimpleUnderline. Color currentTextDecorationColor = visitedDependentColor(CSSPropertyTextDecorationColor); - if (m_inheritedData.m_hasSimpleUnderline && + if (m_hasSimpleUnderline && (getTextDecoration() != TextDecorationNone || currentTextDecorationColor != parentTextDecorationColor)) { - m_inheritedData.m_hasSimpleUnderline = false; + m_hasSimpleUnderline = false; addAppliedTextDecoration(AppliedTextDecoration(TextDecorationUnderline, TextDecorationStyleSolid, parentTextDecorationColor)); @@ -2037,7 +2027,7 @@ overrideTextDecorationColors(currentTextDecorationColor); if (getTextDecoration() == TextDecorationNone) return; - DCHECK(!m_inheritedData.m_hasSimpleUnderline); + DCHECK(!m_hasSimpleUnderline); // To save memory, we don't use AppliedTextDecoration objects in the common // case of a single simple underline of currentColor. TextDecoration decorationLines = getTextDecoration(); @@ -2046,7 +2036,7 @@ decorationStyle == TextDecorationStyleSolid && textDecorationColor().isCurrentColor(); if (isSimpleUnderline && !m_rareInheritedData->appliedTextDecorations) { - m_inheritedData.m_hasSimpleUnderline = true; + m_hasSimpleUnderline = true; return; } @@ -2055,7 +2045,7 @@ } void ComputedStyle::clearAppliedTextDecorations() { - m_inheritedData.m_hasSimpleUnderline = false; + m_hasSimpleUnderline = false; if (m_rareInheritedData->appliedTextDecorations) m_rareInheritedData.access()->appliedTextDecorations = nullptr; @@ -2063,8 +2053,7 @@ void ComputedStyle::restoreParentTextDecorations( const ComputedStyle& parentStyle) { - m_inheritedData.m_hasSimpleUnderline = - parentStyle.m_inheritedData.m_hasSimpleUnderline; + m_hasSimpleUnderline = parentStyle.m_hasSimpleUnderline; if (m_rareInheritedData->appliedTextDecorations != parentStyle.m_rareInheritedData->appliedTextDecorations) m_rareInheritedData.access()->appliedTextDecorations =
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h index d523524..590d3ae 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.h +++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -203,29 +203,6 @@ // !START SYNC!: Keep this in sync with the copy constructor in // ComputedStyle.cpp. - // inherit - struct InheritedData { - InheritedData() - : m_hasSimpleUnderline(false), - m_insideLink(static_cast<unsigned>(EInsideLink::kNotInsideLink)) {} - - bool operator==(const InheritedData& other) const { - // Generated properties are compared in ComputedStyleBase - return (m_hasSimpleUnderline == other.m_hasSimpleUnderline) && - (m_insideLink == other.m_insideLink); - } - - bool operator!=(const InheritedData& other) const { - return !(*this == other); - } - - unsigned m_hasSimpleUnderline : 1; // True if 'underline solid' is the only - // text decoration on this element. - - // non CSS2 inherited - unsigned m_insideLink : 2; // EInsideLink - } m_inheritedData; - // don't inherit struct NonInheritedData { NonInheritedData() @@ -233,8 +210,6 @@ m_originalDisplay(static_cast<unsigned>(initialDisplay())), m_verticalAlign(static_cast<unsigned>(initialVerticalAlign())), m_hasViewportUnits(false), - m_styleType(PseudoIdNone), - m_pseudoBits(0), m_hasRemUnits(false) {} // Compare computed styles, differences in inherited bits or other flags @@ -272,13 +247,6 @@ // lengths. mutable unsigned m_hasViewportUnits : 1; - // 32 bits - - unsigned m_styleType : 6; // PseudoId - unsigned m_pseudoBits : 8; - - // 64 bits - mutable unsigned m_hasRemUnits : 1; // If you add more style bits here, you will also need to update @@ -344,12 +312,8 @@ IsAtShadowBoundary = NotAtShadowBoundary); void copyNonInheritedFromCached(const ComputedStyle&); - PseudoId styleType() const { - return static_cast<PseudoId>(m_nonInheritedData.m_styleType); - } - void setStyleType(PseudoId styleType) { - m_nonInheritedData.m_styleType = styleType; - } + PseudoId styleType() const { return static_cast<PseudoId>(m_styleType); } + void setStyleType(PseudoId styleType) { m_styleType = styleType; } ComputedStyle* getCachedPseudoStyle(PseudoId) const; ComputedStyle* addCachedPseudoStyle(PassRefPtr<ComputedStyle>); @@ -2431,13 +2395,6 @@ SET_VAR(m_rareNonInheritedData, m_hasCompositorProxy, b); } - EInsideLink insideLink() const { - return static_cast<EInsideLink>(m_inheritedData.m_insideLink); - } - void setInsideLink(EInsideLink insideLink) { - m_inheritedData.m_insideLink = static_cast<unsigned>(insideLink); - } - bool requiresAcceleratedCompositingForExternalReasons(bool b) { return m_rareNonInheritedData ->m_requiresAcceleratedCompositingForExternalReasons; @@ -3777,24 +3734,23 @@ } inline bool ComputedStyle::hasAnyPublicPseudoStyles() const { - return m_nonInheritedData.m_pseudoBits; + return m_pseudoBits; } inline bool ComputedStyle::hasPseudoStyle(PseudoId pseudo) const { DCHECK(pseudo >= FirstPublicPseudoId); DCHECK(pseudo < FirstInternalPseudoId); - return (1 << (pseudo - FirstPublicPseudoId)) & - m_nonInheritedData.m_pseudoBits; + return (1 << (pseudo - FirstPublicPseudoId)) & m_pseudoBits; } inline void ComputedStyle::setHasPseudoStyle(PseudoId pseudo) { DCHECK(pseudo >= FirstPublicPseudoId); DCHECK(pseudo < FirstInternalPseudoId); - m_nonInheritedData.m_pseudoBits |= 1 << (pseudo - FirstPublicPseudoId); + m_pseudoBits |= 1 << (pseudo - FirstPublicPseudoId); } inline bool ComputedStyle::hasPseudoElementStyle() const { - return m_nonInheritedData.m_pseudoBits & ElementPseudoIdMask; + return m_pseudoBits & ElementPseudoIdMask; } } // namespace blink
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h index 606c4c2..c332bef 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h +++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -321,12 +321,6 @@ kNone }; -enum class EInsideLink : unsigned { - kNotInsideLink, - kInsideUnvisitedLink, - kInsideVisitedLink -}; - enum ETransformStyle3D { TransformStyle3DFlat, TransformStyle3DPreserve3D }; enum OffsetRotationType { OffsetRotationAuto, OffsetRotationFixed };
diff --git a/third_party/WebKit/Source/core/svg/BUILD.gn b/third_party/WebKit/Source/core/svg/BUILD.gn index 9859b9b..13835a5 100644 --- a/third_party/WebKit/Source/core/svg/BUILD.gn +++ b/third_party/WebKit/Source/core/svg/BUILD.gn
@@ -23,7 +23,9 @@ "SVGAElement.cpp", "SVGAElement.h", "SVGAngle.cpp", + "SVGAngle.h", "SVGAngleTearOff.cpp", + "SVGAngleTearOff.h", "SVGAnimateElement.cpp", "SVGAnimateElement.h", "SVGAnimateMotionElement.cpp", @@ -31,16 +33,25 @@ "SVGAnimateTransformElement.cpp", "SVGAnimateTransformElement.h", "SVGAnimatedAngle.cpp", + "SVGAnimatedAngle.h", "SVGAnimatedColor.cpp", + "SVGAnimatedColor.h", "SVGAnimatedEnumerationBase.cpp", + "SVGAnimatedEnumerationBase.h", "SVGAnimatedHref.cpp", "SVGAnimatedHref.h", "SVGAnimatedInteger.cpp", + "SVGAnimatedInteger.h", "SVGAnimatedIntegerOptionalInteger.cpp", + "SVGAnimatedIntegerOptionalInteger.h", "SVGAnimatedLength.cpp", + "SVGAnimatedLength.h", "SVGAnimatedNumber.cpp", + "SVGAnimatedNumber.h", "SVGAnimatedNumberOptionalNumber.cpp", + "SVGAnimatedNumberOptionalNumber.h", "SVGAnimatedPath.cpp", + "SVGAnimatedPath.h", "SVGAnimatedString.cpp", "SVGAnimatedString.h", "SVGAnimationElement.cpp", @@ -60,6 +71,7 @@ "SVGDiscardElement.cpp", "SVGDiscardElement.h", "SVGDocumentExtensions.cpp", + "SVGDocumentExtensions.h", "SVGElement.cpp", "SVGElement.h", "SVGElementProxy.cpp", @@ -69,6 +81,7 @@ "SVGEllipseElement.cpp", "SVGEllipseElement.h", "SVGEnumeration.cpp", + "SVGEnumeration.h", "SVGFEBlendElement.cpp", "SVGFEBlendElement.h", "SVGFEColorMatrixElement.cpp", @@ -146,9 +159,13 @@ "SVGIntegerOptionalInteger.cpp", "SVGIntegerOptionalInteger.h", "SVGLength.cpp", + "SVGLength.h", "SVGLengthContext.cpp", + "SVGLengthContext.h", "SVGLengthList.cpp", + "SVGLengthList.h", "SVGLengthTearOff.cpp", + "SVGLengthTearOff.h", "SVGLineElement.cpp", "SVGLineElement.h", "SVGLinearGradientElement.cpp", @@ -215,7 +232,9 @@ "SVGPolylineElement.cpp", "SVGPolylineElement.h", "SVGPreserveAspectRatio.cpp", + "SVGPreserveAspectRatio.h", "SVGPreserveAspectRatioTearOff.cpp", + "SVGPreserveAspectRatioTearOff.h", "SVGRadialGradientElement.cpp", "SVGRadialGradientElement.h", "SVGRect.cpp", @@ -262,11 +281,15 @@ "SVGTitleElement.cpp", "SVGTitleElement.h", "SVGTransform.cpp", + "SVGTransform.h", "SVGTransformDistance.cpp", "SVGTransformDistance.h", "SVGTransformList.cpp", + "SVGTransformList.h", "SVGTransformListTearOff.cpp", + "SVGTransformListTearOff.h", "SVGTransformTearOff.cpp", + "SVGTransformTearOff.h", "SVGTreeScopeResources.cpp", "SVGTreeScopeResources.h", "SVGURIReference.cpp", @@ -284,9 +307,11 @@ "SVGZoomAndPan.cpp", "SVGZoomAndPan.h", "animation/SMILTime.cpp", + "animation/SMILTime.h", "animation/SMILTimeContainer.cpp", "animation/SMILTimeContainer.h", "animation/SVGSMILElement.cpp", + "animation/SVGSMILElement.h", "graphics/SVGImage.cpp", "graphics/SVGImage.h", "graphics/SVGImageChromeClient.cpp", @@ -298,7 +323,9 @@ "graphics/filters/SVGFilterBuilder.cpp", "graphics/filters/SVGFilterBuilder.h", "properties/SVGAnimatedProperty.cpp", + "properties/SVGAnimatedProperty.h", "properties/SVGPropertyTearOff.cpp", + "properties/SVGPropertyTearOff.h", ] configs += [
diff --git a/third_party/WebKit/Source/core/svg/SVGImageElement.cpp b/third_party/WebKit/Source/core/svg/SVGImageElement.cpp index 99f083ea..41784f5 100644 --- a/third_party/WebKit/Source/core/svg/SVGImageElement.cpp +++ b/third_party/WebKit/Source/core/svg/SVGImageElement.cpp
@@ -195,6 +195,14 @@ return InsertionDone; } +FloatSize SVGImageElement::sourceDefaultObjectSize() { + if (layoutObject()) + return toLayoutSVGImage(layoutObject())->objectBoundingBox().size(); + SVGLengthContext lengthContext(this); + return FloatSize(m_width->currentValue()->value(lengthContext), + m_height->currentValue()->value(lengthContext)); +} + const AtomicString SVGImageElement::imageSourceURL() const { return AtomicString(hrefString()); }
diff --git a/third_party/WebKit/Source/core/svg/SVGImageElement.h b/third_party/WebKit/Source/core/svg/SVGImageElement.h index 54db5f4..db9341b98a 100644 --- a/third_party/WebKit/Source/core/svg/SVGImageElement.h +++ b/third_party/WebKit/Source/core/svg/SVGImageElement.h
@@ -22,6 +22,7 @@ #define SVGImageElement_h #include "core/SVGNames.h" +#include "core/html/canvas/CanvasImageElementSource.h" #include "core/svg/SVGAnimatedLength.h" #include "core/svg/SVGAnimatedPreserveAspectRatio.h" #include "core/svg/SVGGraphicsElement.h" @@ -31,8 +32,9 @@ namespace blink { -class SVGImageElement final : public SVGGraphicsElement, - public SVGURIReference { +class CORE_EXPORT SVGImageElement final : public SVGGraphicsElement, + public CanvasImageElementSource, + public SVGURIReference { DEFINE_WRAPPERTYPEINFO(); USING_GARBAGE_COLLECTED_MIXIN(SVGImageElement); @@ -77,7 +79,8 @@ bool selfHasRelativeLengths() const override; void didMoveToNewDocument(Document& oldDocument) override; - SVGImageLoader& imageLoader() const { return *m_imageLoader; } + SVGImageLoader& imageLoader() const override { return *m_imageLoader; } + FloatSize sourceDefaultObjectSize() override; Member<SVGAnimatedLength> m_x; Member<SVGAnimatedLength> m_y;
diff --git a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp index 02e3d66..9f52f11 100644 --- a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp +++ b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp
@@ -615,6 +615,11 @@ m_targetElement = target; didChangeAnimationTarget(); + + // If the animation is scheduled and there's an active interval, then + // revalidate the animation value. + if (m_activeState != Inactive && m_isScheduled) + startedActiveInterval(); } SMILTime SVGSMILElement::elapsed() const {
diff --git a/third_party/WebKit/Source/core/testing/DummyModulator.cpp b/third_party/WebKit/Source/core/testing/DummyModulator.cpp index 0ca4b1b..01dfd9d1 100644 --- a/third_party/WebKit/Source/core/testing/DummyModulator.cpp +++ b/third_party/WebKit/Source/core/testing/DummyModulator.cpp
@@ -12,6 +12,16 @@ DEFINE_TRACE(DummyModulator) {} +ReferrerPolicy DummyModulator::referrerPolicy() { + NOTREACHED(); + return ReferrerPolicyDefault; +} + +SecurityOrigin* DummyModulator::securityOrigin() { + NOTREACHED(); + return nullptr; +} + ScriptModuleResolver* DummyModulator::scriptModuleResolver() { NOTREACHED(); return nullptr; @@ -28,4 +38,10 @@ NOTREACHED(); } +ScriptModule DummyModulator::compileModule(const String& script, + const String& urlStr) { + NOTREACHED(); + return ScriptModule(); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/DummyModulator.h b/third_party/WebKit/Source/core/testing/DummyModulator.h index 9d72dc1..f7da0321 100644 --- a/third_party/WebKit/Source/core/testing/DummyModulator.h +++ b/third_party/WebKit/Source/core/testing/DummyModulator.h
@@ -5,6 +5,7 @@ #ifndef DummyModulator_h #define DummyModulator_h +#include "bindings/core/v8/ScriptModule.h" #include "core/dom/Modulator.h" #include "platform/heap/Handle.h" @@ -25,6 +26,7 @@ class DummyModulator : public GarbageCollectedFinalized<DummyModulator>, public Modulator { USING_GARBAGE_COLLECTED_MIXIN(DummyModulator); + DISALLOW_COPY_AND_ASSIGN(DummyModulator); public: DummyModulator(); @@ -33,9 +35,14 @@ ScriptModuleResolver* scriptModuleResolver() override; WebTaskRunner* taskRunner() override; + ReferrerPolicy referrerPolicy() override; + SecurityOrigin* securityOrigin() override; + void fetchNewSingleModule(const ModuleScriptFetchRequest&, ModuleGraphLevel, ModuleScriptLoaderClient*) override; + ScriptModule compileModule(const String& script, + const String& urlStr) override; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/InternalSettings.cpp b/third_party/WebKit/Source/core/testing/InternalSettings.cpp index dc12dca4..76f832b 100644 --- a/third_party/WebKit/Source/core/testing/InternalSettings.cpp +++ b/third_party/WebKit/Source/core/testing/InternalSettings.cpp
@@ -457,8 +457,6 @@ if (token == "none") hoverTypes |= HoverTypeNone; - else if (token == "on-demand") - hoverTypes |= HoverTypeOnDemand; else if (token == "hover") hoverTypes |= HoverTypeHover; else @@ -477,8 +475,6 @@ HoverType hoverType = HoverTypeNone; if (token == "none") hoverType = HoverTypeNone; - else if (token == "on-demand") - hoverType = HoverTypeOnDemand; else if (token == "hover") hoverType = HoverTypeHover; else
diff --git a/third_party/WebKit/Source/core/timing/BUILD.gn b/third_party/WebKit/Source/core/timing/BUILD.gn index dadc3ad..094cc2b 100644 --- a/third_party/WebKit/Source/core/timing/BUILD.gn +++ b/third_party/WebKit/Source/core/timing/BUILD.gn
@@ -9,6 +9,7 @@ "DOMWindowPerformance.cpp", "DOMWindowPerformance.h", "MemoryInfo.cpp", + "MemoryInfo.h", "Performance.cpp", "Performance.h", "PerformanceBase.cpp", @@ -36,6 +37,7 @@ "PerformanceUserTiming.cpp", "PerformanceUserTiming.h", "SharedWorkerPerformance.cpp", + "SharedWorkerPerformance.h", "TaskAttributionTiming.cpp", "TaskAttributionTiming.h", "WorkerGlobalScopePerformance.cpp",
diff --git a/third_party/WebKit/Source/core/workers/BUILD.gn b/third_party/WebKit/Source/core/workers/BUILD.gn index 0f396f4..89d3a7de 100644 --- a/third_party/WebKit/Source/core/workers/BUILD.gn +++ b/third_party/WebKit/Source/core/workers/BUILD.gn
@@ -77,6 +77,7 @@ "Worklet.h", "WorkletGlobalScope.cpp", "WorkletGlobalScope.h", + "WorkletGlobalScopeProxy.h", "WorkletThreadHolder.h", ]
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn index c0de0209..e0f1fdc 100644 --- a/third_party/WebKit/Source/devtools/BUILD.gn +++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -246,8 +246,8 @@ "front_end/help/Help.js", "front_end/help/module.json", "front_end/help/releaseNote.css", - "front_end/help/ReleaseNote.js", "front_end/help/ReleaseNoteText.js", + "front_end/help/ReleaseNoteView.js", "front_end/host/InspectorFrontendHost.js", "front_end/host/InspectorFrontendHostAPI.js", "front_end/host/module.json", @@ -812,6 +812,7 @@ "front_end/Images/toolbarResizerVertical.png", "front_end/Images/touchCursor.png", "front_end/Images/touchCursor_2x.png", + "front_end/Images/whatsnew.png", ] resources_out_dir = "$root_out_dir/resources/inspector"
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/whatsnew.png b/third_party/WebKit/Source/devtools/front_end/Images/whatsnew.png new file mode 100644 index 0000000..8ae6257e --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/Images/whatsnew.png Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js index 9ca7b101..22a10b9e 100644 --- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js +++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
@@ -475,9 +475,9 @@ element = this._formatParameterAsError(output); break; case 'function': - case 'generator': element = this._formatParameterAsFunction(output, includePreview); break; + case 'generator': case 'iterator': case 'map': case 'object':
diff --git a/third_party/WebKit/Source/devtools/front_end/cookie_table/CookiesTable.js b/third_party/WebKit/Source/devtools/front_end/cookie_table/CookiesTable.js index adf3439..3c5786f 100644 --- a/third_party/WebKit/Source/devtools/front_end/cookie_table/CookiesTable.js +++ b/third_party/WebKit/Source/devtools/front_end/cookie_table/CookiesTable.js
@@ -116,7 +116,7 @@ } /** - * @param {!Array.<!{folderName: ?string, cookies: !Array.<!SDK.Cookie>}>} cookieFolders + * @param {!Array.<!{folderName: ?string, cookies: ?Array.<!SDK.Cookie>}>} cookieFolders */ setCookieFolders(cookieFolders) { this._data = cookieFolders;
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js index 2277e80..198849f 100644 --- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js +++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js
@@ -196,9 +196,6 @@ unusedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.unusedSize() / this._maxSize) + '%'; var usedSizeBar = barContainer.createChild('div', 'bar bar-used-size'); usedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.usedSize() / this._maxSize) + '%'; - var sizeBar = barContainer.createChild('div', 'bar bar-slack-size'); - var slackSize = this._coverageInfo.size() - this._coverageInfo.unusedSize() - this._coverageInfo.usedSize(); - sizeBar.style.width = Math.ceil(100 * slackSize / this._maxSize) + '%'; } return cell; }
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js index 2feb80c6..f4a2b46 100644 --- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js +++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js
@@ -172,6 +172,8 @@ this._coverageByURL.set(url, entry); } var segments = Coverage.CoverageModel._convertToDisjointSegments(ranges); + if (segments.length && segments.peekLast().end < contentLength) + segments.push({end: contentLength}); entry.update(contentProvider, contentLength, startLine, startColumn, segments); } }; @@ -185,7 +187,6 @@ /** @type {!Map<string, !Coverage.CoverageInfo>} */ this._coverageInfoByLocation = new Map(); this._size = 0; - this._unusedSize = 0; this._usedSize = 0; /** @type {!Coverage.CoverageType} */ this._type; @@ -209,10 +210,8 @@ this._type |= entry.type(); } this._usedSize -= entry._usedSize; - this._unusedSize -= entry._unusedSize; entry.mergeCoverage(segments); this._usedSize += entry._usedSize; - this._unusedSize += entry._unusedSize; } /** @@ -239,15 +238,15 @@ /** * @return {number} */ - unusedSize() { - return this._unusedSize; + usedSize() { + return this._usedSize; } /** * @return {number} */ - usedSize() { - return this._usedSize; + unusedSize() { + return this._size - this._usedSize; } /** @@ -273,7 +272,6 @@ this._lineOffset = lineOffset; this._columnOffset = columnOffset; this._usedSize = 0; - this._unusedSize = 0; if (contentProvider.contentType().isScript()) { this._coverageType = Coverage.CoverageType.JavaScript; @@ -366,16 +364,11 @@ _updateStats() { this._usedSize = 0; - this._unusedSize = 0; var last = 0; for (var segment of this._segments) { - if (typeof segment.count === 'number') { - if (segment.count) - this._usedSize += segment.end - last; - else - this._unusedSize += segment.end - last; - } + if (segment.count) + this._usedSize += segment.end - last; last = segment.end; } }
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css b/third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css index adfa5ca..1d7a7f3 100644 --- a/third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css +++ b/third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css
@@ -38,10 +38,6 @@ .data-grid td .bar-container { } -.data-grid td .bar-slack-size { - background-color: rgb(150, 150, 200); -} - .data-grid td .bar-unused-size { background-color: #E57373; }
diff --git a/third_party/WebKit/Source/devtools/front_end/help/Help.js b/third_party/WebKit/Source/devtools/front_end/help/Help.js index d4a2080..1e0c5b1d 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/Help.js +++ b/third_party/WebKit/Source/devtools/front_end/help/Help.js
@@ -60,17 +60,11 @@ */ Help._releaseNoteViewId = 'release-note'; -/** @typedef {!{src: string}} */ -Help.ReleaseNoteImage; - -/** @typedef {!{text: string, link: (string | undefined)}} */ -Help.ReleaseNoteHighlightContent; - -/** @typedef {!{contents: !Array<!Help.ReleaseNoteHighlightContent>, featured: (boolean | undefined)}} */ +/** @typedef {!{title: string, subtitle: string, link: string}} */ Help.ReleaseNoteHighlight; /** * @typedef {!{version: number, highlights: !Array<!Help.ReleaseNoteHighlight>, - * link: string, image: !Help.ReleaseNoteImage}} + * link: string}} */ Help.ReleaseNote;
diff --git a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js deleted file mode 100644 index 8eb40d9..0000000 --- a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js +++ /dev/null
@@ -1,58 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -Help.ReleaseNoteView = class extends UI.VBox { - constructor() { - super(true); - this.registerRequiredCSS('help/releaseNote.css'); - var releaseNoteElement = this._createReleaseNoteElement(Help.latestReleaseNote()); - this.contentElement.appendChild(releaseNoteElement); - } - - /** - * @param {!Help.ReleaseNote} releaseNote - * @return {!Element} - */ - _createReleaseNoteElement(releaseNote) { - var container = createElementWithClass('div', 'release-note-container'); - var contentContainer = container.createChild('div', 'release-note-content-container'); - var textContainer = contentContainer.createChild('div', 'release-note-text-container'); - textContainer.createChild('div', 'release-note-update-text') - .createTextChild(Common.UIString('Chrome has been updated. ')); - textContainer.createChild('div').createTextChild(Common.UIString(`Here's what's new in DevTools:`)); - var highlightContainer = textContainer.createChild('ul', 'release-note-highlight-container'); - for (var highlight of releaseNote.highlights) { - var listItem = highlightContainer.createChild('li'); - for (var content of highlight.contents) { - if (content.link) { - var className = highlight.featured ? 'release-note-featured-link' : 'release-note-link'; - listItem.appendChild(UI.createExternalLink(content.link, content.text + ' ', className)); - } else { - listItem.createTextChild(content.text + ' '); - } - } - } - - var actionContainer = container.createChild('div', 'release-note-action-container'); - var viewMoreButton = UI.createTextButton(Common.UIString('Learn more'), event => { - event.consume(true); - InspectorFrontendHost.openInNewTab(releaseNote.link); - }); - actionContainer.appendChild(viewMoreButton); - - var closeButton = UI.createTextButton(Common.UIString('Close'), event => { - event.consume(true); - UI.inspectorView.closeDrawerTab(Help._releaseNoteViewId, true); - }, 'close-release-note'); - actionContainer.appendChild(closeButton); - - var imageLink = UI.createExternalLink(releaseNote.link, ' '); - contentContainer.appendChild(imageLink); - var image = imageLink.createChild('img', 'release-note-image'); - image.src = releaseNote.image.src; - image.addEventListener('mouseover', e => container.classList.add('image-hover')); - image.addEventListener('mouseout', e => container.classList.remove('image-hover')); - return container; - } -};
diff --git a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteText.js b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteText.js index 547fd82f..6d28077 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteText.js +++ b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteText.js
@@ -7,62 +7,29 @@ // https://github.com/ChromeDevTools/devtools-frontend/wiki/Release-Notes /** @type {!Array<!Help.ReleaseNote>} */ -Help.releaseNoteText = [ - { - version: 1, - highlights: [ - { - contents: [ - { - text: 'Debugger', - }, - { - text: 'catches out-of-memory', - link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#out-of-memory-breakpoints', - }, - { - text: 'errors', - }, - ], - featured: true, - }, - { - contents: [ - { - text: 'Edit cookies directly', - link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#cookies', - }, - { - text: 'from the Application panel', - }, - ], - }, - { - contents: [ - { - text: 'Better', - }, - { - text: 'filtering & settings for Console', - link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#console', - }, - ], - }, - { - contents: [ - { - text: 'Improved', - }, - { - text: 'Performance and Memory panels', - link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#performance-panel', - } - ], - }, - ], - link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes', - image: { - src: 'https://developers.google.com/web/updates/images/2017/03/release-notes-preview.png', +Help.releaseNoteText = [{ + version: 1, + highlights: [ + { + title: 'New Performance and Memory panels', + subtitle: 'Head to Performance for JavaScript profiling', + link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#performance-panel', }, - }, -]; + { + title: 'Editable cookies', + subtitle: 'You can edit any existing cookies and create new ones in the Application panel', + link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#cookies', + }, + { + title: 'Console filtering & settings', + subtitle: 'Use the text filter or click the Console settings icon to touch up your preferences', + link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#console', + }, + { + title: 'Debugger catches out-of-memory errors', + subtitle: 'See the stack or grab a heap snapshot to see why the app may crash', + link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes#out-of-memory-breakpoints', + }, + ], + link: 'https://developers.google.com/web/updates/2017/03/devtools-release-notes', +}];
diff --git a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteView.js b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteView.js new file mode 100644 index 0000000..c2af2ce --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNoteView.js
@@ -0,0 +1,56 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +Help.ReleaseNoteView = class extends UI.VBox { + constructor() { + super(true); + this.registerRequiredCSS('help/releaseNote.css'); + var releaseNoteElement = this._createReleaseNoteElement(Help.latestReleaseNote()); + var topSection = this.contentElement.createChild('div', 'release-note-top-section'); + topSection.textContent = Common.UIString('New since the last update'); + this.contentElement.appendChild(releaseNoteElement); + } + + /** + * @param {!Help.ReleaseNote} releaseNote + * @return {!Element} + */ + _createReleaseNoteElement(releaseNote) { + var hbox = createElementWithClass('div', 'hbox'); + var container = hbox.createChild('div', 'release-note-container'); + var contentContainer = container.createChild('ul'); + for (var highlight of releaseNote.highlights) { + var listItem = contentContainer.createChild('li'); + var title = UI.createExternalLink(highlight.link, highlight.title + ' ', 'release-note-title'); + title.title = ''; + listItem.appendChild(title); + var subtitle = UI.createExternalLink(highlight.link, highlight.subtitle + ' ', 'release-note-subtitle'); + subtitle.title = ''; + listItem.appendChild(subtitle); + } + + var actionContainer = container.createChild('div', 'release-note-action-container'); + var viewMoreButton = actionContainer.createChild('button'); + viewMoreButton.textContent = Common.UIString('Learn more'); + viewMoreButton.addEventListener('click', event => { + event.consume(true); + InspectorFrontendHost.openInNewTab(releaseNote.link); + }); + + var closeButton = actionContainer.createChild('button', 'close-release-note'); + closeButton.textContent = Common.UIString('Close'); + closeButton.addEventListener('click', event => { + event.consume(true); + UI.inspectorView.closeDrawerTab(Help._releaseNoteViewId, true); + }); + + var imageLink = UI.createExternalLink(releaseNote.link, ' '); + imageLink.classList.add('release-note-image'); + imageLink.title = ''; + hbox.appendChild(imageLink); + var image = imageLink.createChild('img'); + image.src = 'Images/whatsnew.png'; + return hbox; + } +};
diff --git a/third_party/WebKit/Source/devtools/front_end/help/module.json b/third_party/WebKit/Source/devtools/front_end/help/module.json index a91d233e..6f4d21a 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/module.json +++ b/third_party/WebKit/Source/devtools/front_end/help/module.json
@@ -17,7 +17,7 @@ ], "scripts": [ "Help.js", - "ReleaseNote.js", + "ReleaseNoteView.js", "ReleaseNoteText.js" ], "resources": [
diff --git a/third_party/WebKit/Source/devtools/front_end/help/releaseNote.css b/third_party/WebKit/Source/devtools/front_end/help/releaseNote.css index b2109c2..e09c204 100644 --- a/third_party/WebKit/Source/devtools/front_end/help/releaseNote.css +++ b/third_party/WebKit/Source/devtools/front_end/help/releaseNote.css
@@ -4,57 +4,100 @@ * found in the LICENSE file. */ +:host { +} + +.hbox { + overflow-y: auto; + overflow-x: hidden; +} + +.release-note-top-section { + color: white; + height: 36px; + line-height: 36px; + padding: 0 15px; + font-size: 16px; + flex: none; + background-color: #3367d6; + box-shadow: 0 2px 4px rgba(0,0,0,.28); +} + .release-note-container { display: flex; flex-direction: column; - overflow: hidden; } -.release-note-update-text { - font-weight: bold; -} - -.release-note-content-container { +.release-note-container ul { display: flex; - flex-direction: row; - overflow-x: hidden; - overflow-y: auto; - padding: 12px 12px 0 12px; + padding: 10px 16px; + flex-direction: column; + flex: none; + margin: 4px 12px 0 2px; + max-width: 600px; } -.release-note-text-container { - min-width: 220px; - max-width: 300px; +.release-note-container li { + display: flex; + flex-direction:column; + flex: none; + line-height: 24px; + font-size: 14px; } -.release-note-action-container { - padding: 12px; - min-height: 48px; -} -.release-note-highlight-container { - line-height: 1.5; - -webkit-padding-start: 16px; - -webkit-margin-after: 0; -} - -.release-note-link, .release-note-featured-link { +.release-note-container li:hover { color: #039be5; +} + +.release-note-title, +.release-note-subtitle { + color: inherit; text-decoration: none; } -.release-note-link:hover, -.release-note-featured-link:hover, -.image-hover .release-note-featured-link { - text-decoration: underline; +.release-note-subtitle { + font-size: 13px; + line-height: 13px; + padding-bottom: 8px; +} + +.release-note-container li:not(:hover) .release-note-subtitle { + color: #999; +} + +.release-note-action-container > button, +.release-note-action-container > button:hover { + margin: 10px 20px; + background: none; + border: none; + font-weight: 500; + text-transform: uppercase; + color: #757575; + font-size: 13px; +} + +.release-note-action-container > button:hover { + cursor: pointer; + color: #666; +} + +.release-note-action-container { + flex: none; } .release-note-image { - width: 200px; - margin-left: 12px; - border: 1px solid lightgrey; + flex-shrink: 2; } -.close-release-note { - margin-left: 4px; +img { + margin: 20px; + width: 260px; + height: 200px; + flex: none; + box-shadow: 0 2px 4px rgba(0, 0, 0, .3); +} + +img:hover { + box-shadow: 0 2px 4px rgba(0, 0, 0, .5); }
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js index 95d5491..1c45cbb 100644 --- a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js +++ b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
@@ -231,7 +231,8 @@ var position = this._convertIntoScreenSpace(event); this._domModel.nodeForLocation( Math.floor(position.x / this._pageScaleFactor + this._scrollOffsetX), - Math.floor(position.y / this._pageScaleFactor + this._scrollOffsetY), callback.bind(this)); + Math.floor(position.y / this._pageScaleFactor + this._scrollOffsetY), + Common.moduleSetting('showUAShadowDOM').get(), callback.bind(this)); /** * @param {?SDK.DOMNode} node
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js index 61931e8..2a23a3d 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/DOMModel.js
@@ -1834,10 +1834,11 @@ /** * @param {number} x * @param {number} y + * @param {boolean} includeUserAgentShadowDOM * @param {function(?SDK.DOMNode)} callback */ - nodeForLocation(x, y, callback) { - this._agent.getNodeForLocation(x, y, mycallback.bind(this)); + nodeForLocation(x, y, includeUserAgentShadowDOM, callback) { + this._agent.getNodeForLocation(x, y, includeUserAgentShadowDOM, mycallback.bind(this)); /** * @param {?Protocol.Error} error
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js index 0a85a871..9400e3ed 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/Icon.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/Icon.js
@@ -103,7 +103,6 @@ 'smallicon-command-result': {x: -40, y: -19, width: 10, height: 10, spritesheet: 'smallicons'}, 'smallicon-shadow': {x: -60, y: -20, width: 10, height: 10, spritesheet: 'smallicons', isMask: true}, 'smallicon-bezier': {x: -80, y: -20, width: 10, height: 10, spritesheet: 'smallicons', isMask: true}, - 'smallicon-dropdown-arrow': {x: -18, y: -96, width: 12, height: 12, spritesheet: 'largeicons', isMask: true}, 'smallicon-triangle-right': {x: -4, y: -98, width: 10, height: 10, spritesheet: 'largeicons', isMask: true}, 'smallicon-triangle-down': {x: -20, y: -98, width: 10, height: 10, spritesheet: 'largeicons', isMask: true}, 'smallicon-triangle-up': {x: -4, y: -111, width: 10, height: 10, spritesheet: 'largeicons', isMask: true},
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js index 75ed17ce..4434ea05 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/Toolbar.js
@@ -520,7 +520,7 @@ */ turnIntoSelect(width) { this.element.classList.add('toolbar-has-dropdown'); - var dropdownArrowIcon = UI.Icon.create('smallicon-dropdown-arrow', 'toolbar-dropdown-arrow'); + var dropdownArrowIcon = UI.Icon.create('smallicon-triangle-down', 'toolbar-dropdown-arrow'); this.element.appendChild(dropdownArrowIcon); if (width) this.element.style.width = width + 'px'; @@ -835,7 +835,7 @@ super(createElementWithClass('span', 'toolbar-select-container')); this._selectElement = this.element.createChild('select', 'toolbar-item'); - var dropdownArrowIcon = UI.Icon.create('smallicon-dropdown-arrow', 'toolbar-dropdown-arrow'); + var dropdownArrowIcon = UI.Icon.create('smallicon-triangle-down', 'toolbar-dropdown-arrow'); this.element.appendChild(dropdownArrowIcon); if (changeHandler) this._selectElement.addEventListener('change', changeHandler, false);
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css b/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css index dfdd957..38423c7 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css +++ b/third_party/WebKit/Source/devtools/front_end/ui/toolbar.css
@@ -55,7 +55,6 @@ .toolbar-dropdown-arrow { background-color: #6D6D6D; pointer-events: none; - margin: auto 0; flex: none; } @@ -202,7 +201,7 @@ -webkit-appearance: none; border: 0; border-radius: 0; - padding: 0 8px 0 5px; + padding: 0 13px 0 5px; margin-right: -10px; position: relative; }
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn index 434e74d..91e8181 100644 --- a/third_party/WebKit/Source/modules/BUILD.gn +++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -251,6 +251,7 @@ "fetch/BytesConsumerForDataConsumerHandleTest.cpp", "fetch/BytesConsumerTest.cpp", "fetch/BytesConsumerTestUtil.cpp", + "fetch/BytesConsumerTestUtil.h", "fetch/DataConsumerHandleTestUtil.cpp", "fetch/DataConsumerHandleTestUtil.h", "fetch/FetchDataLoaderTest.cpp",
diff --git a/third_party/WebKit/Source/modules/battery/BUILD.gn b/third_party/WebKit/Source/modules/battery/BUILD.gn index 739062f0..edc5ee6 100644 --- a/third_party/WebKit/Source/modules/battery/BUILD.gn +++ b/third_party/WebKit/Source/modules/battery/BUILD.gn
@@ -17,5 +17,6 @@ deps = [ "//device/battery:mojo_bindings_blink", + "//services/device/public/interfaces:interfaces_blink", ] }
diff --git a/third_party/WebKit/Source/modules/battery/BatteryDispatcher.cpp b/third_party/WebKit/Source/modules/battery/BatteryDispatcher.cpp index 942567dec..611ac94b 100644 --- a/third_party/WebKit/Source/modules/battery/BatteryDispatcher.cpp +++ b/third_party/WebKit/Source/modules/battery/BatteryDispatcher.cpp
@@ -5,8 +5,9 @@ #include "modules/battery/BatteryDispatcher.h" #include "platform/mojo/MojoHelper.h" -#include "public/platform/InterfaceProvider.h" +#include "public/platform/Connector.h" #include "public/platform/Platform.h" +#include "services/device/public/interfaces/constants.mojom-blink.h" #include "wtf/Assertions.h" namespace blink { @@ -44,8 +45,8 @@ void BatteryDispatcher::startListening() { DCHECK(!m_monitor.is_bound()); - Platform::current()->interfaceProvider()->getInterface( - mojo::MakeRequest(&m_monitor)); + Platform::current()->connector()->bindInterface( + device::mojom::blink::kServiceName, mojo::MakeRequest(&m_monitor)); queryNextStatus(); }
diff --git a/third_party/WebKit/Source/modules/battery/DEPS b/third_party/WebKit/Source/modules/battery/DEPS index f7fbcd8..52bc4b6 100644 --- a/third_party/WebKit/Source/modules/battery/DEPS +++ b/third_party/WebKit/Source/modules/battery/DEPS
@@ -8,5 +8,6 @@ "+modules/battery", "+platform", "+public/platform", + "+services/device/public/interfaces/constants.mojom-blink.h", "-web", ]
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp index a1011220..a0abd0e 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.cpp
@@ -130,13 +130,6 @@ } } -void Bluetooth::Dispose() { - // The pipe to this object must be closed when is marked unreachable to - // prevent messages from being dispatched before lazy sweeping. - if (m_clientBinding.is_bound()) - m_clientBinding.Close(); -} - void Bluetooth::RequestDeviceCallback( ScriptPromiseResolver* resolver, mojom::blink::WebBluetoothResult result, @@ -188,15 +181,6 @@ if (interfaceProvider) interfaceProvider->getInterface(mojo::MakeRequest(&m_service)); - - if (m_service) { - // Create an associated interface ptr and pass it to the - // WebBluetoothService so that it can send us events without us - // prompting. - mojom::blink::WebBluetoothServiceClientAssociatedPtrInfo ptrInfo; - m_clientBinding.Bind(&ptrInfo); - m_service->SetClient(std::move(ptrInfo)); - } } if (!m_service) { @@ -229,53 +213,11 @@ return promise; } -void Bluetooth::AddToConnectedDevicesMap(const String& deviceId, - BluetoothDevice* device) { - m_connectedDevices.insert(deviceId, device); -} - -void Bluetooth::RemoveFromConnectedDevicesMap(const String& deviceId) { - m_connectedDevices.erase(deviceId); -} - -void Bluetooth::RegisterCharacteristicObject( - const String& characteristicInstanceId, - BluetoothRemoteGATTCharacteristic* characteristic) { - m_activeCharacteristics.insert(characteristicInstanceId, characteristic); -} - -void Bluetooth::CharacteristicObjectRemoved( - const String& characteristicInstanceId) { - m_activeCharacteristics.erase(characteristicInstanceId); -} - DEFINE_TRACE(Bluetooth) { visitor->trace(m_deviceInstanceMap); - visitor->trace(m_activeCharacteristics); - visitor->trace(m_connectedDevices); } -Bluetooth::Bluetooth() : m_clientBinding(this) {} - -void Bluetooth::RemoteCharacteristicValueChanged( - const WTF::String& characteristicInstanceId, - const WTF::Vector<uint8_t>& value) { - BluetoothRemoteGATTCharacteristic* characteristic = - m_activeCharacteristics.at(characteristicInstanceId); - if (characteristic) - characteristic->DispatchCharacteristicValueChanged(value); -} - -void Bluetooth::GattServerDisconnected(const WTF::String& deviceId) { - BluetoothDevice* device = m_connectedDevices.at(deviceId); - if (device) { - // Remove device from the map before calling dispatchGattServerDisconnected - // to avoid removing a device the gattserverdisconnected event handler might - // have re-connected. - m_connectedDevices.erase(deviceId); - device->DispatchGattServerDisconnected(); - } -} +Bluetooth::Bluetooth() {} BluetoothDevice* Bluetooth::GetBluetoothDeviceRepresentingDevice( mojom::blink::WebBluetoothDevicePtr devicePtr,
diff --git a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.h b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.h index 699bfecd..049eba1 100644 --- a/third_party/WebKit/Source/modules/bluetooth/Bluetooth.h +++ b/third_party/WebKit/Source/modules/bluetooth/Bluetooth.h
@@ -8,29 +8,23 @@ #include "bindings/core/v8/ScriptPromise.h" #include "bindings/core/v8/ScriptWrappable.h" #include "modules/bluetooth/BluetoothDevice.h" -#include "mojo/public/cpp/bindings/associated_binding.h" #include "platform/heap/Handle.h" #include "public/platform/modules/bluetooth/web_bluetooth.mojom-blink.h" #include <memory> namespace blink { -class BluetoothRemoteGATTCharacteristic; class RequestDeviceOptions; class ScriptPromise; class ScriptState; -class Bluetooth : public GarbageCollectedFinalized<Bluetooth>, - public ScriptWrappable, - public mojom::blink::WebBluetoothServiceClient { +class Bluetooth final : public GarbageCollectedFinalized<Bluetooth>, + public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); - USING_PRE_FINALIZER(Bluetooth, Dispose); public: static Bluetooth* Create() { return new Bluetooth(); } - void Dispose(); - // IDL exposed interface: ScriptPromise requestDevice(ScriptState*, const RequestDeviceOptions&, @@ -38,26 +32,12 @@ mojom::blink::WebBluetoothService* Service() { return m_service.get(); } - void AddToConnectedDevicesMap(const String& deviceId, BluetoothDevice*); - - void RemoveFromConnectedDevicesMap(const String& deviceId); - - void RegisterCharacteristicObject(const String& characteristicInstanceId, - BluetoothRemoteGATTCharacteristic*); - void CharacteristicObjectRemoved(const String& characteristicInstanceId); - // Interface required by Garbage Collection: DECLARE_VIRTUAL_TRACE(); private: Bluetooth(); - // mojom::blink::WebBluetoothServiceClient: - void RemoteCharacteristicValueChanged( - const WTF::String& characteristicInstanceId, - const WTF::Vector<uint8_t>& value) override; - void GattServerDisconnected(const WTF::String& deviceId) override; - BluetoothDevice* GetBluetoothDeviceRepresentingDevice( mojom::blink::WebBluetoothDevicePtr, ScriptPromiseResolver*); @@ -71,24 +51,7 @@ // Bluetooth device inside a single global object. HeapHashMap<String, Member<BluetoothDevice>> m_deviceInstanceMap; - // Map of characteristic instance ids to BluetoothRemoteGATTCharacteristic. - // When characteristicObjectRemoved is called the characteristic should be - // removed from the map. Keeps track of what characteristics have listeners. - HeapHashMap<String, Member<BluetoothRemoteGATTCharacteristic>> - m_activeCharacteristics; - - // Map of device ids to BluetoothDevice. Added in - // BluetoothRemoteGATTServer::connect() and removed in - // BluetoothRemoteGATTServer::disconnect(). This means a device may not - // actually be connected while in this map, but that it will definitely be - // removed when the page navigates. - HeapHashMap<String, Member<BluetoothDevice>> m_connectedDevices; - mojom::blink::WebBluetoothServicePtr m_service; - - // Binding associated with |m_service|. - mojo::AssociatedBinding<mojom::blink::WebBluetoothServiceClient> - m_clientBinding; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp index 6d0405a..5449f8c 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
@@ -24,7 +24,7 @@ : ContextLifecycleObserver(context), m_attributeInstanceMap(new BluetoothAttributeInstanceMap(this)), m_device(std::move(device)), - m_gatt(BluetoothRemoteGATTServer::Create(this)), + m_gatt(BluetoothRemoteGATTServer::Create(context, this)), m_bluetooth(bluetooth) {} // static @@ -75,28 +75,7 @@ return m_attributeInstanceMap->ContainsDescriptor(descriptorInstanceId); } -void BluetoothDevice::Dispose() { - DisconnectGATTIfConnected(); -} - -void BluetoothDevice::contextDestroyed(ExecutionContext*) { - DisconnectGATTIfConnected(); -} - -void BluetoothDevice::DisconnectGATTIfConnected() { - if (m_gatt->connected()) { - m_gatt->SetConnected(false); - m_gatt->ClearActiveAlgorithms(); - m_bluetooth->RemoveFromConnectedDevicesMap(id()); - mojom::blink::WebBluetoothService* service = m_bluetooth->Service(); - service->RemoteServerDisconnect(id()); - } -} - -void BluetoothDevice::CleanupDisconnectedDeviceAndFireEvent() { - DCHECK(m_gatt->connected()); - m_gatt->SetConnected(false); - m_gatt->ClearActiveAlgorithms(); +void BluetoothDevice::ClearAttributeInstanceMapAndFireEvent() { m_attributeInstanceMap->Clear(); dispatchEvent(Event::createBubble(EventTypeNames::gattserverdisconnected)); } @@ -109,13 +88,6 @@ return ContextLifecycleObserver::getExecutionContext(); } -void BluetoothDevice::DispatchGattServerDisconnected() { - if (!m_gatt->connected()) { - return; - } - CleanupDisconnectedDeviceAndFireEvent(); -} - DEFINE_TRACE(BluetoothDevice) { visitor->trace(m_attributeInstanceMap); visitor->trace(m_gatt);
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h index 2c339cc..f575765 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
@@ -32,7 +32,6 @@ // CallbackPromiseAdapter class comments. class BluetoothDevice final : public EventTargetWithInlineData, public ContextLifecycleObserver { - USING_PRE_FINALIZER(BluetoothDevice, Dispose); DEFINE_WRAPPERTYPEINFO(); USING_GARBAGE_COLLECTED_MIXIN(BluetoothDevice); @@ -72,29 +71,14 @@ // events on navigator.bluetooth and still remain connected even if the // BluetoothDevice object is garbage collected. - // USING_PRE_FINALIZER interface. - // Called before the object gets garbage collected. - void Dispose(); - - // ContextLifecycleObserver interface. - void contextDestroyed(ExecutionContext*) override; - - // If gatt is connected then sets gatt.connected to false and disconnects. - // This function only performs the necessary steps to ensure a device - // disconnects therefore it should only be used when the object is being - // garbage collected or the context is being destroyed. - void DisconnectGATTIfConnected(); - // Performs necessary cleanup when a device disconnects and fires // gattserverdisconnected event. - void CleanupDisconnectedDeviceAndFireEvent(); + void ClearAttributeInstanceMapAndFireEvent(); // EventTarget methods: const AtomicString& interfaceName() const override; ExecutionContext* getExecutionContext() const override; - void DispatchGattServerDisconnected(); - Bluetooth* bluetooth() { return m_bluetooth; } // Interface required by Garbage Collection:
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp index 1c38600..a4b9939 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
@@ -17,6 +17,7 @@ #include "modules/bluetooth/BluetoothRemoteGATTService.h" #include "modules/bluetooth/BluetoothRemoteGATTUtils.h" #include "modules/bluetooth/BluetoothUUID.h" +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" #include <memory> #include <utility> @@ -31,7 +32,6 @@ : ContextLifecycleObserver(context), m_characteristic(std::move(characteristic)), m_service(service), - m_stopped(false), m_device(device) { m_properties = BluetoothCharacteristicProperties::Create(m_characteristic->properties); @@ -50,7 +50,7 @@ m_value = domDataView; } -void BluetoothRemoteGATTCharacteristic::DispatchCharacteristicValueChanged( +void BluetoothRemoteGATTCharacteristic::RemoteCharacteristicValueChanged( const Vector<uint8_t>& value) { if (!GetGatt()->connected()) return; @@ -59,19 +59,11 @@ } void BluetoothRemoteGATTCharacteristic::contextDestroyed(ExecutionContext*) { - NotifyCharacteristicObjectRemoved(); + Dispose(); } void BluetoothRemoteGATTCharacteristic::Dispose() { - NotifyCharacteristicObjectRemoved(); -} - -void BluetoothRemoteGATTCharacteristic::NotifyCharacteristicObjectRemoved() { - if (!m_stopped) { - m_stopped = true; - m_device->bluetooth()->CharacteristicObjectRemoved( - m_characteristic->instance_id); - } + m_clientBindings.CloseAllBindings(); } const WTF::AtomicString& BluetoothRemoteGATTCharacteristic::interfaceName() @@ -88,12 +80,6 @@ const AtomicString& eventType, RegisteredEventListener& registeredListener) { EventTargetWithInlineData::addedEventListener(eventType, registeredListener); - // We will also need to unregister a characteristic once all the event - // listeners have been removed. See http://crbug.com/541390 - if (eventType == EventTypeNames::characteristicvaluechanged) { - m_device->bluetooth()->RegisterCharacteristicObject( - m_characteristic->instance_id, this); - } } void BluetoothRemoteGATTCharacteristic::ReadValueCallback( @@ -116,6 +102,7 @@ DOMDataView* domDataView = BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value.value()); SetValue(domDataView); + dispatchEvent(Event::create(EventTypeNames::characteristicvaluechanged)); resolver->resolve(domDataView); } else { resolver->reject(BluetoothError::CreateDOMException(result)); @@ -257,8 +244,12 @@ GetGatt()->AddToActiveAlgorithms(resolver); mojom::blink::WebBluetoothService* service = m_device->bluetooth()->Service(); + mojom::blink::WebBluetoothCharacteristicClientAssociatedPtrInfo ptrInfo; + auto request = mojo::MakeRequest(&ptrInfo); + m_clientBindings.AddBinding(this, std::move(request)); + service->RemoteCharacteristicStartNotifications( - m_characteristic->instance_id, + m_characteristic->instance_id, std::move(ptrInfo), convertToBaseCallback( WTF::bind(&BluetoothRemoteGATTCharacteristic::NotificationsCallback, wrapPersistent(this), wrapPersistent(resolver))));
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h index 4f4e831..8ff7e758 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h
@@ -11,10 +11,10 @@ #include "core/dom/DOMDataView.h" #include "modules/EventTargetModules.h" #include "modules/bluetooth/BluetoothRemoteGATTService.h" +#include "mojo/public/cpp/bindings/associated_binding_set.h" #include "platform/heap/Handle.h" #include "public/platform/modules/bluetooth/web_bluetooth.mojom-blink.h" #include "wtf/text/WTFString.h" -#include <memory> namespace blink { @@ -34,7 +34,8 @@ // CallbackPromiseAdapter class comments. class BluetoothRemoteGATTCharacteristic final : public EventTargetWithInlineData, - public ContextLifecycleObserver { + public ContextLifecycleObserver, + public mojom::blink::WebBluetoothCharacteristicClient { USING_PRE_FINALIZER(BluetoothRemoteGATTCharacteristic, Dispose); DEFINE_WRAPPERTYPEINFO(); USING_GARBAGE_COLLECTED_MIXIN(BluetoothRemoteGATTCharacteristic); @@ -55,7 +56,9 @@ // Save value. void SetValue(DOMDataView*); - void DispatchCharacteristicValueChanged(const Vector<uint8_t>& value); + // mojom::blink::WebBluetoothCharacteristicClient: + void RemoteCharacteristicValueChanged( + const WTF::Vector<uint8_t>& value) override; // ContextLifecycleObserver interface. void contextDestroyed(ExecutionContext*) override; @@ -64,10 +67,6 @@ // Called before the object gets garbage collected. void Dispose(); - // Notify our embedder that we should stop any notifications. - // The function only notifies the embedder once. - void NotifyCharacteristicObjectRemoved(); - // EventTarget methods: const AtomicString& interfaceName() const override; ExecutionContext* getExecutionContext() const; @@ -130,10 +129,11 @@ mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr m_characteristic; Member<BluetoothRemoteGATTService> m_service; - bool m_stopped; Member<BluetoothCharacteristicProperties> m_properties; Member<DOMDataView> m_value; Member<BluetoothDevice> m_device; + mojo::AssociatedBindingSet<mojom::blink::WebBluetoothCharacteristicClient> + m_clientBindings; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp index 8aca52e..a3fccdf 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
@@ -15,16 +15,27 @@ #include "modules/bluetooth/BluetoothError.h" #include "modules/bluetooth/BluetoothRemoteGATTService.h" #include "modules/bluetooth/BluetoothUUID.h" +#include "mojo/public/cpp/bindings/associated_interface_ptr.h" #include <utility> namespace blink { -BluetoothRemoteGATTServer::BluetoothRemoteGATTServer(BluetoothDevice* device) - : m_device(device), m_connected(false) {} +BluetoothRemoteGATTServer::BluetoothRemoteGATTServer(ExecutionContext* context, + BluetoothDevice* device) + : ContextLifecycleObserver(context), m_device(device), m_connected(false) {} BluetoothRemoteGATTServer* BluetoothRemoteGATTServer::Create( + ExecutionContext* context, BluetoothDevice* device) { - return new BluetoothRemoteGATTServer(device); + return new BluetoothRemoteGATTServer(context, device); +} + +void BluetoothRemoteGATTServer::contextDestroyed(ExecutionContext*) { + Dispose(); +} + +void BluetoothRemoteGATTServer::GATTServerDisconnected() { + DispatchDisconnected(); } void BluetoothRemoteGATTServer::AddToActiveAlgorithms( @@ -42,9 +53,41 @@ return true; } +void BluetoothRemoteGATTServer::DisconnectIfConnected() { + if (m_connected) { + SetConnected(false); + ClearActiveAlgorithms(); + mojom::blink::WebBluetoothService* service = + m_device->bluetooth()->Service(); + service->RemoteServerDisconnect(m_device->id()); + } +} + +void BluetoothRemoteGATTServer::CleanupDisconnectedDeviceAndFireEvent() { + DCHECK(m_connected); + SetConnected(false); + ClearActiveAlgorithms(); + m_device->ClearAttributeInstanceMapAndFireEvent(); +} + +void BluetoothRemoteGATTServer::DispatchDisconnected() { + if (!m_connected) { + return; + } + CleanupDisconnectedDeviceAndFireEvent(); +} + +void BluetoothRemoteGATTServer::Dispose() { + DisconnectIfConnected(); + // The pipe to this object must be closed when is marked unreachable to + // prevent messages from being dispatched before lazy sweeping. + m_clientBindings.CloseAllBindings(); +} + DEFINE_TRACE(BluetoothRemoteGATTServer) { visitor->trace(m_activeAlgorithms); visitor->trace(m_device); + ContextLifecycleObserver::trace(visitor); } void BluetoothRemoteGATTServer::ConnectCallback( @@ -55,7 +98,6 @@ return; if (result == mojom::blink::WebBluetoothResult::SUCCESS) { - m_device->bluetooth()->AddToConnectedDevicesMap(m_device->id(), m_device); SetConnected(true); resolver->resolve(this); } else { @@ -68,10 +110,15 @@ ScriptPromise promise = resolver->promise(); mojom::blink::WebBluetoothService* service = m_device->bluetooth()->Service(); + mojom::blink::WebBluetoothServerClientAssociatedPtrInfo ptrInfo; + auto request = mojo::MakeRequest(&ptrInfo); + m_clientBindings.AddBinding(this, std::move(request)); + service->RemoteServerConnect( - m_device->id(), convertToBaseCallback(WTF::bind( - &BluetoothRemoteGATTServer::ConnectCallback, - wrapPersistent(this), wrapPersistent(resolver)))); + m_device->id(), std::move(ptrInfo), + convertToBaseCallback( + WTF::bind(&BluetoothRemoteGATTServer::ConnectCallback, + wrapPersistent(this), wrapPersistent(resolver)))); return promise; } @@ -79,8 +126,8 @@ void BluetoothRemoteGATTServer::disconnect(ScriptState* scriptState) { if (!m_connected) return; - m_device->CleanupDisconnectedDeviceAndFireEvent(); - m_device->bluetooth()->RemoveFromConnectedDevicesMap(m_device->id()); + CleanupDisconnectedDeviceAndFireEvent(); + m_clientBindings.CloseAllBindings(); mojom::blink::WebBluetoothService* service = m_device->bluetooth()->Service(); service->RemoteServerDisconnect(m_device->id()); }
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h index 805e50a..99c3efaf 100644 --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h
@@ -7,7 +7,9 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "bindings/modules/v8/StringOrUnsignedLong.h" +#include "core/dom/ContextLifecycleObserver.h" #include "modules/bluetooth/BluetoothDevice.h" +#include "mojo/public/cpp/bindings/associated_binding_set.h" #include "platform/heap/Heap.h" #include "public/platform/modules/bluetooth/web_bluetooth.mojom-blink.h" #include "wtf/text/WTFString.h" @@ -21,15 +23,25 @@ // BluetoothRemoteGATTServer provides a way to interact with a connected // bluetooth peripheral. -class BluetoothRemoteGATTServer final - : public GarbageCollected<BluetoothRemoteGATTServer>, - public ScriptWrappable { +class BluetoothRemoteGATTServer + : public GarbageCollectedFinalized<BluetoothRemoteGATTServer>, + public ScriptWrappable, + public ContextLifecycleObserver, + public mojom::blink::WebBluetoothServerClient { + USING_PRE_FINALIZER(BluetoothRemoteGATTServer, Dispose); DEFINE_WRAPPERTYPEINFO(); + USING_GARBAGE_COLLECTED_MIXIN(BluetoothRemoteGATTServer); public: - BluetoothRemoteGATTServer(BluetoothDevice*); + BluetoothRemoteGATTServer(ExecutionContext*, BluetoothDevice*); - static BluetoothRemoteGATTServer* Create(BluetoothDevice*); + static BluetoothRemoteGATTServer* Create(ExecutionContext*, BluetoothDevice*); + + // ContextLifecycleObserver: + void contextDestroyed(ExecutionContext*) override; + + // mojom::blink::WebBluetoothServerClient: + void GATTServerDisconnected() override; void SetConnected(bool connected) { m_connected = connected; } @@ -47,6 +59,22 @@ // Removes all ScriptPromiseResolvers from the set of Active Algorithms. void ClearActiveAlgorithms() { m_activeAlgorithms.clear(); } + // If gatt is connected then sets gatt.connected to false and disconnects. + // This function only performs the necessary steps to ensure a device + // disconnects therefore it should only be used when the object is being + // garbage collected or the context is being destroyed. + void DisconnectIfConnected(); + + // Performs necessary cleanup when a device disconnects and fires + // gattserverdisconnected event. + void CleanupDisconnectedDeviceAndFireEvent(); + + void DispatchDisconnected(); + + // USING_PRE_FINALIZER interface. + // Called before the object gets garbage collected. + void Dispose(); + // Interface required by Garbage Collectoin: DECLARE_VIRTUAL_TRACE(); @@ -83,6 +111,9 @@ // using this server’s connection. HeapHashSet<Member<ScriptPromiseResolver>> m_activeAlgorithms; + mojo::AssociatedBindingSet<mojom::blink::WebBluetoothServerClient> + m_clientBindings; + Member<BluetoothDevice> m_device; bool m_connected; };
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp index 51e317a..15e8657 100644 --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -15,6 +15,7 @@ #include "core/html/HTMLVideoElement.h" #include "core/html/ImageData.h" #include "core/offscreencanvas/OffscreenCanvas.h" +#include "core/svg/SVGImageElement.h" #include "modules/canvas2d/CanvasGradient.h" #include "modules/canvas2d/CanvasPattern.h" #include "modules/canvas2d/CanvasStyle.h" @@ -913,6 +914,8 @@ video->videoWillBeDrawnToCanvas(); return video; } + if (value.isSVGImageElement()) + return value.getAsSVGImageElement(); if (value.isHTMLCanvasElement()) return value.getAsHTMLCanvasElement(); if (value.isImageBitmap()) {
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h index fff76c3c..81aee6e 100644 --- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h +++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
@@ -5,7 +5,7 @@ #ifndef BaseRenderingContext2D_h #define BaseRenderingContext2D_h -#include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" +#include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrSVGImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" #include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h" #include "core/html/ImageData.h" #include "modules/ModulesExport.h" @@ -27,7 +27,7 @@ class Path2D; class SVGMatrixTearOff; -typedef CSSImageValueOrHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas +typedef CSSImageValueOrHTMLImageElementOrSVGImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas CanvasImageSourceUnion; class MODULES_EXPORT BaseRenderingContext2D : public GarbageCollectedMixin,
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h index 4d4bffb..a26642f 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
@@ -61,7 +61,7 @@ class Path2D; class TextMetrics; -typedef CSSImageValueOrHTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas +typedef CSSImageValueOrHTMLImageElementOrSVGImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmapOrOffscreenCanvas CanvasImageSourceUnion; class MODULES_EXPORT CanvasRenderingContext2D final
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl index da364ef..a644045 100644 --- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.idl
@@ -25,8 +25,17 @@ // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#canvasrenderingcontext2d +// The spec specifies: +// typedef (HTMLImageElement or +// SVGImageElement) HTMLOrSVGImageElement; +// but there's a problem with our IDL code generator for typedef-in-typedef, +// so we split this into two for simplicity. There's no difference from a user +// perspective. +// TODO(fserb): revisit this once union typedefs are finalized. + typedef (CSSImageValue or HTMLImageElement or + SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp index be0fbfa..d72b0ad 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceMotionData.cpp
@@ -128,19 +128,19 @@ DeviceMotionData* DeviceMotionData::create(const device::MotionData& data) { return DeviceMotionData::create( DeviceMotionData::Acceleration::create( - data.hasAccelerationX, data.accelerationX, data.hasAccelerationY, - data.accelerationY, data.hasAccelerationZ, data.accelerationZ), + data.has_acceleration_x, data.acceleration_x, data.has_acceleration_y, + data.acceleration_y, data.has_acceleration_z, data.acceleration_z), DeviceMotionData::Acceleration::create( - data.hasAccelerationIncludingGravityX, - data.accelerationIncludingGravityX, - data.hasAccelerationIncludingGravityY, - data.accelerationIncludingGravityY, - data.hasAccelerationIncludingGravityZ, - data.accelerationIncludingGravityZ), + data.has_acceleration_including_gravity_x, + data.acceleration_including_gravity_x, + data.has_acceleration_including_gravity_y, + data.acceleration_including_gravity_y, + data.has_acceleration_including_gravity_z, + data.acceleration_including_gravity_z), DeviceMotionData::RotationRate::create( - data.hasRotationRateAlpha, data.rotationRateAlpha, - data.hasRotationRateBeta, data.rotationRateBeta, - data.hasRotationRateGamma, data.rotationRateGamma), + data.has_rotation_rate_alpha, data.rotation_rate_alpha, + data.has_rotation_rate_beta, data.rotation_rate_beta, + data.has_rotation_rate_gamma, data.rotation_rate_gamma), data.interval); }
diff --git a/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationData.cpp b/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationData.cpp index 6bcd20b..547b9323 100644 --- a/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationData.cpp +++ b/third_party/WebKit/Source/modules/device_orientation/DeviceOrientationData.cpp
@@ -61,11 +61,11 @@ Nullable<double> alpha; Nullable<double> beta; Nullable<double> gamma; - if (data.hasAlpha) + if (data.has_alpha) alpha = data.alpha; - if (data.hasBeta) + if (data.has_beta) beta = data.beta; - if (data.hasGamma) + if (data.has_gamma) gamma = data.gamma; return DeviceOrientationData::create(alpha, beta, gamma, data.absolute); }
diff --git a/third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp b/third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp index deda27d..8fc3a892 100644 --- a/third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp +++ b/third_party/WebKit/Source/modules/fetch/FormDataBytesConsumer.cpp
@@ -118,17 +118,33 @@ case FormDataElement::data: blobData->appendBytes(element.m_data.data(), element.m_data.size()); break; - case FormDataElement::encodedFile: + case FormDataElement::encodedFile: { + auto fileLength = element.m_fileLength; + if (fileLength < 0) { + if (!getFileSize(element.m_filename, fileLength)) { + m_formData = nullptr; + m_blobBytesConsumer = BytesConsumer::createErrored( + Error("Cannot determine a file size")); + return; + } + } blobData->appendFile(element.m_filename, element.m_fileStart, - element.m_fileLength, + fileLength, element.m_expectedFileModificationTime); break; + } case FormDataElement::encodedBlob: if (element.m_optionalBlobDataHandle) blobData->appendBlob(element.m_optionalBlobDataHandle, 0, element.m_optionalBlobDataHandle->size()); break; case FormDataElement::encodedFileSystemURL: + if (element.m_fileLength < 0) { + m_formData = nullptr; + m_blobBytesConsumer = BytesConsumer::createErrored( + Error("Cannot determine a file size")); + return; + } blobData->appendFileSystemURL( element.m_fileSystemURL, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime);
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp index ff12660e..351f851 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.cpp
@@ -179,6 +179,10 @@ m_component->setContentHint(translatedHint); } +bool MediaStreamTrack::remote() const { + return m_component->source()->remote(); +} + String MediaStreamTrack::readyState() const { if (ended()) return "ended";
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h index 7fe1b26..1946ae34 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.h
@@ -63,6 +63,7 @@ String kind() const; String id() const; String label() const; + bool remote() const; bool enabled() const; void setEnabled(bool);
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.idl b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.idl index 950f06b2..b0b86fc 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.idl +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrack.idl
@@ -54,4 +54,7 @@ MediaTrackConstraints getConstraints(); MediaTrackSettings getSettings(); [RuntimeEnabled=MediaTrackApplyConstraints, CallWith=ScriptState] Promise<void> applyConstraints(optional MediaTrackConstraints constraints); + + // Non-standard APIs + [MeasureAs=MediaStreamTrackRemote] readonly attribute boolean remote; };
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationDispatcher.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationDispatcher.cpp index 4e6defe..6e9e62c 100644 --- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationDispatcher.cpp +++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationDispatcher.cpp
@@ -4,7 +4,7 @@ #include "modules/screen_orientation/ScreenOrientationDispatcher.h" -#include "platform/ServiceConnector.h" +#include "public/platform/Connector.h" #include "public/platform/Platform.h" #include "services/device/public/interfaces/constants.mojom-blink.h" @@ -29,7 +29,7 @@ void ScreenOrientationDispatcher::startListening() { DCHECK(!m_listener); - ServiceConnector::instance().connectToInterface( + Platform::current()->connector()->bindInterface( device::mojom::blink::kServiceName, mojo::MakeRequest(&m_listener)); m_listener->Start(); }
diff --git a/third_party/WebKit/Source/modules/serviceworkers/BUILD.gn b/third_party/WebKit/Source/modules/serviceworkers/BUILD.gn index f8ccca08..e06c648 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/BUILD.gn +++ b/third_party/WebKit/Source/modules/serviceworkers/BUILD.gn
@@ -57,5 +57,6 @@ "ServiceWorkerWindowClientCallback.cpp", "ServiceWorkerWindowClientCallback.h", "WaitUntilObserver.cpp", + "WaitUntilObserver.h", ] }
diff --git a/third_party/WebKit/Source/modules/time_zone_monitor/TimeZoneMonitorClient.cpp b/third_party/WebKit/Source/modules/time_zone_monitor/TimeZoneMonitorClient.cpp index fa3680d..7351b1d 100644 --- a/third_party/WebKit/Source/modules/time_zone_monitor/TimeZoneMonitorClient.cpp +++ b/third_party/WebKit/Source/modules/time_zone_monitor/TimeZoneMonitorClient.cpp
@@ -11,7 +11,7 @@ #include "core/workers/WorkerOrWorkletGlobalScope.h" #include "core/workers/WorkerThread.h" #include "platform/CrossThreadFunctional.h" -#include "platform/ServiceConnector.h" +#include "public/platform/Connector.h" #include "public/platform/Platform.h" #include "services/device/public/interfaces/constants.mojom-blink.h" #include "third_party/icu/source/i18n/unicode/timezone.h" @@ -39,7 +39,7 @@ DEFINE_STATIC_LOCAL(TimeZoneMonitorClient, instance, ()); device::mojom::blink::TimeZoneMonitorPtr monitor; - ServiceConnector::instance().connectToInterface( + Platform::current()->connector()->bindInterface( device::mojom::blink::kServiceName, mojo::MakeRequest(&monitor)); monitor->AddClient(instance.m_binding.CreateInterfacePtrAndBind()); }
diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp index d0acd8db..4919f18e 100644 --- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
@@ -284,9 +284,26 @@ DCHECK_GT(rate, 0); - m_decodeAudioResolvers.insert(resolver); - m_audioDecoder.decodeAsync(audioData, rate, successCallback, errorCallback, - resolver, this); + if (audioData->isNeutered()) { + // If audioData is detached (neutered) we need to reject the + // promise with an error. + DOMException* error = DOMException::create( + DataCloneError, "Cannot decode detached ArrayBuffer"); + resolver->reject(error); + if (errorCallback) { + errorCallback->handleEvent(error); + } + } else { + // Detach the audio array buffer from the main thread and start + // async decoding of the data. + WTF::ArrayBufferContents bufferContents; + audioData->transfer(bufferContents); + DOMArrayBuffer* audio = DOMArrayBuffer::create(bufferContents); + + m_decodeAudioResolvers.insert(resolver); + m_audioDecoder.decodeAsync(audio, rate, successCallback, errorCallback, + resolver, this); + } return promise; }
diff --git a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp index 6c1d9de..b76b550 100644 --- a/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp +++ b/third_party/WebKit/Source/modules/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -52,8 +52,8 @@ AudioUtilities::kRenderQuantumFrames)) { m_source = MediaStreamSource::create( "WebAudio-" + createCanonicalUUIDString(), MediaStreamSource::TypeAudio, - "MediaStreamAudioDestinationNode", MediaStreamSource::ReadyStateLive, - true); + "MediaStreamAudioDestinationNode", false, + MediaStreamSource::ReadyStateLive, true); MediaStreamSourceVector audioSources; audioSources.push_back(m_source.get()); MediaStreamSourceVector videoSources;
diff --git a/third_party/WebKit/Source/modules/webdatabase/BUILD.gn b/third_party/WebKit/Source/modules/webdatabase/BUILD.gn index c2d3d6c9..073a3b6 100644 --- a/third_party/WebKit/Source/modules/webdatabase/BUILD.gn +++ b/third_party/WebKit/Source/modules/webdatabase/BUILD.gn
@@ -39,7 +39,9 @@ "SQLError.cpp", "SQLError.h", "SQLResultSet.cpp", + "SQLResultSet.h", "SQLResultSetRowList.cpp", + "SQLResultSetRowList.h", "SQLStatement.cpp", "SQLStatement.h", "SQLStatementBackend.cpp", @@ -58,6 +60,7 @@ "StorageLog.h", "sqlite/SQLLog.h", "sqlite/SQLValue.cpp", + "sqlite/SQLValue.h", "sqlite/SQLiteAuthorizer.cpp", "sqlite/SQLiteDatabase.cpp", "sqlite/SQLiteDatabase.h",
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.idl b/third_party/WebKit/Source/modules/webdatabase/Database.idl index 1866f655..9acb71f 100644 --- a/third_party/WebKit/Source/modules/webdatabase/Database.idl +++ b/third_party/WebKit/Source/modules/webdatabase/Database.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#database [ NoInterfaceObject ] interface Database {
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseCallback.idl b/third_party/WebKit/Source/modules/webdatabase/DatabaseCallback.idl index dc1987d..1259772a 100644 --- a/third_party/WebKit/Source/modules/webdatabase/DatabaseCallback.idl +++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseCallback.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#databasecallback callback interface DatabaseCallback { boolean handleEvent(Database database); };
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLError.idl b/third_party/WebKit/Source/modules/webdatabase/SQLError.idl index daaed712..287ddad 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLError.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLError.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqlerror [ NoInterfaceObject ] interface SQLError {
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLResultSet.idl b/third_party/WebKit/Source/modules/webdatabase/SQLResultSet.idl index 40b95ca..dad3f14 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLResultSet.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLResultSet.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqlresultset [ NoInterfaceObject, ] interface SQLResultSet {
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLResultSetRowList.idl b/third_party/WebKit/Source/modules/webdatabase/SQLResultSetRowList.idl index 690fbc4e8..ccc0af3 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLResultSetRowList.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLResultSetRowList.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqlresultsetrowlist [ NoInterfaceObject, ] interface SQLResultSetRowList {
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLStatementCallback.idl b/third_party/WebKit/Source/modules/webdatabase/SQLStatementCallback.idl index 48078af4..77faa0e 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLStatementCallback.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLStatementCallback.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqlstatementcallback callback interface SQLStatementCallback { boolean handleEvent(SQLTransaction transaction, SQLResultSet resultSet); };
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLStatementErrorCallback.idl b/third_party/WebKit/Source/modules/webdatabase/SQLStatementErrorCallback.idl index 117431d..8feb6bd 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLStatementErrorCallback.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLStatementErrorCallback.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback callback interface SQLStatementErrorCallback { [Custom] boolean handleEvent(SQLTransaction transaction, SQLError error); };
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.idl b/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.idl index 126c34e1..cbb91d8b 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransaction.idl
@@ -26,10 +26,10 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// http://www.w3.org/TR/webdatabase/#sqltransaction - +// https://www.w3.org/TR/webdatabase/#objectarray typedef sequence<any> ObjectArray; +// https://www.w3.org/TR/webdatabase/#sqltransaction [ NoInterfaceObject, ] interface SQLTransaction {
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionCallback.idl b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionCallback.idl index 41cac85a..450267b 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionCallback.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionCallback.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqltransactioncallback callback interface SQLTransactionCallback { boolean handleEvent(SQLTransaction transaction); };
diff --git a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionErrorCallback.idl b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionErrorCallback.idl index efe64a0..396ada4de 100644 --- a/third_party/WebKit/Source/modules/webdatabase/SQLTransactionErrorCallback.idl +++ b/third_party/WebKit/Source/modules/webdatabase/SQLTransactionErrorCallback.idl
@@ -26,6 +26,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#sqltransactionerrorcallback callback interface SQLTransactionErrorCallback { boolean handleEvent(SQLError error); };
diff --git a/third_party/WebKit/Source/modules/webdatabase/WindowWebDatabase.idl b/third_party/WebKit/Source/modules/webdatabase/WindowWebDatabase.idl index 0d18b0e9..47213b8 100644 --- a/third_party/WebKit/Source/modules/webdatabase/WindowWebDatabase.idl +++ b/third_party/WebKit/Source/modules/webdatabase/WindowWebDatabase.idl
@@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// https://www.w3.org/TR/webdatabase/#databases [ ImplementedAs=DOMWindowWebDatabase, RuntimeEnabled=Database,
diff --git a/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp index 21bacd7f..d59502e 100644 --- a/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
@@ -328,10 +328,9 @@ return wrappedVfs->xCurrentTime(wrappedVfs, prNow); } -int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { - // xGetLastError() has never been used by SQLite. The implementation in - // os_win.c indicates this is a reasonable implementation. - *s = '\0'; +int chromiumGetLastError(sqlite3_vfs* vfs, int nBuf, char* zBuf) { + if (nBuf && zBuf) + *zBuf = '\0'; return 0; }
diff --git a/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp b/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp index bc4fd2f..4e614bf 100644 --- a/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp +++ b/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp
@@ -155,10 +155,9 @@ return wrappedVfs->xCurrentTime(wrappedVfs, prNow); } -int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { - // xGetLastError() has never been used by SQLite. The implementation in - // os_win.c indicates this is a reasonable implementation. - *s = '\0'; +int chromiumGetLastError(sqlite3_vfs* vfs, int nBuf, char* zBuf) { + if (nBuf && zBuf) + *zBuf = '\0'; return 0; }
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn index 38f3273..fec18a2 100644 --- a/third_party/WebKit/Source/platform/BUILD.gn +++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -132,6 +132,30 @@ ] } +action("instrumentation_probes") { + script = "instrumentation/InstrumentingProbesCodeGenerator.py" + + input_file = "instrumentation/PlatformInstrumentation.idl" + inputs = [ + input_file, + "instrumentation/InstrumentingProbesImpl_cpp.template", + "instrumentation/InstrumentingProbesImpl_h.template", + "instrumentation/InstrumentingAgents_h.template", + ] + + outputs = [ + "$blink_platform_output_dir/PlatformInstrumentationAgents.h", + "$blink_platform_output_dir/PlatformInstrumentationInl.h", + "$blink_platform_output_dir/PlatformInstrumentationImpl.cpp", + ] + + args = [ + rebase_path(inputs[0], root_build_dir), + "--output_dir", + rebase_path(blink_platform_output_dir, root_build_dir), + ] +} + executable("character_data_generator") { sources = [ "text/CharacterPropertyDataGenerator.cpp", @@ -157,6 +181,7 @@ ":color_data", ":font_family_names", ":http_names", + ":instrumentation_probes", ":runtime_enabled_features", ] } @@ -263,8 +288,6 @@ "PartitionAllocMemoryDumpProvider.cpp", "PartitionAllocMemoryDumpProvider.h", "PasteMode.h", - "PlatformInstrumentation.cpp", - "PlatformInstrumentation.h", "PlatformResourceLoader.cpp", "PlatformResourceLoader.h", "PluginScriptForbiddenScope.cpp", @@ -280,7 +303,6 @@ "SecureTextInput.cpp", "SecureTextInput.h", "SerializedResource.h", - "ServiceConnector.h", "SharedBuffer.cpp", "SharedBuffer.h", "SharedBufferChunkReader.cpp", @@ -593,7 +615,6 @@ "fonts/FontVariantNumeric.h", "fonts/GenericFontFamilySettings.cpp", "fonts/GenericFontFamilySettings.h", - "fonts/GlyphBuffer.h", "fonts/GlyphMetricsMap.h", "fonts/OrientationIterator.cpp", "fonts/OrientationIterator.h", @@ -647,6 +668,8 @@ "fonts/shaping/ShapeCache.h", "fonts/shaping/ShapeResult.cpp", "fonts/shaping/ShapeResult.h", + "fonts/shaping/ShapeResultBloberizer.cpp", + "fonts/shaping/ShapeResultBloberizer.h", "fonts/shaping/ShapeResultBuffer.cpp", "fonts/shaping/ShapeResultBuffer.h", "fonts/shaping/ShapeResultInlineHeaders.h", @@ -1051,6 +1074,10 @@ "image-encoders/RGBAtoRGB.h", "image-encoders/WEBPImageEncoder.cpp", "image-encoders/WEBPImageEncoder.h", + "instrumentation/PlatformInstrumentation.cpp", + "instrumentation/PlatformInstrumentation.h", + "instrumentation/PlatformTraceEventsAgent.cpp", + "instrumentation/PlatformTraceEventsAgent.h", "instrumentation/tracing/MemoryCacheDumpProvider.cpp", "instrumentation/tracing/MemoryCacheDumpProvider.h", "instrumentation/tracing/TraceEvent.h", @@ -1093,12 +1120,15 @@ "mediastream/MediaStreamWebAudioSource.cpp", "mediastream/MediaStreamWebAudioSource.h", "mhtml/ArchiveResource.cpp", + "mhtml/ArchiveResource.h", "mhtml/MHTMLArchive.cpp", "mhtml/MHTMLArchive.h", "mhtml/MHTMLParser.cpp", "mhtml/MHTMLParser.h", "mojo/BluetoothStructTraits.cpp", + "mojo/BluetoothStructTraits.h", "mojo/CommonCustomTypesStructTraits.cpp", + "mojo/CommonCustomTypesStructTraits.h", "mojo/MojoHelper.h", "network/ContentSecurityPolicyParsers.cpp", "network/ContentSecurityPolicyParsers.h", @@ -1384,6 +1414,7 @@ get_target_outputs(":color_data") + get_target_outputs(":font_family_names") + get_target_outputs(":http_names") + + get_target_outputs(":instrumentation_probes") + get_target_outputs(":runtime_enabled_features") configs += [ @@ -1555,7 +1586,9 @@ "network/mime/MockMimeRegistry.h", "scheduler/base/task_queue_manager_delegate_for_test.cc", "scheduler/base/test_time_source.cc", + "scheduler/base/test_time_source.h", "scheduler/child/scheduler_tqm_delegate_for_test.cc", + "scheduler/child/scheduler_tqm_delegate_for_test.h", "scheduler/test/fake_renderer_scheduler.cc", "scheduler/test/fake_web_task_runner.cc", "scheduler/test/fake_web_task_runner.h", @@ -1675,7 +1708,6 @@ "fonts/FontPlatformDataTest.cpp", "fonts/FontTest.cpp", "fonts/GenericFontFamilySettingsTest.cpp", - "fonts/GlyphBufferTest.cpp", "fonts/OrientationIteratorTest.cpp", "fonts/ScriptRunIteratorTest.cpp", "fonts/SmallCapsIteratorTest.cpp", @@ -1688,9 +1720,11 @@ "fonts/shaping/CachingWordShaperTest.cpp", "fonts/shaping/HarfBuzzShaperTest.cpp", "fonts/shaping/RunSegmenterTest.cpp", + "fonts/shaping/ShapeResultBloberizerTest.cpp", "geometry/DoubleRectTest.cpp", "geometry/FloatBoxTest.cpp", "geometry/FloatBoxTestHelpers.cpp", + "geometry/FloatBoxTestHelpers.h", "geometry/FloatPointTest.cpp", "geometry/FloatPolygonTest.cpp", "geometry/FloatQuadTest.cpp", @@ -1698,6 +1732,7 @@ "geometry/FloatRoundedRectTest.cpp", "geometry/FloatSizeTest.cpp", "geometry/GeometryTestHelpers.cpp", + "geometry/GeometryTestHelpers.h", "geometry/IntRectTest.cpp", "geometry/LayoutRectOutsetsTest.cpp", "geometry/LayoutRectTest.cpp", @@ -1754,6 +1789,7 @@ "scheduler/base/task_queue_manager_unittest.cc", "scheduler/base/task_queue_selector_unittest.cc", "scheduler/base/test_count_uses_time_source.cc", + "scheduler/base/test_count_uses_time_source.h", "scheduler/base/thread_load_tracker_unittest.cc", "scheduler/base/time_domain_unittest.cc", "scheduler/base/work_queue_sets_unittest.cc", @@ -1768,6 +1804,7 @@ "scheduler/renderer/budget_pool_unittest.cc", "scheduler/renderer/deadline_task_runner_unittest.cc", "scheduler/renderer/idle_time_estimator_unittest.cc", + "scheduler/renderer/render_widget_signals_unittest.cc", "scheduler/renderer/renderer_scheduler_impl_unittest.cc", "scheduler/renderer/task_cost_estimator_unittest.cc", "scheduler/renderer/task_queue_throttler_unittest.cc",
diff --git a/third_party/WebKit/Source/platform/PlatformInstrumentation.h b/third_party/WebKit/Source/platform/PlatformInstrumentation.h deleted file mode 100644 index 239c3672..0000000 --- a/third_party/WebKit/Source/platform/PlatformInstrumentation.h +++ /dev/null
@@ -1,97 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef PlatformInstrumentation_h -#define PlatformInstrumentation_h - -#include "platform/PlatformExport.h" -#include "platform/instrumentation/tracing/TraceEvent.h" -#include "wtf/text/WTFString.h" - -namespace blink { - -class PLATFORM_EXPORT PlatformInstrumentation { - public: - class LazyPixelRefTracker : TraceEvent::TraceScopedTrackableObject<void*> { - public: - LazyPixelRefTracker(void* instance) - : TraceEvent::TraceScopedTrackableObject<void*>(CategoryName, - LazyPixelRef, - instance) {} - }; - - static const char ImageDecodeEvent[]; - static const char ImageResizeEvent[]; - static const char DrawLazyPixelRefEvent[]; - static const char DecodeLazyPixelRefEvent[]; - - static const char ImageTypeArgument[]; - static const char CachedArgument[]; - - static const char LazyPixelRef[]; - - static void willDecodeImage(const String& imageType); - static void didDecodeImage(); - static void didDrawLazyPixelRef(unsigned long long lazyPixelRefId); - static void willDecodeLazyPixelRef(unsigned long long lazyPixelRefId); - static void didDecodeLazyPixelRef(); - - private: - static const char CategoryName[]; -}; - -inline void PlatformInstrumentation::willDecodeImage(const String& imageType) { - TRACE_EVENT_BEGIN1(CategoryName, ImageDecodeEvent, ImageTypeArgument, - imageType.ascii()); -} - -inline void PlatformInstrumentation::didDecodeImage() { - TRACE_EVENT_END0(CategoryName, ImageDecodeEvent); -} - -inline void PlatformInstrumentation::didDrawLazyPixelRef( - unsigned long long lazyPixelRefId) { - TRACE_EVENT_INSTANT1(CategoryName, DrawLazyPixelRefEvent, - TRACE_EVENT_SCOPE_THREAD, LazyPixelRef, lazyPixelRefId); -} - -inline void PlatformInstrumentation::willDecodeLazyPixelRef( - unsigned long long lazyPixelRefId) { - TRACE_EVENT_BEGIN1(CategoryName, DecodeLazyPixelRefEvent, LazyPixelRef, - lazyPixelRefId); -} - -inline void PlatformInstrumentation::didDecodeLazyPixelRef() { - TRACE_EVENT_END0(CategoryName, DecodeLazyPixelRefEvent); -} - -} // namespace blink - -#endif // PlatformInstrumentation_h
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 index c938904..2ace50d 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -806,7 +806,7 @@ { name: "SlimmingPaintInvalidation", implied_by: ["SlimmingPaintV2"], - status: "stable", + status: "experimental", }, { name: "SlimmingPaintV2",
diff --git a/third_party/WebKit/Source/platform/ServiceConnector.h b/third_party/WebKit/Source/platform/ServiceConnector.h deleted file mode 100644 index 250a4018..0000000 --- a/third_party/WebKit/Source/platform/ServiceConnector.h +++ /dev/null
@@ -1,60 +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 ServiceConnector_h -#define ServiceConnector_h - -#include "mojo/public/cpp/bindings/binding.h" -#include "public/platform/Platform.h" -#include "services/service_manager/public/interfaces/connector.mojom-blink.h" -#include "wtf/StdLibExtras.h" - -namespace blink { - -// ServiceConnector supports connecting to Mojo services by name. -class ServiceConnector { - public: - static ServiceConnector& instance() { - DEFINE_STATIC_LOCAL(ServiceConnector, instance, ()); - return instance; - } - - template <typename Interface> - void connectToInterface(const char* serviceName, - mojo::InterfaceRequest<Interface> request) { - if (!m_connector.is_bound()) { - Platform::current()->bindServiceConnector( - mojo::MakeRequest(&m_connector).PassMessagePipe()); - } - - if (m_connector.encountered_error()) - return; - - service_manager::mojom::blink::IdentityPtr remoteIdentity( - service_manager::mojom::blink::Identity::New()); - remoteIdentity->name = serviceName; - remoteIdentity->user_id = service_manager::mojom::blink::kInheritUserID; - remoteIdentity->instance = ""; - - service_manager::mojom::blink::InterfaceProviderPtr remoteInterfaces; - m_connector->Connect(std::move(remoteIdentity), - MakeRequest(&remoteInterfaces), - base::Bind(&ServiceConnector::onConnectionCompleted)); - - remoteInterfaces->GetInterface(Interface::Name_, request.PassMessagePipe()); - } - - private: - ServiceConnector() {} - - static void onConnectionCompleted( - service_manager::mojom::ConnectResult result, - const WTF::String& targetUserID) {} - - service_manager::mojom::blink::ConnectorPtr m_connector; -}; - -} // namespace blink - -#endif // ServiceConnector_h
diff --git a/third_party/WebKit/Source/platform/exported/Platform.cpp b/third_party/WebKit/Source/platform/exported/Platform.cpp index 08cf4d5..778123c 100644 --- a/third_party/WebKit/Source/platform/exported/Platform.cpp +++ b/third_party/WebKit/Source/platform/exported/Platform.cpp
@@ -28,6 +28,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "public/platform/Platform.h" + #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" #include "platform/Histogram.h" @@ -37,8 +39,8 @@ #include "platform/heap/BlinkGCMemoryDumpProvider.h" #include "platform/heap/GCTaskRunner.h" #include "platform/instrumentation/tracing/MemoryCacheDumpProvider.h" +#include "public/platform/Connector.h" #include "public/platform/InterfaceProvider.h" -#include "public/platform/Platform.h" #include "public/platform/WebPrerenderingSupport.h" #include "wtf/HashMap.h" @@ -118,11 +120,12 @@ return m_mainThread; } +Connector* Platform::connector() { + return Connector::getEmptyConnector(); +} + InterfaceProvider* Platform::interfaceProvider() { return InterfaceProvider::getEmptyInterfaceProvider(); } -void Platform::bindServiceConnector( - mojo::ScopedMessagePipeHandle remoteHandle) {} - } // namespace blink
diff --git a/third_party/WebKit/Source/platform/exported/ServiceRegistry.cpp b/third_party/WebKit/Source/platform/exported/ServiceRegistry.cpp index b649b301..9689eaf 100644 --- a/third_party/WebKit/Source/platform/exported/ServiceRegistry.cpp +++ b/third_party/WebKit/Source/platform/exported/ServiceRegistry.cpp
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "public/platform/Connector.h" #include "public/platform/InterfaceProvider.h" #include "wtf/StdLibExtras.h" @@ -9,11 +10,22 @@ namespace blink { namespace { +class EmptyConnector : public Connector { + void bindInterface(const char* serviceName, + const char* interfaceName, + mojo::ScopedMessagePipeHandle) override {} +}; + class EmptyInterfaceProvider : public InterfaceProvider { void getInterface(const char* name, mojo::ScopedMessagePipeHandle) override {} }; } +Connector* Connector::getEmptyConnector() { + DEFINE_STATIC_LOCAL(EmptyConnector, emptyConnector, ()); + return &emptyConnector; +} + InterfaceProvider* InterfaceProvider::getEmptyInterfaceProvider() { DEFINE_STATIC_LOCAL(EmptyInterfaceProvider, emptyInterfaceProvider, ()); return &emptyInterfaceProvider;
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp b/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp index 5e19c39..0d00ae1d 100644 --- a/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp +++ b/third_party/WebKit/Source/platform/exported/WebMediaStreamSource.cpp
@@ -57,12 +57,12 @@ } // namespace WebMediaStreamSource WebMediaStreamSource::ExtraData::owner() { - ASSERT(m_owner); + DCHECK(m_owner); return WebMediaStreamSource(m_owner); } void WebMediaStreamSource::ExtraData::setOwner(MediaStreamSource* owner) { - ASSERT(!m_owner); + DCHECK(!m_owner); m_owner = owner; } @@ -91,36 +91,49 @@ Type type, const WebString& name) { m_private = MediaStreamSource::create( - id, static_cast<MediaStreamSource::StreamType>(type), name); + id, static_cast<MediaStreamSource::StreamType>(type), name, false); +} + +void WebMediaStreamSource::initialize(const WebString& id, + Type type, + const WebString& name, + bool remote) { + m_private = MediaStreamSource::create( + id, static_cast<MediaStreamSource::StreamType>(type), name, remote); } WebString WebMediaStreamSource::id() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return m_private.get()->id(); } WebMediaStreamSource::Type WebMediaStreamSource::getType() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return static_cast<Type>(m_private.get()->type()); } WebString WebMediaStreamSource::name() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return m_private.get()->name(); } +bool WebMediaStreamSource::remote() const { + DCHECK(!m_private.isNull()); + return m_private.get()->remote(); +} + void WebMediaStreamSource::setReadyState(ReadyState state) { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); m_private->setReadyState(static_cast<MediaStreamSource::ReadyState>(state)); } WebMediaStreamSource::ReadyState WebMediaStreamSource::getReadyState() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return static_cast<ReadyState>(m_private->getReadyState()); } WebMediaStreamSource::ExtraData* WebMediaStreamSource::getExtraData() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); MediaStreamSource::ExtraData* data = m_private->getExtraData(); if (!data) return 0; @@ -128,7 +141,7 @@ } void WebMediaStreamSource::setExtraData(ExtraData* extraData) { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); if (extraData) extraData->setOwner(m_private.get()); @@ -138,12 +151,12 @@ } WebMediaConstraints WebMediaStreamSource::constraints() { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return m_private->constraints(); } bool WebMediaStreamSource::requiresAudioConsumer() const { - ASSERT(!m_private.isNull()); + DCHECK(!m_private.isNull()); return m_private->requiresAudioConsumer(); } @@ -187,16 +200,16 @@ void WebMediaStreamSource::addAudioConsumer( WebAudioDestinationConsumer* consumer) { - ASSERT(isMainThread()); - ASSERT(!m_private.isNull() && consumer); + DCHECK(isMainThread()); + DCHECK(!m_private.isNull() && consumer); m_private->addAudioConsumer(ConsumerWrapper::create(consumer)); } bool WebMediaStreamSource::removeAudioConsumer( WebAudioDestinationConsumer* consumer) { - ASSERT(isMainThread()); - ASSERT(!m_private.isNull() && consumer); + DCHECK(isMainThread()); + DCHECK(!m_private.isNull() && consumer); const HashSet<AudioDestinationConsumer*>& consumers = m_private->audioConsumers();
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp index e858b675..131e11c 100644 --- a/third_party/WebKit/Source/platform/fonts/Font.cpp +++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -31,9 +31,9 @@ #include "platform/fonts/FontCache.h" #include "platform/fonts/FontFallbackIterator.h" #include "platform/fonts/FontFallbackList.h" -#include "platform/fonts/GlyphBuffer.h" #include "platform/fonts/SimpleFontData.h" #include "platform/fonts/shaping/CachingWordShaper.h" +#include "platform/fonts/shaping/ShapeResultBloberizer.h" #include "platform/geometry/FloatRect.h" #include "platform/graphics/paint/PaintCanvas.h" #include "platform/graphics/paint/PaintFlags.h" @@ -105,22 +105,29 @@ m_fontFallbackList->invalidate(fontSelector); } -float Font::buildGlyphBuffer(const TextRunPaintInfo& runInfo, - GlyphBuffer& glyphBuffer, - const GlyphData* emphasisData) const { - float width; - CachingWordShaper shaper(*this); - if (emphasisData) { - width = shaper.fillGlyphBufferForTextEmphasis(runInfo.run, - emphasisData, &glyphBuffer, - runInfo.from, runInfo.to); - } else { - width = shaper.fillGlyphBuffer(runInfo.run, &glyphBuffer, - runInfo.from, runInfo.to); +namespace { + +void drawBlobs(PaintCanvas* canvas, + const PaintFlags& flags, + const ShapeResultBloberizer::BlobBuffer& blobs, + const FloatPoint& point) { + for (const auto& blobInfo : blobs) { + DCHECK(blobInfo.blob); + PaintCanvasAutoRestore autoRestore(canvas, false); + if (blobInfo.rotation == ShapeResultBloberizer::BlobRotation::CCWRotation) { + canvas->save(); + + SkMatrix m; + m.setSinCos(-1, 0, point.x(), point.y()); + canvas->concat(m); + } + + canvas->drawTextBlob(blobInfo.blob, point.x(), point.y(), flags); } - return width; } +} // anonymous ns + bool Font::drawText(PaintCanvas* canvas, const TextRunPaintInfo& runInfo, const FloatPoint& point, @@ -131,10 +138,9 @@ if (shouldSkipDrawing()) return false; - GlyphBuffer glyphBuffer; - buildGlyphBuffer(runInfo, glyphBuffer); - - drawGlyphBuffer(canvas, flags, glyphBuffer, point, deviceScaleFactor); + ShapeResultBloberizer bloberizer(*this, deviceScaleFactor); + CachingWordShaper(*this).fillGlyphs(runInfo, bloberizer); + drawBlobs(canvas, flags, bloberizer.blobs(), point); return true; } @@ -178,11 +184,10 @@ TextRunPaintInfo subrunInfo(subrun); subrunInfo.bounds = runInfo.bounds; - // TODO: investigate blob consolidation/caching (technically, - // all subruns could be part of the same blob). - GlyphBuffer glyphBuffer; - float runWidth = buildGlyphBuffer(subrunInfo, glyphBuffer); - drawGlyphBuffer(canvas, flags, glyphBuffer, currPoint, deviceScaleFactor); + ShapeResultBloberizer bloberizer(*this, deviceScaleFactor); + float runWidth = + CachingWordShaper(*this).fillGlyphs(subrunInfo, bloberizer); + drawBlobs(canvas, flags, bloberizer.blobs(), currPoint); bidiRun = bidiRun->next(); currPoint.move(runWidth, 0); @@ -207,13 +212,10 @@ if (!emphasisGlyphData.fontData) return; - GlyphBuffer glyphBuffer; - buildGlyphBuffer(runInfo, glyphBuffer, &emphasisGlyphData); - - if (glyphBuffer.isEmpty()) - return; - - drawGlyphBuffer(canvas, flags, glyphBuffer, point, deviceScaleFactor); + ShapeResultBloberizer bloberizer(*this, deviceScaleFactor); + CachingWordShaper(*this).fillTextEmphasisGlyphs(runInfo, emphasisGlyphData, + bloberizer); + drawBlobs(canvas, flags, bloberizer.blobs(), point); } float Font::width(const TextRun& run, @@ -224,163 +226,29 @@ return shaper.width(run, fallbackFonts, glyphBounds); } -namespace { - -enum BlobRotation { - NoRotation, - CCWRotation, -}; - -class GlyphBufferBloberizer { - STACK_ALLOCATED() - public: - GlyphBufferBloberizer(const GlyphBuffer& buffer, - const Font* font, - float deviceScaleFactor) - : m_buffer(buffer), - m_font(font), - m_deviceScaleFactor(deviceScaleFactor), - m_hasVerticalOffsets(buffer.hasVerticalOffsets()), - m_index(0), - m_endIndex(m_buffer.size()), - m_rotation(buffer.isEmpty() ? NoRotation : computeBlobRotation( - buffer.fontDataAt(0))) {} - - bool done() const { return m_index >= m_endIndex; } - - std::pair<sk_sp<SkTextBlob>, BlobRotation> next() { - ASSERT(!done()); - const BlobRotation currentRotation = m_rotation; - - while (m_index < m_endIndex) { - const SimpleFontData* fontData = m_buffer.fontDataAt(m_index); - ASSERT(fontData); - - const BlobRotation newRotation = computeBlobRotation(fontData); - if (newRotation != m_rotation) { - // We're switching to an orientation which requires a different rotation - // => emit the pending blob (and start a new one with the new - // rotation). - m_rotation = newRotation; - break; - } - - const unsigned start = m_index++; - while (m_index < m_endIndex && m_buffer.fontDataAt(m_index) == fontData) - m_index++; - - appendRun(start, m_index - start, fontData); - } - - return std::make_pair(m_builder.make(), currentRotation); - } - - private: - static BlobRotation computeBlobRotation(const SimpleFontData* font) { - // For vertical upright text we need to compensate the inherited 90deg CW - // rotation (using a 90deg CCW rotation). - return (font->platformData().isVerticalAnyUpright() && font->verticalData()) - ? CCWRotation - : NoRotation; - } - - void appendRun(unsigned start, - unsigned count, - const SimpleFontData* fontData) { - SkPaint paint; - fontData->platformData().setupPaint(&paint, m_deviceScaleFactor, m_font); - paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); - - const SkTextBlobBuilder::RunBuffer& buffer = - m_hasVerticalOffsets ? m_builder.allocRunPos(paint, count) - : m_builder.allocRunPosH(paint, count, 0); - - const uint16_t* glyphs = m_buffer.glyphs(start); - const float* offsets = m_buffer.offsets(start); - std::copy(glyphs, glyphs + count, buffer.glyphs); - - if (m_rotation == NoRotation) { - std::copy(offsets, offsets + (m_hasVerticalOffsets ? 2 * count : count), - buffer.pos); - } else { - ASSERT(m_hasVerticalOffsets); - - const float verticalBaselineXOffset = - fontData->getFontMetrics().floatAscent() - - fontData->getFontMetrics().floatAscent(IdeographicBaseline); - - // TODO(fmalita): why don't we apply this adjustment when building the - // glyph buffer? - for (unsigned i = 0; i < 2 * count; i += 2) { - buffer.pos[i] = SkFloatToScalar(offsets[i] + verticalBaselineXOffset); - buffer.pos[i + 1] = SkFloatToScalar(offsets[i + 1]); - } - } - } - - const GlyphBuffer& m_buffer; - const Font* m_font; - const float m_deviceScaleFactor; - const bool m_hasVerticalOffsets; - - SkTextBlobBuilder m_builder; - unsigned m_index; - unsigned m_endIndex; - BlobRotation m_rotation; -}; - -} // anonymous namespace - -void Font::drawGlyphBuffer(PaintCanvas* canvas, - const PaintFlags& flags, - const GlyphBuffer& glyphBuffer, - const FloatPoint& point, - float deviceScaleFactor) const { - GlyphBufferBloberizer bloberizer(glyphBuffer, this, deviceScaleFactor); - - while (!bloberizer.done()) { - auto blob = bloberizer.next(); - ASSERT(blob.first); - - PaintCanvasAutoRestore autoRestore(canvas, false); - if (blob.second == CCWRotation) { - canvas->save(); - - SkMatrix m; - m.setSinCos(-1, 0, point.x(), point.y()); - canvas->concat(m); - } - - canvas->drawTextBlob(blob.first, point.x(), point.y(), flags); - } -} - -static int getInterceptsFromBloberizer(const GlyphBuffer& glyphBuffer, - const Font* font, - const SkPaint& paint, - float deviceScaleFactor, - const std::tuple<float, float>& bounds, - SkScalar* interceptsBuffer) { +static int getInterceptsFromBlobs( + const ShapeResultBloberizer::BlobBuffer& blobs, + const SkPaint& paint, + const std::tuple<float, float>& bounds, + SkScalar* interceptsBuffer) { SkScalar boundsArray[2] = {std::get<0>(bounds), std::get<1>(bounds)}; - GlyphBufferBloberizer bloberizer(glyphBuffer, font, deviceScaleFactor); int numIntervals = 0; - while (!bloberizer.done()) { - auto blob = bloberizer.next(); - DCHECK(blob.first); + for (const auto& blobInfo : blobs) { + DCHECK(blobInfo.blob); - // GlyphBufferBloberizer splits for a new blob rotation, but does not split + // ShapeResultBloberizer splits for a new blob rotation, but does not split // for a change in font. A TextBlob can contain runs with differing fonts // and the getTextBlobIntercepts method handles multiple fonts for us. For // upright in vertical blobs we currently have to bail, see crbug.com/655154 - if (blob.second == BlobRotation::CCWRotation) + if (blobInfo.rotation == ShapeResultBloberizer::BlobRotation::CCWRotation) continue; SkScalar* offsetInterceptsBuffer = nullptr; if (interceptsBuffer) offsetInterceptsBuffer = &interceptsBuffer[numIntervals]; - numIntervals += paint.getTextBlobIntercepts(blob.first.get(), boundsArray, - offsetInterceptsBuffer); + numIntervals += paint.getTextBlobIntercepts( + blobInfo.blob.get(), boundsArray, offsetInterceptsBuffer); } return numIntervals; } @@ -393,23 +261,23 @@ if (shouldSkipDrawing()) return; - GlyphBuffer glyphBuffer(GlyphBuffer::Type::TextIntercepts); - buildGlyphBuffer(runInfo, glyphBuffer); + ShapeResultBloberizer bloberizer(*this, deviceScaleFactor, + ShapeResultBloberizer::Type::TextIntercepts); + CachingWordShaper(*this).fillGlyphs(runInfo, bloberizer); + const auto& blobs = bloberizer.blobs(); // Get the number of intervals, without copying the actual values by // specifying nullptr for the buffer, following the Skia allocation model for // retrieving text intercepts. SkPaint paint(ToSkPaint(flags)); - int numIntervals = getInterceptsFromBloberizer( - glyphBuffer, this, paint, deviceScaleFactor, bounds, nullptr); + int numIntervals = getInterceptsFromBlobs(blobs, paint, bounds, nullptr); if (!numIntervals) return; DCHECK_EQ(numIntervals % 2, 0); intercepts.resize(numIntervals / 2); - getInterceptsFromBloberizer(glyphBuffer, this, paint, deviceScaleFactor, - bounds, - reinterpret_cast<SkScalar*>(intercepts.data())); + getInterceptsFromBlobs(blobs, paint, bounds, + reinterpret_cast<SkScalar*>(intercepts.data())); } static inline FloatRect pixelSnappedSelectionRect(FloatRect rect) {
diff --git a/third_party/WebKit/Source/platform/fonts/Font.h b/third_party/WebKit/Source/platform/fonts/Font.h index 88b85de..13c58d7 100644 --- a/third_party/WebKit/Source/platform/fonts/Font.h +++ b/third_party/WebKit/Source/platform/fonts/Font.h
@@ -49,7 +49,6 @@ class FontFallbackIterator; class FontData; class FontSelector; -class GlyphBuffer; class ShapeCache; class TextRun; struct TextRunPaintInfo; @@ -172,22 +171,10 @@ private: enum ForTextEmphasisOrNot { NotForTextEmphasis, ForTextEmphasis }; - // Returns the total advance. - float buildGlyphBuffer(const TextRunPaintInfo&, - GlyphBuffer&, - const GlyphData* emphasisData = nullptr) const; - void drawGlyphBuffer(PaintCanvas*, - const PaintFlags&, - const GlyphBuffer&, - const FloatPoint&, - float deviceScaleFactor) const; - GlyphData getEmphasisMarkGlyphData(const AtomicString&) const; bool computeCanShapeWordByWord() const; - friend struct SimpleShaper; - public: FontSelector* getFontSelector() const; PassRefPtr<FontFallbackIterator> createFontFallbackIterator(
diff --git a/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h b/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h deleted file mode 100644 index 6b2abfa..0000000 --- a/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h +++ /dev/null
@@ -1,133 +0,0 @@ -/* - * Copyright (C) 2006, 2009, 2011 Apple Inc. All rights reserved. - * Copyright (C) 2007-2008 Torch Mobile Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef GlyphBuffer_h -#define GlyphBuffer_h - -#include "platform/fonts/Glyph.h" -#include "platform/geometry/FloatPoint.h" -#include "platform/heap/Heap.h" -#include "wtf/Vector.h" - -namespace blink { - -class SimpleFontData; - -class GlyphBuffer { - STACK_ALLOCATED(); - - public: - enum class Type { Normal, TextIntercepts }; - explicit GlyphBuffer(Type type = Type::Normal) : m_type(type) {} - - Type type() const { return m_type; } - - bool isEmpty() const { return m_fontData.isEmpty(); } - unsigned size() const { - ASSERT(m_fontData.size() == m_glyphs.size()); - ASSERT(m_fontData.size() == m_offsets.size() || - 2 * m_fontData.size() == m_offsets.size()); - return m_fontData.size(); - } - - bool hasVerticalOffsets() const { - // We exclusively store either horizontal/x-only ofssets -- in which case - // m_offsets.size == size, or vertical/xy offsets -- in which case - // m_offsets.size == size * 2. - return size() != m_offsets.size(); - } - - const Glyph* glyphs(unsigned from) const { - ASSERT(from < size()); - return m_glyphs.data() + from; - } - - // Depending on the GlyphBuffer-wide positioning mode, this either points to - // an array of x-only offsets for horizontal positioning ([x1, x2, ... xn]), - // or interleaved x,y offsets for full positioning ([x1, y1, ... xn, yn]). - const float* offsets(unsigned from) const { - ASSERT(from < size()); - return m_offsets.data() + (hasVerticalOffsets() ? from * 2 : from); - } - - const SimpleFontData* fontDataAt(unsigned index) const { - ASSERT(index < size()); - return m_fontData[index]; - } - - Glyph glyphAt(unsigned index) const { - ASSERT(index < size()); - return m_glyphs[index]; - } - - float xOffsetAt(unsigned index) const { - ASSERT(index < size()); - return hasVerticalOffsets() ? m_offsets[index * 2] : m_offsets[index]; - } - - float yOffsetAt(unsigned index) const { - ASSERT(index < size()); - ASSERT(hasVerticalOffsets()); - return m_offsets[index * 2 + 1]; - } - - void add(Glyph glyph, const SimpleFontData* font, float x) { - // cannot mix x-only/xy offsets - ASSERT(!hasVerticalOffsets()); - - m_fontData.push_back(font); - m_glyphs.push_back(glyph); - m_offsets.push_back(x); - } - - void add(Glyph glyph, const SimpleFontData* font, const FloatPoint& offset) { - // cannot mix x-only/xy offsets - ASSERT(isEmpty() || hasVerticalOffsets()); - - m_fontData.push_back(font); - m_glyphs.push_back(glyph); - m_offsets.push_back(offset.x()); - m_offsets.push_back(offset.y()); - } - - protected: - Vector<const SimpleFontData*, 2048> m_fontData; - Vector<Glyph, 2048> m_glyphs; - - // Glyph positioning: either x-only offsets, or interleaved x,y offsets - // (depending on the buffer-wide positioning mode). This matches the - // glyph positioning format used by Skia. - Vector<float, 2048> m_offsets; - - Type m_type; -}; - -} // namespace blink - -#endif
diff --git a/third_party/WebKit/Source/platform/fonts/GlyphBufferTest.cpp b/third_party/WebKit/Source/platform/fonts/GlyphBufferTest.cpp deleted file mode 100644 index f784bd7..0000000 --- a/third_party/WebKit/Source/platform/fonts/GlyphBufferTest.cpp +++ /dev/null
@@ -1,184 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/fonts/GlyphBuffer.h" - -#include "platform/fonts/SimpleFontData.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "wtf/PassRefPtr.h" -#include "wtf/RefPtr.h" - -namespace blink { - -namespace { - -// Minimal TestSimpleFontData implementation. -// Font has no glyphs, but that's okay. -class TestSimpleFontData : public SimpleFontData { - public: - static PassRefPtr<TestSimpleFontData> create() { - return adoptRef(new TestSimpleFontData); - } - - private: - TestSimpleFontData() : SimpleFontData(nullptr, 10, false, false) {} -}; - -} // anonymous namespace - -TEST(GlyphBufferTest, StartsEmpty) { - GlyphBuffer glyphBuffer; - EXPECT_TRUE(glyphBuffer.isEmpty()); - EXPECT_EQ(0u, glyphBuffer.size()); -} - -TEST(GlyphBufferTest, StoresGlyphs) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), 10); - glyphBuffer.add(43, font1.get(), 15); - glyphBuffer.add(44, font2.get(), 22); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_FALSE(glyphBuffer.hasVerticalOffsets()); - EXPECT_EQ(3u, glyphBuffer.size()); - - EXPECT_EQ(42, glyphBuffer.glyphAt(0)); - EXPECT_EQ(43, glyphBuffer.glyphAt(1)); - EXPECT_EQ(44, glyphBuffer.glyphAt(2)); - - const Glyph* glyphs = glyphBuffer.glyphs(0); - EXPECT_EQ(42, glyphs[0]); - EXPECT_EQ(43, glyphs[1]); - EXPECT_EQ(44, glyphs[2]); -} - -TEST(GlyphBufferTest, StoresVerticalOffsets) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - GlyphBuffer glyphBuffer; - EXPECT_FALSE(glyphBuffer.hasVerticalOffsets()); - - glyphBuffer.add(42, font1.get(), FloatPoint(10, 0)); - glyphBuffer.add(43, font1.get(), FloatPoint(15, 0)); - glyphBuffer.add(44, font2.get(), FloatPoint(12, 2)); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_TRUE(glyphBuffer.hasVerticalOffsets()); - EXPECT_EQ(3u, glyphBuffer.size()); - - const float* offsets = glyphBuffer.offsets(0); - EXPECT_EQ(10, glyphBuffer.xOffsetAt(0)); - EXPECT_EQ(0, glyphBuffer.yOffsetAt(0)); - EXPECT_EQ(15, glyphBuffer.xOffsetAt(1)); - EXPECT_EQ(0, glyphBuffer.yOffsetAt(1)); - EXPECT_EQ(12, glyphBuffer.xOffsetAt(2)); - EXPECT_EQ(2, glyphBuffer.yOffsetAt(2)); - - EXPECT_EQ(10, offsets[0]); - EXPECT_EQ(0, offsets[1]); - EXPECT_EQ(15, offsets[2]); - EXPECT_EQ(0, offsets[3]); - EXPECT_EQ(12, offsets[4]); - EXPECT_EQ(2, offsets[5]); -} - -TEST(GlyphBufferTest, StoresOffsets) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), 10); - glyphBuffer.add(43, font1.get(), 15); - glyphBuffer.add(44, font2.get(), 20); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_FALSE(glyphBuffer.hasVerticalOffsets()); - EXPECT_EQ(3u, glyphBuffer.size()); - - EXPECT_EQ(10, glyphBuffer.xOffsetAt(0)); - EXPECT_EQ(15, glyphBuffer.xOffsetAt(1)); - EXPECT_EQ(20, glyphBuffer.xOffsetAt(2)); - - const float* offsets = glyphBuffer.offsets(0); - EXPECT_EQ(10, offsets[0]); - EXPECT_EQ(15, offsets[1]); - EXPECT_EQ(20, offsets[2]); -} - -TEST(GlyphBufferTest, StoresSimpleFontData) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), 10); - glyphBuffer.add(43, font1.get(), 15); - glyphBuffer.add(44, font2.get(), 12); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_EQ(3u, glyphBuffer.size()); - - EXPECT_EQ(font1.get(), glyphBuffer.fontDataAt(0)); - EXPECT_EQ(font1.get(), glyphBuffer.fontDataAt(1)); - EXPECT_EQ(font2.get(), glyphBuffer.fontDataAt(2)); -} - -TEST(GlyphBufferTest, GlyphArrayWithOffset) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), 10); - glyphBuffer.add(43, font1.get(), 15); - glyphBuffer.add(44, font2.get(), 12); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_EQ(3u, glyphBuffer.size()); - - const Glyph* glyphs = glyphBuffer.glyphs(1); - EXPECT_EQ(43, glyphs[0]); - EXPECT_EQ(44, glyphs[1]); -} - -TEST(GlyphBufferTest, OffsetArrayWithNonZeroIndex) { - RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); - RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); - - { - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), 10); - glyphBuffer.add(43, font1.get(), 15); - glyphBuffer.add(43, font2.get(), 12); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_FALSE(glyphBuffer.hasVerticalOffsets()); - EXPECT_EQ(3u, glyphBuffer.size()); - - const float* offsets = glyphBuffer.offsets(1); - EXPECT_EQ(15, offsets[0]); - EXPECT_EQ(12, offsets[1]); - } - - { - GlyphBuffer glyphBuffer; - glyphBuffer.add(42, font1.get(), FloatPoint(10, 0)); - glyphBuffer.add(43, font1.get(), FloatPoint(15, 0)); - glyphBuffer.add(43, font2.get(), FloatPoint(12, 2)); - - EXPECT_FALSE(glyphBuffer.isEmpty()); - EXPECT_TRUE(glyphBuffer.hasVerticalOffsets()); - EXPECT_EQ(3u, glyphBuffer.size()); - - const float* offsets = glyphBuffer.offsets(1); - EXPECT_EQ(15, offsets[0]); - EXPECT_EQ(0, offsets[1]); - EXPECT_EQ(12, offsets[2]); - EXPECT_EQ(2, offsets[3]); - } -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp index 1a0ddd1..98e7fe6 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.cpp
@@ -89,28 +89,22 @@ return buffer.offsetForPosition(run, targetX, includePartialGlyphs); } -float CachingWordShaper::fillGlyphBuffer( - const TextRun& run, - GlyphBuffer* glyphBuffer, - unsigned from, - unsigned to) { +float CachingWordShaper::fillGlyphs(const TextRunPaintInfo& runInfo, + ShapeResultBloberizer& bloberizer) { ShapeResultBuffer buffer; - shapeResultsForRun(shapeCache(), &m_font, run, &buffer); + shapeResultsForRun(shapeCache(), &m_font, runInfo.run, &buffer); - return buffer.fillGlyphBuffer(glyphBuffer, run, from, to); + return buffer.fillGlyphs(runInfo, bloberizer); } -float CachingWordShaper::fillGlyphBufferForTextEmphasis( - const TextRun& run, - const GlyphData* emphasisData, - GlyphBuffer* glyphBuffer, - unsigned from, - unsigned to) { +void CachingWordShaper::fillTextEmphasisGlyphs( + const TextRunPaintInfo& runInfo, + const GlyphData& emphasisData, + ShapeResultBloberizer& bloberizer) { ShapeResultBuffer buffer; - shapeResultsForRun(shapeCache(), &m_font, run, &buffer); + shapeResultsForRun(shapeCache(), &m_font, runInfo.run, &buffer); - return buffer.fillGlyphBufferForTextEmphasis(glyphBuffer, run, emphasisData, - from, to); + buffer.fillTextEmphasisGlyphs(runInfo, emphasisData, bloberizer); } CharacterRange CachingWordShaper::getCharacterRange(const TextRun& run,
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.h b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.h index 30dce35..2cb7946 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.h +++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaper.h
@@ -37,9 +37,9 @@ struct CharacterRange; class Font; -class GlyphBuffer; class ShapeCache; class SimpleFontData; +class ShapeResultBloberizer; struct GlyphData; class PLATFORM_EXPORT CachingWordShaper final { @@ -56,15 +56,11 @@ int offsetForPosition(const TextRun&, float targetX, bool includePartialGlyphs); - float fillGlyphBuffer(const TextRun&, - GlyphBuffer*, - unsigned from, - unsigned to); - float fillGlyphBufferForTextEmphasis(const TextRun&, - const GlyphData* emphasisData, - GlyphBuffer*, - unsigned from, - unsigned to); + + float fillGlyphs(const TextRunPaintInfo&, ShapeResultBloberizer&); + void fillTextEmphasisGlyphs(const TextRunPaintInfo&, + const GlyphData& emphasisData, + ShapeResultBloberizer&); CharacterRange getCharacterRange(const TextRun&, unsigned from, unsigned to);
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp index 31f30f6..4001094 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShaperTest.cpp
@@ -6,7 +6,6 @@ #include "platform/fonts/CharacterRange.h" #include "platform/fonts/FontCache.h" -#include "platform/fonts/GlyphBuffer.h" #include "platform/fonts/shaping/CachingWordShapeIterator.h" #include "platform/fonts/shaping/ShapeResultTestInfo.h" #include "testing/gtest/include/gtest/gtest.h" @@ -115,21 +114,28 @@ // "/. ." with an accent mark over the first dot. const UChar str[] = {0x2F, 0x301, 0x2E, 0x20, 0x2E, 0x0}; TextRun textRun(str, 5); + TextRunPaintInfo runInfo(textRun); + runInfo.to = 3; - CachingWordShaper shaper(font); - GlyphBuffer glyphBuffer; - shaper.fillGlyphBuffer(textRun, &glyphBuffer, 0, 3); + ShapeResultBloberizer bloberizer(font, 1); + CachingWordShaper(font).fillGlyphs(runInfo, bloberizer); Font referenceFont(fontDescription); referenceFont.update(nullptr); - CachingWordShaper referenceShaper(referenceFont); - GlyphBuffer referenceGlyphBuffer; referenceFont.setCanShapeWordByWordForTesting(false); - referenceShaper.fillGlyphBuffer(textRun, &referenceGlyphBuffer, 0, 3); + ShapeResultBloberizer referenceBloberizer(referenceFont, 1); + CachingWordShaper(referenceFont).fillGlyphs(runInfo, referenceBloberizer); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(0), glyphBuffer.glyphAt(0)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(1), glyphBuffer.glyphAt(1)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(2), glyphBuffer.glyphAt(2)); + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + ASSERT_EQ(glyphs.size(), 3ul); + const auto referenceGlyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(referenceBloberizer); + ASSERT_EQ(referenceGlyphs.size(), 3ul); + + EXPECT_EQ(referenceGlyphs[0], glyphs[0]); + EXPECT_EQ(referenceGlyphs[1], glyphs[1]); + EXPECT_EQ(referenceGlyphs[2], glyphs[2]); } // Tests that filling a glyph buffer for a specific range returns the same @@ -139,26 +145,30 @@ const UChar str[] = {0x5B, 0x5D, 0x20, 0x5B, 0x301, 0x5D, 0x0}; TextRun textRun(str, 6); textRun.setDirection(TextDirection::kRtl); + TextRunPaintInfo runInfo(textRun); + runInfo.from = 1; - CachingWordShaper shaper(font); - GlyphBuffer glyphBuffer; - shaper.fillGlyphBuffer(textRun, &glyphBuffer, 1, 6); + ShapeResultBloberizer bloberizer(font, 1); + CachingWordShaper(font).fillGlyphs(runInfo, bloberizer); Font referenceFont(fontDescription); referenceFont.update(nullptr); - CachingWordShaper referenceShaper(referenceFont); - GlyphBuffer referenceGlyphBuffer; referenceFont.setCanShapeWordByWordForTesting(false); - referenceShaper.fillGlyphBuffer(textRun, &referenceGlyphBuffer, 1, 6); + ShapeResultBloberizer referenceBloberizer(referenceFont, 1); + CachingWordShaper(referenceFont).fillGlyphs(runInfo, referenceBloberizer); - ASSERT_EQ(5u, referenceGlyphBuffer.size()); - ASSERT_EQ(referenceGlyphBuffer.size(), glyphBuffer.size()); + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + ASSERT_EQ(5u, glyphs.size()); + const auto referenceGlyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(referenceBloberizer); + ASSERT_EQ(5u, referenceGlyphs.size()); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(0), glyphBuffer.glyphAt(0)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(1), glyphBuffer.glyphAt(1)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(2), glyphBuffer.glyphAt(2)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(3), glyphBuffer.glyphAt(3)); - ASSERT_EQ(referenceGlyphBuffer.glyphAt(4), glyphBuffer.glyphAt(4)); + EXPECT_EQ(referenceGlyphs[0], glyphs[0]); + EXPECT_EQ(referenceGlyphs[1], glyphs[1]); + EXPECT_EQ(referenceGlyphs[2], glyphs[2]); + EXPECT_EQ(referenceGlyphs[3], glyphs[3]); + EXPECT_EQ(referenceGlyphs[4], glyphs[4]); } // Tests that runs with zero glyphs (the ZWJ non-printable character in this @@ -173,8 +183,10 @@ FloatRect glyphBounds; ASSERT_GT(shaper.width(textRun, nullptr, &glyphBounds), 0); - GlyphBuffer glyphBuffer; - shaper.fillGlyphBuffer(textRun, &glyphBuffer, 0, 8); + ShapeResultBloberizer bloberizer(font, 1); + TextRunPaintInfo runInfo(textRun); + runInfo.to = 8; + shaper.fillGlyphs(runInfo, bloberizer); shaper.getCharacterRange(textRun, 0, 8); }
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp index 3a19550..7eb964e 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
@@ -34,7 +34,6 @@ #include "platform/fonts/Font.h" #include "platform/fonts/FontDescription.h" #include "platform/fonts/FontFallbackIterator.h" -#include "platform/fonts/GlyphBuffer.h" #include "platform/fonts/SmallCapsIterator.h" #include "platform/fonts/UTF16TextIterator.h" #include "platform/fonts/opentype/OpenTypeCapsSupport.h"
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.cpp new file mode 100644 index 0000000..06cc92d --- /dev/null +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.cpp
@@ -0,0 +1,84 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/fonts/shaping/ShapeResultBloberizer.h" + +#include "platform/fonts/Font.h" +#include "platform/fonts/shaping/CachingWordShaper.h" +#include "platform/text/TextRun.h" + +namespace blink { + +ShapeResultBloberizer::ShapeResultBloberizer(const Font& font, + float deviceScaleFactor, + Type type) + : m_font(font), m_deviceScaleFactor(deviceScaleFactor), m_type(type) {} + +bool ShapeResultBloberizer::hasPendingVerticalOffsets() const { + // We exclusively store either horizontal/x-only ofssets -- in which case + // m_offsets.size == size, or vertical/xy offsets -- in which case + // m_offsets.size == size * 2. + DCHECK(m_pendingGlyphs.size() == m_pendingOffsets.size() || + m_pendingGlyphs.size() * 2 == m_pendingOffsets.size()); + return m_pendingGlyphs.size() != m_pendingOffsets.size(); +} + +void ShapeResultBloberizer::commitPendingRun() { + if (m_pendingGlyphs.isEmpty()) + return; + + const auto pendingRotation = blobRotation(m_pendingFontData); + if (pendingRotation != m_builderRotation) { + // The pending run rotation doesn't match the current blob; start a new + // blob. + commitPendingBlob(); + m_builderRotation = pendingRotation; + } + + SkPaint runPaint; + runPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + m_pendingFontData->platformData().setupPaint(&runPaint, m_deviceScaleFactor, + &m_font); + + const auto runSize = m_pendingGlyphs.size(); + const auto& buffer = hasPendingVerticalOffsets() + ? m_builder.allocRunPos(runPaint, runSize) + : m_builder.allocRunPosH(runPaint, runSize, 0); + + std::copy(m_pendingGlyphs.begin(), m_pendingGlyphs.end(), buffer.glyphs); + std::copy(m_pendingOffsets.begin(), m_pendingOffsets.end(), buffer.pos); + + m_builderRunCount += 1; + m_pendingGlyphs.shrink(0); + m_pendingOffsets.shrink(0); +} + +void ShapeResultBloberizer::commitPendingBlob() { + if (!m_builderRunCount) + return; + + m_blobs.emplace_back(m_builder.make(), m_builderRotation); + m_builderRunCount = 0; +} + +const ShapeResultBloberizer::BlobBuffer& ShapeResultBloberizer::blobs() { + commitPendingRun(); + commitPendingBlob(); + DCHECK(m_pendingGlyphs.isEmpty()); + DCHECK_EQ(m_builderRunCount, 0u); + + return m_blobs; +} + +ShapeResultBloberizer::BlobRotation ShapeResultBloberizer::blobRotation( + const SimpleFontData* fontData) { + // For vertical upright text we need to compensate the inherited 90deg CW + // rotation (using a 90deg CCW rotation). + return (fontData->platformData().isVerticalAnyUpright() && + fontData->verticalData()) + ? BlobRotation::CCWRotation + : BlobRotation::NoRotation; +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.h new file mode 100644 index 0000000..a79c9dcc --- /dev/null +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizer.h
@@ -0,0 +1,109 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ShapeResultBloberizer_h +#define ShapeResultBloberizer_h + +#include "platform/PlatformExport.h" +#include "platform/fonts/Glyph.h" +#include "platform/fonts/SimpleFontData.h" +#include "platform/geometry/FloatPoint.h" +#include "third_party/skia/include/core/SkTextBlob.h" +#include "wtf/Allocator.h" +#include "wtf/Vector.h" + +namespace blink { + +class Font; + +class PLATFORM_EXPORT ShapeResultBloberizer { + WTF_MAKE_NONCOPYABLE(ShapeResultBloberizer); + STACK_ALLOCATED(); + + public: + enum class Type { Normal, TextIntercepts }; + + ShapeResultBloberizer(const Font&, + float deviceScaleFactor, + Type = Type::Normal); + + Type type() const { return m_type; } + + void add(Glyph glyph, const SimpleFontData* fontData, float hOffset) { + // cannot mix x-only/xy offsets + DCHECK(!hasPendingVerticalOffsets()); + + if (UNLIKELY(fontData != m_pendingFontData)) { + commitPendingRun(); + m_pendingFontData = fontData; + DCHECK_EQ(blobRotation(fontData), BlobRotation::NoRotation); + } + + m_pendingGlyphs.push_back(glyph); + m_pendingOffsets.push_back(hOffset); + } + + void add(Glyph glyph, + const SimpleFontData* fontData, + const FloatPoint& offset) { + // cannot mix x-only/xy offsets + DCHECK(m_pendingGlyphs.isEmpty() || hasPendingVerticalOffsets()); + + if (UNLIKELY(fontData != m_pendingFontData)) { + commitPendingRun(); + m_pendingFontData = fontData; + m_pendingVerticalBaselineXOffset = + blobRotation(fontData) == BlobRotation::NoRotation + ? 0 + : fontData->getFontMetrics().floatAscent() - + fontData->getFontMetrics().floatAscent(IdeographicBaseline); + } + + m_pendingGlyphs.push_back(glyph); + m_pendingOffsets.push_back(offset.x() + m_pendingVerticalBaselineXOffset); + m_pendingOffsets.push_back(offset.y()); + } + + enum class BlobRotation { NoRotation, CCWRotation }; + struct BlobInfo { + BlobInfo(sk_sp<SkTextBlob> b, BlobRotation r) + : blob(std::move(b)), rotation(r) {} + sk_sp<SkTextBlob> blob; + BlobRotation rotation; + }; + + using BlobBuffer = Vector<BlobInfo, 16>; + const BlobBuffer& blobs(); + + private: + friend class ShapeResultBloberizerTestInfo; + + void commitPendingRun(); + void commitPendingBlob(); + + bool hasPendingVerticalOffsets() const; + static BlobRotation blobRotation(const SimpleFontData*); + + const Font& m_font; + const float m_deviceScaleFactor; + const Type m_type; + + // Current text blob state. + SkTextBlobBuilder m_builder; + BlobRotation m_builderRotation = BlobRotation::NoRotation; + size_t m_builderRunCount = 0; + + // Current run state. + const SimpleFontData* m_pendingFontData = nullptr; + Vector<Glyph, 1024> m_pendingGlyphs; + Vector<float, 1024> m_pendingOffsets; + float m_pendingVerticalBaselineXOffset = 0; + + // Constructed blobs. + BlobBuffer m_blobs; +}; + +} // namespace blink + +#endif // ShapeResultBloberizer_h
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizerTest.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizerTest.cpp new file mode 100644 index 0000000..4780ad75 --- /dev/null +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBloberizerTest.cpp
@@ -0,0 +1,173 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/fonts/shaping/ShapeResultBloberizer.h" + +#include "platform/fonts/Font.h" +#include "platform/fonts/SimpleFontData.h" +#include "platform/fonts/shaping/ShapeResultTestInfo.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "wtf/Optional.h" + +namespace blink { + +namespace { + +// Minimal TestSimpleFontData implementation. +// Font has no glyphs, but that's okay. +class TestSimpleFontData : public SimpleFontData { + public: + static PassRefPtr<TestSimpleFontData> create() { + return adoptRef(new TestSimpleFontData); + } + + private: + TestSimpleFontData() : SimpleFontData(nullptr, 10, false, false) {} +}; + +} // anonymous namespace + +TEST(ShapeResultBloberizerTest, StartsEmpty) { + Font font; + ShapeResultBloberizer bloberizer(font, 1); + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunFontData(bloberizer), + nullptr); + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer).size(), + 0ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunOffsets(bloberizer).size(), + 0ul); + EXPECT_FALSE( + ShapeResultBloberizerTestInfo::hasPendingRunVerticalOffsets(bloberizer)); + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingBlobRunCount(bloberizer), + 0ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::committedBlobCount(bloberizer), 0ul); + + EXPECT_TRUE(bloberizer.blobs().isEmpty()); +} + +TEST(ShapeResultBloberizerTest, StoresGlyphsOffsets) { + Font font; + ShapeResultBloberizer bloberizer(font, 1); + + RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); + RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); + + // 2 pending glyphs + bloberizer.add(42, font1.get(), 10); + bloberizer.add(43, font1.get(), 15); + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunFontData(bloberizer), + font1.get()); + EXPECT_FALSE( + ShapeResultBloberizerTestInfo::hasPendingRunVerticalOffsets(bloberizer)); + { + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + EXPECT_EQ(glyphs.size(), 2ul); + EXPECT_EQ(42, glyphs[0]); + EXPECT_EQ(43, glyphs[1]); + + const auto& offsets = + ShapeResultBloberizerTestInfo::pendingRunOffsets(bloberizer); + EXPECT_EQ(offsets.size(), 2ul); + EXPECT_EQ(10, offsets[0]); + EXPECT_EQ(15, offsets[1]); + } + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingBlobRunCount(bloberizer), + 0ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::committedBlobCount(bloberizer), 0ul); + + // one more glyph, different font => pending run flush + bloberizer.add(44, font2.get(), 12); + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunFontData(bloberizer), + font2.get()); + EXPECT_FALSE( + ShapeResultBloberizerTestInfo::hasPendingRunVerticalOffsets(bloberizer)); + { + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + EXPECT_EQ(glyphs.size(), 1ul); + EXPECT_EQ(44, glyphs[0]); + + const auto& offsets = + ShapeResultBloberizerTestInfo::pendingRunOffsets(bloberizer); + EXPECT_EQ(offsets.size(), 1ul); + EXPECT_EQ(12, offsets[0]); + } + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingBlobRunCount(bloberizer), + 1ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::committedBlobCount(bloberizer), 0ul); + + // flush everything (1 blob w/ 2 runs) + EXPECT_EQ(bloberizer.blobs().size(), 1ul); +} + +TEST(ShapeResultBloberizerTest, StoresGlyphsVerticalOffsets) { + Font font; + ShapeResultBloberizer bloberizer(font, 1); + + RefPtr<SimpleFontData> font1 = TestSimpleFontData::create(); + RefPtr<SimpleFontData> font2 = TestSimpleFontData::create(); + + // 2 pending glyphs + bloberizer.add(42, font1.get(), FloatPoint(10, 0)); + bloberizer.add(43, font1.get(), FloatPoint(15, 0)); + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunFontData(bloberizer), + font1.get()); + EXPECT_TRUE( + ShapeResultBloberizerTestInfo::hasPendingRunVerticalOffsets(bloberizer)); + { + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + EXPECT_EQ(glyphs.size(), 2ul); + EXPECT_EQ(42, glyphs[0]); + EXPECT_EQ(43, glyphs[1]); + + const auto& offsets = + ShapeResultBloberizerTestInfo::pendingRunOffsets(bloberizer); + EXPECT_EQ(offsets.size(), 4ul); + EXPECT_EQ(10, offsets[0]); + EXPECT_EQ(0, offsets[1]); + EXPECT_EQ(15, offsets[2]); + EXPECT_EQ(0, offsets[3]); + } + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingBlobRunCount(bloberizer), + 0ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::committedBlobCount(bloberizer), 0ul); + + // one more glyph, different font => pending run flush + bloberizer.add(44, font2.get(), FloatPoint(12, 2)); + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingRunFontData(bloberizer), + font2.get()); + EXPECT_TRUE( + ShapeResultBloberizerTestInfo::hasPendingRunVerticalOffsets(bloberizer)); + { + const auto& glyphs = + ShapeResultBloberizerTestInfo::pendingRunGlyphs(bloberizer); + EXPECT_EQ(glyphs.size(), 1ul); + EXPECT_EQ(44, glyphs[0]); + + const auto& offsets = + ShapeResultBloberizerTestInfo::pendingRunOffsets(bloberizer); + EXPECT_EQ(offsets.size(), 2ul); + EXPECT_EQ(12, offsets[0]); + EXPECT_EQ(2, offsets[1]); + } + + EXPECT_EQ(ShapeResultBloberizerTestInfo::pendingBlobRunCount(bloberizer), + 1ul); + EXPECT_EQ(ShapeResultBloberizerTestInfo::committedBlobCount(bloberizer), 0ul); + + // flush everything (1 blob w/ 2 runs) + EXPECT_EQ(bloberizer.blobs().size(), 1ul); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp index 7eec345a..7e4a4da 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
@@ -5,8 +5,8 @@ #include "platform/fonts/shaping/ShapeResultBuffer.h" #include "platform/fonts/CharacterRange.h" -#include "platform/fonts/GlyphBuffer.h" #include "platform/fonts/SimpleFontData.h" +#include "platform/fonts/shaping/ShapeResultBloberizer.h" #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" #include "platform/geometry/FloatPoint.h" #include "platform/text/Character.h" @@ -17,50 +17,47 @@ namespace { -inline bool isSkipInkException(const GlyphBuffer& glyphBuffer, +inline bool isSkipInkException(const ShapeResultBloberizer& bloberizer, const TextRun& run, unsigned characterIndex) { // We want to skip descenders in general, but it is undesirable renderings for // CJK characters. - return glyphBuffer.type() == GlyphBuffer::Type::TextIntercepts && + return bloberizer.type() == ShapeResultBloberizer::Type::TextIntercepts && !run.is8Bit() && Character::isCJKIdeographOrSymbol(run.codepointAt(characterIndex)); } -inline void addGlyphToBuffer(GlyphBuffer* glyphBuffer, - float advance, - hb_direction_t direction, - const SimpleFontData* fontData, - const HarfBuzzRunGlyphData& glyphData, - const TextRun& run, - unsigned characterIndex) { +inline void addGlyphToBloberizer(ShapeResultBloberizer& bloberizer, + float advance, + hb_direction_t direction, + const SimpleFontData* fontData, + const HarfBuzzRunGlyphData& glyphData, + const TextRun& run, + unsigned characterIndex) { FloatPoint startOffset = HB_DIRECTION_IS_HORIZONTAL(direction) ? FloatPoint(advance, 0) : FloatPoint(0, advance); - if (!isSkipInkException(*glyphBuffer, run, characterIndex)) { - glyphBuffer->add(glyphData.glyph, fontData, startOffset + glyphData.offset); - } + if (!isSkipInkException(bloberizer, run, characterIndex)) + bloberizer.add(glyphData.glyph, fontData, startOffset + glyphData.offset); } -inline void addEmphasisMark(GlyphBuffer* buffer, - const GlyphData* emphasisData, +inline void addEmphasisMark(ShapeResultBloberizer& bloberizer, + const GlyphData& emphasisData, FloatPoint glyphCenter, float midGlyphOffset) { - ASSERT(buffer); - ASSERT(emphasisData); - - const SimpleFontData* emphasisFontData = emphasisData->fontData; - ASSERT(emphasisFontData); + const SimpleFontData* emphasisFontData = emphasisData.fontData; + DCHECK(emphasisFontData); bool isVertical = emphasisFontData->platformData().isVerticalAnyUpright() && emphasisFontData->verticalData(); if (!isVertical) { - buffer->add(emphasisData->glyph, emphasisFontData, - midGlyphOffset - glyphCenter.x()); + bloberizer.add(emphasisData.glyph, emphasisFontData, + midGlyphOffset - glyphCenter.x()); } else { - buffer->add(emphasisData->glyph, emphasisFontData, - FloatPoint(-glyphCenter.x(), midGlyphOffset - glyphCenter.y())); + bloberizer.add( + emphasisData.glyph, emphasisFontData, + FloatPoint(-glyphCenter.x(), midGlyphOffset - glyphCenter.y())); } } @@ -89,24 +86,22 @@ } // anonymous namespace -float ShapeResultBuffer::fillGlyphBufferForResult(GlyphBuffer* glyphBuffer, - const ShapeResult& result, - const TextRun& textRun, - float initialAdvance, - unsigned from, - unsigned to, - unsigned runOffset) { +float ShapeResultBuffer::fillGlyphsForResult(ShapeResultBloberizer& bloberizer, + const ShapeResult& result, + const TextRunPaintInfo& runInfo, + float initialAdvance, + unsigned runOffset) { auto totalAdvance = initialAdvance; for (const auto& run : result.m_runs) { totalAdvance = run->forEachGlyphInRange( - totalAdvance, from, to, runOffset, + totalAdvance, runInfo.from, runInfo.to, runOffset, [&](const HarfBuzzRunGlyphData& glyphData, float totalAdvance, uint16_t characterIndex) -> bool { - addGlyphToBuffer(glyphBuffer, totalAdvance, run->m_direction, - run->m_fontData.get(), glyphData, textRun, - characterIndex); + addGlyphToBloberizer(bloberizer, totalAdvance, run->m_direction, + run->m_fontData.get(), glyphData, runInfo.run, + characterIndex); return true; }); } @@ -114,14 +109,12 @@ return totalAdvance; } -float ShapeResultBuffer::fillGlyphBufferForTextEmphasisRun( - GlyphBuffer* glyphBuffer, +float ShapeResultBuffer::fillTextEmphasisGlyphsForRun( + ShapeResultBloberizer& bloberizer, const ShapeResult::RunInfo* run, - const TextRun& textRun, - const GlyphData* emphasisData, + const TextRunPaintInfo& runInfo, + const GlyphData& emphasisData, float initialAdvance, - unsigned from, - unsigned to, unsigned runOffset) { if (!run) return 0; @@ -130,7 +123,11 @@ float clusterAdvance = 0; FloatPoint glyphCenter = - emphasisData->fontData->boundsForGlyph(emphasisData->glyph).center(); + emphasisData.fontData->boundsForGlyph(emphasisData.glyph).center(); + + const auto& textRun = runInfo.run; + const auto from = runInfo.from; + const auto to = runInfo.to; TextDirection direction = textRun.direction(); @@ -169,7 +166,7 @@ if (textRun.is8Bit()) { float glyphAdvanceX = glyphData.advance; if (Character::canReceiveTextEmphasis(textRun[currentCharacterIndex])) { - addEmphasisMark(glyphBuffer, emphasisData, glyphCenter, + addEmphasisMark(bloberizer, emphasisData, glyphCenter, advanceSoFar + glyphAdvanceX / 2); } advanceSoFar += glyphAdvanceX; @@ -193,7 +190,7 @@ // Do not put emphasis marks on space, separator, and control // characters. if (Character::canReceiveTextEmphasis(textRun[currentCharacterIndex])) - addEmphasisMark(glyphBuffer, emphasisData, glyphCenter, + addEmphasisMark(bloberizer, emphasisData, glyphCenter, advanceSoFar + glyphAdvanceX / 2); advanceSoFar += glyphAdvanceX; } @@ -204,11 +201,11 @@ return advanceSoFar - initialAdvance; } -float ShapeResultBuffer::fillFastHorizontalGlyphBuffer( - GlyphBuffer* glyphBuffer, - const TextRun& textRun) const { +float ShapeResultBuffer::fillFastHorizontalGlyphs( + const TextRun& textRun, + ShapeResultBloberizer& bloberizer) const { DCHECK(!hasVerticalOffsets()); - DCHECK_NE(glyphBuffer->type(), GlyphBuffer::Type::TextIntercepts); + DCHECK_NE(bloberizer.type(), ShapeResultBloberizer::Type::TextIntercepts); float advance = 0; @@ -227,44 +224,41 @@ [&](const HarfBuzzRunGlyphData& glyphData, float totalAdvance) -> bool { DCHECK(!glyphData.offset.height()); - - glyphBuffer->add(glyphData.glyph, run->m_fontData.get(), - totalAdvance + glyphData.offset.width()); + bloberizer.add(glyphData.glyph, run->m_fontData.get(), + totalAdvance + glyphData.offset.width()); return true; }); } } - ASSERT(!glyphBuffer->hasVerticalOffsets()); - return advance; } -float ShapeResultBuffer::fillGlyphBuffer(GlyphBuffer* glyphBuffer, - const TextRun& textRun, - unsigned from, - unsigned to) const { +float ShapeResultBuffer::fillGlyphs(const TextRunPaintInfo& runInfo, + ShapeResultBloberizer& bloberizer) const { // Fast path: full run with no vertical offsets, no text intercepts. - if (!from && to == textRun.length() && !hasVerticalOffsets() && - glyphBuffer->type() != GlyphBuffer::Type::TextIntercepts) - return fillFastHorizontalGlyphBuffer(glyphBuffer, textRun); + if (!runInfo.from && runInfo.to == runInfo.run.length() && + !hasVerticalOffsets() && + bloberizer.type() != ShapeResultBloberizer::Type::TextIntercepts) { + return fillFastHorizontalGlyphs(runInfo.run, bloberizer); + } float advance = 0; - if (textRun.rtl()) { - unsigned wordOffset = textRun.length(); + if (runInfo.run.rtl()) { + unsigned wordOffset = runInfo.run.length(); for (unsigned j = 0; j < m_results.size(); j++) { unsigned resolvedIndex = m_results.size() - 1 - j; const RefPtr<const ShapeResult>& wordResult = m_results[resolvedIndex]; wordOffset -= wordResult->numCharacters(); - advance = fillGlyphBufferForResult(glyphBuffer, *wordResult, textRun, - advance, from, to, wordOffset); + advance = fillGlyphsForResult(bloberizer, *wordResult, runInfo, advance, + wordOffset); } } else { unsigned wordOffset = 0; for (const auto& wordResult : m_results) { - advance = fillGlyphBufferForResult(glyphBuffer, *wordResult, textRun, - advance, from, to, wordOffset); + advance = fillGlyphsForResult(bloberizer, *wordResult, runInfo, advance, + wordOffset); wordOffset += wordResult->numCharacters(); } } @@ -272,29 +266,25 @@ return advance; } -float ShapeResultBuffer::fillGlyphBufferForTextEmphasis( - GlyphBuffer* glyphBuffer, - const TextRun& textRun, - const GlyphData* emphasisData, - unsigned from, - unsigned to) const { +void ShapeResultBuffer::fillTextEmphasisGlyphs( + const TextRunPaintInfo& runInfo, + const GlyphData& emphasisData, + ShapeResultBloberizer& bloberizer) const { float advance = 0; - unsigned wordOffset = textRun.rtl() ? textRun.length() : 0; + unsigned wordOffset = runInfo.run.rtl() ? runInfo.run.length() : 0; for (unsigned j = 0; j < m_results.size(); j++) { - unsigned resolvedIndex = textRun.rtl() ? m_results.size() - 1 - j : j; + unsigned resolvedIndex = runInfo.run.rtl() ? m_results.size() - 1 - j : j; const RefPtr<const ShapeResult>& wordResult = m_results[resolvedIndex]; for (unsigned i = 0; i < wordResult->m_runs.size(); i++) { unsigned resolvedOffset = - wordOffset - (textRun.rtl() ? wordResult->numCharacters() : 0); - advance += fillGlyphBufferForTextEmphasisRun( - glyphBuffer, wordResult->m_runs[i].get(), textRun, emphasisData, - advance, from, to, resolvedOffset); + wordOffset - (runInfo.run.rtl() ? wordResult->numCharacters() : 0); + advance += fillTextEmphasisGlyphsForRun( + bloberizer, wordResult->m_runs[i].get(), runInfo, emphasisData, + advance, resolvedOffset); } - wordOffset += wordResult->numCharacters() * (textRun.rtl() ? -1 : 1); + wordOffset += wordResult->numCharacters() * (runInfo.run.rtl() ? -1 : 1); } - - return advance; } // TODO(eae): This is a bit of a hack to allow reuse of the implementation
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h index 7a99ead..54407c1 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.h
@@ -10,15 +10,15 @@ #include "wtf/Allocator.h" #include "wtf/RefPtr.h" #include "wtf/Vector.h" -#include <tuple> namespace blink { struct CharacterRange; class FontDescription; -class GlyphBuffer; struct GlyphData; +class ShapeResultBloberizer; class TextRun; +struct TextRunPaintInfo; class PLATFORM_EXPORT ShapeResultBuffer { WTF_MAKE_NONCOPYABLE(ShapeResultBuffer); @@ -34,15 +34,10 @@ bool hasVerticalOffsets() const { return m_hasVerticalOffsets; } - float fillGlyphBuffer(GlyphBuffer*, - const TextRun&, - unsigned from, - unsigned to) const; - float fillGlyphBufferForTextEmphasis(GlyphBuffer*, - const TextRun&, - const GlyphData* emphasisData, - unsigned from, - unsigned to) const; + float fillGlyphs(const TextRunPaintInfo&, ShapeResultBloberizer&) const; + void fillTextEmphasisGlyphs(const TextRunPaintInfo&, + const GlyphData& emphasisData, + ShapeResultBloberizer&) const; int offsetForPosition(const TextRun&, float targetX, bool includePartialGlyphs) const; @@ -76,23 +71,19 @@ unsigned from, unsigned to); - float fillFastHorizontalGlyphBuffer(GlyphBuffer*, const TextRun&) const; + float fillFastHorizontalGlyphs(const TextRun&, ShapeResultBloberizer&) const; - static float fillGlyphBufferForResult(GlyphBuffer*, - const ShapeResult&, - const TextRun&, - float initialAdvance, - unsigned from, - unsigned to, - unsigned runOffset); - static float fillGlyphBufferForTextEmphasisRun(GlyphBuffer*, - const ShapeResult::RunInfo*, - const TextRun&, - const GlyphData*, - float initialAdvance, - unsigned from, - unsigned to, - unsigned runOffset); + static float fillGlyphsForResult(ShapeResultBloberizer&, + const ShapeResult&, + const TextRunPaintInfo&, + float initialAdvance, + unsigned runOffset); + static float fillTextEmphasisGlyphsForRun(ShapeResultBloberizer&, + const ShapeResult::RunInfo*, + const TextRunPaintInfo&, + const GlyphData&, + float initialAdvance, + unsigned runOffset); static void addRunInfoRanges(const ShapeResult::RunInfo&, float offset,
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h index c299b93..406cb95 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultTestInfo.h
@@ -6,6 +6,7 @@ #define ShapeResultTestInfo_h #include "platform/fonts/shaping/HarfBuzzShaper.h" +#include "platform/fonts/shaping/ShapeResultBloberizer.h" #include <hb.h> @@ -23,6 +24,37 @@ SimpleFontData* fontDataForTesting(unsigned runIndex) const; }; +class PLATFORM_EXPORT ShapeResultBloberizerTestInfo { + public: + static const SimpleFontData* pendingRunFontData( + const ShapeResultBloberizer& bloberizer) { + return bloberizer.m_pendingFontData; + } + + static const Vector<Glyph, 1024>& pendingRunGlyphs( + const ShapeResultBloberizer& bloberizer) { + return bloberizer.m_pendingGlyphs; + } + + static const Vector<float, 1024>& pendingRunOffsets( + const ShapeResultBloberizer& bloberizer) { + return bloberizer.m_pendingOffsets; + } + + static bool hasPendingRunVerticalOffsets( + const ShapeResultBloberizer& bloberizer) { + return bloberizer.hasPendingVerticalOffsets(); + } + + static size_t pendingBlobRunCount(const ShapeResultBloberizer& bloberizer) { + return bloberizer.m_builderRunCount; + } + + static size_t committedBlobCount(const ShapeResultBloberizer& bloberizer) { + return bloberizer.m_blobs.size(); + } +}; + } // namespace blink #endif // ShapeResultTestInfo_h
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp index 55cdde87..add02cf 100644 --- a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
@@ -26,7 +26,6 @@ #include "platform/graphics/BitmapImage.h" -#include "platform/PlatformInstrumentation.h" #include "platform/RuntimeEnabledFeatures.h" #include "platform/Timer.h" #include "platform/geometry/FloatRect.h" @@ -37,6 +36,8 @@ #include "platform/graphics/paint/PaintCanvas.h" #include "platform/graphics/paint/PaintFlags.h" #include "platform/graphics/skia/SkiaUtils.h" +#include "platform/instrumentation/PlatformInstrumentation.h" +#include "platform/instrumentation/PlatformTraceEventsAgent.h" #include "platform/instrumentation/tracing/TraceEvent.h" #include "wtf/PassRefPtr.h" #include "wtf/PtrUtil.h"
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp index f9033f2..78dea6662 100644 --- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp +++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
@@ -25,14 +25,14 @@ #include "platform/graphics/DecodingImageGenerator.h" -#include "platform/PlatformInstrumentation.h" +#include <memory> #include "platform/SharedBuffer.h" #include "platform/graphics/ImageFrameGenerator.h" #include "platform/image-decoders/ImageDecoder.h" #include "platform/image-decoders/SegmentReader.h" +#include "platform/instrumentation/PlatformInstrumentation.h" #include "platform/instrumentation/tracing/TraceEvent.h" #include "third_party/skia/include/core/SkData.h" -#include <memory> namespace blink {
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp index b7981e9..ec88992 100644 --- a/third_party/WebKit/Source/platform/graphics/Image.cpp +++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -27,7 +27,6 @@ #include "platform/graphics/Image.h" #include "platform/Length.h" -#include "platform/PlatformInstrumentation.h" #include "platform/RuntimeEnabledFeatures.h" #include "platform/SharedBuffer.h" #include "platform/geometry/FloatPoint.h" @@ -38,6 +37,7 @@ #include "platform/graphics/GraphicsContext.h" #include "platform/graphics/paint/PaintRecorder.h" #include "platform/graphics/paint/PaintShader.h" +#include "platform/instrumentation/PlatformInstrumentation.h" #include "platform/instrumentation/tracing/TraceEvent.h" #include "platform/network/mime/MIMETypeRegistry.h" #include "public/platform/Platform.h"
diff --git a/third_party/WebKit/Source/platform/graphics/PaintGeneratedImage.cpp b/third_party/WebKit/Source/platform/graphics/PaintGeneratedImage.cpp index 5f12013..7cac007 100644 --- a/third_party/WebKit/Source/platform/graphics/PaintGeneratedImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/PaintGeneratedImage.cpp
@@ -23,7 +23,9 @@ canvas->scale(destRect.width() / srcRect.width(), destRect.height() / srcRect.height()); canvas->translate(-srcRect.x(), -srcRect.y()); - canvas->drawPicture(m_record, nullptr, &flags); + SkRect bounds = m_record->cullRect(); + canvas->saveLayer(&bounds, &flags); + canvas->drawPicture(m_record); } void PaintGeneratedImage::drawTile(GraphicsContext& context,
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp index ea592959..7329a4d 100644 --- a/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp +++ b/third_party/WebKit/Source/platform/graphics/paint/DrawingDisplayItem.cpp
@@ -37,7 +37,7 @@ // numSlowPaths. if (!m_record) return; - analyzer.analyzePicture(ToSkPicture(m_record.get())); + analyzer.analyzePicture(ToSkPicture(m_record).get()); } #ifndef NDEBUG @@ -53,8 +53,8 @@ } #endif -static bool recordsEqual(const PaintRecord* record1, - const PaintRecord* record2) { +static bool recordsEqual(sk_sp<const PaintRecord> record1, + sk_sp<const PaintRecord> record2) { if (record1->approximateOpCount() != record2->approximateOpCount()) return false; @@ -116,7 +116,7 @@ if (!record || !otherRecord) return false; - if (recordsEqual(record.get(), otherRecord.get())) + if (recordsEqual(record, otherRecord)) return true; // Sometimes the client may produce different records for the same visual
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp index 39d8801..440e16a 100644 --- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -20,7 +20,7 @@ #include "platform/image-decoders/ImageDecoder.h" -#include "platform/PlatformInstrumentation.h" +#include <memory> #include "platform/RuntimeEnabledFeatures.h" #include "platform/graphics/BitmapImageMetrics.h" #include "platform/image-decoders/FastSharedBufferReader.h" @@ -30,8 +30,8 @@ #include "platform/image-decoders/jpeg/JPEGImageDecoder.h" #include "platform/image-decoders/png/PNGImageDecoder.h" #include "platform/image-decoders/webp/WEBPImageDecoder.h" +#include "platform/instrumentation/PlatformInstrumentation.h" #include "wtf/PtrUtil.h" -#include <memory> namespace blink {
diff --git a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp index a027844..dc8a41e 100644 --- a/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -37,9 +37,9 @@ #include "platform/image-decoders/jpeg/JPEGImageDecoder.h" -#include "platform/PlatformInstrumentation.h" -#include "wtf/PtrUtil.h" #include <memory> +#include "platform/instrumentation/PlatformInstrumentation.h" +#include "wtf/PtrUtil.h" extern "C" { #include <stdio.h> // jpeglib.h needs stdio FILE.
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp index 9364c72..b362e12 100644 --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -194,7 +194,32 @@ return SkColorSpace::MakeRGB(fn, toXYZD50); } +void PNGImageDecoder::setColorSpace() { + if (ignoresColorSpace()) + return; + png_structp png = m_reader->pngPtr(); + png_infop info = m_reader->infoPtr(); + const int colorType = png_get_color_type(png, info); + if (!(colorType & PNG_COLOR_MASK_COLOR)) + return; + // We only support color profiles for color PALETTE and RGB[A] PNG. + // TODO(msarett): Add GRAY profile support, block CYMK? + sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info); + if (colorSpace) + setEmbeddedColorSpace(colorSpace); +} + +bool PNGImageDecoder::setSize(unsigned width, unsigned height) { + DCHECK(!isDecodedSizeAvailable()); + // Protect against large PNGs. See http://bugzil.la/251381 for more details. + const unsigned long maxPNGSize = 1000000UL; + return (width <= maxPNGSize) && (height <= maxPNGSize) && + ImageDecoder::setSize(width, height); +} + void PNGImageDecoder::headerAvailable() { + DCHECK(isDecodedSizeAvailable()); + png_structp png = m_reader->pngPtr(); png_infop info = m_reader->infoPtr(); @@ -220,31 +245,6 @@ colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png); - // Only set the size and the color space of the image once since non-first - // frames also use this method: there is no per-frame color space, and the - // image size is determined from the header width and height. - if (!isDecodedSizeAvailable()) { - // Protect against large PNGs. See http://bugzil.la/251381 for more details. - const unsigned long maxPNGSize = 1000000UL; - if (width > maxPNGSize || height > maxPNGSize) { - longjmp(JMPBUF(png), 1); - return; - } - - // Set the image size now that the image header is available. - if (!setSize(width, height)) { - longjmp(JMPBUF(png), 1); - return; - } - - if ((colorType & PNG_COLOR_MASK_COLOR) && !ignoresColorSpace()) { - // We only support color profiles for color PALETTE and RGB[A] PNG. - // TODO(msarret): Add GRAY profile support, block CYMK? - if (sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info)) - setEmbeddedColorSpace(colorSpace); - } - } - if (!hasEmbeddedColorSpace()) { const double inverseGamma = 0.45455; const double defaultGamma = 2.2; @@ -261,8 +261,6 @@ } } - DCHECK(isDecodedSizeAvailable()); - // Tell libpng to send us rows for interlaced pngs. if (interlaceType == PNG_INTERLACE_ADAM7) png_set_interlace_handling(png);
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h index c31b8411..9d770d55 100644 --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.h
@@ -44,6 +44,7 @@ // ImageDecoder: String filenameExtension() const override { return "png"; } + bool setSize(unsigned, unsigned) override; int repetitionCount() const override; bool frameIsCompleteAtIndex(size_t) const override; float frameDurationAtIndex(size_t) const override; @@ -54,6 +55,7 @@ void rowAvailable(unsigned char* row, unsigned rowIndex, int); void frameComplete(); + void setColorSpace(); void setRepetitionCount(int); private:
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp index e84ddb6a..df10739 100644 --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoderTest.cpp
@@ -1043,4 +1043,11 @@ } } +TEST(PNGTests, sizeMayOverflow) { + auto decoder = + createDecoderWithPngData("/LayoutTests/images/resources/crbug702934.png"); + EXPECT_FALSE(decoder->isSizeAvailable()); + EXPECT_TRUE(decoder->failed()); +} + }; // namespace blink
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.cpp b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.cpp index ccfd5fc..38c76056 100644 --- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.cpp +++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.cpp
@@ -534,6 +534,9 @@ m_isAnimated = false; if (!m_isAnimated || 1 == m_reportedFrameCount) m_decoder->setRepetitionCount(cAnimationNone); + if (!m_decoder->setSize(m_width, m_height)) + return false; + m_decoder->setColorSpace(); m_decoder->headerAvailable(); return true; }
diff --git a/third_party/WebKit/Source/core/inspector/InstrumentingAgents_h.template b/third_party/WebKit/Source/platform/instrumentation/InstrumentingAgents_h.template similarity index 76% rename from third_party/WebKit/Source/core/inspector/InstrumentingAgents_h.template rename to third_party/WebKit/Source/platform/instrumentation/InstrumentingAgents_h.template index 1a90db1..ea6ce97b 100644 --- a/third_party/WebKit/Source/core/inspector/InstrumentingAgents_h.template +++ b/third_party/WebKit/Source/platform/instrumentation/InstrumentingAgents_h.template
@@ -4,11 +4,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef InstrumentingAgents_h -#define InstrumentingAgents_h +{% set agents_class = name + "Agents" %} -#include "core/CoreExport.h" +#ifndef {{agents_class}}_h +#define {{agents_class}}_h + #include "platform/heap/HeapAllocator.h" +{% for define in defines %} +{{define}} +{% endfor %} namespace blink { @@ -16,11 +20,11 @@ class {{ agent | agent_name_to_class }}; {% endfor %} -class CORE_EXPORT InstrumentingAgents : public GarbageCollected<InstrumentingAgents> { - WTF_MAKE_NONCOPYABLE(InstrumentingAgents); +class PROBE_EXPORT {{agents_class}} : public GarbageCollected<{{agents_class}}> { + WTF_MAKE_NONCOPYABLE({{agents_class}}); public: - InstrumentingAgents(); + {{agents_class}}(); DECLARE_TRACE(); {% for agent in agents %} @@ -43,4 +47,4 @@ } // namespace blink -#endif // !defined(InstrumentingAgents_h) +#endif // !defined({{agents_class}}_h)
diff --git a/third_party/WebKit/Source/core/inspector/InstrumentingProbesCodeGenerator.py b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesCodeGenerator.py similarity index 90% rename from third_party/WebKit/Source/core/inspector/InstrumentingProbesCodeGenerator.py rename to third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesCodeGenerator.py index d334bf6..6957119 100644 --- a/third_party/WebKit/Source/core/inspector/InstrumentingProbesCodeGenerator.py +++ b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesCodeGenerator.py
@@ -35,6 +35,8 @@ return "PerformanceMonitor" elif agent_name == "TraceEvents": return "InspectorTraceEvents" + elif agent_name == "PlatformTraceEvents": + return "PlatformTraceEventsAgent" else: return "Inspector%sAgent" % agent_name @@ -81,16 +83,19 @@ def __init__(self, name, source): self.name = name self.header_name = self.name + "Inl" - self.includes = [include_inspector_header("InspectorInstrumentation")] + self.includes = [include_inspector_header(base_name)] self.forward_declarations = [] self.declarations = [] + self.defines = [] for line in map(str.strip, source.split("\n")): line = re.sub(r"\s{2,}", " ", line).strip() # Collapse whitespace if len(line) == 0: continue - if line[0] == "#": + if line.startswith("#define"): + self.defines.append(line) + elif line.startswith("#include"): self.includes.append(line) - elif line.startswith("class "): + elif line.startswith("class ") or line.startswith("struct "): self.forward_declarations.append(line) else: self.declarations.append(Method(line)) @@ -105,6 +110,8 @@ def include_inspector_header(name): if name == "PerformanceMonitor": return include_header("core/frame/" + name) + if name == "PlatformInstrumentation": + return include_header("platform/instrumentation/" + name) return include_header("core/inspector/" + name) @@ -200,34 +207,40 @@ exit(1) jinja_env = initialize_jinja_env(output_dirpath) +all_agents = set() +all_defines = [] +base_name = os.path.splitext(os.path.basename(input_path))[0] + fin = open(input_path, "r") files = load_model_from_idl(fin.read()) fin.close() -all_agents = set() for f in files: for declaration in f.declarations: for agent in declaration.agents: all_agents.add(agent) + all_defines += f.defines template_context = { "files": files, "agents": all_agents, + "defines": all_defines, + "name": base_name, "input_file": os.path.basename(input_path) } cpp_template = jinja_env.get_template("/InstrumentingProbesImpl_cpp.template") -cpp_file = open(output_dirpath + "/InstrumentingProbesImpl.cpp", "w") +cpp_file = open(output_dirpath + "/" + base_name + "Impl.cpp", "w") cpp_file.write(cpp_template.render(template_context)) cpp_file.close() agents_h_template = jinja_env.get_template("/InstrumentingAgents_h.template") -agents_h_file = open(output_dirpath + "/InstrumentingAgents.h", "w") +agents_h_file = open(output_dirpath + "/" + base_name + "Agents.h", "w") agents_h_file.write(agents_h_template.render(template_context)) agents_h_file.close() for f in files: template_context["file"] = f h_template = jinja_env.get_template("/InstrumentingProbesImpl_h.template") - h_file = open(output_dirpath + "/" + f.name + "Inl.h", "w") + h_file = open(output_dirpath + "/" + f.header_name + ".h", "w") h_file.write(h_template.render(template_context)) h_file.close()
diff --git a/third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_cpp.template b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_cpp.template similarity index 83% rename from third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_cpp.template rename to third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_cpp.template index 047dad1..57a79ac 100644 --- a/third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_cpp.template +++ b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_cpp.template
@@ -5,15 +5,17 @@ // found in the LICENSE file. +{% set agents_class = name + "Agents" %} {% for file in files %} -#include "{{file.header_name}}.h" +#include "{{file.name}}Inl.h" {% endfor %} -#include "InstrumentingAgents.h" -#include "core/CoreExport.h" +#include "{{agents_class}}.h" {% for agent in agents %} {% set class_name = agent | agent_name_to_class %} {% if class_name == "PerformanceMonitor" %} #include "core/frame/PerformanceMonitor.h" +{% elif class_name.startswith("Platform") %} +#include "platform/instrumentation/{{class_name}}.h" {% else %} #include "core/inspector/{{class_name}}.h" {% endif %} @@ -21,28 +23,28 @@ namespace blink { -InstrumentingAgents::InstrumentingAgents() {} +{{agents_class}}::{{agents_class}}() {} {% for agent in agents %} {% set class_name = agent | agent_name_to_class %} {% set getter_name = class_name | to_lower_case %} -void InstrumentingAgents::add{{class_name}}({{class_name}}* agent) { +void {{agents_class}}::add{{class_name}}({{class_name}}* agent) { m_{{getter_name}}s.insert(agent); m_has{{class_name}}s = true; } -void InstrumentingAgents::remove{{class_name}}({{class_name}}* agent) { +void {{agents_class}}::remove{{class_name}}({{class_name}}* agent) { m_{{getter_name}}s.erase(agent); m_has{{class_name}}s = !m_{{getter_name}}s.isEmpty(); } {% endfor -%} -DEFINE_TRACE(InstrumentingAgents) +DEFINE_TRACE({{agents_class}}) { {% for agent in agents %} {% set getter_name = agent | agent_name_to_class | to_lower_case %} - visitor->trace(m_{{getter_name}}s); + visitor->trace(m_{{getter_name}}s); {% endfor %} } @@ -56,7 +58,7 @@ {% macro probe_body(probe, common_name) %} {% set agent_probe_name = common_name or probe.name %} - InstrumentingAgents* agents = instrumentingAgentsFor({{probe.params[0].name}}); + {{agents_class}}* agents = instrumentingAgentsFor({{probe.params[0].name}}); if (!agents) return {{probe.default_return_value}}; {% for param in probe.params %}
diff --git a/third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_h.template b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_h.template similarity index 81% rename from third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_h.template rename to third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_h.template index d7e2cd0..db28b1dd 100644 --- a/third_party/WebKit/Source/core/inspector/InstrumentingProbesImpl_h.template +++ b/third_party/WebKit/Source/platform/instrumentation/InstrumentingProbesImpl_h.template
@@ -7,10 +7,15 @@ #ifndef {{file.header_name}}_h #define {{file.header_name}}_h +#include "platform/heap/HeapAllocator.h" {% for include in file.includes %} {{include}} {% endfor %} +{% for define in file.defines %} +{{define}} +{% endfor %} + namespace blink { {% for forward_decl in file.forward_declarations %} @@ -32,7 +37,7 @@ {% if probe.is_scoped %} -class CORE_EXPORT {{probe.name}} : public ProbeBase { +class PROBE_EXPORT {{probe.name}} : public ProbeBase { STACK_ALLOCATED() public: explicit {{probe.name}}({{ params_decl(probe) }}); @@ -43,7 +48,7 @@ }; {%- else %} -CORE_EXPORT {{probe.return_type}} {{probe.name}}({{ params_decl(probe) }}); +PROBE_EXPORT {{probe.return_type}} {{probe.name}}({{ params_decl(probe) }}); {%- endif %} {%- endfor %}
diff --git a/third_party/WebKit/Source/platform/PlatformInstrumentation.cpp b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.cpp similarity index 97% rename from third_party/WebKit/Source/platform/PlatformInstrumentation.cpp rename to third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.cpp index e5c0926..50e13e0e 100644 --- a/third_party/WebKit/Source/platform/PlatformInstrumentation.cpp +++ b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.cpp
@@ -28,7 +28,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "platform/PlatformInstrumentation.h" +#include "platform/instrumentation/PlatformInstrumentation.h" namespace blink {
diff --git a/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.h b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.h new file mode 100644 index 0000000..a6f1e25 --- /dev/null +++ b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.h
@@ -0,0 +1,98 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PlatformInstrumentation_h +#define PlatformInstrumentation_h + +#include "platform/PlatformExport.h" +#include "platform/instrumentation/tracing/TraceEvent.h" +#include "platform/loader/fetch/FetchContext.h" + +namespace blink { + +class FetchContext; +class PlatformInstrumentationAgents; + +namespace probe { + +class PLATFORM_EXPORT ProbeBase { + STACK_ALLOCATED() + + public: + double captureStartTime() const; + double captureEndTime() const; + double duration() const; + + private: + mutable double m_startTime = 0; + mutable double m_endTime = 0; +}; + +inline PlatformInstrumentationAgents* instrumentingAgentsFor( + FetchContext* context) { + return context->instrumentingAgents(); +} + +} // namespace probe + +class PLATFORM_EXPORT PlatformInstrumentation { + public: + class LazyPixelRefTracker : TraceEvent::TraceScopedTrackableObject<void*> { + public: + LazyPixelRefTracker(void* instance) + : TraceEvent::TraceScopedTrackableObject<void*>(CategoryName, + LazyPixelRef, + instance) {} + }; + + static const char ImageDecodeEvent[]; + static const char ImageResizeEvent[]; + static const char DrawLazyPixelRefEvent[]; + static const char DecodeLazyPixelRefEvent[]; + + static const char ImageTypeArgument[]; + static const char CachedArgument[]; + + static const char LazyPixelRef[]; + + static void willDecodeImage(const String& imageType); + static void didDecodeImage(); + static void didDrawLazyPixelRef(unsigned long long lazyPixelRefId); + static void willDecodeLazyPixelRef(unsigned long long lazyPixelRefId); + static void didDecodeLazyPixelRef(); + + private: + static const char CategoryName[]; +}; + +inline void PlatformInstrumentation::willDecodeImage(const String& imageType) { + TRACE_EVENT_BEGIN1(CategoryName, ImageDecodeEvent, ImageTypeArgument, + imageType.ascii()); +} + +inline void PlatformInstrumentation::didDecodeImage() { + TRACE_EVENT_END0(CategoryName, ImageDecodeEvent); +} + +inline void PlatformInstrumentation::didDrawLazyPixelRef( + unsigned long long lazyPixelRefId) { + TRACE_EVENT_INSTANT1(CategoryName, DrawLazyPixelRefEvent, + TRACE_EVENT_SCOPE_THREAD, LazyPixelRef, lazyPixelRefId); +} + +inline void PlatformInstrumentation::willDecodeLazyPixelRef( + unsigned long long lazyPixelRefId) { + TRACE_EVENT_BEGIN1(CategoryName, DecodeLazyPixelRefEvent, LazyPixelRef, + lazyPixelRefId); +} + +inline void PlatformInstrumentation::didDecodeLazyPixelRef() { + TRACE_EVENT_END0(CategoryName, DecodeLazyPixelRefEvent); +} + +} // namespace blink + +#include "platform/PlatformInstrumentationInl.h" + +#endif // PlatformInstrumentation_h
diff --git a/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.idl b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.idl new file mode 100644 index 0000000..c2fc3a0 --- /dev/null +++ b/third_party/WebKit/Source/platform/instrumentation/PlatformInstrumentation.idl
@@ -0,0 +1,16 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +interface PlatformInstrumentation { + +#define PROBE_EXPORT PLATFORM_EXPORT + +class FetchContext; +class ResourceRequest; +class ResourceResponse; +struct FetchInitiatorInfo; + + [PlatformTraceEvents] + PlatformSendRequest([Keep] FetchContext*, unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse, const FetchInitiatorInfo&); +}
diff --git a/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.cpp b/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.cpp new file mode 100644 index 0000000..1117395 --- /dev/null +++ b/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.cpp
@@ -0,0 +1,33 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "platform/instrumentation/PlatformTraceEventsAgent.h" + +#include "platform/instrumentation/PlatformInstrumentation.h" +#include "platform/instrumentation/tracing/TraceEvent.h" +#include "platform/instrumentation/tracing/TracedValue.h" + +namespace blink { + +namespace { + +std::unique_ptr<TracedValue> buildData( + const probe::PlatformSendRequest& probe) { + std::unique_ptr<TracedValue> value = TracedValue::create(); + value->setString("id", String::number(probe.identifier)); + return value; +} + +} // namespace + +void PlatformTraceEventsAgent::will(const probe::PlatformSendRequest& probe) { + TRACE_EVENT_BEGIN1("devtools.timeline", "PlatformResourceSendRequest", "data", + buildData(probe)); +} + +void PlatformTraceEventsAgent::did(const probe::PlatformSendRequest& probe) { + TRACE_EVENT_END0("devtools.timeline", "PlatformResourceSendRequest"); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.h b/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.h new file mode 100644 index 0000000..9428d66 --- /dev/null +++ b/third_party/WebKit/Source/platform/instrumentation/PlatformTraceEventsAgent.h
@@ -0,0 +1,29 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PlatformTraceEventsAgent_h +#define PlatformTraceEventsAgent_h + +#include "platform/PlatformExport.h" +#include "platform/heap/Heap.h" +#include "platform/instrumentation/tracing/TraceEvent.h" + +namespace blink { + +namespace probe { +class PlatformSendRequest; +} + +class PLATFORM_EXPORT PlatformTraceEventsAgent + : public GarbageCollected<PlatformTraceEventsAgent> { + public: + DEFINE_INLINE_TRACE() {} + + void will(const probe::PlatformSendRequest&); + void did(const probe::PlatformSendRequest&); +}; + +} // namespace blink + +#endif // !defined(PlatformTraceEventsAgent_h)
diff --git a/third_party/WebKit/Source/platform/loader/fetch/FetchContext.cpp b/third_party/WebKit/Source/platform/loader/fetch/FetchContext.cpp index 850651c..e7a9ba0 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/FetchContext.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/FetchContext.cpp
@@ -30,6 +30,8 @@ #include "platform/loader/fetch/FetchContext.h" +#include "platform/PlatformInstrumentationAgents.h" +#include "platform/instrumentation/PlatformTraceEventsAgent.h" #include "public/platform/WebCachePolicy.h" namespace blink { @@ -39,6 +41,16 @@ return instance; } +FetchContext::FetchContext() + : m_instrumentingAgents(new PlatformInstrumentationAgents) { + m_instrumentingAgents->addPlatformTraceEventsAgent( + new PlatformTraceEventsAgent); +} + +DEFINE_TRACE(FetchContext) { + visitor->trace(m_instrumentingAgents); +} + void FetchContext::dispatchDidChangeResourcePriority(unsigned long, ResourceLoadPriority, int) {}
diff --git a/third_party/WebKit/Source/platform/loader/fetch/FetchContext.h b/third_party/WebKit/Source/platform/loader/fetch/FetchContext.h index 169f9630..d388b0e9 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/FetchContext.h +++ b/third_party/WebKit/Source/platform/loader/fetch/FetchContext.h
@@ -47,6 +47,7 @@ class ClientHintsPreferences; class KURL; class MHTMLArchive; +class PlatformInstrumentationAgents; class ResourceError; class ResourceResponse; class ResourceTimingInfo; @@ -72,7 +73,8 @@ static FetchContext& nullInstance(); virtual ~FetchContext() {} - DEFINE_INLINE_VIRTUAL_TRACE() {} + + DECLARE_VIRTUAL_TRACE(); virtual bool isLiveContext() { return false; } @@ -196,8 +198,15 @@ virtual RefPtr<WebTaskRunner> loadingTaskRunner() const { return nullptr; } + PlatformInstrumentationAgents* instrumentingAgents() const { + return m_instrumentingAgents; + } + protected: - FetchContext() {} + FetchContext(); + + private: + Member<PlatformInstrumentationAgents> m_instrumentingAgents; }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp index 3478550..7c72125 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
@@ -29,6 +29,7 @@ #include "platform/Histogram.h" #include "platform/RuntimeEnabledFeatures.h" +#include "platform/instrumentation/PlatformInstrumentation.h" #include "platform/instrumentation/tracing/TraceEvent.h" #include "platform/instrumentation/tracing/TracedValue.h" #include "platform/loader/fetch/FetchContext.h" @@ -1240,8 +1241,13 @@ } ResourceRequest request(resource->resourceRequest()); - context().dispatchWillSendRequest(resource->identifier(), request, - ResourceResponse(), + ResourceResponse response; + + blink::probe::PlatformSendRequest probe(&context(), resource->identifier(), + request, response, + resource->options().initiatorInfo); + + context().dispatchWillSendRequest(resource->identifier(), request, response, resource->options().initiatorInfo); // TODO(shaochuan): Saving modified ResourceRequest back to |resource|, remove
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp index 79485a8..acc8331 100644 --- a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp +++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp
@@ -35,19 +35,23 @@ MediaStreamSource* MediaStreamSource::create(const String& id, StreamType type, const String& name, + bool remote, ReadyState readyState, bool requiresConsumer) { - return new MediaStreamSource(id, type, name, readyState, requiresConsumer); + return new MediaStreamSource(id, type, name, remote, readyState, + requiresConsumer); } MediaStreamSource::MediaStreamSource(const String& id, StreamType type, const String& name, + bool remote, ReadyState readyState, bool requiresConsumer) : m_id(id), m_type(type), m_name(name), + m_remote(remote), m_readyState(readyState), m_requiresConsumer(requiresConsumer) {}
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.h b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.h index fcb2fb2..d3480c9c 100644 --- a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.h +++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.h
@@ -71,12 +71,14 @@ static MediaStreamSource* create(const String& id, StreamType, const String& name, + bool remote, ReadyState = ReadyStateLive, bool requiresConsumer = false); const String& id() const { return m_id; } StreamType type() const { return m_type; } const String& name() const { return m_name; } + bool remote() const { return m_remote; } void setReadyState(ReadyState); ReadyState getReadyState() const { return m_readyState; } @@ -114,12 +116,14 @@ MediaStreamSource(const String& id, StreamType, const String& name, + bool remote, ReadyState, bool requiresConsumer); String m_id; StreamType m_type; String m_name; + bool m_remote; ReadyState m_readyState; bool m_requiresConsumer; HeapHashSet<WeakMember<Observer>> m_observers;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cpp b/third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cc similarity index 99% rename from third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cpp rename to third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cc index bf473ec..0894948 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cpp +++ b/third_party/WebKit/Source/platform/scheduler/renderer/render_widget_signals_unittest.cc
@@ -13,6 +13,7 @@ using testing::Mock; using testing::_; +namespace blink { namespace scheduler { namespace { @@ -264,3 +265,4 @@ } } // namespace scheduler +} // namespace blink
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc index 509b289..fe476ff 100644 --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -55,8 +55,7 @@ return; int load_percentage = static_cast<int>(load * 100); - // TODO(altimin): Revert back to DCHECK. - CHECK_LE(load_percentage, 100); + DCHECK_LE(load_percentage, 100); UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", load_percentage); @@ -69,8 +68,7 @@ return; int load_percentage = static_cast<int>(load * 100); - // TODO(altimin): Revert back to DCHECK. - CHECK_LE(load_percentage, 100); + DCHECK_LE(load_percentage, 100); UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", load_percentage);
diff --git a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp index a49e0dd..f80b7210 100644 --- a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp +++ b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp
@@ -39,10 +39,9 @@ class URLSchemesRegistry final { public: URLSchemesRegistry() - : emptyDocumentSchemes({"about"}), - // For ServiceWorker schemes: HTTP is required because http://localhost - // is considered secure. Additional checks are performed to ensure that - // other http pages are filtered out. + : // For ServiceWorker schemes: HTTP is required because http://localhost + // is considered secure. Additional checks are performed to ensure that + // other http pages are filtered out. serviceWorkerSchemes({"http", "https"}), fetchAPISchemes({"http", "https"}), allowedInReferrerSchemes({"http", "https"}) { @@ -58,6 +57,8 @@ contentSecurityPolicyBypassingSchemes.insert( scheme.c_str(), SchemeRegistry::PolicyAreaAll); } + for (auto& scheme : url::GetEmptyDocumentSchemes()) + emptyDocumentSchemes.insert(scheme.c_str()); } ~URLSchemesRegistry() = default; @@ -161,11 +162,6 @@ return getURLSchemesRegistry().secureSchemes.contains(scheme); } -void SchemeRegistry::registerURLSchemeAsEmptyDocument(const String& scheme) { - DCHECK_EQ(scheme, scheme.lower()); - getMutableURLSchemesRegistry().emptyDocumentSchemes.insert(scheme); -} - bool SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(const String& scheme) { DCHECK_EQ(scheme, scheme.lower()); if (scheme.isEmpty())
diff --git a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.h b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.h index 6bd8828..ad846dc 100644 --- a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.h +++ b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.h
@@ -66,7 +66,6 @@ static void registerURLSchemeAsDisplayIsolated(const String&); static bool shouldTreatURLSchemeAsDisplayIsolated(const String&); - static void registerURLSchemeAsEmptyDocument(const String&); static bool shouldLoadURLSchemeAsEmptyDocument(const String&); static void setDomainRelaxationForbiddenForURLScheme(bool forbidden,
diff --git a/third_party/WebKit/Source/platform/wtf/BUILD.gn b/third_party/WebKit/Source/platform/wtf/BUILD.gn index 2895ff29..a5c22bc2 100644 --- a/third_party/WebKit/Source/platform/wtf/BUILD.gn +++ b/third_party/WebKit/Source/platform/wtf/BUILD.gn
@@ -171,10 +171,14 @@ "text/AtomicStringHash.h", "text/AtomicStringTable.cpp", "text/AtomicStringTable.h", + "text/Base64.cpp", + "text/Base64.h", "text/CString.cpp", "text/CString.h", "text/CharacterNames.h", + "text/Collator.h", "text/IntegerToStringConversion.h", + "text/ParsingUtilities.h", "text/StringBuffer.h", "text/StringBuilder.cpp", "text/StringBuilder.h", @@ -189,15 +193,45 @@ "text/StringOperators.h", "text/StringStatics.cpp", "text/StringStatics.h", + "text/StringStatics.h", "text/StringToNumber.cpp", "text/StringToNumber.h", + "text/StringUTF8Adaptor.h", "text/StringView.cpp", "text/StringView.h", + "text/TextCodec.cpp", + "text/TextCodec.h", + "text/TextCodecASCIIFastPath.h", + "text/TextCodecICU.cpp", + "text/TextCodecICU.h", + "text/TextCodecICU.h", + "text/TextCodecLatin1.cpp", + "text/TextCodecLatin1.h", + "text/TextCodecLatin1.h", + "text/TextCodecReplacement.cpp", + "text/TextCodecReplacement.h", + "text/TextCodecUTF16.cpp", + "text/TextCodecUTF16.h", + "text/TextCodecUTF16.h", + "text/TextCodecUTF8.cpp", + "text/TextCodecUTF8.h", + "text/TextCodecUserDefined.cpp", + "text/TextCodecUserDefined.h", + "text/TextCodecUserDefined.h", + "text/TextEncoding.cpp", + "text/TextEncoding.h", + "text/TextEncoding.h", + "text/TextEncodingRegistry.cpp", + "text/TextEncodingRegistry.h", + "text/TextEncodingRegistry.h", + "text/TextPosition.cpp", + "text/TextPosition.h", "text/UTF8.cpp", "text/UTF8.h", "text/Unicode.h", "text/WTFString.cpp", "text/WTFString.h", + "text/icu/CollatorICU.cpp", "text/icu/UnicodeIcu.h", ]
diff --git a/third_party/WebKit/Source/wtf/text/Base64.cpp b/third_party/WebKit/Source/platform/wtf/text/Base64.cpp similarity index 98% rename from third_party/WebKit/Source/wtf/text/Base64.cpp rename to third_party/WebKit/Source/platform/wtf/text/Base64.cpp index e9f9b40d..788d499 100644 --- a/third_party/WebKit/Source/wtf/text/Base64.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/Base64.cpp
@@ -22,9 +22,9 @@ package by Ronald Tschalaer Copyright (C) 1996-1999. */ -#include "wtf/text/Base64.h" +#include "platform/wtf/text/Base64.h" -#include "wtf/StringExtras.h" +#include "platform/wtf/StringExtras.h" #include <limits.h> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/Base64.h b/third_party/WebKit/Source/platform/wtf/text/Base64.h new file mode 100644 index 0000000..c12af5e --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/Base64.h
@@ -0,0 +1,129 @@ +/* + * Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> + * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef Base64_h +#define Base64_h + +#include "platform/wtf/Vector.h" +#include "platform/wtf/WTFExport.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/WTFString.h" + +namespace WTF { + +enum Base64EncodePolicy { Base64DoNotInsertLFs, Base64InsertLFs }; + +enum Base64DecodePolicy { Base64DoNotValidatePadding, Base64ValidatePadding }; + +WTF_EXPORT void base64Encode(const char*, + unsigned, + Vector<char>&, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT void base64Encode(const Vector<char>&, + Vector<char>&, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT void base64Encode(const CString&, + Vector<char>&, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT String base64Encode(const char*, + unsigned, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT String base64Encode(const Vector<char>&, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT String base64Encode(const Vector<unsigned char>&, + Base64EncodePolicy = Base64DoNotInsertLFs); +WTF_EXPORT String base64Encode(const CString&, + Base64EncodePolicy = Base64DoNotInsertLFs); + +WTF_EXPORT bool base64Decode( + const String&, + Vector<char>&, + CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, + Base64DecodePolicy = Base64DoNotValidatePadding); +WTF_EXPORT bool base64Decode( + const Vector<char>&, + Vector<char>&, + CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, + Base64DecodePolicy = Base64DoNotValidatePadding); +WTF_EXPORT bool base64Decode( + const char*, + unsigned, + Vector<char>&, + CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, + Base64DecodePolicy = Base64DoNotValidatePadding); +WTF_EXPORT bool base64Decode( + const UChar*, + unsigned, + Vector<char>&, + CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, + Base64DecodePolicy = Base64DoNotValidatePadding); + +// Given an encoding in either base64 or base64url, returns a normalized +// encoding in plain base64. +WTF_EXPORT String normalizeToBase64(const String&); + +WTF_EXPORT String base64URLEncode(const char*, + unsigned, + Base64EncodePolicy = Base64DoNotInsertLFs); + +inline void base64Encode(const Vector<char>& in, + Vector<char>& out, + Base64EncodePolicy policy) { + base64Encode(in.data(), in.size(), out, policy); +} + +inline void base64Encode(const CString& in, + Vector<char>& out, + Base64EncodePolicy policy) { + base64Encode(in.data(), in.length(), out, policy); +} + +inline String base64Encode(const Vector<char>& in, Base64EncodePolicy policy) { + return base64Encode(in.data(), in.size(), policy); +} + +inline String base64Encode(const Vector<unsigned char>& in, + Base64EncodePolicy policy) { + return base64Encode(reinterpret_cast<const char*>(in.data()), in.size(), + policy); +} + +inline String base64Encode(const CString& in, Base64EncodePolicy policy) { + return base64Encode(in.data(), in.length(), policy); +} + +} // namespace WTF + +using WTF::Base64EncodePolicy; +using WTF::Base64DoNotInsertLFs; +using WTF::Base64InsertLFs; +using WTF::Base64DecodePolicy; +using WTF::Base64DoNotValidatePadding; +using WTF::Base64ValidatePadding; +using WTF::base64Encode; +using WTF::base64Decode; + +#endif // Base64_h
diff --git a/third_party/WebKit/Source/platform/wtf/text/Collator.h b/third_party/WebKit/Source/platform/wtf/text/Collator.h new file mode 100644 index 0000000..c60d4681 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/Collator.h
@@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef WTF_Collator_h +#define WTF_Collator_h + +#include "platform/wtf/Allocator.h" +#include "platform/wtf/Noncopyable.h" +#include "platform/wtf/WTFExport.h" +#include "platform/wtf/text/Unicode.h" +#include <memory> + +struct UCollator; + +namespace WTF { + +class WTF_EXPORT Collator { + WTF_MAKE_NONCOPYABLE(Collator); + USING_FAST_MALLOC(Collator); + + public: + enum Result { Equal = 0, Greater = 1, Less = -1 }; + + // From ICU's uloc.h (ULOC_FULLNAME_CAPACITY) + static const size_t ulocFullnameCapacity = 157; + + // Parsing is lenient; e.g. language identifiers (such as "en-US") are + // accepted, too. + explicit Collator(const char* locale); + + ~Collator(); + void setOrderLowerFirst(bool); + + static std::unique_ptr<Collator> userDefault(); + + Result collate(const ::UChar*, size_t, const ::UChar*, size_t) const; + + private: + void createCollator() const; + void releaseCollator(); + void setEquivalentLocale(const char*, char*); + mutable UCollator* m_collator; + + char* m_locale; + char m_equivalentLocale[ulocFullnameCapacity]; + bool m_lowerFirst; +}; + +} // namespace WTF + +using WTF::Collator; + +#endif
diff --git a/third_party/WebKit/Source/wtf/text/OWNERS b/third_party/WebKit/Source/platform/wtf/text/OWNERS similarity index 100% rename from third_party/WebKit/Source/wtf/text/OWNERS rename to third_party/WebKit/Source/platform/wtf/text/OWNERS
diff --git a/third_party/WebKit/Source/platform/wtf/text/ParsingUtilities.h b/third_party/WebKit/Source/platform/wtf/text/ParsingUtilities.h new file mode 100644 index 0000000..2d9a970 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/ParsingUtilities.h
@@ -0,0 +1,98 @@ +/* + * Copyright (C) 2013 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ParsingUtilities_h +#define ParsingUtilities_h + +template <typename CharType> +bool skipExactly(const CharType*& position, + const CharType* end, + CharType delimiter) { + if (position < end && *position == delimiter) { + ++position; + return true; + } + return false; +} + +template <typename CharType, bool characterPredicate(CharType)> +bool skipExactly(const CharType*& position, const CharType* end) { + if (position < end && characterPredicate(*position)) { + ++position; + return true; + } + return false; +} + +template <typename CharType> +bool skipToken(const CharType*& position, + const CharType* end, + const char* token) { + const CharType* current = position; + while (current < end && *token) { + if (*current != *token) + return false; + ++current; + ++token; + } + if (*token) + return false; + + position = current; + return true; +} + +template <typename CharType> +void skipUntil(const CharType*& position, + const CharType* end, + CharType delimiter) { + while (position < end && *position != delimiter) + ++position; +} + +template <typename CharType, bool characterPredicate(CharType)> +void skipUntil(const CharType*& position, const CharType* end) { + while (position < end && !characterPredicate(*position)) + ++position; +} + +template <typename CharType, bool characterPredicate(CharType)> +void skipWhile(const CharType*& position, const CharType* end) { + while (position < end && characterPredicate(*position)) + ++position; +} + +template <typename CharType, bool characterPredicate(CharType)> +void reverseSkipWhile(const CharType*& position, const CharType* start) { + while (position >= start && characterPredicate(*position)) + --position; +} + +#endif
diff --git a/third_party/WebKit/Source/platform/wtf/text/StringUTF8Adaptor.h b/third_party/WebKit/Source/platform/wtf/text/StringUTF8Adaptor.h new file mode 100644 index 0000000..9f0d9cc3 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/StringUTF8Adaptor.h
@@ -0,0 +1,85 @@ +/* + * Copyright (C) 2013 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef StringUTF8Adaptor_h +#define StringUTF8Adaptor_h + +#include "base/strings/string_piece.h" +#include "platform/wtf/Allocator.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/TextEncoding.h" +#include "platform/wtf/text/WTFString.h" + +namespace WTF { + +// This class lets you get UTF-8 data out of a String without mallocing a +// separate buffer to hold the data if the String happens to be 8 bit and +// contain only ASCII characters. +class StringUTF8Adaptor final { + DISALLOW_NEW(); + + public: + StringUTF8Adaptor(const String& string, + UTF8ConversionMode mode = LenientUTF8Conversion) + : m_data(0), m_length(0) { + if (string.isEmpty()) + return; + // Unfortunately, 8 bit WTFStrings are encoded in Latin-1 and GURL uses + // UTF-8 when processing 8 bit strings. If |relative| is entirely ASCII, we + // luck out and can avoid mallocing a new buffer to hold the UTF-8 data + // because UTF-8 and Latin-1 use the same code units for ASCII code points. + if (string.is8Bit() && string.containsOnlyASCII()) { + m_data = reinterpret_cast<const char*>(string.characters8()); + m_length = string.length(); + } else { + m_utf8Buffer = string.utf8(mode); + m_data = m_utf8Buffer.data(); + m_length = m_utf8Buffer.length(); + } + } + + const char* data() const { return m_data; } + size_t length() const { return m_length; } + + base::StringPiece asStringPiece() const { + return base::StringPiece(m_data, m_length); + } + + private: + CString m_utf8Buffer; + const char* m_data; + size_t m_length; +}; + +} // namespace WTF + +using WTF::StringUTF8Adaptor; + +#endif // StringUTF8Adaptor_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodec.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodec.cpp similarity index 96% rename from third_party/WebKit/Source/wtf/text/TextCodec.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodec.cpp index 884d7ed..2a42726 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodec.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodec.cpp
@@ -24,9 +24,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodec.h" +#include "platform/wtf/text/TextCodec.h" -#include "wtf/StringExtras.h" +#include "platform/wtf/StringExtras.h" namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodec.h b/third_party/WebKit/Source/platform/wtf/text/TextCodec.h new file mode 100644 index 0000000..4592183 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodec.h
@@ -0,0 +1,121 @@ +/* + * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodec_h +#define TextCodec_h + +#include "platform/wtf/Forward.h" +#include "platform/wtf/Noncopyable.h" +#include "platform/wtf/text/Unicode.h" +#include "platform/wtf/text/WTFString.h" +#include <memory> + +namespace WTF { + +class TextEncoding; + +// Specifies what will happen when a character is encountered that is +// not encodable in the character set. +enum UnencodableHandling { + // Substitutes the replacement character "?". + QuestionMarksForUnencodables, + + // Encodes the character as an XML entity. For example, U+06DE + // would be "۞" (0x6DE = 1758 in octal). + EntitiesForUnencodables, + + // Encodes the character as en entity as above, but escaped + // non-alphanumeric characters. This is used in URLs. + // For example, U+6DE would be "%26%231758%3B". + URLEncodedEntitiesForUnencodables, + + // Encodes the character as a CSS entity. For example U+06DE + // would be \06de. See: https://www.w3.org/TR/css-syntax-3/#escaping + CSSEncodedEntitiesForUnencodables, +}; + +typedef char UnencodableReplacementArray[32]; + +enum FlushBehavior { + // More bytes are coming, don't flush the codec. + DoNotFlush = 0, + + // A fetch has hit EOF. Some codecs handle fetches differently, for compat + // reasons. + FetchEOF, + + // Do a full flush of the codec. + DataEOF +}; + +static_assert(!DoNotFlush, "DoNotFlush should be falsy"); +static_assert(FetchEOF, "FetchEOF should be truthy"); +static_assert(DataEOF, "DataEOF should be truthy"); + +class WTF_EXPORT TextCodec { + WTF_MAKE_NONCOPYABLE(TextCodec); + USING_FAST_MALLOC(TextCodec); + + public: + TextCodec() {} + virtual ~TextCodec(); + + String decode(const char* str, + size_t length, + FlushBehavior flush = DoNotFlush) { + bool ignored; + return decode(str, length, flush, false, ignored); + } + + virtual String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) = 0; + virtual CString encode(const UChar*, size_t length, UnencodableHandling) = 0; + virtual CString encode(const LChar*, size_t length, UnencodableHandling) = 0; + + // Fills a null-terminated string representation of the given + // unencodable character into the given replacement buffer. + // The length of the string (not including the null) will be returned. + static int getUnencodableReplacement(unsigned codePoint, + UnencodableHandling, + UnencodableReplacementArray); +}; + +typedef void (*EncodingNameRegistrar)(const char* alias, const char* name); + +typedef std::unique_ptr<TextCodec> ( + *NewTextCodecFunction)(const TextEncoding&, const void* additionalData); +typedef void (*TextCodecRegistrar)(const char* name, + NewTextCodecFunction, + const void* additionalData); + +} // namespace WTF + +using WTF::TextCodec; + +#endif // TextCodec_h
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecASCIIFastPath.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecASCIIFastPath.h new file mode 100644 index 0000000..f962d9d --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecASCIIFastPath.h
@@ -0,0 +1,77 @@ +/* + * Copyright (C) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecASCIIFastPath_h +#define TextCodecASCIIFastPath_h + +#include "platform/wtf/text/ASCIIFastPath.h" + +namespace WTF { + +template <size_t size> +struct UCharByteFiller; +template <> +struct UCharByteFiller<4> { + static void copy(LChar* destination, const uint8_t* source) { + memcpy(destination, source, 4); + } + + static void copy(UChar* destination, const uint8_t* source) { + destination[0] = source[0]; + destination[1] = source[1]; + destination[2] = source[2]; + destination[3] = source[3]; + } +}; +template <> +struct UCharByteFiller<8> { + static void copy(LChar* destination, const uint8_t* source) { + memcpy(destination, source, 8); + } + + static void copy(UChar* destination, const uint8_t* source) { + destination[0] = source[0]; + destination[1] = source[1]; + destination[2] = source[2]; + destination[3] = source[3]; + destination[4] = source[4]; + destination[5] = source[5]; + destination[6] = source[6]; + destination[7] = source[7]; + } +}; + +inline void copyASCIIMachineWord(LChar* destination, const uint8_t* source) { + UCharByteFiller<sizeof(WTF::MachineWord)>::copy(destination, source); +} + +inline void copyASCIIMachineWord(UChar* destination, const uint8_t* source) { + UCharByteFiller<sizeof(WTF::MachineWord)>::copy(destination, source); +} + +} // namespace WTF + +#endif // TextCodecASCIIFastPath_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecICU.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecICU.cpp similarity index 98% rename from third_party/WebKit/Source/wtf/text/TextCodecICU.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecICU.cpp index 37c7d13..b59b94b 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecICU.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecICU.cpp
@@ -24,16 +24,16 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodecICU.h" +#include "platform/wtf/text/TextCodecICU.h" -#include "wtf/Assertions.h" -#include "wtf/PtrUtil.h" -#include "wtf/StringExtras.h" -#include "wtf/Threading.h" -#include "wtf/WTFThreadData.h" -#include "wtf/text/CString.h" -#include "wtf/text/CharacterNames.h" -#include "wtf/text/StringBuilder.h" +#include "platform/wtf/Assertions.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/StringExtras.h" +#include "platform/wtf/Threading.h" +#include "platform/wtf/WTFThreadData.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/CharacterNames.h" +#include "platform/wtf/text/StringBuilder.h" #include <memory> #include <unicode/ucnv.h> #include <unicode/ucnv_cb.h>
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecICU.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecICU.h new file mode 100644 index 0000000..92059609 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecICU.h
@@ -0,0 +1,107 @@ +/* + * Copyright (C) 2004, 2006, 2007, 2011 Apple Inc. All rights reserved. + * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecICU_h +#define TextCodecICU_h + +#include "base/gtest_prod_util.h" +#include "platform/wtf/text/TextCodec.h" +#include "platform/wtf/text/TextEncoding.h" +#include <memory> +#include <unicode/utypes.h> + +typedef struct UConverter UConverter; + +namespace WTF { + +class TextCodecInput; + +class TextCodecICU final : public TextCodec { + public: + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + ~TextCodecICU() override; + + private: + TextCodecICU(const TextEncoding&); + WTF_EXPORT static std::unique_ptr<TextCodec> create(const TextEncoding&, + const void*); + + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + CString encode(const UChar*, size_t length, UnencodableHandling) override; + CString encode(const LChar*, size_t length, UnencodableHandling) override; + + template <typename CharType> + CString encodeCommon(const CharType*, size_t length, UnencodableHandling); + CString encodeInternal(const TextCodecInput&, UnencodableHandling); + + void createICUConverter() const; + void releaseICUConverter() const; +#if defined(USING_SYSTEM_ICU) + bool needsGBKFallbacks() const { return m_needsGBKFallbacks; } + void setNeedsGBKFallbacks(bool needsFallbacks) { + m_needsGBKFallbacks = needsFallbacks; + } +#endif + + int decodeToBuffer(UChar* buffer, + UChar* bufferLimit, + const char*& source, + const char* sourceLimit, + int32_t* offsets, + bool flush, + UErrorCode&); + + TextEncoding m_encoding; + mutable UConverter* m_converterICU; +#if defined(USING_SYSTEM_ICU) + mutable bool m_needsGBKFallbacks; +#endif + + FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, IgnorableCodePoint); + FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, UTF32AndQuestionMarks); + FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, UTF32Aliases); +}; + +struct ICUConverterWrapper { + WTF_MAKE_NONCOPYABLE(ICUConverterWrapper); + USING_FAST_MALLOC(ICUConverterWrapper); + + public: + ICUConverterWrapper() : converter(0) {} + ~ICUConverterWrapper(); + + UConverter* converter; +}; + +} // namespace WTF + +#endif // TextCodecICU_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecLatin1.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.cpp similarity index 97% rename from third_party/WebKit/Source/wtf/text/TextCodecLatin1.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.cpp index 589c853e..9994c38 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecLatin1.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.cpp
@@ -23,13 +23,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodecLatin1.h" +#include "platform/wtf/text/TextCodecLatin1.h" -#include "wtf/PtrUtil.h" -#include "wtf/text/CString.h" -#include "wtf/text/StringBuffer.h" -#include "wtf/text/TextCodecASCIIFastPath.h" -#include "wtf/text/WTFString.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/StringBuffer.h" +#include "platform/wtf/text/TextCodecASCIIFastPath.h" +#include "platform/wtf/text/WTFString.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.h new file mode 100644 index 0000000..29ef4d0b --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecLatin1.h
@@ -0,0 +1,53 @@ +/* + * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecLatin1_h +#define TextCodecLatin1_h + +#include "platform/wtf/text/TextCodec.h" + +namespace WTF { + +class TextCodecLatin1 final : public TextCodec { + public: + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + private: + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + CString encode(const UChar*, size_t length, UnencodableHandling) override; + CString encode(const LChar*, size_t length, UnencodableHandling) override; + + template <typename CharType> + CString encodeCommon(const CharType*, size_t length, UnencodableHandling); +}; + +} // namespace WTF + +#endif // TextCodecLatin1_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecReplacement.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.cpp similarity index 91% rename from third_party/WebKit/Source/wtf/text/TextCodecReplacement.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.cpp index 113a1bc..99aa9e25 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecReplacement.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.cpp
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "wtf/text/TextCodecReplacement.h" +#include "platform/wtf/text/TextCodecReplacement.h" -#include "wtf/PtrUtil.h" -#include "wtf/text/CharacterNames.h" -#include "wtf/text/WTFString.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/text/CharacterNames.h" +#include "platform/wtf/text/WTFString.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.h new file mode 100644 index 0000000..38b144fe --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecReplacement.h
@@ -0,0 +1,32 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef TextCodecReplacement_h +#define TextCodecReplacement_h + +#include "platform/wtf/text/TextCodec.h" +#include "platform/wtf/text/TextCodecUTF8.h" + +namespace WTF { + +class TextCodecReplacement final : public TextCodecUTF8 { + public: + TextCodecReplacement(); + + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + private: + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + + bool m_replacementErrorReturned; +}; + +} // namespace WTF + +#endif // TextCodecReplacement_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.cpp similarity index 96% rename from third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.cpp index 72b187d..bf782687 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.cpp
@@ -23,13 +23,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodecUTF16.h" +#include "platform/wtf/text/TextCodecUTF16.h" -#include "wtf/PtrUtil.h" -#include "wtf/text/CString.h" -#include "wtf/text/CharacterNames.h" -#include "wtf/text/StringBuffer.h" -#include "wtf/text/WTFString.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/CharacterNames.h" +#include "platform/wtf/text/StringBuffer.h" +#include "platform/wtf/text/WTFString.h" #include <memory> using namespace std;
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.h new file mode 100644 index 0000000..5984bc4ae --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF16.h
@@ -0,0 +1,58 @@ +/* + * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecUTF16_h +#define TextCodecUTF16_h + +#include "platform/wtf/text/TextCodec.h" + +namespace WTF { + +class TextCodecUTF16 final : public TextCodec { + public: + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + TextCodecUTF16(bool littleEndian) : m_littleEndian(littleEndian) {} + + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + CString encode(const UChar*, size_t length, UnencodableHandling) override; + CString encode(const LChar*, size_t length, UnencodableHandling) override; + + private: + bool m_littleEndian; + bool m_haveLeadByte = false; + unsigned char m_leadByte; + bool m_haveLeadSurrogate = false; + UChar m_leadSurrogate; +}; + +} // namespace WTF + +#endif // TextCodecUTF16_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUTF8.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.cpp similarity index 98% rename from third_party/WebKit/Source/wtf/text/TextCodecUTF8.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.cpp index 9446bc7..b3e6e99 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUTF8.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.cpp
@@ -23,13 +23,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodecUTF8.h" +#include "platform/wtf/text/TextCodecUTF8.h" -#include "wtf/PtrUtil.h" -#include "wtf/text/CString.h" -#include "wtf/text/CharacterNames.h" -#include "wtf/text/StringBuffer.h" -#include "wtf/text/TextCodecASCIIFastPath.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/CharacterNames.h" +#include "platform/wtf/text/StringBuffer.h" +#include "platform/wtf/text/TextCodecASCIIFastPath.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.h new file mode 100644 index 0000000..a2c5c101 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUTF8.h
@@ -0,0 +1,72 @@ +/* + * Copyright (C) 2011 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecUTF8_h +#define TextCodecUTF8_h + +#include "platform/wtf/text/TextCodec.h" +#include <memory> + +namespace WTF { + +class TextCodecUTF8 : public TextCodec { + public: + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + protected: + TextCodecUTF8() : m_partialSequenceSize(0) {} + + private: + static std::unique_ptr<TextCodec> create(const TextEncoding&, const void*); + + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + CString encode(const UChar*, size_t length, UnencodableHandling) override; + CString encode(const LChar*, size_t length, UnencodableHandling) override; + + template <typename CharType> + CString encodeCommon(const CharType* characters, size_t length); + + template <typename CharType> + bool handlePartialSequence(CharType*& destination, + const uint8_t*& source, + const uint8_t* end, + bool flush, + bool stopOnError, + bool& sawError); + void handleError(UChar*& destination, bool stopOnError, bool& sawError); + void consumePartialSequenceByte(); + + int m_partialSequenceSize; + uint8_t m_partialSequence[U8_MAX_LENGTH]; +}; + +} // namespace WTF + +#endif // TextCodecUTF8_h
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.cpp b/third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.cpp similarity index 95% rename from third_party/WebKit/Source/wtf/text/TextCodecUserDefined.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.cpp index 92ac7a9f..4e1dfb6 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.cpp
@@ -23,13 +23,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextCodecUserDefined.h" +#include "platform/wtf/text/TextCodecUserDefined.h" -#include "wtf/PtrUtil.h" -#include "wtf/text/CString.h" -#include "wtf/text/StringBuffer.h" -#include "wtf/text/StringBuilder.h" -#include "wtf/text/WTFString.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/StringBuffer.h" +#include "platform/wtf/text/StringBuilder.h" +#include "platform/wtf/text/WTFString.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.h b/third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.h new file mode 100644 index 0000000..1bd84649 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextCodecUserDefined.h
@@ -0,0 +1,53 @@ +/* + * Copyright (C) 2007 Apple, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextCodecUserDefined_h +#define TextCodecUserDefined_h + +#include "platform/wtf/text/TextCodec.h" + +namespace WTF { + +class TextCodecUserDefined final : public TextCodec { + public: + static void registerEncodingNames(EncodingNameRegistrar); + static void registerCodecs(TextCodecRegistrar); + + private: + String decode(const char*, + size_t length, + FlushBehavior, + bool stopOnError, + bool& sawError) override; + CString encode(const UChar*, size_t length, UnencodableHandling) override; + CString encode(const LChar*, size_t length, UnencodableHandling) override; + + template <typename CharType> + CString encodeCommon(const CharType*, size_t length, UnencodableHandling); +}; + +} // namespace WTF + +#endif // TextCodecUserDefined_h
diff --git a/third_party/WebKit/Source/wtf/text/TextEncoding.cpp b/third_party/WebKit/Source/platform/wtf/text/TextEncoding.cpp similarity index 96% rename from third_party/WebKit/Source/wtf/text/TextEncoding.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextEncoding.cpp index e92f80a..d7e7dc1 100644 --- a/third_party/WebKit/Source/wtf/text/TextEncoding.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextEncoding.cpp
@@ -25,13 +25,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextEncoding.h" +#include "platform/wtf/text/TextEncoding.h" -#include "wtf/StdLibExtras.h" -#include "wtf/Threading.h" -#include "wtf/text/CString.h" -#include "wtf/text/TextEncodingRegistry.h" -#include "wtf/text/WTFString.h" +#include "platform/wtf/StdLibExtras.h" +#include "platform/wtf/Threading.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/TextEncodingRegistry.h" +#include "platform/wtf/text/WTFString.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextEncoding.h b/third_party/WebKit/Source/platform/wtf/text/TextEncoding.h new file mode 100644 index 0000000..d58d6e3 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextEncoding.h
@@ -0,0 +1,99 @@ +/* + * Copyright (C) 2004, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextEncoding_h +#define TextEncoding_h + +#include "platform/wtf/Allocator.h" +#include "platform/wtf/Forward.h" +#include "platform/wtf/WTFExport.h" +#include "platform/wtf/text/TextCodec.h" +#include "platform/wtf/text/Unicode.h" + +namespace WTF { + +class WTF_EXPORT TextEncoding final { + USING_FAST_MALLOC(TextEncoding); + + public: + TextEncoding() : m_name(0) {} + TextEncoding(const char* name); + TextEncoding(const String& name); + + bool isValid() const { return m_name; } + const char* name() const { return m_name; } + bool usesVisualOrdering() const; + const TextEncoding& closestByteBasedEquivalent() const; + const TextEncoding& encodingForFormSubmission() const; + + String decode(const char* str, size_t length) const { + bool ignored; + return decode(str, length, false, ignored); + } + String decode(const char*, + size_t length, + bool stopOnError, + bool& sawError) const; + + CString encode(const String&, UnencodableHandling) const; + + bool isNonByteBasedEncoding() const; + + private: + bool isUTF7Encoding() const; + + const char* m_name; +}; + +inline bool operator==(const TextEncoding& a, const TextEncoding& b) { + return a.name() == b.name(); +} +inline bool operator!=(const TextEncoding& a, const TextEncoding& b) { + return a.name() != b.name(); +} + +WTF_EXPORT const TextEncoding& ASCIIEncoding(); +WTF_EXPORT const TextEncoding& Latin1Encoding(); +WTF_EXPORT const TextEncoding& UTF16BigEndianEncoding(); +WTF_EXPORT const TextEncoding& UTF16LittleEndianEncoding(); +WTF_EXPORT const TextEncoding& UTF32Encoding(); +WTF_EXPORT const TextEncoding& UTF32BigEndianEncoding(); +WTF_EXPORT const TextEncoding& UTF32LittleEndianEncoding(); +WTF_EXPORT const TextEncoding& UTF8Encoding(); +WTF_EXPORT const TextEncoding& WindowsLatin1Encoding(); + +} // namespace WTF + +using WTF::ASCIIEncoding; +using WTF::Latin1Encoding; +using WTF::UTF16BigEndianEncoding; +using WTF::UTF16LittleEndianEncoding; +using WTF::UTF32Encoding; +using WTF::UTF32BigEndianEncoding; +using WTF::UTF32LittleEndianEncoding; +using WTF::UTF8Encoding; +using WTF::WindowsLatin1Encoding; + +#endif // TextEncoding_h
diff --git a/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.cpp b/third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.cpp similarity index 92% rename from third_party/WebKit/Source/wtf/text/TextEncodingRegistry.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.cpp index a8a0aa5..824d399 100644 --- a/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.cpp
@@ -24,24 +24,24 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/TextEncodingRegistry.h" +#include "platform/wtf/text/TextEncodingRegistry.h" -#include "wtf/ASCIICType.h" -#include "wtf/Atomics.h" -#include "wtf/CurrentTime.h" -#include "wtf/HashMap.h" -#include "wtf/HashSet.h" -#include "wtf/StdLibExtras.h" -#include "wtf/StringExtras.h" -#include "wtf/ThreadingPrimitives.h" -#include "wtf/text/CString.h" -#include "wtf/text/TextCodecICU.h" -#include "wtf/text/TextCodecLatin1.h" -#include "wtf/text/TextCodecReplacement.h" -#include "wtf/text/TextCodecUTF16.h" -#include "wtf/text/TextCodecUTF8.h" -#include "wtf/text/TextCodecUserDefined.h" -#include "wtf/text/TextEncoding.h" +#include "platform/wtf/ASCIICType.h" +#include "platform/wtf/Atomics.h" +#include "platform/wtf/CurrentTime.h" +#include "platform/wtf/HashMap.h" +#include "platform/wtf/HashSet.h" +#include "platform/wtf/StdLibExtras.h" +#include "platform/wtf/StringExtras.h" +#include "platform/wtf/ThreadingPrimitives.h" +#include "platform/wtf/text/CString.h" +#include "platform/wtf/text/TextCodecICU.h" +#include "platform/wtf/text/TextCodecLatin1.h" +#include "platform/wtf/text/TextCodecReplacement.h" +#include "platform/wtf/text/TextCodecUTF16.h" +#include "platform/wtf/text/TextCodecUTF8.h" +#include "platform/wtf/text/TextCodecUserDefined.h" +#include "platform/wtf/text/TextEncoding.h" #include <memory> namespace WTF {
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.h b/third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.h new file mode 100644 index 0000000..10a87a7e --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextEncodingRegistry.h
@@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TextEncodingRegistry_h +#define TextEncodingRegistry_h + +#include "platform/wtf/WTFExport.h" +#include "platform/wtf/text/Unicode.h" +#include "platform/wtf/text/WTFString.h" +#include <memory> + +namespace WTF { + +class TextCodec; +class TextEncoding; + +// Use TextResourceDecoder::decode to decode resources, since it handles BOMs. +// Use TextEncoding::encode to encode, since it takes care of normalization. +WTF_EXPORT std::unique_ptr<TextCodec> newTextCodec(const TextEncoding&); + +// Only TextEncoding should use the following functions directly. +const char* atomicCanonicalTextEncodingName(const char* alias); +template <typename CharacterType> +const char* atomicCanonicalTextEncodingName(const CharacterType*, size_t); +const char* atomicCanonicalTextEncodingName(const String&); +bool noExtendedTextEncodingNameUsed(); +bool isReplacementEncoding(const char* alias); +bool isReplacementEncoding(const String& alias); + +#ifndef NDEBUG +void dumpTextEncodingNameMap(); +#endif + +} // namespace WTF + +using WTF::newTextCodec; +using WTF::atomicCanonicalTextEncodingName; +using WTF::noExtendedTextEncodingNameUsed; +#ifndef NDEBUG +using WTF::dumpTextEncodingNameMap; +#endif + +#endif // TextEncodingRegistry_h
diff --git a/third_party/WebKit/Source/wtf/text/TextPosition.cpp b/third_party/WebKit/Source/platform/wtf/text/TextPosition.cpp similarity index 95% rename from third_party/WebKit/Source/wtf/text/TextPosition.cpp rename to third_party/WebKit/Source/platform/wtf/text/TextPosition.cpp index 98ba250d..db19f54a 100644 --- a/third_party/WebKit/Source/wtf/text/TextPosition.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/TextPosition.cpp
@@ -23,10 +23,10 @@ * DAMAGE. */ -#include "wtf/text/TextPosition.h" +#include "platform/wtf/text/TextPosition.h" -#include "wtf/PtrUtil.h" -#include "wtf/StdLibExtras.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/StdLibExtras.h" #include <algorithm> #include <memory>
diff --git a/third_party/WebKit/Source/platform/wtf/text/TextPosition.h b/third_party/WebKit/Source/platform/wtf/text/TextPosition.h new file mode 100644 index 0000000..7cbe773 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/text/TextPosition.h
@@ -0,0 +1,120 @@ +/* + * Copyright (C) 2010, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +#ifndef TextPosition_h +#define TextPosition_h + +#include "platform/wtf/Allocator.h" +#include "platform/wtf/Assertions.h" +#include "platform/wtf/Vector.h" +#include "platform/wtf/WTFExport.h" +#include "platform/wtf/text/WTFString.h" +#include <memory> + +namespace WTF { + +// An abstract number of element in a sequence. The sequence has a first +// element. This type should be used instead of integer because 2 +// contradicting traditions can call a first element '0' or '1' which makes +// integer type ambiguous. +class OrdinalNumber final { + DISALLOW_NEW(); + + public: + static OrdinalNumber fromZeroBasedInt(int zeroBasedInt) { + return OrdinalNumber(zeroBasedInt); + } + static OrdinalNumber fromOneBasedInt(int oneBasedInt) { + return OrdinalNumber(oneBasedInt - 1); + } + OrdinalNumber() : m_zeroBasedValue(0) {} + + int zeroBasedInt() const { return m_zeroBasedValue; } + int oneBasedInt() const { return m_zeroBasedValue + 1; } + + bool operator==(OrdinalNumber other) const { + return m_zeroBasedValue == other.m_zeroBasedValue; + } + bool operator!=(OrdinalNumber other) const { return !((*this) == other); } + + static OrdinalNumber first() { return OrdinalNumber(0); } + static OrdinalNumber beforeFirst() { return OrdinalNumber(-1); } + + private: + OrdinalNumber(int zeroBasedInt) : m_zeroBasedValue(zeroBasedInt) {} + int m_zeroBasedValue; +}; + +// TextPosition structure specifies coordinates within an text resource. It is +// used mostly +// for saving script source position. +class TextPosition final { + DISALLOW_NEW(); + + public: + TextPosition(OrdinalNumber line, OrdinalNumber column) + : m_line(line), m_column(column) {} + TextPosition() {} + bool operator==(const TextPosition& other) const { + return m_line == other.m_line && m_column == other.m_column; + } + bool operator!=(const TextPosition& other) const { + return !((*this) == other); + } + WTF_EXPORT OrdinalNumber toOffset(const Vector<unsigned>&); + + // A 'minimum' value of position, used as a default value. + static TextPosition minimumPosition() { + return TextPosition(OrdinalNumber::first(), OrdinalNumber::first()); + } + + // A value with line value less than a minimum; used as an impossible + // position. + static TextPosition belowRangePosition() { + return TextPosition(OrdinalNumber::beforeFirst(), + OrdinalNumber::beforeFirst()); + } + + // A value corresponding to a position with given offset within text having + // the specified line ending offsets. + WTF_EXPORT static TextPosition fromOffsetAndLineEndings( + unsigned, + const Vector<unsigned>&); + + OrdinalNumber m_line; + OrdinalNumber m_column; +}; + +WTF_EXPORT std::unique_ptr<Vector<unsigned>> lineEndings(const String&); + +} // namespace WTF + +using WTF::OrdinalNumber; + +using WTF::TextPosition; + +using WTF::lineEndings; + +#endif // TextPosition_h
diff --git a/third_party/WebKit/Source/wtf/text/icu/CollatorICU.cpp b/third_party/WebKit/Source/platform/wtf/text/icu/CollatorICU.cpp similarity index 94% rename from third_party/WebKit/Source/wtf/text/icu/CollatorICU.cpp rename to third_party/WebKit/Source/platform/wtf/text/icu/CollatorICU.cpp index 9428b52..45b3caa 100644 --- a/third_party/WebKit/Source/wtf/text/icu/CollatorICU.cpp +++ b/third_party/WebKit/Source/platform/wtf/text/icu/CollatorICU.cpp
@@ -26,14 +26,14 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "wtf/text/Collator.h" +#include "platform/wtf/text/Collator.h" -#include "wtf/Assertions.h" -#include "wtf/PtrUtil.h" -#include "wtf/StdLibExtras.h" -#include "wtf/StringExtras.h" -#include "wtf/Threading.h" -#include "wtf/ThreadingPrimitives.h" +#include "platform/wtf/Assertions.h" +#include "platform/wtf/PtrUtil.h" +#include "platform/wtf/StdLibExtras.h" +#include "platform/wtf/StringExtras.h" +#include "platform/wtf/Threading.h" +#include "platform/wtf/ThreadingPrimitives.h" #include <memory> #include <stdlib.h> #include <string.h>
diff --git a/third_party/WebKit/Source/web/AssertMatchingEnums.cpp b/third_party/WebKit/Source/web/AssertMatchingEnums.cpp index 7adbc552..3235300 100644 --- a/third_party/WebKit/Source/web/AssertMatchingEnums.cpp +++ b/third_party/WebKit/Source/web/AssertMatchingEnums.cpp
@@ -870,8 +870,12 @@ WebSettings::ProgressBarCompletion::ResourcesBeforeDCLAndSameOriginIFrames, ProgressBarCompletion::ResourcesBeforeDCLAndSameOriginIFrames); +// This ensures that the version number published in +// WebSerializedScriptValueVersion.h matches the serializer's understanding. +// TODO(jbroman): Fix this to also account for the V8-side version. See +// https://crbug.com/704293. static_assert(kSerializedScriptValueVersion == SerializedScriptValue::wireFormatVersion, - ""); + "Update WebSerializedScriptValueVersion.h."); } // namespace blink
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn index 5efe15e6..a1c6cda 100644 --- a/third_party/WebKit/Source/web/BUILD.gn +++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -92,6 +92,7 @@ "LocalFileSystemClient.cpp", "LocalFileSystemClient.h", "LocalFrameClientImpl.cpp", + "LocalFrameClientImpl.h", "MediaKeysClientImpl.cpp", "MediaKeysClientImpl.h", "NavigatorContentUtilsClientImpl.cpp",
diff --git a/third_party/WebKit/Source/web/DevToolsEmulator.cpp b/third_party/WebKit/Source/web/DevToolsEmulator.cpp index b3c9f054..8fd8711 100644 --- a/third_party/WebKit/Source/web/DevToolsEmulator.cpp +++ b/third_party/WebKit/Source/web/DevToolsEmulator.cpp
@@ -284,8 +284,8 @@ m_webViewImpl->page()->settings().setPluginsEnabled(false); m_webViewImpl->page()->settings().setAvailablePointerTypes(PointerTypeCoarse); m_webViewImpl->page()->settings().setPrimaryPointerType(PointerTypeCoarse); - m_webViewImpl->page()->settings().setAvailableHoverTypes(HoverTypeOnDemand); - m_webViewImpl->page()->settings().setPrimaryHoverType(HoverTypeOnDemand); + m_webViewImpl->page()->settings().setAvailableHoverTypes(HoverTypeNone); + m_webViewImpl->page()->settings().setPrimaryHoverType(HoverTypeNone); m_webViewImpl->page()->settings().setMainFrameResizesAreOrientationChanges( true); m_webViewImpl->setZoomFactorOverride(1);
diff --git a/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp b/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp index 090852de..c1adc7364 100644 --- a/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp +++ b/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp
@@ -1035,4 +1035,9 @@ m_webFrame->client()->setHasReceivedUserGesture(); } +void LocalFrameClientImpl::abortClientNavigation() { + if (m_webFrame->client()) + m_webFrame->client()->abortClientNavigation(); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/web/LocalFrameClientImpl.h b/third_party/WebKit/Source/web/LocalFrameClientImpl.h index d332c862..a7481d05 100644 --- a/third_party/WebKit/Source/web/LocalFrameClientImpl.h +++ b/third_party/WebKit/Source/web/LocalFrameClientImpl.h
@@ -225,6 +225,8 @@ void setHasReceivedUserGesture() override; + void abortClientNavigation() override; + private: explicit LocalFrameClientImpl(WebLocalFrameImpl*);
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp index e50ce42be..65d20708 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -35,7 +35,7 @@ #include "bindings/core/v8/ScriptController.h" #include "bindings/core/v8/V8Binding.h" -#include "core/InstrumentingAgents.h" +#include "core/InspectorInstrumentationAgents.h" #include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h"
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h index e742f54..794d34f 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.h
@@ -148,7 +148,7 @@ WebDevToolsAgentClient* m_client; Member<WebLocalFrameImpl> m_webLocalFrameImpl; - Member<InstrumentingAgents> m_instrumentingAgents; + Member<InspectorInstrumentationAgents> m_instrumentingAgents; Member<InspectorResourceContentLoader> m_resourceContentLoader; Member<InspectorOverlay> m_overlay; Member<InspectedFrames> m_inspectedFrames;
diff --git a/third_party/WebKit/Source/web/WebSecurityPolicy.cpp b/third_party/WebKit/Source/web/WebSecurityPolicy.cpp index be9f91d..192fd90 100644 --- a/third_party/WebKit/Source/web/WebSecurityPolicy.cpp +++ b/third_party/WebKit/Source/web/WebSecurityPolicy.cpp
@@ -60,11 +60,6 @@ SchemeRegistry::registerURLSchemeAsFirstPartyWhenTopLevel(scheme); } -void WebSecurityPolicy::registerURLSchemeAsEmptyDocument( - const WebString& scheme) { - SchemeRegistry::registerURLSchemeAsEmptyDocument(scheme); -} - void WebSecurityPolicy::addOriginAccessWhitelistEntry( const WebURL& sourceOrigin, const WebString& destinationProtocol,
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp index dcaacbc..ba56e4a 100644 --- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -8950,6 +8950,22 @@ reset(); } +TEST_F(WebFrameSwapTest, RemoteWindowToString) { + v8::HandleScope scope(v8::Isolate::GetCurrent()); + + FrameTestHelpers::TestWebRemoteFrameClient remoteClient; + WebRemoteFrame* remoteFrame = remoteClient.frame(); + lastChild(mainFrame())->swap(remoteFrame); + remoteFrame->setReplicatedOrigin(SecurityOrigin::createUnique()); + v8::Local<v8::Value> toStringResult = + mainFrame()->executeScriptAndReturnValue( + WebScriptSource("Object.prototype.toString.call(window[2])")); + ASSERT_FALSE(toStringResult.IsEmpty()); + EXPECT_STREQ("[object Object]", *v8::String::Utf8Value(toStringResult)); + + reset(); +} + // TODO(alexmos, dcheng): This test and some other OOPIF tests use // very little of the test fixture support in WebFrameSwapTest. We should // clean these tests up.
diff --git a/third_party/WebKit/Source/web/tests/data/device_emulation.html b/third_party/WebKit/Source/web/tests/data/device_emulation.html index c96394a..9779edb 100644 --- a/third_party/WebKit/Source/web/tests/data/device_emulation.html +++ b/third_party/WebKit/Source/web/tests/data/device_emulation.html
@@ -41,7 +41,7 @@ { #pointer { height: 20px; } } -@media all and (hover: on-demand) +@media all and (hover: none) { #pointer { width: 20px; } } @@ -59,4 +59,4 @@ <div id="test"></div> <div id="pointer"></div> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/WebKit/Source/web/tests/data/module.js b/third_party/WebKit/Source/web/tests/data/module.js new file mode 100644 index 0000000..efc5c30 --- /dev/null +++ b/third_party/WebKit/Source/web/tests/data/module.js
@@ -0,0 +1 @@ +export default 'grapes';
diff --git a/third_party/WebKit/Source/wtf/BUILD.gn b/third_party/WebKit/Source/wtf/BUILD.gn index f46830e..958a4e1 100644 --- a/third_party/WebKit/Source/wtf/BUILD.gn +++ b/third_party/WebKit/Source/wtf/BUILD.gn
@@ -123,7 +123,6 @@ "text/AtomicString.h", "text/AtomicStringHash.h", "text/AtomicStringTable.h", - "text/Base64.cpp", "text/Base64.h", "text/CString.h", "text/CharacterNames.h", @@ -139,25 +138,19 @@ "text/StringToNumber.h", "text/StringUTF8Adaptor.h", "text/StringView.h", - "text/TextCodec.cpp", "text/TextCodec.h", "text/TextCodecASCIIFastPath.h", - "text/TextCodecICU.cpp", - "text/TextCodecLatin1.cpp", - "text/TextCodecReplacement.cpp", + "text/TextCodecLatin1.h", "text/TextCodecReplacement.h", - "text/TextCodecUTF16.cpp", - "text/TextCodecUTF8.cpp", + "text/TextCodecUTF16.h", "text/TextCodecUTF8.h", - "text/TextCodecUserDefined.cpp", - "text/TextEncoding.cpp", - "text/TextEncodingRegistry.cpp", - "text/TextPosition.cpp", + "text/TextCodecUserDefined.h", + "text/TextEncoding.h", + "text/TextEncodingRegistry.h", "text/TextPosition.h", "text/UTF8.h", "text/Unicode.h", "text/WTFString.h", - "text/icu/CollatorICU.cpp", "text/icu/UnicodeIcu.h", "typed_arrays/ArrayBuffer.cpp", "typed_arrays/ArrayBuffer.h",
diff --git a/third_party/WebKit/Source/wtf/text/Base64.h b/third_party/WebKit/Source/wtf/text/Base64.h index 7a4496e..97da3b1e 100644 --- a/third_party/WebKit/Source/wtf/text/Base64.h +++ b/third_party/WebKit/Source/wtf/text/Base64.h
@@ -1,129 +1,9 @@ -/* - * Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> - * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef Base64_h -#define Base64_h +#include "platform/wtf/text/Base64.h" -#include "wtf/Vector.h" -#include "wtf/WTFExport.h" -#include "wtf/text/CString.h" -#include "wtf/text/WTFString.h" - -namespace WTF { - -enum Base64EncodePolicy { Base64DoNotInsertLFs, Base64InsertLFs }; - -enum Base64DecodePolicy { Base64DoNotValidatePadding, Base64ValidatePadding }; - -WTF_EXPORT void base64Encode(const char*, - unsigned, - Vector<char>&, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT void base64Encode(const Vector<char>&, - Vector<char>&, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT void base64Encode(const CString&, - Vector<char>&, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT String base64Encode(const char*, - unsigned, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT String base64Encode(const Vector<char>&, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT String base64Encode(const Vector<unsigned char>&, - Base64EncodePolicy = Base64DoNotInsertLFs); -WTF_EXPORT String base64Encode(const CString&, - Base64EncodePolicy = Base64DoNotInsertLFs); - -WTF_EXPORT bool base64Decode( - const String&, - Vector<char>&, - CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, - Base64DecodePolicy = Base64DoNotValidatePadding); -WTF_EXPORT bool base64Decode( - const Vector<char>&, - Vector<char>&, - CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, - Base64DecodePolicy = Base64DoNotValidatePadding); -WTF_EXPORT bool base64Decode( - const char*, - unsigned, - Vector<char>&, - CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, - Base64DecodePolicy = Base64DoNotValidatePadding); -WTF_EXPORT bool base64Decode( - const UChar*, - unsigned, - Vector<char>&, - CharacterMatchFunctionPtr shouldIgnoreCharacter = 0, - Base64DecodePolicy = Base64DoNotValidatePadding); - -// Given an encoding in either base64 or base64url, returns a normalized -// encoding in plain base64. -WTF_EXPORT String normalizeToBase64(const String&); - -WTF_EXPORT String base64URLEncode(const char*, - unsigned, - Base64EncodePolicy = Base64DoNotInsertLFs); - -inline void base64Encode(const Vector<char>& in, - Vector<char>& out, - Base64EncodePolicy policy) { - base64Encode(in.data(), in.size(), out, policy); -} - -inline void base64Encode(const CString& in, - Vector<char>& out, - Base64EncodePolicy policy) { - base64Encode(in.data(), in.length(), out, policy); -} - -inline String base64Encode(const Vector<char>& in, Base64EncodePolicy policy) { - return base64Encode(in.data(), in.size(), policy); -} - -inline String base64Encode(const Vector<unsigned char>& in, - Base64EncodePolicy policy) { - return base64Encode(reinterpret_cast<const char*>(in.data()), in.size(), - policy); -} - -inline String base64Encode(const CString& in, Base64EncodePolicy policy) { - return base64Encode(in.data(), in.length(), policy); -} - -} // namespace WTF - -using WTF::Base64EncodePolicy; -using WTF::Base64DoNotInsertLFs; -using WTF::Base64InsertLFs; -using WTF::Base64DecodePolicy; -using WTF::Base64DoNotValidatePadding; -using WTF::Base64ValidatePadding; -using WTF::base64Encode; -using WTF::base64Decode; - -#endif // Base64_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/Collator.h b/third_party/WebKit/Source/wtf/text/Collator.h index 853083e..cafa65c 100644 --- a/third_party/WebKit/Source/wtf/text/Collator.h +++ b/third_party/WebKit/Source/wtf/text/Collator.h
@@ -1,78 +1,9 @@ -/* - * Copyright (C) 2008 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef WTF_Collator_h -#define WTF_Collator_h +#include "platform/wtf/text/Collator.h" -#include "wtf/Allocator.h" -#include "wtf/Noncopyable.h" -#include "wtf/WTFExport.h" -#include "wtf/text/Unicode.h" -#include <memory> - -struct UCollator; - -namespace WTF { - -class WTF_EXPORT Collator { - WTF_MAKE_NONCOPYABLE(Collator); - USING_FAST_MALLOC(Collator); - - public: - enum Result { Equal = 0, Greater = 1, Less = -1 }; - - // From ICU's uloc.h (ULOC_FULLNAME_CAPACITY) - static const size_t ulocFullnameCapacity = 157; - - // Parsing is lenient; e.g. language identifiers (such as "en-US") are - // accepted, too. - explicit Collator(const char* locale); - - ~Collator(); - void setOrderLowerFirst(bool); - - static std::unique_ptr<Collator> userDefault(); - - Result collate(const ::UChar*, size_t, const ::UChar*, size_t) const; - - private: - void createCollator() const; - void releaseCollator(); - void setEquivalentLocale(const char*, char*); - mutable UCollator* m_collator; - - char* m_locale; - char m_equivalentLocale[ulocFullnameCapacity]; - bool m_lowerFirst; -}; - -} // namespace WTF - -using WTF::Collator; - -#endif +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/ParsingUtilities.h b/third_party/WebKit/Source/wtf/text/ParsingUtilities.h index 2d9a970..70f6813 100644 --- a/third_party/WebKit/Source/wtf/text/ParsingUtilities.h +++ b/third_party/WebKit/Source/wtf/text/ParsingUtilities.h
@@ -1,98 +1,9 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef ParsingUtilities_h -#define ParsingUtilities_h +#include "platform/wtf/text/ParsingUtilities.h" -template <typename CharType> -bool skipExactly(const CharType*& position, - const CharType* end, - CharType delimiter) { - if (position < end && *position == delimiter) { - ++position; - return true; - } - return false; -} - -template <typename CharType, bool characterPredicate(CharType)> -bool skipExactly(const CharType*& position, const CharType* end) { - if (position < end && characterPredicate(*position)) { - ++position; - return true; - } - return false; -} - -template <typename CharType> -bool skipToken(const CharType*& position, - const CharType* end, - const char* token) { - const CharType* current = position; - while (current < end && *token) { - if (*current != *token) - return false; - ++current; - ++token; - } - if (*token) - return false; - - position = current; - return true; -} - -template <typename CharType> -void skipUntil(const CharType*& position, - const CharType* end, - CharType delimiter) { - while (position < end && *position != delimiter) - ++position; -} - -template <typename CharType, bool characterPredicate(CharType)> -void skipUntil(const CharType*& position, const CharType* end) { - while (position < end && !characterPredicate(*position)) - ++position; -} - -template <typename CharType, bool characterPredicate(CharType)> -void skipWhile(const CharType*& position, const CharType* end) { - while (position < end && characterPredicate(*position)) - ++position; -} - -template <typename CharType, bool characterPredicate(CharType)> -void reverseSkipWhile(const CharType*& position, const CharType* start) { - while (position >= start && characterPredicate(*position)) - --position; -} - -#endif +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h b/third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h index 1aa0897..3ab6829 100644 --- a/third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h +++ b/third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h
@@ -1,85 +1,9 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef StringUTF8Adaptor_h -#define StringUTF8Adaptor_h +#include "platform/wtf/text/StringUTF8Adaptor.h" -#include "base/strings/string_piece.h" -#include "wtf/Allocator.h" -#include "wtf/text/CString.h" -#include "wtf/text/TextEncoding.h" -#include "wtf/text/WTFString.h" - -namespace WTF { - -// This class lets you get UTF-8 data out of a String without mallocing a -// separate buffer to hold the data if the String happens to be 8 bit and -// contain only ASCII characters. -class StringUTF8Adaptor final { - DISALLOW_NEW(); - - public: - StringUTF8Adaptor(const String& string, - UTF8ConversionMode mode = LenientUTF8Conversion) - : m_data(0), m_length(0) { - if (string.isEmpty()) - return; - // Unfortunately, 8 bit WTFStrings are encoded in Latin-1 and GURL uses - // UTF-8 when processing 8 bit strings. If |relative| is entirely ASCII, we - // luck out and can avoid mallocing a new buffer to hold the UTF-8 data - // because UTF-8 and Latin-1 use the same code units for ASCII code points. - if (string.is8Bit() && string.containsOnlyASCII()) { - m_data = reinterpret_cast<const char*>(string.characters8()); - m_length = string.length(); - } else { - m_utf8Buffer = string.utf8(mode); - m_data = m_utf8Buffer.data(); - m_length = m_utf8Buffer.length(); - } - } - - const char* data() const { return m_data; } - size_t length() const { return m_length; } - - base::StringPiece asStringPiece() const { - return base::StringPiece(m_data, m_length); - } - - private: - CString m_utf8Buffer; - const char* m_data; - size_t m_length; -}; - -} // namespace WTF - -using WTF::StringUTF8Adaptor; - -#endif // StringUTF8Adaptor_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodec.h b/third_party/WebKit/Source/wtf/text/TextCodec.h index 2162521..39fa35e 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodec.h +++ b/third_party/WebKit/Source/wtf/text/TextCodec.h
@@ -1,121 +1,9 @@ -/* - * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. - * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodec_h -#define TextCodec_h +#include "platform/wtf/text/TextCodec.h" -#include "wtf/Forward.h" -#include "wtf/Noncopyable.h" -#include "wtf/text/Unicode.h" -#include "wtf/text/WTFString.h" -#include <memory> - -namespace WTF { - -class TextEncoding; - -// Specifies what will happen when a character is encountered that is -// not encodable in the character set. -enum UnencodableHandling { - // Substitutes the replacement character "?". - QuestionMarksForUnencodables, - - // Encodes the character as an XML entity. For example, U+06DE - // would be "۞" (0x6DE = 1758 in octal). - EntitiesForUnencodables, - - // Encodes the character as en entity as above, but escaped - // non-alphanumeric characters. This is used in URLs. - // For example, U+6DE would be "%26%231758%3B". - URLEncodedEntitiesForUnencodables, - - // Encodes the character as a CSS entity. For example U+06DE - // would be \06de. See: https://www.w3.org/TR/css-syntax-3/#escaping - CSSEncodedEntitiesForUnencodables, -}; - -typedef char UnencodableReplacementArray[32]; - -enum FlushBehavior { - // More bytes are coming, don't flush the codec. - DoNotFlush = 0, - - // A fetch has hit EOF. Some codecs handle fetches differently, for compat - // reasons. - FetchEOF, - - // Do a full flush of the codec. - DataEOF -}; - -static_assert(!DoNotFlush, "DoNotFlush should be falsy"); -static_assert(FetchEOF, "FetchEOF should be truthy"); -static_assert(DataEOF, "DataEOF should be truthy"); - -class WTF_EXPORT TextCodec { - WTF_MAKE_NONCOPYABLE(TextCodec); - USING_FAST_MALLOC(TextCodec); - - public: - TextCodec() {} - virtual ~TextCodec(); - - String decode(const char* str, - size_t length, - FlushBehavior flush = DoNotFlush) { - bool ignored; - return decode(str, length, flush, false, ignored); - } - - virtual String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) = 0; - virtual CString encode(const UChar*, size_t length, UnencodableHandling) = 0; - virtual CString encode(const LChar*, size_t length, UnencodableHandling) = 0; - - // Fills a null-terminated string representation of the given - // unencodable character into the given replacement buffer. - // The length of the string (not including the null) will be returned. - static int getUnencodableReplacement(unsigned codePoint, - UnencodableHandling, - UnencodableReplacementArray); -}; - -typedef void (*EncodingNameRegistrar)(const char* alias, const char* name); - -typedef std::unique_ptr<TextCodec> ( - *NewTextCodecFunction)(const TextEncoding&, const void* additionalData); -typedef void (*TextCodecRegistrar)(const char* name, - NewTextCodecFunction, - const void* additionalData); - -} // namespace WTF - -using WTF::TextCodec; - -#endif // TextCodec_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecASCIIFastPath.h b/third_party/WebKit/Source/wtf/text/TextCodecASCIIFastPath.h index 4f83d38..d7c08ba3 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecASCIIFastPath.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecASCIIFastPath.h
@@ -1,77 +1,9 @@ -/* - * Copyright (C) 2011 Apple Inc. All rights reserved. - * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecASCIIFastPath_h -#define TextCodecASCIIFastPath_h +#include "platform/wtf/text/TextCodecASCIIFastPath.h" -#include "wtf/text/ASCIIFastPath.h" - -namespace WTF { - -template <size_t size> -struct UCharByteFiller; -template <> -struct UCharByteFiller<4> { - static void copy(LChar* destination, const uint8_t* source) { - memcpy(destination, source, 4); - } - - static void copy(UChar* destination, const uint8_t* source) { - destination[0] = source[0]; - destination[1] = source[1]; - destination[2] = source[2]; - destination[3] = source[3]; - } -}; -template <> -struct UCharByteFiller<8> { - static void copy(LChar* destination, const uint8_t* source) { - memcpy(destination, source, 8); - } - - static void copy(UChar* destination, const uint8_t* source) { - destination[0] = source[0]; - destination[1] = source[1]; - destination[2] = source[2]; - destination[3] = source[3]; - destination[4] = source[4]; - destination[5] = source[5]; - destination[6] = source[6]; - destination[7] = source[7]; - } -}; - -inline void copyASCIIMachineWord(LChar* destination, const uint8_t* source) { - UCharByteFiller<sizeof(WTF::MachineWord)>::copy(destination, source); -} - -inline void copyASCIIMachineWord(UChar* destination, const uint8_t* source) { - UCharByteFiller<sizeof(WTF::MachineWord)>::copy(destination, source); -} - -} // namespace WTF - -#endif // TextCodecASCIIFastPath_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecICU.h b/third_party/WebKit/Source/wtf/text/TextCodecICU.h index df150ccc..15c1a81c 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecICU.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecICU.h
@@ -1,107 +1,9 @@ -/* - * Copyright (C) 2004, 2006, 2007, 2011 Apple Inc. All rights reserved. - * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecICU_h -#define TextCodecICU_h +#include "platform/wtf/text/TextCodecICU.h" -#include "base/gtest_prod_util.h" -#include "wtf/text/TextCodec.h" -#include "wtf/text/TextEncoding.h" -#include <memory> -#include <unicode/utypes.h> - -typedef struct UConverter UConverter; - -namespace WTF { - -class TextCodecInput; - -class TextCodecICU final : public TextCodec { - public: - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - ~TextCodecICU() override; - - private: - TextCodecICU(const TextEncoding&); - WTF_EXPORT static std::unique_ptr<TextCodec> create(const TextEncoding&, - const void*); - - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - CString encode(const UChar*, size_t length, UnencodableHandling) override; - CString encode(const LChar*, size_t length, UnencodableHandling) override; - - template <typename CharType> - CString encodeCommon(const CharType*, size_t length, UnencodableHandling); - CString encodeInternal(const TextCodecInput&, UnencodableHandling); - - void createICUConverter() const; - void releaseICUConverter() const; -#if defined(USING_SYSTEM_ICU) - bool needsGBKFallbacks() const { return m_needsGBKFallbacks; } - void setNeedsGBKFallbacks(bool needsFallbacks) { - m_needsGBKFallbacks = needsFallbacks; - } -#endif - - int decodeToBuffer(UChar* buffer, - UChar* bufferLimit, - const char*& source, - const char* sourceLimit, - int32_t* offsets, - bool flush, - UErrorCode&); - - TextEncoding m_encoding; - mutable UConverter* m_converterICU; -#if defined(USING_SYSTEM_ICU) - mutable bool m_needsGBKFallbacks; -#endif - - FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, IgnorableCodePoint); - FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, UTF32AndQuestionMarks); - FRIEND_TEST_ALL_PREFIXES(TextCodecICUTest, UTF32Aliases); -}; - -struct ICUConverterWrapper { - WTF_MAKE_NONCOPYABLE(ICUConverterWrapper); - USING_FAST_MALLOC(ICUConverterWrapper); - - public: - ICUConverterWrapper() : converter(0) {} - ~ICUConverterWrapper(); - - UConverter* converter; -}; - -} // namespace WTF - -#endif // TextCodecICU_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecLatin1.h b/third_party/WebKit/Source/wtf/text/TextCodecLatin1.h index c4c2170..bd8920e 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecLatin1.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecLatin1.h
@@ -1,53 +1,9 @@ -/* - * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecLatin1_h -#define TextCodecLatin1_h +#include "platform/wtf/text/TextCodecLatin1.h" -#include "wtf/text/TextCodec.h" - -namespace WTF { - -class TextCodecLatin1 final : public TextCodec { - public: - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - private: - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - CString encode(const UChar*, size_t length, UnencodableHandling) override; - CString encode(const LChar*, size_t length, UnencodableHandling) override; - - template <typename CharType> - CString encodeCommon(const CharType*, size_t length, UnencodableHandling); -}; - -} // namespace WTF - -#endif // TextCodecLatin1_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecReplacement.h b/third_party/WebKit/Source/wtf/text/TextCodecReplacement.h index a7254d51..c3528d1 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecReplacement.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecReplacement.h
@@ -1,32 +1,9 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef TextCodecReplacement_h -#define TextCodecReplacement_h +#include "platform/wtf/text/TextCodecReplacement.h" -#include "wtf/text/TextCodec.h" -#include "wtf/text/TextCodecUTF8.h" - -namespace WTF { - -class TextCodecReplacement final : public TextCodecUTF8 { - public: - TextCodecReplacement(); - - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - private: - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - - bool m_replacementErrorReturned; -}; - -} // namespace WTF - -#endif // TextCodecReplacement_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.h b/third_party/WebKit/Source/wtf/text/TextCodecUTF16.h index 06ed917..b5916a82 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecUTF16.h
@@ -1,58 +1,9 @@ -/* - * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecUTF16_h -#define TextCodecUTF16_h +#include "platform/wtf/text/TextCodecUTF16.h" -#include "wtf/text/TextCodec.h" - -namespace WTF { - -class TextCodecUTF16 final : public TextCodec { - public: - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - TextCodecUTF16(bool littleEndian) : m_littleEndian(littleEndian) {} - - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - CString encode(const UChar*, size_t length, UnencodableHandling) override; - CString encode(const LChar*, size_t length, UnencodableHandling) override; - - private: - bool m_littleEndian; - bool m_haveLeadByte = false; - unsigned char m_leadByte; - bool m_haveLeadSurrogate = false; - UChar m_leadSurrogate; -}; - -} // namespace WTF - -#endif // TextCodecUTF16_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUTF8.h b/third_party/WebKit/Source/wtf/text/TextCodecUTF8.h index a996e7e..56a3165 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUTF8.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecUTF8.h
@@ -1,72 +1,9 @@ -/* - * Copyright (C) 2011 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecUTF8_h -#define TextCodecUTF8_h +#include "platform/wtf/text/TextCodecUTF8.h" -#include "wtf/text/TextCodec.h" -#include <memory> - -namespace WTF { - -class TextCodecUTF8 : public TextCodec { - public: - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - protected: - TextCodecUTF8() : m_partialSequenceSize(0) {} - - private: - static std::unique_ptr<TextCodec> create(const TextEncoding&, const void*); - - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - CString encode(const UChar*, size_t length, UnencodableHandling) override; - CString encode(const LChar*, size_t length, UnencodableHandling) override; - - template <typename CharType> - CString encodeCommon(const CharType* characters, size_t length); - - template <typename CharType> - bool handlePartialSequence(CharType*& destination, - const uint8_t*& source, - const uint8_t* end, - bool flush, - bool stopOnError, - bool& sawError); - void handleError(UChar*& destination, bool stopOnError, bool& sawError); - void consumePartialSequenceByte(); - - int m_partialSequenceSize; - uint8_t m_partialSequence[U8_MAX_LENGTH]; -}; - -} // namespace WTF - -#endif // TextCodecUTF8_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.h b/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.h index 2138901..2a02fd18 100644 --- a/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.h +++ b/third_party/WebKit/Source/wtf/text/TextCodecUserDefined.h
@@ -1,53 +1,9 @@ -/* - * Copyright (C) 2007 Apple, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextCodecUserDefined_h -#define TextCodecUserDefined_h +#include "platform/wtf/text/TextCodecUserDefined.h" -#include "wtf/text/TextCodec.h" - -namespace WTF { - -class TextCodecUserDefined final : public TextCodec { - public: - static void registerEncodingNames(EncodingNameRegistrar); - static void registerCodecs(TextCodecRegistrar); - - private: - String decode(const char*, - size_t length, - FlushBehavior, - bool stopOnError, - bool& sawError) override; - CString encode(const UChar*, size_t length, UnencodableHandling) override; - CString encode(const LChar*, size_t length, UnencodableHandling) override; - - template <typename CharType> - CString encodeCommon(const CharType*, size_t length, UnencodableHandling); -}; - -} // namespace WTF - -#endif // TextCodecUserDefined_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextEncoding.h b/third_party/WebKit/Source/wtf/text/TextEncoding.h index f7285959..119a51f 100644 --- a/third_party/WebKit/Source/wtf/text/TextEncoding.h +++ b/third_party/WebKit/Source/wtf/text/TextEncoding.h
@@ -1,99 +1,9 @@ -/* - * Copyright (C) 2004, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextEncoding_h -#define TextEncoding_h +#include "platform/wtf/text/TextEncoding.h" -#include "wtf/Allocator.h" -#include "wtf/Forward.h" -#include "wtf/WTFExport.h" -#include "wtf/text/TextCodec.h" -#include "wtf/text/Unicode.h" - -namespace WTF { - -class WTF_EXPORT TextEncoding final { - USING_FAST_MALLOC(TextEncoding); - - public: - TextEncoding() : m_name(0) {} - TextEncoding(const char* name); - TextEncoding(const String& name); - - bool isValid() const { return m_name; } - const char* name() const { return m_name; } - bool usesVisualOrdering() const; - const TextEncoding& closestByteBasedEquivalent() const; - const TextEncoding& encodingForFormSubmission() const; - - String decode(const char* str, size_t length) const { - bool ignored; - return decode(str, length, false, ignored); - } - String decode(const char*, - size_t length, - bool stopOnError, - bool& sawError) const; - - CString encode(const String&, UnencodableHandling) const; - - bool isNonByteBasedEncoding() const; - - private: - bool isUTF7Encoding() const; - - const char* m_name; -}; - -inline bool operator==(const TextEncoding& a, const TextEncoding& b) { - return a.name() == b.name(); -} -inline bool operator!=(const TextEncoding& a, const TextEncoding& b) { - return a.name() != b.name(); -} - -WTF_EXPORT const TextEncoding& ASCIIEncoding(); -WTF_EXPORT const TextEncoding& Latin1Encoding(); -WTF_EXPORT const TextEncoding& UTF16BigEndianEncoding(); -WTF_EXPORT const TextEncoding& UTF16LittleEndianEncoding(); -WTF_EXPORT const TextEncoding& UTF32Encoding(); -WTF_EXPORT const TextEncoding& UTF32BigEndianEncoding(); -WTF_EXPORT const TextEncoding& UTF32LittleEndianEncoding(); -WTF_EXPORT const TextEncoding& UTF8Encoding(); -WTF_EXPORT const TextEncoding& WindowsLatin1Encoding(); - -} // namespace WTF - -using WTF::ASCIIEncoding; -using WTF::Latin1Encoding; -using WTF::UTF16BigEndianEncoding; -using WTF::UTF16LittleEndianEncoding; -using WTF::UTF32Encoding; -using WTF::UTF32BigEndianEncoding; -using WTF::UTF32LittleEndianEncoding; -using WTF::UTF8Encoding; -using WTF::WindowsLatin1Encoding; - -#endif // TextEncoding_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.h b/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.h index 2b76057f..484bb01 100644 --- a/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.h +++ b/third_party/WebKit/Source/wtf/text/TextEncodingRegistry.h
@@ -1,65 +1,9 @@ -/* - * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextEncodingRegistry_h -#define TextEncodingRegistry_h +#include "platform/wtf/text/TextEncodingRegistry.h" -#include "wtf/WTFExport.h" -#include "wtf/text/Unicode.h" -#include "wtf/text/WTFString.h" -#include <memory> - -namespace WTF { - -class TextCodec; -class TextEncoding; - -// Use TextResourceDecoder::decode to decode resources, since it handles BOMs. -// Use TextEncoding::encode to encode, since it takes care of normalization. -WTF_EXPORT std::unique_ptr<TextCodec> newTextCodec(const TextEncoding&); - -// Only TextEncoding should use the following functions directly. -const char* atomicCanonicalTextEncodingName(const char* alias); -template <typename CharacterType> -const char* atomicCanonicalTextEncodingName(const CharacterType*, size_t); -const char* atomicCanonicalTextEncodingName(const String&); -bool noExtendedTextEncodingNameUsed(); -bool isReplacementEncoding(const char* alias); -bool isReplacementEncoding(const String& alias); - -#ifndef NDEBUG -void dumpTextEncodingNameMap(); -#endif - -} // namespace WTF - -using WTF::newTextCodec; -using WTF::atomicCanonicalTextEncodingName; -using WTF::noExtendedTextEncodingNameUsed; -#ifndef NDEBUG -using WTF::dumpTextEncodingNameMap; -#endif - -#endif // TextEncodingRegistry_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Source/wtf/text/TextPosition.h b/third_party/WebKit/Source/wtf/text/TextPosition.h index ca8c6db..7b4867fc 100644 --- a/third_party/WebKit/Source/wtf/text/TextPosition.h +++ b/third_party/WebKit/Source/wtf/text/TextPosition.h
@@ -1,120 +1,9 @@ -/* - * Copyright (C) 2010, Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - */ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -#ifndef TextPosition_h -#define TextPosition_h +#include "platform/wtf/text/TextPosition.h" -#include "wtf/Allocator.h" -#include "wtf/Assertions.h" -#include "wtf/Vector.h" -#include "wtf/WTFExport.h" -#include "wtf/text/WTFString.h" -#include <memory> - -namespace WTF { - -// An abstract number of element in a sequence. The sequence has a first -// element. This type should be used instead of integer because 2 -// contradicting traditions can call a first element '0' or '1' which makes -// integer type ambiguous. -class OrdinalNumber final { - DISALLOW_NEW(); - - public: - static OrdinalNumber fromZeroBasedInt(int zeroBasedInt) { - return OrdinalNumber(zeroBasedInt); - } - static OrdinalNumber fromOneBasedInt(int oneBasedInt) { - return OrdinalNumber(oneBasedInt - 1); - } - OrdinalNumber() : m_zeroBasedValue(0) {} - - int zeroBasedInt() const { return m_zeroBasedValue; } - int oneBasedInt() const { return m_zeroBasedValue + 1; } - - bool operator==(OrdinalNumber other) const { - return m_zeroBasedValue == other.m_zeroBasedValue; - } - bool operator!=(OrdinalNumber other) const { return !((*this) == other); } - - static OrdinalNumber first() { return OrdinalNumber(0); } - static OrdinalNumber beforeFirst() { return OrdinalNumber(-1); } - - private: - OrdinalNumber(int zeroBasedInt) : m_zeroBasedValue(zeroBasedInt) {} - int m_zeroBasedValue; -}; - -// TextPosition structure specifies coordinates within an text resource. It is -// used mostly -// for saving script source position. -class TextPosition final { - DISALLOW_NEW(); - - public: - TextPosition(OrdinalNumber line, OrdinalNumber column) - : m_line(line), m_column(column) {} - TextPosition() {} - bool operator==(const TextPosition& other) const { - return m_line == other.m_line && m_column == other.m_column; - } - bool operator!=(const TextPosition& other) const { - return !((*this) == other); - } - WTF_EXPORT OrdinalNumber toOffset(const Vector<unsigned>&); - - // A 'minimum' value of position, used as a default value. - static TextPosition minimumPosition() { - return TextPosition(OrdinalNumber::first(), OrdinalNumber::first()); - } - - // A value with line value less than a minimum; used as an impossible - // position. - static TextPosition belowRangePosition() { - return TextPosition(OrdinalNumber::beforeFirst(), - OrdinalNumber::beforeFirst()); - } - - // A value corresponding to a position with given offset within text having - // the specified line ending offsets. - WTF_EXPORT static TextPosition fromOffsetAndLineEndings( - unsigned, - const Vector<unsigned>&); - - OrdinalNumber m_line; - OrdinalNumber m_column; -}; - -WTF_EXPORT std::unique_ptr<Vector<unsigned>> lineEndings(const String&); - -} // namespace WTF - -using WTF::OrdinalNumber; - -using WTF::TextPosition; - -using WTF::lineEndings; - -#endif // TextPosition_h +// The contents of this header was moved to platform/wtf as part of +// WTF migration project. See the following post for details: +// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py index 406bcbe5..bfeb329 100644 --- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py +++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
@@ -144,6 +144,8 @@ def __init__(self, host): self._host = host + self._port = self._host.port_factory.get() + self._builder_names = set() self._test_prefix_map = collections.defaultdict(list) def __iter__(self): @@ -154,10 +156,9 @@ def _iter_combinations(self): """Iterates through (test, build) combinations.""" - port = self._host.port_factory.get() for test_prefix, builds in self._test_prefix_map.iteritems(): - for build in builds: - for test in port.tests([test_prefix]): + for test in self._port.tests([test_prefix]): + for build in builds: yield (test, build) def __str__(self): @@ -172,11 +173,12 @@ test_prefix: This can be a full test path, or directory of tests, or a path with globs. build: A Build object. This specifies where to fetch baselines from. """ + self._builder_names.add(build.builder_name) self._test_prefix_map[test_prefix].append(build) def all_builders(self): """Returns all builder names in in this collection.""" - return sorted({b.builder_name for _, b in self._iter_combinations()}) + return self._builder_names class CopyExistingBaselinesInternal(AbstractRebaseliningCommand): @@ -407,8 +409,9 @@ rebaseline_commands = [] lines_to_remove = {} + builders_to_fetch_from = self._builders_to_fetch_from(test_baseline_set.all_builders()) for test, build in test_baseline_set: - if build.builder_name not in self._builders_to_fetch_from(test_baseline_set.all_builders()): + if build.builder_name not in builders_to_fetch_from: continue suffixes = self._suffixes_for_actual_failures(test, build) @@ -458,8 +461,8 @@ def _optimize_baselines(self, test_baseline_set, verbose=False): """Returns a list of commands to run in parallel to de-duplicate baselines.""" tests_to_suffixes = collections.defaultdict(set) + builders_to_fetch_from = self._builders_to_fetch_from(test_baseline_set.all_builders()) for test, build in test_baseline_set: - builders_to_fetch_from = self._builders_to_fetch_from(test_baseline_set.all_builders()) if build.builder_name not in builders_to_fetch_from: continue tests_to_suffixes[test].update(self._suffixes_for_actual_failures(test, build))
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn index 6903d21f..c4c7d36b 100644 --- a/third_party/WebKit/public/BUILD.gn +++ b/third_party/WebKit/public/BUILD.gn
@@ -89,6 +89,8 @@ # and public structures without actually linking against any Blink libraries. source_set("blink_headers") { sources = [ + "platform/BlameContext.h", + "platform/Connector.h", "platform/FilePathConversion.h", "platform/InterfaceProvider.h", "platform/Platform.h", @@ -391,6 +393,7 @@ "platform/modules/serviceworker/WebServiceWorkerRegistrationProxy.h", "platform/modules/serviceworker/WebServiceWorkerRequest.h", "platform/modules/serviceworker/WebServiceWorkerResponse.h", + "platform/modules/serviceworker/WebServiceWorkerResponseError.h", "platform/modules/serviceworker/WebServiceWorkerResponseType.h", "platform/modules/serviceworker/WebServiceWorkerSkipWaitingCallbacks.h", "platform/modules/serviceworker/WebServiceWorkerState.h", @@ -539,6 +542,7 @@ "web/WebSharedWorker.h", "web/WebSharedWorkerClient.h", "web/WebSharedWorkerConnectListener.h", + "web/WebSharedWorkerCreationContextType.h", "web/WebSharedWorkerCreationErrors.h", "web/WebSharedWorkerRepositoryClient.h", "web/WebSpeechGrammar.h", @@ -755,6 +759,7 @@ visibility = [ ":*" ] sources = [ "web/ConsoleMessageStructTraits.cpp", + "web/ConsoleMessageStructTraits.h", ] deps = [ ":mojo_bindings_shared__generator",
diff --git a/third_party/WebKit/public/platform/Connector.h b/third_party/WebKit/public/platform/Connector.h new file mode 100644 index 0000000..666eea5 --- /dev/null +++ b/third_party/WebKit/public/platform/Connector.h
@@ -0,0 +1,32 @@ +// 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 Connector_h +#define Connector_h + +#include "mojo/public/cpp/bindings/interface_request.h" +#include "mojo/public/cpp/system/message_pipe.h" +#include "public/platform/WebCommon.h" + +namespace blink { + +// Supports obtaining interfaces from services specified by name. +class BLINK_PLATFORM_EXPORT Connector { + public: + virtual void bindInterface(const char* serviceName, + const char* interfaceName, + mojo::ScopedMessagePipeHandle) = 0; + + template <typename Interface> + void bindInterface(const char* serviceName, + mojo::InterfaceRequest<Interface> ptr) { + bindInterface(serviceName, Interface::Name_, ptr.PassMessagePipe()); + } + + static Connector* getEmptyConnector(); +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/public/platform/Platform.h b/third_party/WebKit/public/platform/Platform.h index c65365f..3fdfffe5 100644 --- a/third_party/WebKit/public/platform/Platform.h +++ b/third_party/WebKit/public/platform/Platform.h
@@ -71,6 +71,7 @@ namespace blink { +class Connector; class InterfaceProvider; class WebAudioBus; class WebAudioLatencyHint; @@ -599,16 +600,9 @@ // Mojo --------------------------------------------------------------- - virtual InterfaceProvider* interfaceProvider(); + virtual Connector* connector(); - // Sets up a connection to the ServiceManager by binding |remoteHandle| to a - // remote implementation of - // //service_manager/public/interfaces/connector.mojom. Using this connection - // the caller can then request connections to other services. - // NOTE: This handle is not strongly typed because neither the Blink nor - // Chromium types generated from connector.mojom should leak across the - // Blink-Chromium boundary. - virtual void bindServiceConnector(mojo::ScopedMessagePipeHandle remoteHandle); + virtual InterfaceProvider* interfaceProvider(); // Platform events ----------------------------------------------------- // Device Orientation, Device Motion, Device Light, Battery, Gamepad.
diff --git a/third_party/WebKit/public/platform/PointerProperties.h b/third_party/WebKit/public/platform/PointerProperties.h index 12a1a02..d944d85c 100644 --- a/third_party/WebKit/public/platform/PointerProperties.h +++ b/third_party/WebKit/public/platform/PointerProperties.h
@@ -15,13 +15,7 @@ }; // Bit field values indicating available hover types. -enum HoverType { - HoverTypeNone = 1 << 0, - // Indicates that the primary pointing system can hover, but it requires - // a significant action on the user's part. e.g. hover on "long press". - HoverTypeOnDemand = 1 << 1, - HoverTypeHover = 1 << 2 -}; +enum HoverType { HoverTypeNone = 1 << 0, HoverTypeHover = 1 << 1 }; } #endif
diff --git a/third_party/WebKit/public/platform/WebMediaStreamSource.h b/third_party/WebKit/public/platform/WebMediaStreamSource.h index 23a63c7..4f6f2418 100644 --- a/third_party/WebKit/public/platform/WebMediaStreamSource.h +++ b/third_party/WebKit/public/platform/WebMediaStreamSource.h
@@ -88,13 +88,18 @@ BLINK_PLATFORM_EXPORT void initialize(const WebString& id, Type, - const WebString& name); + const WebString& name); // DEPRECATED + BLINK_PLATFORM_EXPORT void initialize(const WebString& id, + Type, + const WebString& name, + bool remote); BLINK_PLATFORM_EXPORT void reset(); bool isNull() const { return m_private.isNull(); } BLINK_PLATFORM_EXPORT WebString id() const; BLINK_PLATFORM_EXPORT Type getType() const; BLINK_PLATFORM_EXPORT WebString name() const; + BLINK_PLATFORM_EXPORT bool remote() const; BLINK_PLATFORM_EXPORT void setReadyState(ReadyState); BLINK_PLATFORM_EXPORT ReadyState getReadyState() const;
diff --git a/third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom b/third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom index d8dbfc4..e168bda2 100644 --- a/third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom +++ b/third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom
@@ -148,11 +148,6 @@ // Web Bluetooth Interface that Blink can use to perform // Bluetooth GATT Operations on Bluetooth Devices. interface WebBluetoothService { - // Sets the client for this WebBluetoothService. The service will notify the - // client of device events e.g. when a Characteristic's value changes or when - // a device disconnects. - SetClient(associated WebBluetoothServiceClient client); - RequestDevice(WebBluetoothRequestDeviceOptions options) => (WebBluetoothResult result, WebBluetoothDevice? device); @@ -160,7 +155,10 @@ // if a connection to the device didn't exist already. If a GATT connection // existed already then this function increases the ref count to keep that // connection alive. - RemoteServerConnect(WebBluetoothDeviceId device_id) => (WebBluetoothResult result); + // Returns the result of the connection request. + RemoteServerConnect( + WebBluetoothDeviceId device_id, + associated WebBluetoothServerClient client) => (WebBluetoothResult result); // If a GATT connection exists for Device identified by |device_id| then // decreases the ref count for that connection. @@ -211,8 +209,11 @@ // Starts notifications for the characteristic identified by // |characteristic_instance_id|. + // Returns the result of the connection request. RemoteCharacteristicStartNotifications( - string characteristic_instance_id) => (WebBluetoothResult result); + string characteristic_instance_id, + associated WebBluetoothCharacteristicClient client) => ( + WebBluetoothResult result); // Stops notifications for the characteristic identified by // |characteristic_instance_id|. @@ -251,15 +252,15 @@ array<uint8> value) => (WebBluetoothResult result); }; -// Classes should implement this interface and pass an associated pointer -// bound to them to the WebBluetoothService by using SetClient. Classes -// that do this will be notified of device events e.g. device disconnection. -interface WebBluetoothServiceClient { - // The characteristic identified by |characteristic_instance_id| has received - // a notification of value change. - RemoteCharacteristicValueChanged(string characteristic_instance_id, - array<uint8> value); +// Classes that implement this interface will be notified of device events. +interface WebBluetoothServerClient { + // Called when a device disconnects. + GATTServerDisconnected(); +}; - // The device identified by |device_id| has been disconnected. - GattServerDisconnected(WebBluetoothDeviceId device_id); +// Classes that implement this interface will be notified of characteristic +// events. +interface WebBluetoothCharacteristicClient { + // Called when we receive a notification for the characteristic. + RemoteCharacteristicValueChanged(array<uint8> value); };
diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h index 5d712ad..693d403 100644 --- a/third_party/WebKit/public/web/WebFrameClient.h +++ b/third_party/WebKit/public/web/WebFrameClient.h
@@ -449,6 +449,10 @@ return WebEffectiveConnectionType::TypeUnknown; } + // PlzNavigate + // Called to abort a navigation that is being handled by the browser process. + virtual void abortClientNavigation() {} + // Push API --------------------------------------------------- // Used to access the embedder for the Push API.
diff --git a/third_party/WebKit/public/web/WebSecurityPolicy.h b/third_party/WebKit/public/web/WebSecurityPolicy.h index ef865ba..f950b38 100644 --- a/third_party/WebKit/public/web/WebSecurityPolicy.h +++ b/third_party/WebKit/public/web/WebSecurityPolicy.h
@@ -61,10 +61,6 @@ BLINK_EXPORT static void registerURLSchemeAsFirstPartyWhenTopLevel( const WebString&); - // Registers a URL scheme as strictly empty documents, allowing them to - // commit synchronously. - BLINK_EXPORT static void registerURLSchemeAsEmptyDocument(const WebString&); - // Support for whitelisting access to origins beyond the same-origin policy. BLINK_EXPORT static void addOriginAccessWhitelistEntry( const WebURL& sourceOrigin,
diff --git a/third_party/WebKit/public/web/WebSerializedScriptValueVersion.h b/third_party/WebKit/public/web/WebSerializedScriptValueVersion.h index 1389d91..a808ae2 100644 --- a/third_party/WebKit/public/web/WebSerializedScriptValueVersion.h +++ b/third_party/WebKit/public/web/WebSerializedScriptValueVersion.h
@@ -38,7 +38,7 @@ // Embedders may serialize this as out-of-band metadata along with // collections of serialized data so that version skew can be detected // before deserializing individual values. -const unsigned kSerializedScriptValueVersion = 9; +const unsigned kSerializedScriptValueVersion = 16; } // namespace blink
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index d410154..cb1a549e 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: 18d70acf81df49cc10b00bcc67c1ec64e16bd9d0 +Revision: 8e37886d418dd042c3c7bfadac99214739ee4d98 License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS index 190f5a3..aefedbc9 100644 --- a/third_party/crashpad/crashpad/DEPS +++ b/third_party/crashpad/crashpad/DEPS
@@ -38,7 +38,7 @@ 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - '9e0d322ae9f87acbe17c4ced025319b4964bf0b7', + '62e6015f633dd4acb1610db15a064889315cadaa', 'crashpad/third_party/zlib/zlib': Var('chromium_git') + '/chromium/src/third_party/zlib@' + '13dc246a58e4b72104d35f9b1809af95221ebda7',
diff --git a/third_party/crashpad/crashpad/README.md b/third_party/crashpad/crashpad/README.md index 57e8169..914af34 100644 --- a/third_party/crashpad/crashpad/README.md +++ b/third_party/crashpad/crashpad/README.md
@@ -25,6 +25,7 @@ code, building, testing, and contributing to the project. * [Crashpad interface documentation](https://crashpad.chromium.org/doxygen/) * [Crashpad tool man pages](doc/man.md) + * [Crashpad overview design](doc/overview_design.md) ## Source Code
diff --git a/third_party/crashpad/crashpad/build/gyp_crashpad.py b/third_party/crashpad/crashpad/build/gyp_crashpad.py index fe9da84..dd5fa69c 100755 --- a/third_party/crashpad/crashpad/build/gyp_crashpad.py +++ b/third_party/crashpad/crashpad/build/gyp_crashpad.py
@@ -75,11 +75,24 @@ return result if sys.platform == 'win32': - # Also generate the x86 build. - result = gyp.main(args + ['-D', 'target_arch=ia32', '-G', 'config=Debug']) - if result != 0: - return result - result = gyp.main(args + ['-D', 'target_arch=ia32', '-G', 'config=Release']) + # Check to make sure that no target_arch was specified. target_arch may be + # set during a cross build, such as a cross build for Android. + has_target_arch = False + for arg_index in xrange(0, len(args)): + arg = args[arg_index] + if (arg.startswith('-Dtarget_arch=') or + (arg == '-D' and arg_index + 1 < len(args) and + args[arg_index + 1].startswith('target_arch='))): + has_target_arch = True + break + + if not has_target_arch: + # Also generate the x86 build. + result = gyp.main(args + ['-D', 'target_arch=ia32', '-G', 'config=Debug']) + if result != 0: + return result + result = gyp.main( + args + ['-D', 'target_arch=ia32', '-G', 'config=Release']) return result
diff --git a/third_party/crashpad/crashpad/build/gyp_crashpad_android.py b/third_party/crashpad/crashpad/build/gyp_crashpad_android.py new file mode 100755 index 0000000..a6ad1b43 --- /dev/null +++ b/third_party/crashpad/crashpad/build/gyp_crashpad_android.py
@@ -0,0 +1,107 @@ +#!/usr/bin/env python +# coding: utf-8 + +# Copyright 2017 The Crashpad Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import glob +import gyp_crashpad +import os +import re +import subprocess +import sys + + +def main(args): + parser = argparse.ArgumentParser( + description='Set up an Android cross build', + epilog='Additional arguments will be passed to gyp_crashpad.py.') + parser.add_argument('--ndk', required=True, help='Standalone NDK toolchain') + parser.add_argument('--compiler', + default='clang', + choices=('clang', 'gcc'), + help='The compiler to use, clang by default') + (parsed, extra_command_line_args) = parser.parse_known_args(args) + + NDK_ERROR=( + 'NDK must be a valid standalone NDK toolchain.\n' + + 'See https://developer.android.com/ndk/guides/standalone_toolchain.html') + arch_dirs = glob.glob(os.path.join(parsed.ndk, '*-linux-android*')) + if len(arch_dirs) != 1: + parser.error(NDK_ERROR) + + arch_triplet = os.path.basename(arch_dirs[0]) + ARCH_TRIPLET_TO_ARCH = { + 'arm-linux-androideabi': 'arm', + 'aarch64-linux-android': 'arm64', + 'i686-linux-android': 'x86', + 'x86_64-linux-android': 'x86_64', + 'mipsel-linux-android': 'mips', + 'mips64el-linux-android': 'mips64', + } + if arch_triplet not in ARCH_TRIPLET_TO_ARCH: + parser.error(NDK_ERROR) + arch = ARCH_TRIPLET_TO_ARCH[arch_triplet] + + ndk_bin_dir = os.path.join(parsed.ndk, 'bin') + + clang_path = os.path.join(ndk_bin_dir, 'clang') + extra_args = [] + + if parsed.compiler == 'clang': + os.environ['CC_target'] = clang_path + os.environ['CXX_target'] = os.path.join(ndk_bin_dir, 'clang++') + elif parsed.compiler == 'gcc': + os.environ['CC_target'] = os.path.join(ndk_bin_dir, + '%s-gcc' % arch_triplet) + os.environ['CXX_target'] = os.path.join(ndk_bin_dir, + '%s-g++' % arch_triplet) + + # Unlike the Clang build, when using GCC with “unified headers,” + # __ANDROID_API__ isn’t set automatically and must be pushed in to the + # build. Fish the correct value out of the Clang wrapper script. If unified + # headers are not being used, the Clang wrapper won’t mention + # __ANDROID_API__, but the standalone toolchain’s <android/api-level.h> will + # #define it for both Clang and GCC. + # + # Unified headers are the way of the future, according to + # https://android.googlesource.com/platform/ndk/+/ndk-r14/CHANGELOG.md and + # https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md. + with open(clang_path, 'r') as file: + clang_script_contents = file.read() + matches = re.finditer(r'\s-D__ANDROID_API__=([\d]+)\s', + clang_script_contents) + match = next(matches, None) + if match: + android_api = int(match.group(1)) + extra_args.extend(['-D', 'android_api_level=%d' % android_api]) + if next(matches, None): + raise AssertionError('__ANDROID_API__ defined too many times') + + for tool in ('ar', 'nm', 'readelf'): + os.environ['%s_target' % tool.upper()] = ( + os.path.join(ndk_bin_dir, '%s-%s' % (arch_triplet, tool))) + + return gyp_crashpad.main( + ['-D', 'OS=android', + '-D', 'target_arch=%s' % arch, + '-D', 'clang=%d' % (1 if parsed.compiler == 'clang' else 0), + '-f', 'ninja-android'] + + extra_args + + extra_command_line_args) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:]))
diff --git a/third_party/crashpad/crashpad/build/run_tests.py b/third_party/crashpad/crashpad/build/run_tests.py index f630685..00b40f6 100755 --- a/third_party/crashpad/crashpad/build/run_tests.py +++ b/third_party/crashpad/crashpad/build/run_tests.py
@@ -15,7 +15,6 @@ # limitations under the License. import os -import platform import subprocess import sys @@ -25,25 +24,12 @@ # location in the recipe. def main(args): if len(args) != 1: - print >> sys.stderr, \ - 'usage: run_tests.py {Debug|Release|Debug_x64|Release_x64}' + print >> sys.stderr, 'usage: run_tests.py <binary_dir>' return 1 crashpad_dir = \ os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir) - - # In a standalone Crashpad build, the out directory is in the Crashpad root. - out_dir = os.path.join(crashpad_dir, 'out') - if not os.path.exists(out_dir): - # In an in-Chromium build, the out directory is in the Chromium root, and - # the Crashpad root is in third_party/crashpad/crashpad relative to the - # Chromium root. - chromium_dir = os.path.join(crashpad_dir, os.pardir, os.pardir, os.pardir) - out_dir = os.path.join(chromium_dir, 'out') - if not os.path.exists(out_dir): - raise Exception('could not determine out_dir', crashpad_dir) - - binary_dir = os.path.join(out_dir, args[0]) + binary_dir = args[0] tests = [ 'crashpad_client_test', @@ -59,12 +45,12 @@ subprocess.check_call(os.path.join(binary_dir, test)) if sys.platform == 'win32': - name = 'snapshot/win/end_to_end_test.py' + script = 'snapshot/win/end_to_end_test.py' print '-' * 80 - print name + print script print '-' * 80 subprocess.check_call( - [sys.executable, os.path.join(crashpad_dir, name), binary_dir]) + [sys.executable, os.path.join(crashpad_dir, script), binary_dir]) return 0
diff --git a/third_party/crashpad/crashpad/client/client_test.gyp b/third_party/crashpad/crashpad/client/client_test.gyp index 66ec59e..dec8f60 100644 --- a/third_party/crashpad/crashpad/client/client_test.gyp +++ b/third_party/crashpad/crashpad/client/client_test.gyp
@@ -23,9 +23,9 @@ 'dependencies': [ 'client.gyp:crashpad_client', '../handler/handler.gyp:crashpad_handler', + '../test/test.gyp:crashpad_gmock_main', '../test/test.gyp:crashpad_test', '../third_party/gtest/gmock.gyp:gmock', - '../third_party/gtest/gmock.gyp:gmock_main', '../third_party/gtest/gtest.gyp:gtest', '../third_party/mini_chromium/mini_chromium.gyp:base', '../util/util.gyp:crashpad_util',
diff --git a/third_party/crashpad/crashpad/client/crash_report_database_win.cc b/third_party/crashpad/crashpad/client/crash_report_database_win.cc index 4fccd3f..6629d25d 100644 --- a/third_party/crashpad/crashpad/client/crash_report_database_win.cc +++ b/third_party/crashpad/crashpad/client/crash_report_database_win.cc
@@ -77,8 +77,8 @@ DCHECK_GT(end, read_from); size_t data_length = static_cast<size_t>(end - read_from); std::string buffer(data_length, '\0'); - return LoggingReadFile(file, &buffer[0], data_length) ? buffer - : std::string(); + return LoggingReadFileExactly(file, &buffer[0], data_length) ? buffer + : std::string(); } // Helper structures, and conversions ------------------------------------------ @@ -417,7 +417,7 @@ } MetadataFileHeader header; - if (!LoggingReadFile(handle_.get(), &header, sizeof(header))) { + if (!LoggingReadFileExactly(handle_.get(), &header, sizeof(header))) { LOG(ERROR) << "failed to read header"; return; } @@ -438,7 +438,7 @@ std::vector<ReportDisk> reports; if (header.num_records > 0) { std::vector<MetadataFileReportRecord> records(header.num_records); - if (!LoggingReadFile( + if (!LoggingReadFileExactly( handle_.get(), &records[0], records_size.ValueOrDie())) { LOG(ERROR) << "failed to read records"; return;
diff --git a/third_party/crashpad/crashpad/client/settings.cc b/third_party/crashpad/crashpad/client/settings.cc index 7757ecb..15d16f2 100644 --- a/third_party/crashpad/crashpad/client/settings.cc +++ b/third_party/crashpad/crashpad/client/settings.cc
@@ -246,13 +246,10 @@ if (LoggingSeekFile(handle, 0, SEEK_SET) != 0) return false; - bool read_result; - if (log_read_error) { - read_result = LoggingReadFile(handle, out_data, sizeof(*out_data)); - } else { - read_result = - ReadFile(handle, out_data, sizeof(*out_data)) == sizeof(*out_data); - } + bool read_result = + log_read_error + ? LoggingReadFileExactly(handle, out_data, sizeof(*out_data)) + : ReadFileExactly(handle, out_data, sizeof(*out_data)); if (!read_result) return false;
diff --git a/third_party/crashpad/crashpad/compat/android/elf.h b/third_party/crashpad/crashpad/compat/android/elf.h new file mode 100644 index 0000000..a3fc2a9a --- /dev/null +++ b/third_party/crashpad/crashpad/compat/android/elf.h
@@ -0,0 +1,25 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_COMPAT_ANDROID_ELF_H_ +#define CRASHPAD_COMPAT_ANDROID_ELF_H_ + +#include_next <elf.h> + +// Android 5.0.0 (API 21) NDK +#if !defined(NT_PRSTATUS) +#define NT_PRSTATUS 1 +#endif + +#endif // CRASHPAD_COMPAT_ANDROID_ELF_H_
diff --git a/third_party/crashpad/crashpad/compat/android/linux/ptrace.h b/third_party/crashpad/crashpad/compat/android/linux/ptrace.h new file mode 100644 index 0000000..7db46aa --- /dev/null +++ b/third_party/crashpad/crashpad/compat/android/linux/ptrace.h
@@ -0,0 +1,25 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_ +#define CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_ + +#include_next <linux/ptrace.h> + +// Android 5.0.0 (API 21) NDK +#if !defined(PTRACE_GETREGSET) +#define PTRACE_GETREGSET 0x4204 +#endif + +#endif // CRASHPAD_COMPAT_ANDROID_LINUX_PTRACE_H_
diff --git a/third_party/crashpad/crashpad/compat/compat.gyp b/third_party/crashpad/crashpad/compat/compat.gyp index f1cd4933..56daa3f8 100644 --- a/third_party/crashpad/crashpad/compat/compat.gyp +++ b/third_party/crashpad/crashpad/compat/compat.gyp
@@ -83,6 +83,16 @@ ], }, }], + ['OS=="android"', { + 'include_dirs': [ + 'android', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + 'android', + ], + }, + }], ], }, ],
diff --git a/third_party/crashpad/crashpad/doc/developing.md b/third_party/crashpad/crashpad/doc/developing.md index 4505d61..65d62356 100644 --- a/third_party/crashpad/crashpad/doc/developing.md +++ b/third_party/crashpad/crashpad/doc/developing.md
@@ -91,7 +91,9 @@ The Ninja build files and build output are in the `out` directory. Both debug- and release-mode configurations are available. The examples below show the debug configuration. To build and test the release configuration, substitute `Release` -for `Debug`. +for `Debug`. On Windows, four configurations are available: `Debug` and +`Release` produce 32-bit x86 executables, and `Debug_x64` and `Release_x64` +produce x86_64 executables. ``` $ cd ~/crashpad/crashpad @@ -112,7 +114,7 @@ If it’s not already present on your system, [download the NDK package for your system](https://developer.android.com/ndk/downloads/) and expand it to a suitable location. These instructions assume that it’s been expanded to -`~/android-ndk-r13`. +`~/android-ndk-r14`. To build Crashpad, portions of the NDK must be reassembled into a [standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html). @@ -126,8 +128,8 @@ ``` $ cd ~ -$ python android-ndk-r13/build/tools/make_standalone_toolchain.py \ - --arch=arm64 --api=21 --install-dir=android-ndk-r13_arm64_api21 +$ python android-ndk-r14/build/tools/make_standalone_toolchain.py \ + --arch=arm64 --api=21 --install-dir=android-ndk-r14_arm64_api21 ``` Note that Chrome uses Android API level 21 for 64-bit platforms and 16 for @@ -135,46 +137,35 @@ [`build/config/android/config.gni`](https://chromium.googlesource.com/chromium/src/+/master/build/config/android/config.gni) which sets `_android_api_level` and `_android64_api_level`. -To configure a Crashpad build for Android using this standalone toolchain, set -several environment variables directing the build to the standalone toolchain, -along with GYP options to identify an Android build. This must be done after any -`gclient sync`, or instead of any `gclient runhooks` operation. The environment -variables only need to be set for this `gyp_crashpad.py` invocation, and need -not be permanent. +To configure a Crashpad build for Android using the standalone toolchain +assembled above, use `gyp_crashpad_android.py`. This script is a wrapper for +`gyp_crashpad.py` that sets several environment variables directing the build to +the standalone toolchain, and several GYP options to identify an Android build. +This must be done after any `gclient sync`, or instead of any `gclient runhooks` +operation. ``` $ cd ~/crashpad/crashpad -$ CC_target=~/android-ndk-r13_arm64_api21/bin/clang \ - CXX_target=~/android-ndk-r13_arm64_api21/bin/clang++ \ - AR_target=~/android-ndk-r13_arm64_api21/bin/aarch64-linux-android-ar \ - NM_target=~/android-ndk-r13_arm64_api21/bin/aarch64-linux-android-nm \ - READELF_target=~/android-ndk-r13_arm64_api21/bin/aarch64-linux-android-readelf \ - python build/gyp_crashpad.py \ - -DOS=android -Dtarget_arch=arm64 -Dclang=1 \ - --generator-output=out_android_arm64_api21 -f ninja-android +$ python build/gyp_crashpad_android.py \ + --ndk ~/android-ndk-r14_arm64_api21 \ + --generator-output out/android_arm64_api21 ``` -It is also possible to use GCC instead of Clang by making the appropriate -substitutions: `aarch64-linux-android-gcc` for `CC_target`; -`aarch64-linux-android-g++` for `CXX_target`; and `-Dclang=0` as an argument to -`gyp_crashpad.py`. +`gyp_crashpad_android.py` detects the build type based on the characteristics of +the standalone toolchain given in its `--ndk` argument. -Target “triplets” to use for `ar`, `nm`, `readelf`, `gcc`, and `g++` are: +`gyp_crashpad_android.py` sets the build up to use Clang by default. It’s also +possible to use GCC by providing the `--compiler=gcc` argument to +`gyp_crashpad_android.py`. -| Architecture | Target “triplet” | -|:-------------|:------------------------| -| `arm` | `arm-linux-androideabi` | -| `arm64` | `aarch64-linux-android` | -| `x86` | `i686-linux-android` | -| `x86_64` | `x86_64-linux-android` | - -The port is incomplete, but targets known to be working include `crashpad_util`, -`crashpad_test`, and `crashpad_test_test`. This list will grow over time. To -build, direct `ninja` to the specific `out` directory chosen by -`--generator-output` above. +The Android port is incomplete, but targets known to be working include +`crashpad_test`, `crashpad_util`, and their tests. This list will grow over +time. To build, direct `ninja` to the specific `out` directory chosen by the +`--generator-output` argument to `gyp_crashpad_android.py`. ``` -$ ninja -C out_android_arm64_api21/out/Debug crashpad_test_test +$ ninja -C out/android_arm64_api21/out/Debug \ + crashpad_test_test crashpad_util_test ``` ## Testing @@ -193,11 +184,11 @@ ``` A script is provided to run all of Crashpad’s tests. It accepts a single -argument that tells it which configuration to test. +argument, a path to the directory containing the test executables. ``` $ cd ~/crashpad/crashpad -$ python build/run_tests.py Debug +$ python build/run_tests.py out/Debug ``` ### Android @@ -216,10 +207,10 @@ ``` $ cd ~/crashpad/crashpad -$ adb push out_android_arm64_api21/out/Debug/crashpad_test_test /data/local/tmp/ +$ adb push out/android_arm64_api21/out/Debug/crashpad_test_test /data/local/tmp/ [100%] /data/local/tmp/crashpad_test_test $ adb push \ - out_android_arm64_api21/out/Debug/crashpad_test_test_multiprocess_exec_test_child \ + out/android_arm64_api21/out/Debug/crashpad_test_test_multiprocess_exec_test_child \ /data/local/tmp/ [100%] /data/local/tmp/crashpad_test_test_multiprocess_exec_test_child $ adb shell mkdir -p /data/local/tmp/crashpad_test_data_root/test
diff --git a/third_party/crashpad/crashpad/doc/layering.png b/third_party/crashpad/crashpad/doc/layering.png new file mode 100644 index 0000000..791bea5 --- /dev/null +++ b/third_party/crashpad/crashpad/doc/layering.png Binary files differ
diff --git a/third_party/crashpad/crashpad/doc/overview.png b/third_party/crashpad/crashpad/doc/overview.png new file mode 100644 index 0000000..78f849ef --- /dev/null +++ b/third_party/crashpad/crashpad/doc/overview.png Binary files differ
diff --git a/third_party/crashpad/crashpad/doc/overview_design.md b/third_party/crashpad/crashpad/doc/overview_design.md new file mode 100644 index 0000000..ad871c18 --- /dev/null +++ b/third_party/crashpad/crashpad/doc/overview_design.md
@@ -0,0 +1,505 @@ +<!-- +Copyright 2017 The Crashpad Authors. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> + +# Crashpad Overview Design + +[TOC] + +## Objective + +Crashpad is a library for capturing, storing and transmitting postmortem crash +reports from a client to an upstream collection server. Crashpad aims to make it +possible for clients to capture process state at the time of crash with the best +possible fidelity and coverage, with the minimum of fuss. + +Crashpad also provides a facility for clients to capture dumps of process state +on-demand for diagnostic purposes. + +Crashpad additionally provides minimal facilities for clients to adorn their +crashes with application-specific metadata in the form of per-process key/value +pairs. More sophisticated clients are able to adorn crash reports further +through extensibility points that allow the embedder to augment the crash report +with application-specific metadata. + +## Background + +It’s an unfortunate truth that any large piece of software will contain bugs +that will cause it to occasionally crash. Even in the absence of bugs, software +incompatibilities can cause program instability. + +Fixing bugs and incompatibilities in client software that ships to millions of +users around the world is a daunting task. User reports and manual reproduction +of crashes can work, but even given a user report, often times the problem is +not readily reproducible. This is for various reasons, such as e.g. system +version or third-party software incompatibility, or the problem can happen due +to a race of some sort. Users are also unlikely to report problems they +encounter, and user reports are often of poor quality, as unfortunately most +users don’t have experience with making good bug reports. + +Automatic crash telemetry has been the best solution to the problem so far, as +this relieves the burden of manual reporting from users, while capturing the +hardware and software state at the time of crash. + +TODO(siggi): examples of this? + +Crash telemetry involves capturing postmortem crash dumps and transmitting them +to a backend collection server. On the server they can be stackwalked and +symbolized, and evaluated and aggregated in various ways. Stackwalking and +symbolizing the reports on an upstream server has several benefits over +performing these tasks on the client. High-fidelity stackwalking requires access +to bulky unwind data, and it may be desirable to not ship this to end users out +of concern for the application size. The process of symbolization requires +access to debugging symbols, which can be quite large, and the symbolization +process can consume considerable other resources. Transmitting un-stackwalked +and un-symbolized postmortem dumps to the collection server also allows deep +analysis of individual dumps, which is often necessary to resolve the bug +causing the crash. + +Transmitting reports to the collection server allows aggregating crashes by +cause, which in turn allows assessing the importance of different crashes in +terms of the occurrence rate and e.g. the potential security impact. + +A postmortem crash dump must contain the program state at the time of crash +with sufficient fidelity to allow diagnosing and fixing the problem. As the full +program state is usually too large to transmit to an upstream server, the +postmortem dump captures a heuristic subset of the full state. + +The crashed program is in an indeterminate state and, in fact, has often crashed +because of corrupt global state - such as heap. It’s therefore important to +generate crash reports with as little execution in the crashed process as +possible. Different operating systems vary in the facilities they provide for +this. + +## Overview + +Crashpad is a client-side library that focuses on capturing machine and program +state in a postmortem crash report, and transmitting this report to a backend +server - a “collection server”. The Crashpad library is embedded by the client +application. Conceptually, Crashpad breaks down into the handler and the client. +The handler runs in a separate process from the client or clients. It is +responsible for snapshotting the crashing client process’ state on a crash, +saving it to a crash dump, and transmitting the crash dump to an upstream +server. Clients register with the handler to allow it to capture and upload +their crashes. + +### The Crashpad handler + +The Crashpad handler is instantiated in a process supplied by the embedding +application. It provides means for clients to register themselves by some means +of IPC, or where operating system support is available, by taking advantage of +such support to cause crash notifications to be delivered to the handler. On +crash, the handler snapshots the crashed client process’ state, writes it to a +postmortem dump in a database, and may also transmit the dump to an upstream +server if so configured. + +The Crashpad handler is able to handle cross-bitted requests and generate crash +dumps across bitness, where e.g. the handler is a 64-bit process while the +client is a 32-bit process or vice versa. In the case of Windows, this is +limited by the OS such that a 32-bit handler can only generate crash dumps for +32-bit clients, but a 64-bit handler can acquire nearly all of the detail for a +32-bit process. + +### The Crashpad client + +The Crashpad client provides two main facilities. +1. Registration with the Crashpad handler. +2. Metadata communication to the Crashpad handler on crash. + +A Crashpad embedder links the Crashpad client library into one or more +executables, whether a loadable library or a program file. The client process +then registers with the Crashpad handler through some mode of IPC or other +operating system-specific support. + +On crash, metadata is communicated to the Crashpad handler via the CrashpadInfo +structure. Each client executable module linking the Crashpad client library +embeds a CrashpadInfo structure, which can be updated by the client with +whatever state the client wishes to record with a crash. + + + +Here is an overview picture of the conceptual relationships between embedder (in +light blue), client modules (darker blue), and Crashpad (in green). Note that +multiple client modules can contain a CrashpadInfo structure, but only one +registration is necessary. + +## Detailed Design + +### Requirements + +The purpose of Crashpad is to capture machine, OS and application state in +sufficient detail and fidelity to allow developers to diagnose and, where +possible, fix the issue causing the crash. + +Each distinct crash report is assigned a globally unique ID, in order to allow +users to associate them with a user report, report in bug reports and so on. + +It’s critical to safeguard the user’s privacy by ensuring that no crash report +is ever uploaded without user consent. Likewise it’s important to ensure that +Crashpad never captures or uploads reports from non-client processes. + +### Concepts + +* **Client ID**. A UUID tied to a single instance of a Crashpad database. When + creating a crash report, the Crashpad handler includes the client ID stored + in the database. This provides a means to determine how many individual end + users are affected by a specific crash signature. + +* **Crash ID**. A UUID representing a single crash report. Uploaded crash + reports also receive a “server ID.” The Crashpad database indexes both the + locally-generated and server-generated IDs. + +* **Collection Server**. See [crash server documentation.]( + https://goto.google.com/crash-server-overview) + +* **Client Process**. Any process that has registered with a Crashpad handler. + +* **Handler process**. A process hosting the Crashpad handler library. This may + be a dedicated executable, or it may be hosted within a client executable + with control passed to it based on special signaling under the client’s + control, such as a command-line parameter. + +* **CrashpadInfo**. A structure used by client modules to provide information to + the handler. + +* **Annotations**. Each CrashpadInfo structure points to a dictionary of + {string, string} annotations that the client can use to communicate + application state in the case of crash. + +* **Database**. The Crashpad database contains persistent client settings as + well as crash dumps pending upload. + +TODO(siggi): moar concepts? + +### Overview Picture + +Here is a rough overview picture of the various Crashpad constructs, their +layering and intended use by clients. + + + +Dark blue boxes are interfaces, light blue boxes are implementation. Gray is the +embedding client application. Note that wherever possible, implementation that +necessarily has to be OS-specific, exposes OS-agnostic interfaces to the rest of +Crashpad and the client. + +### Registration + +The particulars of how a client registers with the handler varies across +operating systems. + +#### macOS + +At registration time, the client designates a Mach port monitored by the +Crashpad handler as the EXC_CRASH exception port for the client. The port may be +acquired by launching a new handler process or by retrieving service already +registered with the system. The registration is maintained by the kernel and is +inherited by subprocesses at creation time by default, so only the topmost +process of a process tree need register. + +Crashpad provides a facility for a process to disassociate (unregister) with an +existing crash handler, which can be necessary when an older client spawns an +updated version. + +#### Windows + +There are two modes of registration on Windows. In both cases the handler is +advised of the address of a set of structures in the client process’ address +space. These structures include a pair of ExceptionInformation structs, one for +generating a postmortem dump for a crashing process, and another one for +generating a dump for a non- crashing process. + +##### Normal registration + +In the normal registration mode, the client connects to a named pipe by a +pre-arranged name. A registration request is written to the pipe. During +registration, the handler creates a set of events, duplicates them to the +registering client, then returns the handle values in the registration response. +This is a blocking process. + +##### Initial Handler Creation + +In order to avoid blocking client startup for the creation and initialization of +the handler, a different mode of registration can be used for the handler +creation. In this mode, the client creates a set of event handles and inherits +them into the newly created handler process. The handler process is advised of +the handle values and the location of the ExceptionInformation structures by way +of command line arguments in this mode. + +#### Linux/Android + +TODO(mmentovai): describe this. See this preliminary doc. + +### Capturing Exceptions + +The details of how Crashpad captures the exceptions leading to crashes varies +between operating systems. + +#### macOS + +On macOS, the operating system will notify the handler of client crashes via the +Mach port set as the client process’ exception port. As exceptions are +dispatched to the Mach port by the kernel, on macOS, exceptions can be handled +entirely from the Crashpad handler without the need to run any code in the crash +process at the time of the exception. + +#### Windows + +On Windows, the OS dispatches exceptions in the context of the crashing thread. +To notify the handler of exceptions, the Crashpad client registers an +UnhandledExceptionFilter (UEF) in the client process. When an exception trickles +up to the UEF, it stores the exception information and the crashing thread’s ID +in the ExceptionInformation structure registered with the handler. It then sets +an event handle to signal the handler to go ahead and process the exception. + +##### Caveats + +* If the crashing thread’s stack is smashed when an exception occurs, the + exception cannot be dispatched. In this case the OS will summarily terminate + the process, without the handler having an opportunity to generate a crash + report. +* If an exception is handled in the crashing thread, it will never propagate + to the UEF, and thus a crash report won’t be generated. This happens a fair + bit in Windows as system libraries will often dispatch callbacks under a + structured exception handler. This occurs during Window message dispatching + on some system configurations, as well as during e.g. DLL entry point + notifications. +* A growing number of conditions in the system and runtime exist where + detected corruption or illegal calls result in summary termination of the + process, in which case no crash report will be generated. + +###### Out-Of-Process Exception Handling + +There exists a mechanism in Windows Error Reporting (WER) that allows a client +process to register for handling client exceptions out of the crashing process. +Unfortunately this mechanism is difficult to use, and doesn’t provide coverage +for many of the caveats above. [Details +here.](https://crashpad.chromium.org/bug/133) + +#### Linux/Android + +TODO(mmentovai): describe this. See [this preliminary +doc.](https://goto.google.com/crashpad-android-dd) + +### The CrashpadInfo structure + +The CrashpadInfo structure is used to communicate information from the client to +the handler. Each executable module in a client process can contain a +CrashpadInfo structure. On a crash, the handler crawls all modules in the +crashing process to locate all CrashpadInfo structures present. The CrashpadInfo +structures are linked into a special, named section of the executable, where the +handler can readily find them. + +The CrashpadInfo structure has a magic signature, and contains a size and a +version field. The intent is to allow backwards compatibility from older client +modules to newer handler. It may also be necessary to provide forwards +compatibility from newer clients to older handler, though this hasn’t occurred +yet. + +The CrashpadInfo structure contains such properties as the cap for how much +memory to include in the crash dump, some tristate flags for controlling the +handler’s behavior, a pointer to an annotation dictionary and so on. + +### Snapshot + +Snapshot is a layer of interfaces that represent the machine and OS entities +that Crashpad cares about. Different concrete implementations of snapshot can +then be backed different ways, such as e.g. from the in-memory representation of +a crashed process, or e.g. from the contents of a minidump. + +### Crash Dump Creation + +To create a crash dump, a subset of the machine, OS and application state is +grabbed from the crashed process into an in-memory snapshot structure in the +handler process. Since the full application state is typically too large for +capturing to disk and transmitting to an upstream server, the snapshot contains +a heuristically selected subset of the full state. + +The precise details of what’s captured varies between operating systems, but +generally includes the following +* The set of modules (executable, shared libraries) that are loaded into the + crashing process. +* An enumeration of the threads running in the crashing process, including the + register contents and the contents of stack memory of each thread. +* A selection of the OS-related state of the process, such as e.g. the command + line, environment and so on. +* A selection of memory potentially referenced from registers and from stack. + +To capture a crash dump, the crashing process is first suspended, then a +snapshot is created in the handler process. The snapshot includes the +CrashpadInfo structures of the modules loaded into the process, and the contents +of those is used to control the level of detail captured for the crash dump. + +Once the snapshot has been constructed, it is then written to a minidump file, +which is added to the database. The process is un-suspended after the minidump +file has been written. In the case of a crash (as opposed to a client request to +produce a dump without crashing), it is then either killed by the operating +system or the Crashpad handler. + +In general the snapshotting process has to be very intimate with the operating +system it’s working with, so there will be a set of concrete implementation +classes, many deriving from the snapshot interfaces, doing this for each +operating system. + +### Minidump + +The minidump implementation is responsible for writing a snapshot to a +serialized on-disk file in the minidump format. The minidump implementation is +OS-agnostic, as it works on an OS-agnostic Snapshot interface. + +TODO(siggi): Talk about two-phase writes and contents ordering here. + +### Database + +The Crashpad database contains persistent client settings, including a unique +crash client identifier and the upload-enabled bit. Note that the crash client +identifier is assigned by Crashpad, and is distinct from any identifiers the +client application uses to identify users, installs, machines or such - if any. +The expectation is that the client application will manage the user’s upload +consent, and inform Crashpad of changes in consent. + +The unique client identifier is set at the time of database creation. It is then +recorded into every crash report collected by the handler and communicated to +the upstream server. + +The database stores a configurable number of recorded crash dumps to a +configurable maximum aggregate size. For each crash dump it stores annotations +relating to whether the crash dumps have been uploaded. For successfully +uploaded crash dumps it also stores their server-assigned ID. + +The database consists of a settings file, named "settings.dat" with binary +contents (see crashpad::Settings::Data for the file format), as well as +directory containing the crash dumps. Additionally each crash dump is adorned +with properties relating to the state of the dump for upload and such. The +details of how these properties are stored vary between platforms. + +#### macOS + +The macOS implementation simply stores database properties on the minidump files +in filesystem extended attributes. + +#### Windows + +The Windows implementation stores database properties in a binary file named +“metadata” at the top level of the database directory. + +### Report Format + +Crash reports are recorded in the Windows minidump format with +extensions to support Crashpad additions, such as e.g. Annotations. + +### Upload to collection server + +#### Wire Format + +For the time being, Crashpad uses the Breakpad wire protocol, which is +essentially a MIME multipart message communicated over HTTP(S). To support this, +the annotations from all the CrashpadInfo structures found in the crashing +process are merged to create the Breakpad “crash keys” as form data. The +postmortem minidump is then attached as an “application/octet- stream” +attachment with the name “upload_file_minidump”. The entirety of the request +body, including the minidump, can be gzip-compressed to reduce transmission time +and increase transmission reliability. Note that by convention there is a set of +“crash keys” that are used to communicate the product, version, client ID and +other relevant data about the client, to the server. Crashpad normally stores +these values in the minidump file itself, but retrieves them from the minidump +and supplies them as form data for compatibility with the Breakpad-style server. + +This is a temporary compatibility measure to allow the current Breakpad-based +upstream server to handle Crashpad reports. In the fullness of time, the wire +protocol is expected to change to remove this redundant transmission and +processing of the Annotations. + +#### Transport + +The embedding client controls the URL of the collection server by the command +line passed to the handler. The handler can upload crashes with HTTP or HTTPS, +depending on client’s preference. It’s strongly suggested use HTTPS transport +for crash uploads to protect the user’s privacy against man-in-the-middle +snoopers. + +TODO(mmentovai): Certificate pinning. + +#### Throttling & Retry Strategy + +To protect both the collection server from DDoS as well as to protect the +clients from unreasonable data transfer demands, the handler implements a +client-side throttling strategy. At the moment, the strategy is very simplistic, +it simply limits uploads to one upload per hour, and failed uploads are aborted. + +An experiment has been conducted to lift all throttling. Analysis on the +aggregate data this produced shows that multiple crashes within a short timespan +on the same client are nearly always due to the same cause. Therefore there is +very little loss of signal due to the throttling, though the ability to +reconstruct at least the full crash count is highly desirable. + +The lack of retry is expected to [change +soon](https://crashpad.chromium.org/bug/23), as this creates blind spots for +client crashes that exclusively occur on e.g. network down events, during +suspend and resume and such. + +### Extensibility + +Clients are able to extend the generated crash reports in two ways, by +manipulating their CrashpadInfo structure. +The two extensibility points are: +1. Nominating a set of address ranges for inclusion in the crash report. +2. Adding user-defined minidump streams for inclusion in the crash report. + +In both cases the CrashpadInfo structure has to be updated before a crash +occurs. + +### Dependencies + +Aside from system headers and APIs, when used outside of Chromium, Crashpad has +a dependency on “mini_chromium”, which is a subset of the Chromium base library. +This is to allow non-Chromium clients to use Crashpad, without taking a direct +dependency on the Chromium base, while allowing Chromium projects to use +Crashpad with minimum code duplication or hassle. When using Crashpad as part of +Chromium, Chromium’s own copy of the base library is used instead of +mini_chromium. + +The downside to this is that mini_chromium must be kept up to date with +interface and implementation changes in Chromium base, for the subset of +functionality used by Crashpad. + +## Caveats + +TODO(anyone): You may need to describe what you did not do or why simpler +approaches don't work. Mention other things to watch out for (if any). + +## Security Considerations + +Crashpad may be used to capture the state of sandboxed processes and it writes +minidumps to disk. It may therefore straddle security boundaries, so it’s +important that Crashpad handle all data it reads out of the crashed process with +extreme care. The Crashpad handler takes care to access client address spaces +through specially-designed accessors that check pointer validity and enforce +accesses within prescribed bounds. The flow of information into the Crashpad +handler is exclusively one-way: Crashpad never communicates anything back to +its clients, aside from providing single-bit indications of completion. + +## Privacy Considerations + +Crashpad may capture arbitrary contents from crashed process’ memory, including +user IDs and passwords, credit card information, URLs and whatever other content +users have trusted the crashing program with. The client program must acquire +and honor the user’s consent to upload crash reports, and appropriately manage +the upload state in Crashpad’s database. + +Crashpad must also be careful not to upload crashes for arbitrary processes on +the user’s system. To this end, Crashpad will never upload a process that hasn’t +registered with the handler, but note that registrations are inherited by child +processes on some operating systems.
diff --git a/third_party/crashpad/crashpad/handler/win/crash_other_program.cc b/third_party/crashpad/crashpad/handler/win/crash_other_program.cc index d191aac0..012b4ba 100644 --- a/third_party/crashpad/crashpad/handler/win/crash_other_program.cc +++ b/third_party/crashpad/crashpad/handler/win/crash_other_program.cc
@@ -90,7 +90,8 @@ // Wait until it's ready. char c; - if (!LoggingReadFile(child.stdout_read_handle(), &c, sizeof(c)) || c != ' ') { + if (!LoggingReadFileExactly(child.stdout_read_handle(), &c, sizeof(c)) || + c != ' ') { LOG(ERROR) << "failed child communication"; return EXIT_FAILURE; }
diff --git a/third_party/crashpad/crashpad/minidump/minidump.gyp b/third_party/crashpad/crashpad/minidump/minidump.gyp index 35528060..3135de3d 100644 --- a/third_party/crashpad/crashpad/minidump/minidump.gyp +++ b/third_party/crashpad/crashpad/minidump/minidump.gyp
@@ -72,6 +72,8 @@ 'minidump_thread_writer.h', 'minidump_unloaded_module_writer.cc', 'minidump_unloaded_module_writer.h', + 'minidump_user_extension_stream_data_source.cc', + 'minidump_user_extension_stream_data_source.h', 'minidump_user_stream_writer.cc', 'minidump_user_stream_writer.h', 'minidump_writable.cc',
diff --git a/third_party/crashpad/crashpad/minidump/minidump_crashpad_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_crashpad_info_writer_test.cc index 85eec274..0b62066 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_crashpad_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_crashpad_info_writer_test.cc
@@ -70,7 +70,7 @@ base::WrapUnique(new MinidumpCrashpadInfoWriter()); EXPECT_FALSE(crashpad_info_writer->IsUseful()); - minidump_file_writer.AddStream(std::move(crashpad_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -106,7 +106,7 @@ EXPECT_TRUE(crashpad_info_writer->IsUseful()); - minidump_file_writer.AddStream(std::move(crashpad_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -148,7 +148,7 @@ EXPECT_TRUE(crashpad_info_writer->IsUseful()); - minidump_file_writer.AddStream(std::move(crashpad_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -189,7 +189,7 @@ EXPECT_TRUE(crashpad_info_writer->IsUseful()); - minidump_file_writer.AddStream(std::move(crashpad_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(crashpad_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -265,7 +265,7 @@ EXPECT_TRUE(info_writer->IsUseful()); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc index 8635190..613c5dd 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc
@@ -102,7 +102,7 @@ InitializeMinidumpContextX86(context_x86_writer->context(), kSeed); exception_writer->SetContext(std::move(context_x86_writer)); - minidump_file_writer.AddStream(std::move(exception_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(exception_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -161,7 +161,7 @@ exception_information.push_back(kExceptionInformation2); exception_writer->SetExceptionInformation(exception_information); - minidump_file_writer.AddStream(std::move(exception_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(exception_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -234,7 +234,7 @@ exception_writer->InitializeFromSnapshot(&exception_snapshot, thread_id_map); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(exception_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(exception_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -256,7 +256,7 @@ MinidumpFileWriter minidump_file_writer; auto exception_writer = base::WrapUnique(new MinidumpExceptionWriter()); - minidump_file_writer.AddStream(std::move(exception_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(exception_writer))); StringFile string_file; ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file),
diff --git a/third_party/crashpad/crashpad/minidump/minidump_file_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_file_writer.cc index 6a91ca6..3e99d2a3 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_file_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_file_writer.cc
@@ -29,6 +29,7 @@ #include "minidump/minidump_thread_id_map.h" #include "minidump/minidump_thread_writer.h" #include "minidump/minidump_unloaded_module_writer.h" +#include "minidump/minidump_user_extension_stream_data_source.h" #include "minidump/minidump_user_stream_writer.h" #include "minidump/minidump_writer_util.h" #include "snapshot/exception_snapshot.h" @@ -74,11 +75,13 @@ const SystemSnapshot* system_snapshot = process_snapshot->System(); auto system_info = base::WrapUnique(new MinidumpSystemInfoWriter()); system_info->InitializeFromSnapshot(system_snapshot); - AddStream(std::move(system_info)); + bool add_stream_result = AddStream(std::move(system_info)); + DCHECK(add_stream_result); auto misc_info = base::WrapUnique(new MinidumpMiscInfoWriter()); misc_info->InitializeFromSnapshot(process_snapshot); - AddStream(std::move(misc_info)); + add_stream_result = AddStream(std::move(misc_info)); + DCHECK(add_stream_result); auto memory_list = base::WrapUnique(new MinidumpMemoryListWriter()); auto thread_list = base::WrapUnique(new MinidumpThreadListWriter()); @@ -86,33 +89,29 @@ MinidumpThreadIDMap thread_id_map; thread_list->InitializeFromSnapshot(process_snapshot->Threads(), &thread_id_map); - AddStream(std::move(thread_list)); + add_stream_result = AddStream(std::move(thread_list)); + DCHECK(add_stream_result); const ExceptionSnapshot* exception_snapshot = process_snapshot->Exception(); if (exception_snapshot) { auto exception = base::WrapUnique(new MinidumpExceptionWriter()); exception->InitializeFromSnapshot(exception_snapshot, thread_id_map); - AddStream(std::move(exception)); + add_stream_result = AddStream(std::move(exception)); + DCHECK(add_stream_result); } auto module_list = base::WrapUnique(new MinidumpModuleListWriter()); module_list->InitializeFromSnapshot(process_snapshot->Modules()); - AddStream(std::move(module_list)); - - for (const auto& module : process_snapshot->Modules()) { - for (const UserMinidumpStream* stream : module->CustomMinidumpStreams()) { - auto user_stream = base::WrapUnique(new MinidumpUserStreamWriter()); - user_stream->InitializeFromSnapshot(stream); - AddStream(std::move(user_stream)); - } - } + add_stream_result = AddStream(std::move(module_list)); + DCHECK(add_stream_result); auto unloaded_modules = process_snapshot->UnloadedModules(); if (!unloaded_modules.empty()) { auto unloaded_module_list = base::WrapUnique(new MinidumpUnloadedModuleListWriter()); unloaded_module_list->InitializeFromSnapshot(unloaded_modules); - AddStream(std::move(unloaded_module_list)); + add_stream_result = AddStream(std::move(unloaded_module_list)); + DCHECK(add_stream_result); } auto crashpad_info = base::WrapUnique(new MinidumpCrashpadInfoWriter()); @@ -121,7 +120,8 @@ // Since the MinidumpCrashpadInfo stream is an extension, it’s safe to not add // it to the minidump file if it wouldn’t carry any useful information. if (crashpad_info->IsUseful()) { - AddStream(std::move(crashpad_info)); + add_stream_result = AddStream(std::move(crashpad_info)); + DCHECK(add_stream_result); } std::vector<const MemoryMapRegionSnapshot*> memory_map_snapshot = @@ -130,21 +130,50 @@ auto memory_info_list = base::WrapUnique(new MinidumpMemoryInfoListWriter()); memory_info_list->InitializeFromSnapshot(memory_map_snapshot); - AddStream(std::move(memory_info_list)); + add_stream_result = AddStream(std::move(memory_info_list)); + DCHECK(add_stream_result); } std::vector<HandleSnapshot> handles_snapshot = process_snapshot->Handles(); if (!handles_snapshot.empty()) { auto handle_data_writer = base::WrapUnique(new MinidumpHandleDataWriter()); handle_data_writer->InitializeFromSnapshot(handles_snapshot); - AddStream(std::move(handle_data_writer)); + add_stream_result = AddStream(std::move(handle_data_writer)); + DCHECK(add_stream_result); } memory_list->AddFromSnapshot(process_snapshot->ExtraMemory()); - if (exception_snapshot) + if (exception_snapshot) { memory_list->AddFromSnapshot(exception_snapshot->ExtraMemory()); + } - AddStream(std::move(memory_list)); + // These user streams must be added last. Otherwise, a user stream with the + // same type as a well-known stream could preempt the well-known stream. As it + // stands now, earlier-discovered user streams can still preempt + // later-discovered ones. The well-known memory list stream is added after + // these user streams, but only with a check here to avoid adding a user + // stream that would preempt the memory list stream. + for (const auto& module : process_snapshot->Modules()) { + for (const UserMinidumpStream* stream : module->CustomMinidumpStreams()) { + if (stream->stream_type() == kMinidumpStreamTypeMemoryList) { + LOG(WARNING) << "discarding duplicate stream of type " + << stream->stream_type(); + continue; + } + auto user_stream = base::WrapUnique(new MinidumpUserStreamWriter()); + user_stream->InitializeFromSnapshot(stream); + AddStream(std::move(user_stream)); + } + } + + // The memory list stream should be added last. This keeps the “extra memory” + // at the end so that if the minidump file is truncated, other, more critical + // data is more likely to be preserved. Note that non-“extra” memory regions + // will not have to ride at the end of the file. Thread stack memory, for + // example, exists as a children of threads, and appears alongside them in the + // file, despite also being mentioned by the memory list stream. + add_stream_result = AddStream(std::move(memory_list)); + DCHECK(add_stream_result); } void MinidumpFileWriter::SetTimestamp(time_t timestamp) { @@ -153,18 +182,35 @@ internal::MinidumpWriterUtil::AssignTimeT(&header_.TimeDateStamp, timestamp); } -void MinidumpFileWriter::AddStream( +bool MinidumpFileWriter::AddStream( std::unique_ptr<internal::MinidumpStreamWriter> stream) { DCHECK_EQ(state(), kStateMutable); MinidumpStreamType stream_type = stream->StreamType(); auto rv = stream_types_.insert(stream_type); - CHECK(rv.second) << "stream_type " << stream_type << " already present"; + if (!rv.second) { + LOG(WARNING) << "discarding duplicate stream of type " << stream_type; + return false; + } streams_.push_back(stream.release()); DCHECK_EQ(streams_.size(), stream_types_.size()); + return true; +} + +bool MinidumpFileWriter::AddUserExtensionStream( + std::unique_ptr<MinidumpUserExtensionStreamDataSource> + user_extension_stream_data) { + DCHECK_EQ(state(), kStateMutable); + + auto user_stream = base::WrapUnique(new MinidumpUserStreamWriter()); + user_stream->InitializeFromBuffer(user_extension_stream_data->stream_type(), + user_extension_stream_data->buffer(), + user_extension_stream_data->buffer_size()); + + return AddStream(std::move(user_stream)); } bool MinidumpFileWriter::WriteEverything(FileWriterInterface* file_writer) {
diff --git a/third_party/crashpad/crashpad/minidump/minidump_file_writer.h b/third_party/crashpad/crashpad/minidump/minidump_file_writer.h index b093dad..d5e2d1a 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_file_writer.h +++ b/third_party/crashpad/crashpad/minidump/minidump_file_writer.h
@@ -33,6 +33,7 @@ namespace crashpad { class ProcessSnapshot; +class MinidumpUserExtensionStreamDataSource; //! \brief The root-level object in a minidump file. //! @@ -61,7 +62,11 @@ //! - kMinidumpStreamTypeThreadList //! - kMinidumpStreamTypeException (if present) //! - kMinidumpStreamTypeModuleList + //! - kMinidumpStreamTypeUnloadedModuleList (if present) //! - kMinidumpStreamTypeCrashpadInfo (if present) + //! - kMinidumpStreamTypeMemoryInfoList (if present) + //! - kMinidumpStreamTypeHandleData (if present) + //! - User streams (if present) //! - kMinidumpStreamTypeMemoryList //! //! \param[in] process_snapshot The process snapshot to use as source data. @@ -84,11 +89,40 @@ //! //! At most one object of each stream type (as obtained from //! internal::MinidumpStreamWriter::StreamType()) may be added to a - //! MinidumpFileWriter object. It is an error to attempt to add multiple - //! streams with the same stream type. + //! MinidumpFileWriter object. If an attempt is made to add a stream whose + //! type matches an existing stream’s type, this method discards the new + //! stream. //! //! \note Valid in #kStateMutable. - void AddStream(std::unique_ptr<internal::MinidumpStreamWriter> stream); + //! + //! \return `true` on success. `false` on failure, as occurs when an attempt + //! is made to add a stream whose type matches an existing stream’s type, + //! with a message logged. + bool AddStream(std::unique_ptr<internal::MinidumpStreamWriter> stream); + + //! \brief Adds a user extension stream to the minidump file and arranges for + //! a MINIDUMP_DIRECTORY entry to point to it. + //! + //! This object takes ownership of \a user_extension_stream_data. + //! + //! At most one object of each stream type (as obtained from + //! internal::MinidumpStreamWriter::StreamType()) may be added to a + //! MinidumpFileWriter object. If an attempt is made to add a stream whose + //! type matches an existing stream’s type, this method discards the new + //! stream. + //! + //! \param[in] user_extension_stream_data The stream data to add to the + //! minidump file. Note that the buffer this object points to must be valid + //! through WriteEverything(). + //! + //! \note Valid in #kStateMutable. + //! + //! \return `true` on success. `false` on failure, as occurs when an attempt + //! is made to add a stream whose type matches an existing stream’s type, + //! with a message logged. + bool AddUserExtensionStream( + std::unique_ptr<MinidumpUserExtensionStreamDataSource> + user_extension_stream_data); // MinidumpWritable:
diff --git a/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc index f3432fb..0d30060 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc
@@ -25,6 +25,7 @@ #include "base/memory/ptr_util.h" #include "gtest/gtest.h" #include "minidump/minidump_stream_writer.h" +#include "minidump/minidump_user_extension_stream_data_source.h" #include "minidump/minidump_writable.h" #include "minidump/test/minidump_file_writer_test_util.h" #include "minidump/test/minidump_writable_test_util.h" @@ -98,7 +99,7 @@ const uint8_t kStreamValue = 0x5a; auto stream = base::WrapUnique(new TestStream(kStreamType, kStreamSize, kStreamValue)); - minidump_file.AddStream(std::move(stream)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream))); StringFile string_file; ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); @@ -127,6 +128,50 @@ EXPECT_EQ(0, memcmp(stream_data, expected_stream.c_str(), kStreamSize)); } +TEST(MinidumpFileWriter, AddUserExtensionStream) { + MinidumpFileWriter minidump_file; + const time_t kTimestamp = 0x155d2fb8; + minidump_file.SetTimestamp(kTimestamp); + + static const uint8_t kStreamData[] = "Hello World!"; + const size_t kStreamSize = arraysize(kStreamData); + const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); + + auto stream = base::WrapUnique(new MinidumpUserExtensionStreamDataSource( + kStreamType, kStreamData, kStreamSize)); + ASSERT_TRUE(minidump_file.AddUserExtensionStream(std::move(stream))); + + // Adding the same stream type a second time should fail. + stream = base::WrapUnique(new MinidumpUserExtensionStreamDataSource( + kStreamType, kStreamData, kStreamSize)); + ASSERT_FALSE(minidump_file.AddUserExtensionStream(std::move(stream))); + + StringFile string_file; + ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); + + const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); + const size_t kStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); + const size_t kFileSize = kStreamOffset + kStreamSize; + + ASSERT_EQ(kFileSize, string_file.string().size()); + + const MINIDUMP_DIRECTORY* directory; + const MINIDUMP_HEADER* header = + MinidumpHeaderAtStart(string_file.string(), &directory); + ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, kTimestamp)); + ASSERT_TRUE(directory); + + EXPECT_EQ(kStreamType, directory[0].StreamType); + EXPECT_EQ(kStreamSize, directory[0].Location.DataSize); + EXPECT_EQ(kStreamOffset, directory[0].Location.Rva); + + const uint8_t* stream_data = MinidumpWritableAtLocationDescriptor<uint8_t>( + string_file.string(), directory[0].Location); + ASSERT_TRUE(stream_data); + + EXPECT_EQ(0, memcmp(stream_data, kStreamData, kStreamSize)); +} + TEST(MinidumpFileWriter, ThreeStreams) { MinidumpFileWriter minidump_file; const time_t kTimestamp = 0x155d2fb8; @@ -137,7 +182,7 @@ const uint8_t kStream0Value = 0x5a; auto stream0 = base::WrapUnique( new TestStream(kStream0Type, kStream0Size, kStream0Value)); - minidump_file.AddStream(std::move(stream0)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream0))); // Make the second stream’s type be a smaller quantity than the first stream’s // to test that the streams show up in the order that they were added, not in @@ -147,14 +192,14 @@ const uint8_t kStream1Value = 0xa5; auto stream1 = base::WrapUnique( new TestStream(kStream1Type, kStream1Size, kStream1Value)); - minidump_file.AddStream(std::move(stream1)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream1))); const size_t kStream2Size = 1; const MinidumpStreamType kStream2Type = static_cast<MinidumpStreamType>(0x7e); const uint8_t kStream2Value = 0x36; auto stream2 = base::WrapUnique( new TestStream(kStream2Type, kStream2Size, kStream2Value)); - minidump_file.AddStream(std::move(stream2)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream2))); StringFile string_file; ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); @@ -221,7 +266,7 @@ const size_t kStreamSize = 0; const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); auto stream = base::WrapUnique(new TestStream(kStreamType, kStreamSize, 0)); - minidump_file.AddStream(std::move(stream)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream))); StringFile string_file; ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); @@ -439,24 +484,48 @@ string_file.string(), directory[6].Location)); } -TEST(MinidumpFileWriterDeathTest, SameStreamType) { +TEST(MinidumpFileWriter, SameStreamType) { MinidumpFileWriter minidump_file; - const size_t kStream0Size = 5; - const MinidumpStreamType kStream0Type = static_cast<MinidumpStreamType>(0x4d); + const size_t kStream0Size = 3; + const MinidumpStreamType kStreamType = static_cast<MinidumpStreamType>(0x4d); const uint8_t kStream0Value = 0x5a; auto stream0 = base::WrapUnique( - new TestStream(kStream0Type, kStream0Size, kStream0Value)); - minidump_file.AddStream(std::move(stream0)); + new TestStream(kStreamType, kStream0Size, kStream0Value)); + ASSERT_TRUE(minidump_file.AddStream(std::move(stream0))); - // It is an error to add a second stream of the same type. - const size_t kStream1Size = 3; - const MinidumpStreamType kStream1Type = static_cast<MinidumpStreamType>(0x4d); + // An attempt to add a second stream of the same type should fail. + const size_t kStream1Size = 5; const uint8_t kStream1Value = 0xa5; auto stream1 = base::WrapUnique( - new TestStream(kStream1Type, kStream1Size, kStream1Value)); - ASSERT_DEATH_CHECK(minidump_file.AddStream(std::move(stream1)), - "already present"); + new TestStream(kStreamType, kStream1Size, kStream1Value)); + ASSERT_FALSE(minidump_file.AddStream(std::move(stream1))); + + StringFile string_file; + ASSERT_TRUE(minidump_file.WriteEverything(&string_file)); + + const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); + const size_t kStream0Offset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); + const size_t kFileSize = kStream0Offset + kStream0Size; + + ASSERT_EQ(kFileSize, string_file.string().size()); + + const MINIDUMP_DIRECTORY* directory; + const MINIDUMP_HEADER* header = + MinidumpHeaderAtStart(string_file.string(), &directory); + ASSERT_NO_FATAL_FAILURE(VerifyMinidumpHeader(header, 1, 0)); + ASSERT_TRUE(directory); + + EXPECT_EQ(kStreamType, directory[0].StreamType); + EXPECT_EQ(kStream0Size, directory[0].Location.DataSize); + EXPECT_EQ(kStream0Offset, directory[0].Location.Rva); + + const uint8_t* stream_data = MinidumpWritableAtLocationDescriptor<uint8_t>( + string_file.string(), directory[0].Location); + ASSERT_TRUE(stream_data); + + std::string expected_stream(kStream0Size, kStream0Value); + EXPECT_EQ(0, memcmp(stream_data, expected_stream.c_str(), kStream0Size)); } } // namespace
diff --git a/third_party/crashpad/crashpad/minidump/minidump_handle_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_handle_writer_test.cc index 982da71..db4cae5 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_handle_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_handle_writer_test.cc
@@ -59,7 +59,7 @@ TEST(MinidumpHandleDataWriter, Empty) { MinidumpFileWriter minidump_file_writer; auto handle_data_writer = base::WrapUnique(new MinidumpHandleDataWriter()); - minidump_file_writer.AddStream(std::move(handle_data_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(handle_data_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -92,7 +92,7 @@ handle_data_writer->InitializeFromSnapshot(snapshot); - minidump_file_writer.AddStream(std::move(handle_data_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(handle_data_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -150,7 +150,7 @@ handle_data_writer->InitializeFromSnapshot(snapshot); - minidump_file_writer.AddStream(std::move(handle_data_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(handle_data_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_memory_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_memory_info_writer_test.cc index ef6535b7..8debff5 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_memory_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_memory_info_writer_test.cc
@@ -60,7 +60,8 @@ MinidumpFileWriter minidump_file_writer; auto memory_info_list_writer = base::WrapUnique(new MinidumpMemoryInfoListWriter()); - minidump_file_writer.AddStream(std::move(memory_info_list_writer)); + ASSERT_TRUE( + minidump_file_writer.AddStream(std::move(memory_info_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -97,7 +98,8 @@ memory_map.push_back(memory_map_region.get()); memory_info_list_writer->InitializeFromSnapshot(memory_map); - minidump_file_writer.AddStream(std::move(memory_info_list_writer)); + ASSERT_TRUE( + minidump_file_writer.AddStream(std::move(memory_info_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc index d9e87ae..65fcca2 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc
@@ -79,7 +79,7 @@ MinidumpFileWriter minidump_file_writer; auto memory_list_writer = base::WrapUnique(new MinidumpMemoryListWriter()); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -107,7 +107,7 @@ new TestMinidumpMemoryWriter(kBaseAddress, kSize, kValue)); memory_list_writer->AddMemory(std::move(memory_writer)); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -148,7 +148,7 @@ new TestMinidumpMemoryWriter(kBaseAddress1, kSize1, kValue1)); memory_list_writer->AddMemory(std::move(memory_writer_1)); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -247,7 +247,7 @@ auto memory_list_writer = base::WrapUnique(new MinidumpMemoryListWriter()); memory_list_writer->AddExtraMemory(test_memory_stream->memory()); - minidump_file_writer.AddStream(std::move(test_memory_stream)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(test_memory_stream))); const uint64_t kBaseAddress1 = 0x2000; const size_t kSize1 = 0x0400; @@ -257,7 +257,7 @@ new TestMinidumpMemoryWriter(kBaseAddress1, kSize1, kValue1)); memory_list_writer->AddMemory(std::move(memory_writer)); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -335,7 +335,7 @@ memory_list_writer->AddFromSnapshot(memory_snapshots); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc index 9a0c7654..71fdbfb 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc
@@ -34,6 +34,7 @@ #include "snapshot/test/test_process_snapshot.h" #include "snapshot/test/test_system_snapshot.h" #include "util/file/string_file.h" +#include "util/misc/arraysize_unsafe.h" #include "util/stdlib/strlcpy.h" namespace crashpad { @@ -193,7 +194,7 @@ MinidumpFileWriter minidump_file_writer; auto misc_info_writer = base::WrapUnique(new MinidumpMiscInfoWriter()); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -214,7 +215,7 @@ misc_info_writer->SetProcessID(kProcessId); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -240,7 +241,7 @@ misc_info_writer->SetProcessTimes( kProcessCreateTime, kProcessUserTime, kProcessKernelTime); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -273,7 +274,7 @@ kProcessorMaxIdleState, kProcessorCurrentIdleState); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -300,7 +301,7 @@ misc_info_writer->SetProcessIntegrityLevel(kProcessIntegrityLevel); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -323,7 +324,7 @@ misc_info_writer->SetProcessExecuteFlags(kProcessExecuteFlags); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -346,7 +347,7 @@ misc_info_writer->SetProtectedProcess(kProtectedProcess); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -383,7 +384,7 @@ kDaylightDate, kDaylightBias); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -398,7 +399,7 @@ base::string16 standard_name_utf16 = base::UTF8ToUTF16(kStandardName); c16lcpy(expected.TimeZone.StandardName, standard_name_utf16.c_str(), - arraysize(expected.TimeZone.StandardName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.StandardName)); memcpy(&expected.TimeZone.StandardDate, &kStandardDate, sizeof(expected.TimeZone.StandardDate)); @@ -406,7 +407,7 @@ base::string16 daylight_name_utf16 = base::UTF8ToUTF16(kDaylightName); c16lcpy(expected.TimeZone.DaylightName, daylight_name_utf16.c_str(), - arraysize(expected.TimeZone.DaylightName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.DaylightName)); memcpy(&expected.TimeZone.DaylightDate, &kDaylightDate, sizeof(expected.TimeZone.DaylightDate)); @@ -426,9 +427,10 @@ const int32_t kBias = 300; MINIDUMP_MISC_INFO_N tmp; ALLOW_UNUSED_LOCAL(tmp); - std::string standard_name(arraysize(tmp.TimeZone.StandardName) + 1, 's'); + std::string standard_name(ARRAYSIZE_UNSAFE(tmp.TimeZone.StandardName) + 1, + 's'); const int32_t kStandardBias = 0; - std::string daylight_name(arraysize(tmp.TimeZone.DaylightName), 'd'); + std::string daylight_name(ARRAYSIZE_UNSAFE(tmp.TimeZone.DaylightName), 'd'); const int32_t kDaylightBias = -60; // Test using kSystemTimeZero, because not all platforms will be able to @@ -444,7 +446,7 @@ kSystemTimeZero, kDaylightBias); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -459,7 +461,7 @@ base::string16 standard_name_utf16 = base::UTF8ToUTF16(standard_name); c16lcpy(expected.TimeZone.StandardName, standard_name_utf16.c_str(), - arraysize(expected.TimeZone.StandardName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.StandardName)); memcpy(&expected.TimeZone.StandardDate, &kSystemTimeZero, sizeof(expected.TimeZone.StandardDate)); @@ -467,7 +469,7 @@ base::string16 daylight_name_utf16 = base::UTF8ToUTF16(daylight_name); c16lcpy(expected.TimeZone.DaylightName, daylight_name_utf16.c_str(), - arraysize(expected.TimeZone.DaylightName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.DaylightName)); memcpy(&expected.TimeZone.DaylightDate, &kSystemTimeZero, sizeof(expected.TimeZone.DaylightDate)); @@ -485,7 +487,7 @@ misc_info_writer->SetBuildString(kBuildString, kDebugBuildString); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -498,12 +500,12 @@ base::string16 build_string_utf16 = base::UTF8ToUTF16(kBuildString); c16lcpy(expected.BuildString, build_string_utf16.c_str(), - arraysize(expected.BuildString)); + ARRAYSIZE_UNSAFE(expected.BuildString)); base::string16 debug_build_string_utf16 = base::UTF8ToUTF16(kDebugBuildString); c16lcpy(expected.DbgBldStr, debug_build_string_utf16.c_str(), - arraysize(expected.DbgBldStr)); + ARRAYSIZE_UNSAFE(expected.DbgBldStr)); ExpectMiscInfoEqual(&expected, observed); } @@ -517,12 +519,12 @@ MINIDUMP_MISC_INFO_N tmp; ALLOW_UNUSED_LOCAL(tmp); - std::string build_string(arraysize(tmp.BuildString) + 1, 'B'); - std::string debug_build_string(arraysize(tmp.DbgBldStr), 'D'); + std::string build_string(ARRAYSIZE_UNSAFE(tmp.BuildString) + 1, 'B'); + std::string debug_build_string(ARRAYSIZE_UNSAFE(tmp.DbgBldStr), 'D'); misc_info_writer->SetBuildString(build_string, debug_build_string); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -535,12 +537,12 @@ base::string16 build_string_utf16 = base::UTF8ToUTF16(build_string); c16lcpy(expected.BuildString, build_string_utf16.c_str(), - arraysize(expected.BuildString)); + ARRAYSIZE_UNSAFE(expected.BuildString)); base::string16 debug_build_string_utf16 = base::UTF8ToUTF16(debug_build_string); c16lcpy(expected.DbgBldStr, debug_build_string_utf16.c_str(), - arraysize(expected.DbgBldStr)); + ARRAYSIZE_UNSAFE(expected.DbgBldStr)); ExpectMiscInfoEqual(&expected, observed); } @@ -565,7 +567,7 @@ misc_info_writer->SetXStateData(kXStateData); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -587,7 +589,7 @@ misc_info_writer->SetProcessCookie(kProcessCookie); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -649,7 +651,7 @@ kDaylightBias); misc_info_writer->SetBuildString(kBuildString, kDebugBuildString); - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -680,7 +682,7 @@ base::string16 standard_name_utf16 = base::UTF8ToUTF16(kStandardName); c16lcpy(expected.TimeZone.StandardName, standard_name_utf16.c_str(), - arraysize(expected.TimeZone.StandardName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.StandardName)); memcpy(&expected.TimeZone.StandardDate, &kSystemTimeZero, sizeof(expected.TimeZone.StandardDate)); @@ -688,7 +690,7 @@ base::string16 daylight_name_utf16 = base::UTF8ToUTF16(kDaylightName); c16lcpy(expected.TimeZone.DaylightName, daylight_name_utf16.c_str(), - arraysize(expected.TimeZone.DaylightName)); + ARRAYSIZE_UNSAFE(expected.TimeZone.DaylightName)); memcpy(&expected.TimeZone.DaylightDate, &kSystemTimeZero, sizeof(expected.TimeZone.DaylightDate)); @@ -696,12 +698,12 @@ base::string16 build_string_utf16 = base::UTF8ToUTF16(kBuildString); c16lcpy(expected.BuildString, build_string_utf16.c_str(), - arraysize(expected.BuildString)); + ARRAYSIZE_UNSAFE(expected.BuildString)); base::string16 debug_build_string_utf16 = base::UTF8ToUTF16(kDebugBuildString); c16lcpy(expected.DbgBldStr, debug_build_string_utf16.c_str(), - arraysize(expected.DbgBldStr)); + ARRAYSIZE_UNSAFE(expected.DbgBldStr)); ExpectMiscInfoEqual(&expected, observed); } @@ -744,18 +746,18 @@ expect_misc_info.TimeZone.Bias = 300; c16lcpy(expect_misc_info.TimeZone.StandardName, standard_time_name_utf16.c_str(), - arraysize(expect_misc_info.TimeZone.StandardName)); + ARRAYSIZE_UNSAFE(expect_misc_info.TimeZone.StandardName)); expect_misc_info.TimeZone.StandardBias = 0; c16lcpy(expect_misc_info.TimeZone.DaylightName, daylight_time_name_utf16.c_str(), - arraysize(expect_misc_info.TimeZone.DaylightName)); + ARRAYSIZE_UNSAFE(expect_misc_info.TimeZone.DaylightName)); expect_misc_info.TimeZone.DaylightBias = -60; c16lcpy(expect_misc_info.BuildString, build_string_utf16.c_str(), - arraysize(expect_misc_info.BuildString)); + ARRAYSIZE_UNSAFE(expect_misc_info.BuildString)); c16lcpy(expect_misc_info.DbgBldStr, debug_build_string_utf16.c_str(), - arraysize(expect_misc_info.DbgBldStr)); + ARRAYSIZE_UNSAFE(expect_misc_info.DbgBldStr)); const timeval kStartTime = { static_cast<time_t>(expect_misc_info.ProcessCreateTime), 0 }; @@ -789,7 +791,7 @@ misc_info_writer->InitializeFromSnapshot(&process_snapshot); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(misc_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(misc_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc index f74a2a70..8fdda897 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer.cc
@@ -14,6 +14,8 @@ #include "minidump/minidump_module_writer.h" +#include <stddef.h> + #include <limits> #include <utility>
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc index 7c9dcda..6a0464cf 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc
@@ -14,6 +14,7 @@ #include "minidump/minidump_module_writer.h" +#include <stddef.h> #include <string.h> #include <utility> @@ -67,7 +68,7 @@ MinidumpFileWriter minidump_file_writer; auto module_list_writer = base::WrapUnique(new MinidumpModuleListWriter()); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -276,7 +277,7 @@ module_writer->SetName(kModuleName); module_list_writer->AddModule(std::move(module_writer)); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -367,7 +368,7 @@ module_writer->SetMiscDebugRecord(std::move(misc_debug_writer)); module_list_writer->AddModule(std::move(module_writer)); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -442,7 +443,7 @@ module_writer->SetMiscDebugRecord(std::move(misc_debug_writer)); module_list_writer->AddModule(std::move(module_writer)); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -534,7 +535,7 @@ module_list_writer->AddModule(std::move(module_writer_2)); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -653,7 +654,6 @@ TEST(MinidumpModuleWriter, InitializeFromSnapshot) { MINIDUMP_MODULE expect_modules[3] = {}; const char* module_paths[arraysize(expect_modules)] = {}; - const char* module_names[arraysize(expect_modules)] = {}; const char* module_pdbs[arraysize(expect_modules)] = {}; UUID uuids[arraysize(expect_modules)] = {}; uint32_t ages[arraysize(expect_modules)] = {}; @@ -667,7 +667,6 @@ expect_modules[0].VersionInfo.dwProductVersionLS = 0x00070008; expect_modules[0].VersionInfo.dwFileType = VFT_APP; module_paths[0] = "/usr/bin/true"; - module_names[0] = "true"; module_pdbs[0] = "true"; const uint8_t kUUIDBytes0[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, @@ -684,7 +683,6 @@ expect_modules[1].VersionInfo.dwProductVersionLS = 0x000f0000; expect_modules[1].VersionInfo.dwFileType = VFT_DLL; module_paths[1] = "/usr/lib/libSystem.B.dylib"; - module_names[1] = "libSystem.B.dylib"; module_pdbs[1] = "libSystem.B.dylib.pdb"; const uint8_t kUUIDBytes1[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, @@ -701,7 +699,6 @@ expect_modules[2].VersionInfo.dwProductVersionLS = 0xbbbbcccc; expect_modules[2].VersionInfo.dwFileType = VFT_UNKNOWN; module_paths[2] = "/usr/lib/dyld"; - module_names[2] = "dyld"; module_pdbs[2] = "/usr/lib/dyld.pdb"; const uint8_t kUUIDBytes2[16] = {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, @@ -727,7 +724,7 @@ module_list_writer->InitializeFromSnapshot(module_snapshots); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -759,7 +756,7 @@ auto module_list_writer = base::WrapUnique(new MinidumpModuleListWriter()); auto module_writer = base::WrapUnique(new MinidumpModuleWriter()); module_list_writer->AddModule(std::move(module_writer)); - minidump_file_writer.AddStream(std::move(module_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(module_list_writer))); StringFile string_file; ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file),
diff --git a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer_test.cc index 2a869c6..4f35d3d 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer_test.cc
@@ -82,7 +82,7 @@ system_info_writer->SetCSDVersion(std::string()); - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -153,7 +153,7 @@ system_info_writer->SetCPUX86VersionAndFeatures(kCPUVersion, kCPUFeatures); system_info_writer->SetCPUX86AMDExtendedFeatures(kAMDFeatures); - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -213,7 +213,7 @@ system_info_writer->SetCSDVersion(kCSDVersion); system_info_writer->SetCPUOtherFeatures(kCPUFeatures[0], kCPUFeatures[1]); - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -255,7 +255,7 @@ kCPUVendor[0], kCPUVendor[1], kCPUVendor[2]); system_info_writer->SetCSDVersion(std::string()); - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -335,7 +335,7 @@ system_info_writer->InitializeFromSnapshot(&system_snapshot); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -431,7 +431,7 @@ system_info_writer->InitializeFromSnapshot(&system_snapshot); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -469,7 +469,7 @@ TEST(MinidumpSystemInfoWriterDeathTest, NoCSDVersion) { MinidumpFileWriter minidump_file_writer; auto system_info_writer = base::WrapUnique(new MinidumpSystemInfoWriter()); - minidump_file_writer.AddStream(std::move(system_info_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(system_info_writer))); StringFile string_file; ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file),
diff --git a/third_party/crashpad/crashpad/minidump/minidump_test.gyp b/third_party/crashpad/crashpad/minidump/minidump_test.gyp index cdae4ca..acf4d63 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_test.gyp +++ b/third_party/crashpad/crashpad/minidump/minidump_test.gyp
@@ -23,9 +23,9 @@ 'dependencies': [ 'minidump.gyp:crashpad_minidump', '../snapshot/snapshot_test.gyp:crashpad_snapshot_test_lib', + '../test/test.gyp:crashpad_gtest_main', '../test/test.gyp:crashpad_test', '../third_party/gtest/gtest.gyp:gtest', - '../third_party/gtest/gtest.gyp:gtest_main', '../third_party/mini_chromium/mini_chromium.gyp:base', '../util/util.gyp:crashpad_util', ],
diff --git a/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc index 1384efe3..61332363 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc
@@ -81,7 +81,7 @@ MinidumpFileWriter minidump_file_writer; auto thread_list_writer = base::WrapUnique(new MinidumpThreadListWriter()); - minidump_file_writer.AddStream(std::move(thread_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -161,7 +161,7 @@ thread_writer->SetContext(std::move(context_x86_writer)); thread_list_writer->AddThread(std::move(thread_writer)); - minidump_file_writer.AddStream(std::move(thread_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -231,7 +231,7 @@ thread_writer->SetContext(std::move(context_amd64_writer)); thread_list_writer->AddThread(std::move(thread_writer)); - minidump_file_writer.AddStream(std::move(thread_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -363,8 +363,8 @@ thread_list_writer->AddThread(std::move(thread_writer_2)); - minidump_file_writer.AddStream(std::move(thread_list_writer)); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -623,8 +623,8 @@ thread_list_writer->InitializeFromSnapshot(thread_snapshots, &thread_id_map); MinidumpFileWriter minidump_file_writer; - minidump_file_writer.AddStream(std::move(thread_list_writer)); - minidump_file_writer.AddStream(std::move(memory_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(memory_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -702,7 +702,7 @@ auto thread_writer = base::WrapUnique(new MinidumpThreadWriter()); thread_list_writer->AddThread(std::move(thread_writer)); - minidump_file_writer.AddStream(std::move(thread_list_writer)); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(thread_list_writer))); StringFile string_file; ASSERT_DEATH_CHECK(minidump_file_writer.WriteEverything(&string_file),
diff --git a/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer_test.cc index dba4691..002c82b 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer_test.cc
@@ -82,7 +82,8 @@ unloaded_module_list_writer->AddUnloadedModule( std::move(unloaded_module_writer)); - minidump_file_writer.AddStream(std::move(unloaded_module_list_writer)); + ASSERT_TRUE( + minidump_file_writer.AddStream(std::move(unloaded_module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); @@ -128,7 +129,8 @@ unloaded_module_list_writer->AddUnloadedModule( std::move(unloaded_module_writer)); - minidump_file_writer.AddStream(std::move(unloaded_module_list_writer)); + ASSERT_TRUE( + minidump_file_writer.AddStream(std::move(unloaded_module_list_writer))); StringFile string_file; ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file));
diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.cc b/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.cc new file mode 100644 index 0000000..8056011 --- /dev/null +++ b/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.cc
@@ -0,0 +1,30 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "minidump/minidump_user_extension_stream_data_source.h" + +namespace crashpad { + +MinidumpUserExtensionStreamDataSource::MinidumpUserExtensionStreamDataSource( + uint32_t stream_type, + const void* buffer, + size_t buffer_size) + : stream_type_(static_cast<MinidumpStreamType>(stream_type)), + buffer_(buffer), + buffer_size_(buffer_size) {} + +MinidumpUserExtensionStreamDataSource:: + ~MinidumpUserExtensionStreamDataSource() {} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.h b/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.h new file mode 100644 index 0000000..1afb166 --- /dev/null +++ b/third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.h
@@ -0,0 +1,55 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_ +#define CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_ + +#include <stdint.h> +#include <sys/types.h> + +#include "base/macros.h" + +#include "minidump/minidump_extensions.h" + +namespace crashpad { + +//! \brief Describes a user extension data stream in a minidump. +class MinidumpUserExtensionStreamDataSource { + public: + //! \brief Constructs a MinidumpUserExtensionStreamDataSource. + //! + //! \param[in] stream_type The type of the user extension stream. + //! \param[in] buffer Points to the data for this stream. \a buffer is not + //! owned, and must outlive the use of this object. + //! \param[in] buffer_size The length of data in \a buffer. + MinidumpUserExtensionStreamDataSource(uint32_t stream_type, + const void* buffer, + size_t buffer_size); + ~MinidumpUserExtensionStreamDataSource(); + + MinidumpStreamType stream_type() const { return stream_type_; } + const void* buffer() const { return buffer_; } + size_t buffer_size() const { return buffer_size_; } + + private: + MinidumpStreamType stream_type_; + const void* buffer_; // weak + size_t buffer_size_; + + DISALLOW_COPY_AND_ASSIGN(MinidumpUserExtensionStreamDataSource); +}; + +} // namespace crashpad + +#endif // CRASHPAD_MINIDUMP_MINIDUMP_USER_EXTENSION_STREAM_DATA_SOURCE_H_
diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc index 7332cd014..6520f0f 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.cc
@@ -14,13 +14,67 @@ #include "minidump/minidump_user_stream_writer.h" +#include "base/memory/ptr_util.h" #include "util/file/file_writer.h" namespace crashpad { -MinidumpUserStreamWriter::MinidumpUserStreamWriter() - : stream_type_(0), reader_() { -} +class MinidumpUserStreamWriter::ContentsWriter { + public: + virtual ~ContentsWriter() {} + virtual bool WriteContents(FileWriterInterface* writer) = 0; + virtual size_t GetSize() const = 0; +}; + +class MinidumpUserStreamWriter::SnapshotContentsWriter final + : public MinidumpUserStreamWriter::ContentsWriter, + public MemorySnapshot::Delegate { + public: + explicit SnapshotContentsWriter(const MemorySnapshot* snapshot) + : snapshot_(snapshot), writer_(nullptr) {} + + bool WriteContents(FileWriterInterface* writer) override { + DCHECK(!writer_); + + writer_ = writer; + if (!snapshot_) + return true; + + return snapshot_->Read(this); + } + + size_t GetSize() const override { return snapshot_ ? snapshot_->Size() : 0; }; + + bool MemorySnapshotDelegateRead(void* data, size_t size) override { + return writer_->Write(data, size); + } + + private: + const MemorySnapshot* snapshot_; + FileWriterInterface* writer_; + + DISALLOW_COPY_AND_ASSIGN(SnapshotContentsWriter); +}; + +class MinidumpUserStreamWriter::BufferContentsWriter final + : public MinidumpUserStreamWriter::ContentsWriter { + public: + BufferContentsWriter(const void* buffer, size_t buffer_size) + : buffer_(buffer), buffer_size_(buffer_size) {} + + bool WriteContents(FileWriterInterface* writer) override { + return writer->Write(buffer_, buffer_size_); + } + size_t GetSize() const override { return buffer_size_; } + + private: + const void* buffer_; + size_t buffer_size_; + + DISALLOW_COPY_AND_ASSIGN(BufferContentsWriter); +}; + +MinidumpUserStreamWriter::MinidumpUserStreamWriter() : stream_type_() {} MinidumpUserStreamWriter::~MinidumpUserStreamWriter() { } @@ -28,10 +82,23 @@ void MinidumpUserStreamWriter::InitializeFromSnapshot( const UserMinidumpStream* stream) { DCHECK_EQ(state(), kStateMutable); + DCHECK(!contents_writer_.get()); - stream_type_ = stream->stream_type(); - if (stream->memory()) - stream->memory()->Read(&reader_); + stream_type_ = static_cast<MinidumpStreamType>(stream->stream_type()); + contents_writer_ = + base::WrapUnique(new SnapshotContentsWriter(stream->memory())); +} + +void MinidumpUserStreamWriter::InitializeFromBuffer( + MinidumpStreamType stream_type, + const void* buffer, + size_t buffer_size) { + DCHECK_EQ(state(), kStateMutable); + DCHECK(!contents_writer_.get()); + + stream_type_ = stream_type; + contents_writer_ = + base::WrapUnique(new BufferContentsWriter(buffer, buffer_size)); } bool MinidumpUserStreamWriter::Freeze() { @@ -42,7 +109,8 @@ size_t MinidumpUserStreamWriter::SizeOfObject() { DCHECK_GE(state(), kStateFrozen); - return reader_.size(); + + return contents_writer_->GetSize(); } std::vector<internal::MinidumpWritable*> @@ -53,21 +121,12 @@ bool MinidumpUserStreamWriter::WriteObject(FileWriterInterface* file_writer) { DCHECK_EQ(state(), kStateWritable); - return file_writer->Write(reader_.data(), reader_.size()); + + return contents_writer_->WriteContents(file_writer); } MinidumpStreamType MinidumpUserStreamWriter::StreamType() const { return static_cast<MinidumpStreamType>(stream_type_); } -MinidumpUserStreamWriter::MemoryReader::~MemoryReader() {} - -bool MinidumpUserStreamWriter::MemoryReader::MemorySnapshotDelegateRead( - void* data, - size_t size) { - data_.resize(size); - memcpy(&data_[0], data, size); - return true; -} - } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.h b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.h index b31247a..838ed0de 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.h +++ b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer.h
@@ -22,6 +22,7 @@ #include <vector> #include "base/macros.h" +#include "minidump/minidump_extensions.h" #include "minidump/minidump_stream_writer.h" #include "minidump/minidump_writable.h" #include "snapshot/module_snapshot.h" @@ -41,6 +42,18 @@ //! \note Valid in #kStateMutable. void InitializeFromSnapshot(const UserMinidumpStream* stream); + //! \brief Initializes a MINIDUMP_USER_STREAM based on \a stream_type, + //! \a buffer and \a buffer_size. + //! + //! \param[in] stream_type The type of the stream. + //! \param[in] buffer The data for the stream. + //! \param[in] buffer_size The length of \a buffer, and the resulting stream. + //! + //! \note Valid in #kStateMutable. + void InitializeFromBuffer(MinidumpStreamType stream_type, + const void* buffer, + size_t buffer_size); + protected: // MinidumpWritable: bool Freeze() override; @@ -52,22 +65,13 @@ MinidumpStreamType StreamType() const override; private: - class MemoryReader : public MemorySnapshot::Delegate { - public: - ~MemoryReader() override; - bool MemorySnapshotDelegateRead(void* data, size_t size) override; + class ContentsWriter; + class SnapshotContentsWriter; + class BufferContentsWriter; - const void* data() const { - return reinterpret_cast<const void*>(data_.data()); - } - size_t size() const { return data_.size(); } + std::unique_ptr<ContentsWriter> contents_writer_; - private: - std::vector<uint8_t> data_; - }; - - uint32_t stream_type_; - MemoryReader reader_; + MinidumpStreamType stream_type_; DISALLOW_COPY_AND_ASSIGN(MinidumpUserStreamWriter); };
diff --git a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer_test.cc index 97d41eecf..3942e0e 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_user_stream_writer_test.cc
@@ -32,7 +32,8 @@ // The user stream is expected to be the only stream. void GetUserStream(const std::string& file_contents, MINIDUMP_LOCATION_DESCRIPTOR* user_stream_location, - uint32_t stream_type) { + uint32_t stream_type, + size_t stream_size) { const size_t kDirectoryOffset = sizeof(MINIDUMP_HEADER); const size_t kUserStreamOffset = kDirectoryOffset + sizeof(MINIDUMP_DIRECTORY); @@ -47,16 +48,36 @@ ASSERT_EQ(stream_type, directory[kDirectoryIndex].StreamType); EXPECT_EQ(kUserStreamOffset, directory[kDirectoryIndex].Location.Rva); + EXPECT_EQ(stream_size, directory[kDirectoryIndex].Location.DataSize); *user_stream_location = directory[kDirectoryIndex].Location; } -TEST(MinidumpUserStreamWriter, NoData) { +constexpr MinidumpStreamType kTestStreamId = + static_cast<MinidumpStreamType>(0x123456); + +TEST(MinidumpUserStreamWriter, InitializeFromSnapshotNoData) { MinidumpFileWriter minidump_file_writer; auto user_stream_writer = base::WrapUnique(new MinidumpUserStreamWriter()); - const uint32_t kTestStreamId = 0x123456; auto stream = base::WrapUnique(new UserMinidumpStream(kTestStreamId, nullptr)); user_stream_writer->InitializeFromSnapshot(stream.get()); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(user_stream_writer))); + + StringFile string_file; + ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); + + ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY), + string_file.string().size()); + + MINIDUMP_LOCATION_DESCRIPTOR user_stream_location; + ASSERT_NO_FATAL_FAILURE(GetUserStream( + string_file.string(), &user_stream_location, kTestStreamId, 0u)); +} + +TEST(MinidumpUserStreamWriter, InitializeFromBufferNoData) { + MinidumpFileWriter minidump_file_writer; + auto user_stream_writer = base::WrapUnique(new MinidumpUserStreamWriter()); + user_stream_writer->InitializeFromBuffer(kTestStreamId, nullptr, 0); minidump_file_writer.AddStream(std::move(user_stream_writer)); StringFile string_file; @@ -67,14 +88,12 @@ MINIDUMP_LOCATION_DESCRIPTOR user_stream_location; ASSERT_NO_FATAL_FAILURE(GetUserStream( - string_file.string(), &user_stream_location, kTestStreamId)); - EXPECT_EQ(0u, user_stream_location.DataSize); + string_file.string(), &user_stream_location, kTestStreamId, 0u)); } -TEST(MinidumpUserStreamWriter, OneStream) { +TEST(MinidumpUserStreamWriter, InitializeFromSnapshotOneStream) { MinidumpFileWriter minidump_file_writer; auto user_stream_writer = base::WrapUnique(new MinidumpUserStreamWriter()); - const uint32_t kTestStreamId = 0x123456; TestMemorySnapshot* test_data = new TestMemorySnapshot(); test_data->SetAddress(97865); @@ -84,6 +103,30 @@ auto stream = base::WrapUnique(new UserMinidumpStream(kTestStreamId, test_data)); user_stream_writer->InitializeFromSnapshot(stream.get()); + ASSERT_TRUE(minidump_file_writer.AddStream(std::move(user_stream_writer))); + + StringFile string_file; + ASSERT_TRUE(minidump_file_writer.WriteEverything(&string_file)); + + ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + kStreamSize, + string_file.string().size()); + + MINIDUMP_LOCATION_DESCRIPTOR user_stream_location = {}; + ASSERT_NO_FATAL_FAILURE(GetUserStream( + string_file.string(), &user_stream_location, kTestStreamId, kStreamSize)); + const std::string stream_data = string_file.string().substr( + user_stream_location.Rva, user_stream_location.DataSize); + EXPECT_EQ(std::string(kStreamSize, 'c'), stream_data); +} + +TEST(MinidumpUserStreamWriter, InitializeFromBufferOneStream) { + MinidumpFileWriter minidump_file_writer; + auto user_stream_writer = base::WrapUnique(new MinidumpUserStreamWriter()); + + const size_t kStreamSize = 128; + std::vector<uint8_t> data(kStreamSize, 'c'); + user_stream_writer->InitializeFromBuffer( + kTestStreamId, &data[0], data.size()); minidump_file_writer.AddStream(std::move(user_stream_writer)); StringFile string_file; @@ -92,10 +135,9 @@ ASSERT_EQ(sizeof(MINIDUMP_HEADER) + sizeof(MINIDUMP_DIRECTORY) + kStreamSize, string_file.string().size()); - MINIDUMP_LOCATION_DESCRIPTOR user_stream_location; + MINIDUMP_LOCATION_DESCRIPTOR user_stream_location = {}; ASSERT_NO_FATAL_FAILURE(GetUserStream( - string_file.string(), &user_stream_location, kTestStreamId)); - EXPECT_EQ(kStreamSize, user_stream_location.DataSize); + string_file.string(), &user_stream_location, kTestStreamId, kStreamSize)); const std::string stream_data = string_file.string().substr( user_stream_location.Rva, user_stream_location.DataSize); EXPECT_EQ(std::string(kStreamSize, 'c'), stream_data);
diff --git a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc index 66c0591d..49ff172 100644 --- a/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc +++ b/third_party/crashpad/crashpad/minidump/test/minidump_writable_test_util.cc
@@ -14,6 +14,8 @@ #include "minidump/test/minidump_writable_test_util.h" +#include <stddef.h> + #include <string> #include "base/strings/string16.h"
diff --git a/third_party/crashpad/crashpad/snapshot/api/module_annotations_win_test.cc b/third_party/crashpad/crashpad/snapshot/api/module_annotations_win_test.cc index 30e880f3..ee02868 100644 --- a/third_party/crashpad/crashpad/snapshot/api/module_annotations_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/api/module_annotations_win_test.cc
@@ -28,7 +28,7 @@ void WinMultiprocessParent() override { // Read the child executable module. HMODULE module = nullptr; - CheckedReadFile(ReadPipeHandle(), &module, sizeof(module)); + CheckedReadFileExactly(ReadPipeHandle(), &module, sizeof(module)); // Reopen the child process with necessary access. HANDLE process_handle = @@ -70,7 +70,7 @@ // Wait until a signal from the parent process to terminate. char c; - CheckedReadFile(ReadPipeHandle(), &c, sizeof(c)); + CheckedReadFileExactly(ReadPipeHandle(), &c, sizeof(c)); } };
diff --git a/third_party/crashpad/crashpad/snapshot/cpu_context.cc b/third_party/crashpad/crashpad/snapshot/cpu_context.cc index c3887a2c..5c964480 100644 --- a/third_party/crashpad/crashpad/snapshot/cpu_context.cc +++ b/third_party/crashpad/crashpad/snapshot/cpu_context.cc
@@ -14,6 +14,7 @@ #include "snapshot/cpu_context.h" +#include <stddef.h> #include <string.h> #include "base/logging.h"
diff --git a/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc b/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc index ffc18cfe..6b94871b 100644 --- a/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc +++ b/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc
@@ -14,6 +14,7 @@ #include "snapshot/cpu_context.h" +#include <stddef.h> #include <string.h> #include <sys/types.h>
diff --git a/third_party/crashpad/crashpad/snapshot/mac/cpu_context_mac.cc b/third_party/crashpad/crashpad/snapshot/mac/cpu_context_mac.cc index 8dca246..c91e331 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/cpu_context_mac.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/cpu_context_mac.cc
@@ -14,6 +14,7 @@ #include "snapshot/mac/cpu_context_mac.h" +#include <stddef.h> #include <string.h> #include "base/logging.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc index 7a94eb2..50e646ae 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_annotations_reader_test.cc
@@ -245,7 +245,7 @@ // Wait for the child process to indicate that it’s done setting up its // annotations via the CrashpadInfo interface. char c; - CheckedReadFile(ReadPipeHandle(), &c, sizeof(c)); + CheckedReadFileExactly(ReadPipeHandle(), &c, sizeof(c)); // Verify the “simple map” annotations set via the CrashpadInfo interface. const std::vector<ProcessReader::Module>& modules = @@ -333,7 +333,7 @@ CheckedWriteFile(WritePipeHandle(), &c, sizeof(c)); // Wait for the parent to indicate that it’s safe to crash. - CheckedReadFile(ReadPipeHandle(), &c, sizeof(c)); + CheckedReadFileExactly(ReadPipeHandle(), &c, sizeof(c)); // Direct an exception message to the exception server running in the // parent.
diff --git a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h index 23904a5..16ad7e1 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h +++ b/third_party/crashpad/crashpad/snapshot/mac/module_snapshot_mac.h
@@ -37,7 +37,7 @@ namespace internal { //! \brief A ModuleSnapshot of a code module (binary image) loaded into a -//! running (or crashed) process on a Mac OS X system. +//! running (or crashed) process on a macOS system. class ModuleSnapshotMac final : public ModuleSnapshot { public: ModuleSnapshotMac();
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_reader.cc b/third_party/crashpad/crashpad/snapshot/mac/process_reader.cc index 46b83c1..46083ab3fa 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_reader.cc
@@ -116,7 +116,9 @@ return false; } - is_64_bit_ = process_info_.Is64Bit(); + if (!process_info_.Is64Bit(&is_64_bit_)) { + return false; + } task_memory_.reset(new TaskMemory(task)); task_ = task; @@ -125,6 +127,11 @@ return true; } +void ProcessReader::StartTime(timeval* start_time) const { + bool rv = process_info_.StartTime(start_time); + DCHECK(rv); +} + bool ProcessReader::CPUTimes(timeval* user_time, timeval* system_time) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_);
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_reader.h b/third_party/crashpad/crashpad/snapshot/mac/process_reader.h index c369611..72bd1dc 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_reader.h +++ b/third_party/crashpad/crashpad/snapshot/mac/process_reader.h
@@ -124,9 +124,7 @@ //! \brief Determines the target process’ start time. //! //! \param[out] start_time The time that the process started. - void StartTime(timeval* start_time) const { - process_info_.StartTime(start_time); - } + void StartTime(timeval* start_time) const; //! \brief Determines the target process’ execution time. //!
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_reader_test.cc b/third_party/crashpad/crashpad/snapshot/mac/process_reader_test.cc index e679d2ef..87fb639 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_reader_test.cc
@@ -105,7 +105,7 @@ FileHandle read_handle = ReadPipeHandle(); mach_vm_address_t address; - CheckedReadFile(read_handle, &address, sizeof(address)); + CheckedReadFileExactly(read_handle, &address, sizeof(address)); std::string read_string; ASSERT_TRUE(process_reader.Memory()->ReadCString(address, &read_string)); @@ -448,15 +448,15 @@ thread_index < thread_count_ + 1; ++thread_index) { uint64_t thread_id; - CheckedReadFile(read_handle, &thread_id, sizeof(thread_id)); + CheckedReadFileExactly(read_handle, &thread_id, sizeof(thread_id)); TestThreadPool::ThreadExpectation expectation; - CheckedReadFile(read_handle, - &expectation.stack_address, - sizeof(expectation.stack_address)); - CheckedReadFile(read_handle, - &expectation.suspend_count, - sizeof(expectation.suspend_count)); + CheckedReadFileExactly(read_handle, + &expectation.stack_address, + sizeof(expectation.stack_address)); + CheckedReadFileExactly(read_handle, + &expectation.suspend_count, + sizeof(expectation.suspend_count)); // There can’t be any duplicate thread IDs. EXPECT_EQ(0u, thread_map.count(thread_id)); @@ -730,7 +730,8 @@ FileHandle read_handle = ReadPipeHandle(); uint32_t expect_modules; - CheckedReadFile(read_handle, &expect_modules, sizeof(expect_modules)); + CheckedReadFileExactly( + read_handle, &expect_modules, sizeof(expect_modules)); ASSERT_EQ(expect_modules, modules.size()); @@ -740,16 +741,17 @@ "index %zu, name %s", index, modules[index].name.c_str())); uint32_t expect_name_length; - CheckedReadFile( + CheckedReadFileExactly( read_handle, &expect_name_length, sizeof(expect_name_length)); // The NUL terminator is not read. std::string expect_name(expect_name_length, '\0'); - CheckedReadFile(read_handle, &expect_name[0], expect_name_length); + CheckedReadFileExactly(read_handle, &expect_name[0], expect_name_length); EXPECT_EQ(expect_name, modules[index].name); mach_vm_address_t expect_address; - CheckedReadFile(read_handle, &expect_address, sizeof(expect_address)); + CheckedReadFileExactly( + read_handle, &expect_address, sizeof(expect_address)); ASSERT_TRUE(modules[index].reader); EXPECT_EQ(expect_address, modules[index].reader->Address());
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc b/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc index 33e3a7ec..c896ebf 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc
@@ -14,6 +14,7 @@ #include "snapshot/mac/process_types.h" +#include <stddef.h> #include <string.h> #include <sys/types.h>
diff --git a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc index b65a9e08..135fe98e 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc
@@ -14,6 +14,7 @@ #include "snapshot/mac/system_snapshot_mac.h" +#include <stddef.h> #include <sys/sysctl.h> #include <sys/types.h> #include <sys/utsname.h>
diff --git a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.h b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.h index 0f18a48..2ac2ef90 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.h +++ b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.h
@@ -29,8 +29,7 @@ namespace internal { -//! \brief A SystemSnapshot of the running system, when the system runs Mac OS -//! X. +//! \brief A SystemSnapshot of the running system, when the system runs macOS. class SystemSnapshotMac final : public SystemSnapshot { public: SystemSnapshotMac();
diff --git a/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp b/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp index 4ca9f4d5..b31b0601 100644 --- a/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp +++ b/third_party/crashpad/crashpad/snapshot/snapshot_test.gyp
@@ -57,9 +57,9 @@ 'snapshot.gyp:crashpad_snapshot_api', '../client/client.gyp:crashpad_client', '../compat/compat.gyp:crashpad_compat', + '../test/test.gyp:crashpad_gtest_main', '../test/test.gyp:crashpad_test', '../third_party/gtest/gtest.gyp:gtest', - '../third_party/gtest/gtest.gyp:gtest_main', '../third_party/mini_chromium/mini_chromium.gyp:base', '../util/util.gyp:crashpad_util', ],
diff --git a/third_party/crashpad/crashpad/snapshot/win/cpu_context_win.cc b/third_party/crashpad/crashpad/snapshot/win/cpu_context_win.cc index cc66e1c..1a76c6d 100644 --- a/third_party/crashpad/crashpad/snapshot/win/cpu_context_win.cc +++ b/third_party/crashpad/crashpad/snapshot/win/cpu_context_win.cc
@@ -14,6 +14,7 @@ #include "snapshot/win/cpu_context_win.h" +#include <stddef.h> #include <stdint.h> #include <string.h>
diff --git a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc index 58b145e..e6875fdd 100644 --- a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc +++ b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_extra_memory_ranges.cc
@@ -43,7 +43,7 @@ HANDLE in = GetStdHandle(STD_INPUT_HANDLE); PCHECK(in != INVALID_HANDLE_VALUE) << "GetStdHandle"; - CheckedReadFile(in, &c, sizeof(c)); + CheckedReadFileExactly(in, &c, sizeof(c)); CHECK(c == 'd' || c == ' '); // If 'd' we crash with a debug break, otherwise exit normally.
diff --git a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_simple_annotations.cc b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_simple_annotations.cc index b66a19e1..11e7b4e 100644 --- a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_simple_annotations.cc +++ b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_simple_annotations.cc
@@ -42,7 +42,7 @@ HANDLE in = GetStdHandle(STD_INPUT_HANDLE); PCHECK(in != INVALID_HANDLE_VALUE) << "GetStdHandle"; - crashpad::CheckedReadFile(in, &c, sizeof(c)); + crashpad::CheckedReadFileExactly(in, &c, sizeof(c)); CHECK(c == 'd' || c == ' '); // If 'd' we crash with a debug break, otherwise exit normally.
diff --git a/third_party/crashpad/crashpad/snapshot/win/exception_snapshot_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/exception_snapshot_win_test.cc index af0cc3a..03aa049 100644 --- a/third_party/crashpad/crashpad/snapshot/win/exception_snapshot_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/exception_snapshot_win_test.cc
@@ -148,9 +148,9 @@ // The child tells us (approximately) where it will crash. WinVMAddress break_near_address; - LoggingReadFile(child.stdout_read_handle(), - &break_near_address, - sizeof(break_near_address)); + LoggingReadFileExactly(child.stdout_read_handle(), + &break_near_address, + sizeof(break_near_address)); delegate.set_break_near(break_near_address); // Wait for the child to crash and the exception information to be validated. @@ -250,9 +250,9 @@ // The child tells us (approximately) where it will capture a dump. WinVMAddress dump_near_address; - LoggingReadFile(child.stdout_read_handle(), - &dump_near_address, - sizeof(dump_near_address)); + LoggingReadFileExactly(child.stdout_read_handle(), + &dump_near_address, + sizeof(dump_near_address)); delegate.set_dump_near(dump_near_address); // Wait for the child to crash and the exception information to be validated.
diff --git a/third_party/crashpad/crashpad/snapshot/win/extra_memory_ranges_test.cc b/third_party/crashpad/crashpad/snapshot/win/extra_memory_ranges_test.cc index d6d5659..57d41bb 100644 --- a/third_party/crashpad/crashpad/snapshot/win/extra_memory_ranges_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/extra_memory_ranges_test.cc
@@ -58,7 +58,7 @@ // Wait for the child process to indicate that it's done setting up its // annotations via the CrashpadInfo interface. char c; - CheckedReadFile(child.stdout_read_handle(), &c, sizeof(c)); + CheckedReadFileExactly(child.stdout_read_handle(), &c, sizeof(c)); ProcessSnapshotWin snapshot; ASSERT_TRUE(snapshot.Initialize(
diff --git a/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader_test.cc b/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader_test.cc index 523a449..f791f80e 100644 --- a/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader_test.cc
@@ -62,7 +62,7 @@ // Wait for the child process to indicate that it's done setting up its // annotations via the CrashpadInfo interface. char c; - CheckedReadFile(child.stdout_read_handle(), &c, sizeof(c)); + CheckedReadFileExactly(child.stdout_read_handle(), &c, sizeof(c)); ProcessReaderWin process_reader; ASSERT_TRUE(process_reader.Initialize(child.process_handle(),
diff --git a/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc b/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc index f7e8e51d..342021a 100644 --- a/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc
@@ -14,6 +14,7 @@ #include "snapshot/win/pe_image_reader.h" +#include <stddef.h> #include <string.h> #include <memory>
diff --git a/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc index b9befc9a..af57c622 100644 --- a/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc
@@ -69,7 +69,7 @@ #endif WinVMAddress address; - CheckedReadFile(ReadPipeHandle(), &address, sizeof(address)); + CheckedReadFileExactly(ReadPipeHandle(), &address, sizeof(address)); char buffer[sizeof(kTestMemory)]; ASSERT_TRUE( @@ -142,7 +142,7 @@ void WinMultiprocessParent() override { char c; - CheckedReadFile(ReadPipeHandle(), &c, sizeof(c)); + CheckedReadFileExactly(ReadPipeHandle(), &c, sizeof(c)); ASSERT_EQ(' ', c); {
diff --git a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc index 11e83145..7a18dbef 100644 --- a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc +++ b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc
@@ -14,6 +14,8 @@ #include "snapshot/win/process_snapshot_win.h" +#include <stddef.h> + #include <algorithm> #include "base/logging.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win_test.cc index a3e31a4..82b29035 100644 --- a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win_test.cc
@@ -48,7 +48,8 @@ child.Start(); char c; - ASSERT_TRUE(LoggingReadFile(child.stdout_read_handle(), &c, sizeof(c))); + ASSERT_TRUE( + LoggingReadFileExactly(child.stdout_read_handle(), &c, sizeof(c))); ASSERT_EQ(' ', c); ScopedProcessSuspend suspend(child.process_handle());
diff --git a/third_party/crashpad/crashpad/test/gmock_main.cc b/third_party/crashpad/crashpad/test/gmock_main.cc new file mode 100644 index 0000000..05492817 --- /dev/null +++ b/third_party/crashpad/crashpad/test/gmock_main.cc
@@ -0,0 +1,23 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "test/main_arguments.h" + +int main(int argc, char* argv[]) { + crashpad::test::InitializeMainArguments(argc, argv); + testing::InitGoogleMock(&argc, argv); + return RUN_ALL_TESTS(); +}
diff --git a/third_party/crashpad/crashpad/test/gtest_main.cc b/third_party/crashpad/crashpad/test/gtest_main.cc new file mode 100644 index 0000000..5608d2c --- /dev/null +++ b/third_party/crashpad/crashpad/test/gtest_main.cc
@@ -0,0 +1,22 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gtest/gtest.h" +#include "test/main_arguments.h" + +int main(int argc, char* argv[]) { + crashpad::test::InitializeMainArguments(argc, argv); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}
diff --git a/third_party/crashpad/crashpad/test/main_arguments.cc b/third_party/crashpad/crashpad/test/main_arguments.cc new file mode 100644 index 0000000..c28d2fa3 --- /dev/null +++ b/third_party/crashpad/crashpad/test/main_arguments.cc
@@ -0,0 +1,38 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "test/main_arguments.h" + +#include "base/logging.h" + +namespace crashpad { +namespace test { + +const std::vector<std::string>* g_arguments; + +void InitializeMainArguments(int argc, char* argv[]) { + CHECK(!g_arguments); + CHECK(argc); + CHECK(argv); + + g_arguments = new const std::vector<std::string>(argv, argv + argc); +} + +const std::vector<std::string>& GetMainArguments() { + CHECK(g_arguments); + return *g_arguments; +} + +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/test/main_arguments.h b/third_party/crashpad/crashpad/test/main_arguments.h new file mode 100644 index 0000000..d6c4d5c8 --- /dev/null +++ b/third_party/crashpad/crashpad/test/main_arguments.h
@@ -0,0 +1,49 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_TEST_MAIN_ARGUMENTS_H_ +#define CRASHPAD_TEST_MAIN_ARGUMENTS_H_ + +#include <string> +#include <vector> + +namespace crashpad { +namespace test { + +//! \brief Saves the arguments to `main()` for later use. +//! +//! Call this function from a test program’s `main()` function so that tests +//! that require access to these variables can retrieve them from +//! GetMainArguments(). +//! +//! The contents of \a argv, limited to \a argc elements, will be copied, so +//! that subsequent modifications to these variables by `main()` will not affect +//! the state returned by GetMainArguments(). +//! +//! This function must be called exactly once during the lifetime of a test +//! program. +void InitializeMainArguments(int argc, char* argv[]); + +//! \brief Retrieves pointers to the arguments to `main()`. +//! +//! Tests that need to access the original values of a test program’s `main()` +//! function’s parameters at process creation can use this function to retrieve +//! them, provided that `main()` called InitializeMainArguments() before making +//! any changes to its arguments. +const std::vector<std::string>& GetMainArguments(); + +} // namespace test +} // namespace crashpad + +#endif // CRASHPAD_TEST_MAIN_ARGUMENTS_H_
diff --git a/third_party/crashpad/crashpad/test/main_arguments_test.cc b/third_party/crashpad/crashpad/test/main_arguments_test.cc new file mode 100644 index 0000000..85d1598 --- /dev/null +++ b/third_party/crashpad/crashpad/test/main_arguments_test.cc
@@ -0,0 +1,34 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "test/main_arguments.h" + +#include "gtest/gtest.h" + +namespace crashpad { +namespace test { +namespace { + +TEST(MainArguments, GetMainArguments) { + // Make sure that InitializeMainArguments() has been called and that + // GetMainArguments() provides reasonable values. + const std::vector<std::string>& arguments = GetMainArguments(); + + ASSERT_FALSE(arguments.empty()); + EXPECT_FALSE(arguments[0].empty()); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/test/multiprocess_exec_test.cc b/third_party/crashpad/crashpad/test/multiprocess_exec_test.cc index f6231e9c..3e958aa8 100644 --- a/third_party/crashpad/crashpad/test/multiprocess_exec_test.cc +++ b/third_party/crashpad/crashpad/test/multiprocess_exec_test.cc
@@ -39,7 +39,7 @@ char c = 'z'; ASSERT_TRUE(LoggingWriteFile(WritePipeHandle(), &c, 1)); - ASSERT_TRUE(LoggingReadFile(ReadPipeHandle(), &c, 1)); + ASSERT_TRUE(LoggingReadFileExactly(ReadPipeHandle(), &c, 1)); EXPECT_EQ('Z', c); }
diff --git a/third_party/crashpad/crashpad/test/multiprocess_posix_test.cc b/third_party/crashpad/crashpad/test/multiprocess_posix_test.cc index be927111..9f557fa 100644 --- a/third_party/crashpad/crashpad/test/multiprocess_posix_test.cc +++ b/third_party/crashpad/crashpad/test/multiprocess_posix_test.cc
@@ -39,11 +39,11 @@ void MultiprocessParent() override { FileHandle read_handle = ReadPipeHandle(); char c; - CheckedReadFile(read_handle, &c, 1); + CheckedReadFileExactly(read_handle, &c, 1); EXPECT_EQ('M', c); pid_t pid; - CheckedReadFile(read_handle, &pid, sizeof(pid)); + CheckedReadFileExactly(read_handle, &pid, sizeof(pid)); EXPECT_EQ(pid, ChildPID()); c = 'm'; @@ -63,7 +63,7 @@ pid_t pid = getpid(); CheckedWriteFile(write_handle, &pid, sizeof(pid)); - CheckedReadFile(ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(ReadPipeHandle(), &c, 1); EXPECT_EQ('m', c); }
diff --git a/third_party/crashpad/crashpad/test/test.gyp b/third_party/crashpad/crashpad/test/test.gyp index d84ff64..eb0a28b 100644 --- a/third_party/crashpad/crashpad/test/test.gyp +++ b/third_party/crashpad/crashpad/test/test.gyp
@@ -42,6 +42,8 @@ 'mac/mach_errors.h', 'mac/mach_multiprocess.cc', 'mac/mach_multiprocess.h', + 'main_arguments.cc', + 'main_arguments.h', 'multiprocess.h', 'multiprocess_exec.h', 'multiprocess_exec_posix.cc', @@ -63,6 +65,11 @@ 'win/win_multiprocess.cc', 'win/win_multiprocess.h', ], + 'direct_dependent_settings': { + 'include_dirs': [ + '..', + ], + }, 'conditions': [ ['OS=="mac"', { 'link_settings': { @@ -87,5 +94,28 @@ }], ], }, + { + 'target_name': 'crashpad_gtest_main', + 'type': 'static_library', + 'dependencies': [ + 'crashpad_test', + '../third_party/gtest/gtest.gyp:gtest', + ], + 'sources': [ + 'gtest_main.cc', + ], + }, + { + 'target_name': 'crashpad_gmock_main', + 'type': 'static_library', + 'dependencies': [ + 'crashpad_test', + '../third_party/gtest/gmock.gyp:gmock', + '../third_party/gtest/gtest.gyp:gtest', + ], + 'sources': [ + 'gmock_main.cc', + ], + }, ], }
diff --git a/third_party/crashpad/crashpad/test/test_test.gyp b/third_party/crashpad/crashpad/test/test_test.gyp index 2c58c17..053d9c8 100644 --- a/third_party/crashpad/crashpad/test/test_test.gyp +++ b/third_party/crashpad/crashpad/test/test_test.gyp
@@ -22,10 +22,10 @@ 'type': 'executable', 'dependencies': [ 'crashpad_test_test_multiprocess_exec_test_child', + 'test.gyp:crashpad_gmock_main', 'test.gyp:crashpad_test', '../compat/compat.gyp:crashpad_compat', '../third_party/gtest/gmock.gyp:gmock', - '../third_party/gtest/gmock.gyp:gmock_main', '../third_party/gtest/gtest.gyp:gtest', '../third_party/mini_chromium/mini_chromium.gyp:base', '../util/util.gyp:crashpad_util', @@ -36,6 +36,7 @@ 'sources': [ 'hex_string_test.cc', 'mac/mach_multiprocess_test.cc', + 'main_arguments_test.cc', 'multiprocess_exec_test.cc', 'multiprocess_posix_test.cc', 'paths_test.cc',
diff --git a/third_party/crashpad/crashpad/test/win/win_child_process.cc b/third_party/crashpad/crashpad/test/win/win_child_process.cc index 156aa6dc..06ab21b 100644 --- a/third_party/crashpad/crashpad/test/win/win_child_process.cc +++ b/third_party/crashpad/crashpad/test/win/win_child_process.cc
@@ -203,7 +203,7 @@ // immediately, and test code expects process initialization to have // completed so it can, for example, read the process memory. char c; - if (!LoggingReadFile(handles_for_parent->read.get(), &c, sizeof(c))) { + if (!LoggingReadFileExactly(handles_for_parent->read.get(), &c, sizeof(c))) { ADD_FAILURE() << "LoggedReadFile"; return std::unique_ptr<Handles>(); }
diff --git a/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp b/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp index 466de6a..a6600708 100644 --- a/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp +++ b/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp
@@ -104,7 +104,7 @@ ], }, }], - ['OS=="linux"', { + ['OS=="linux" or OS=="android"', { 'cflags': [ '-Wno-inconsistent-missing-override', '-Wno-unknown-warning-option',
diff --git a/third_party/crashpad/crashpad/tools/crashpad_database_util.cc b/third_party/crashpad/crashpad/tools/crashpad_database_util.cc index e7d89bc4..b2c4cb49 100644 --- a/third_party/crashpad/crashpad/tools/crashpad_database_util.cc +++ b/third_party/crashpad/crashpad/tools/crashpad_database_util.cc
@@ -560,13 +560,21 @@ return EXIT_FAILURE; } + bool used_stdin = false; for (const base::FilePath new_report_path : options.new_report_paths) { std::unique_ptr<FileReaderInterface> file_reader; - bool is_stdin = false; if (new_report_path.value() == FILE_PATH_LITERAL("-")) { - is_stdin = true; - file_reader.reset(new WeakStdioFileReader(stdin)); + if (used_stdin) { + fprintf(stderr, + "%" PRFilePath + ": Only one --new-report may be read from standard input\n", + me.value().c_str()); + return EXIT_FAILURE; + } + used_stdin = true; + file_reader.reset(new WeakFileHandleFileReader( + StdioFileHandle(StdioStream::kStandardInput))); } else { std::unique_ptr<FileReader> file_path_reader(new FileReader()); if (!file_path_reader->Open(new_report_path)) { @@ -597,7 +605,7 @@ !LoggingWriteFile(new_report->handle, buf, read_result)) { return EXIT_FAILURE; } - } while (read_result == sizeof(buf)); + } while (read_result > 0); call_error_writing_crash_report.Disarm(); @@ -607,13 +615,6 @@ return EXIT_FAILURE; } - file_reader.reset(); - if (is_stdin) { - if (fclose(stdin) == EOF) { - STDIO_PLOG(ERROR) << "fclose"; - } - } - const char* prefix = (show_operations > 1) ? "New report ID: " : ""; printf("%s%s\n", prefix, uuid.ToString().c_str()); }
diff --git a/third_party/crashpad/crashpad/tools/crashpad_http_upload.cc b/third_party/crashpad/crashpad/tools/crashpad_http_upload.cc index 55ab955..d4ec3f9c 100644 --- a/third_party/crashpad/crashpad/tools/crashpad_http_upload.cc +++ b/third_party/crashpad/crashpad/tools/crashpad_http_upload.cc
@@ -163,7 +163,8 @@ return EXIT_FAILURE; } } else { - file_writer.reset(new WeakStdioFileWriter(stdout)); + file_writer.reset(new WeakFileHandleFileWriter( + StdioFileHandle(StdioStream::kStandardOutput))); } http_multipart_builder.SetGzipEnabled(options.upload_gzip);
diff --git a/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc b/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc new file mode 100644 index 0000000..a55c2a7c --- /dev/null +++ b/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc
@@ -0,0 +1,109 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/file/delimited_file_reader.h" + +#include <sys/types.h> + +#include <algorithm> +#include <limits> + +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" + +namespace crashpad { + +DelimitedFileReader::DelimitedFileReader(FileReaderInterface* file_reader) + : file_reader_(file_reader), buf_pos_(0), buf_len_(0), eof_(false) { + static_assert(sizeof(buf_) <= std::numeric_limits<decltype(buf_pos_)>::max(), + "buf_pos_ must cover buf_"); + static_assert(sizeof(buf_) <= std::numeric_limits<decltype(buf_len_)>::max(), + "buf_len_ must cover buf_"); +} + +DelimitedFileReader::~DelimitedFileReader() {} + +DelimitedFileReader::Result DelimitedFileReader::GetDelim(char delimiter, + std::string* field) { + if (eof_) { + DCHECK_EQ(buf_pos_, buf_len_); + + // Allow subsequent calls to attempt to read more data from the file. If the + // file is still at EOF in the future, the read will return 0 and cause + // kEndOfFile to be returned anyway. + eof_ = false; + + return Result::kEndOfFile; + } + + std::string local_field; + while (true) { + if (buf_pos_ == buf_len_) { + // buf_ is empty. Refill it. + FileOperationResult read_result = file_reader_->Read(buf_, sizeof(buf_)); + if (read_result < 0) { + return Result::kError; + } else if (read_result == 0) { + if (!local_field.empty()) { + // The file ended with a field that wasn’t terminated by a delimiter + // character. + // + // This is EOF, but EOF can’t be returned because there’s a field that + // needs to be returned to the caller. Cache the detected EOF so it + // can be returned next time. This is done to support proper semantics + // for weird “files” like terminal input that can reach EOF and then + // “grow”, allowing subsequent reads past EOF to block while waiting + // for more data. Once EOF is detected by a read that returns 0, that + // EOF signal should propagate to the caller before attempting a new + // read. Here, it will be returned on the next call to this method + // without attempting to read more data. + eof_ = true; + field->swap(local_field); + return Result::kSuccess; + } + return Result::kEndOfFile; + } + + DCHECK_LE(static_cast<size_t>(read_result), arraysize(buf_)); + DCHECK( + base::IsValueInRangeForNumericType<decltype(buf_len_)>(read_result)); + buf_len_ = static_cast<decltype(buf_len_)>(read_result); + buf_pos_ = 0; + } + + const char* const start = buf_ + buf_pos_; + const char* const end = buf_ + buf_len_; + const char* const found = std::find(start, end, delimiter); + + local_field.append(start, found); + buf_pos_ = static_cast<decltype(buf_pos_)>(found - buf_); + DCHECK_LE(buf_pos_, buf_len_); + + if (found != end) { + // A real delimiter character was found. Append it to the field being + // built and return it. + local_field.push_back(delimiter); + ++buf_pos_; + DCHECK_LE(buf_pos_, buf_len_); + field->swap(local_field); + return Result::kSuccess; + } + } +} + +DelimitedFileReader::Result DelimitedFileReader::GetLine(std::string* line) { + return GetDelim('\n', line); +} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/delimited_file_reader.h b/third_party/crashpad/crashpad/util/file/delimited_file_reader.h new file mode 100644 index 0000000..93fd7380 --- /dev/null +++ b/third_party/crashpad/crashpad/util/file/delimited_file_reader.h
@@ -0,0 +1,93 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_ +#define CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_ + +#include <stdint.h> + +#include <string> + +#include "base/macros.h" +#include "util/file/file_reader.h" + +namespace crashpad { + +//! \brief Reads a file one field or line at a time. +//! +//! The file is interpreted as a series of fields separated by delimiter +//! characters. When the delimiter character is the newline character +//! (<code>'\\n'</code>), the file is interpreted as a series of lines. +//! +//! It is safe to mix GetDelim() and GetLine() calls, if appropriate for the +//! format being interpreted. +//! +//! This is a replacement for the standard library’s `getdelim()` and +//! `getline()` functions, adapted to work with FileReaderInterface objects +//! instead of `FILE*` streams. +class DelimitedFileReader { + public: + //! \brief The result of a GetDelim() or GetLine() call. + enum class Result { + //! \brief An error occurred, and a message was logged. + kError = -1, + + //! \brief A field or line was read from the file. + kSuccess, + + //! \brief The end of the file was encountered. + kEndOfFile, + }; + + explicit DelimitedFileReader(FileReaderInterface* file_reader); + ~DelimitedFileReader(); + + //! \brief Reads a single field from the file. + //! + //! \param[in] delimiter The delimiter character that terminates the field. + //! It is safe to call this method multiple times while changing the value + //! of this parameter, if appropriate for the format being interpreted. + //! \param[out] field The field read from the file. This parameter will + //! include the field’s terminating delimiter character unless the field + //! was at the end of the file and was read without such a character. + //! This parameter will not be empty. + //! + //! \return a #Result value. \a field is only valid when Result::kSuccess is + //! returned. + Result GetDelim(char delimiter, std::string* field); + + //! \brief Reads a single line from the file. + //! + //! \param[out] line The line read from the file. This parameter will include + //! the line terminating delimiter character unless the line was at the + //! end of the file and was read without such a character. This parameter + //! will not be empty. + //! + //! \return a #Result value. \a line is only valid when Result::kSuccess is + //! returned. + Result GetLine(std::string* line); + + private: + char buf_[4096]; + FileReaderInterface* file_reader_; // weak + uint16_t buf_pos_; // Index into buf_ of the start of the next field. + uint16_t buf_len_; // The size of buf_ that’s been filled. + bool eof_; // Caches the EOF signal when detected following a partial field. + + DISALLOW_COPY_AND_ASSIGN(DelimitedFileReader); +}; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_FILE_DELIMITED_FILE_READER_H_
diff --git a/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc b/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc new file mode 100644 index 0000000..63b5083 --- /dev/null +++ b/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc
@@ -0,0 +1,363 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/file/delimited_file_reader.h" + +#include <vector> + +#include "base/format_macros.h" +#include "base/strings/stringprintf.h" +#include "gtest/gtest.h" +#include "util/file/string_file.h" + +namespace crashpad { +namespace test { +namespace { + +TEST(DelimitedFileReader, EmptyFile) { + StringFile string_file; + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, EmptyOneLineFile) { + StringFile string_file; + string_file.SetString("\n"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(string_file.string(), line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, SmallOneLineFile) { + StringFile string_file; + string_file.SetString("one line\n"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(string_file.string(), line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, SmallOneLineFileWithoutNewline) { + StringFile string_file; + string_file.SetString("no newline"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(string_file.string(), line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, SmallMultiLineFile) { + StringFile string_file; + string_file.SetString("first\nsecond line\n3rd\n"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("first\n", line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("second line\n", line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("3rd\n", line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, SmallMultiFieldFile) { + StringFile string_file; + string_file.SetString("first,second field\ntwo lines,3rd,"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string field; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim(',', &field)); + EXPECT_EQ("first,", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim(',', &field)); + EXPECT_EQ("second field\ntwo lines,", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim(',', &field)); + EXPECT_EQ("3rd,", field); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetDelim(',', &field)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetDelim(',', &field)); +} + +TEST(DelimitedFileReader, SmallMultiFieldFile_MixedDelimiters) { + StringFile string_file; + string_file.SetString("first,second, still 2nd\t3rd\nalso\tnewline\n55555$"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string field; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim(',', &field)); + EXPECT_EQ("first,", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('\t', &field)); + EXPECT_EQ("second, still 2nd\t", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&field)); + EXPECT_EQ("3rd\n", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('\n', &field)); + EXPECT_EQ("also\tnewline\n", field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('$', &field)); + EXPECT_EQ("55555$", field); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetDelim('?', &field)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&field)); +} + +TEST(DelimitedFileReader, EmptyLineMultiLineFile) { + StringFile string_file; + string_file.SetString("first\n\n\n4444\n"); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("first\n", line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("\n", line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("\n", line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ("4444\n", line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, LongOneLineFile) { + std::string contents(50000, '!'); + contents[1] = '?'; + contents.push_back('\n'); + + StringFile string_file; + string_file.SetString(contents); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(contents, line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +void TestLongMultiLineFile(int base_length) { + std::vector<std::string> lines; + std::string contents; + for (size_t line_index = 0; line_index <= 'z' - 'a'; ++line_index) { + char c = 'a' + static_cast<char>(line_index); + + // Mix up the lengths a little. + std::string line(base_length + line_index * ((line_index % 3) - 1), c); + + // Mix up the data a little too. + ASSERT_LT(line_index, line.size()); + line[line_index] -= ('a' - 'A'); + + line.push_back('\n'); + contents.append(line); + lines.push_back(line); + } + + StringFile string_file; + string_file.SetString(contents); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + for (size_t line_index = 0; line_index < lines.size(); ++line_index) { + SCOPED_TRACE(base::StringPrintf("line_index %" PRIuS, line_index)); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(lines[line_index], line); + } + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, LongMultiLineFile) { + TestLongMultiLineFile(500); +} + +TEST(DelimitedFileReader, ReallyLongMultiLineFile) { + TestLongMultiLineFile(5000); +} + +TEST(DelimitedFileReader, EmbeddedNUL) { + const char kString[] = "embedded\0NUL\n"; + StringFile string_file; + string_file.SetString(std::string(kString, arraysize(kString) - 1)); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(string_file.string(), line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); +} + +TEST(DelimitedFileReader, NULDelimiter) { + const char kString[] = "aa\0b\0ccc\0"; + StringFile string_file; + string_file.SetString(std::string(kString, arraysize(kString) - 1)); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string field; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('\0', &field)); + EXPECT_EQ(std::string("aa\0", 3), field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('\0', &field)); + EXPECT_EQ(std::string("b\0", 2), field); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetDelim('\0', &field)); + EXPECT_EQ(std::string("ccc\0", 4), field); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetDelim('\0', &field)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetDelim('\0', &field)); +} + +TEST(DelimitedFileReader, EdgeCases) { + const size_t kSizes[] = {4094, 4095, 4096, 4097, 8190, 8191, 8192, 8193}; + for (size_t index = 0; index < arraysize(kSizes); ++index) { + size_t size = kSizes[index]; + SCOPED_TRACE( + base::StringPrintf("index %" PRIuS ", size %" PRIuS, index, size)); + + std::string line_0(size, '$'); + line_0.push_back('\n'); + + StringFile string_file; + string_file.SetString(line_0); + DelimitedFileReader delimited_file_reader(&string_file); + + std::string line; + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(line_0, line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + std::string line_1(size, '@'); + line_1.push_back('\n'); + + string_file.SetString(line_0 + line_1); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(line_0, line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(line_1, line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + line_1[size] = '?'; + + string_file.SetString(line_0 + line_1); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(line_0, line); + ASSERT_EQ(DelimitedFileReader::Result::kSuccess, + delimited_file_reader.GetLine(&line)); + EXPECT_EQ(line_1, line); + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + + // The file is still at EOF. + EXPECT_EQ(DelimitedFileReader::Result::kEndOfFile, + delimited_file_reader.GetLine(&line)); + } +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_io.cc b/third_party/crashpad/crashpad/util/file/file_io.cc index 98eb340..6cae837 100644 --- a/third_party/crashpad/crashpad/util/file/file_io.cc +++ b/third_party/crashpad/crashpad/util/file/file_io.cc
@@ -15,42 +15,131 @@ #include "util/file/file_io.h" #include "base/logging.h" +#include "base/macros.h" #include "base/numerics/safe_conversions.h" namespace crashpad { -bool LoggingReadFile(FileHandle file, void* buffer, size_t size) { - FileOperationResult expect = base::checked_cast<FileOperationResult>(size); - FileOperationResult rv = ReadFile(file, buffer, size); - if (rv < 0) { - PLOG(ERROR) << "read"; - return false; +namespace { + +class FileIOReadExactly final : public internal::ReadExactlyInternal { + public: + explicit FileIOReadExactly(FileHandle file) + : ReadExactlyInternal(), file_(file) {} + ~FileIOReadExactly() {} + + private: + // ReadExactlyInternal: + FileOperationResult Read(void* buffer, size_t size, bool can_log) override { + FileOperationResult rv = ReadFile(file_, buffer, size); + if (rv < 0) { + PLOG_IF(ERROR, can_log) << internal::kNativeReadFunctionName; + return -1; + } + return rv; } - if (rv != expect) { - LOG(ERROR) << "read: expected " << expect << ", observed " << rv; + + FileHandle file_; + + DISALLOW_COPY_AND_ASSIGN(FileIOReadExactly); +}; + +class FileIOWriteAll final : public internal::WriteAllInternal { + public: + explicit FileIOWriteAll(FileHandle file) : WriteAllInternal(), file_(file) {} + ~FileIOWriteAll() {} + + private: + // WriteAllInternal: + FileOperationResult Write(const void* buffer, size_t size) override { + return internal::NativeWriteFile(file_, buffer, size); + } + + FileHandle file_; + + DISALLOW_COPY_AND_ASSIGN(FileIOWriteAll); +}; + +} // namespace + +namespace internal { + +bool ReadExactlyInternal::ReadExactly(void* buffer, size_t size, bool can_log) { + char* buffer_c = static_cast<char*>(buffer); + size_t total_bytes = 0; + size_t remaining = size; + while (remaining > 0) { + FileOperationResult bytes_read = Read(buffer_c, remaining, can_log); + if (bytes_read < 0) { + return false; + } + + DCHECK_LE(static_cast<size_t>(bytes_read), remaining); + + if (bytes_read == 0) { + break; + } + + buffer_c += bytes_read; + remaining -= bytes_read; + total_bytes += bytes_read; + } + + if (total_bytes != size) { + LOG_IF(ERROR, can_log) << "ReadExactly: expected " << size << ", observed " + << total_bytes; return false; } return true; } +bool WriteAllInternal::WriteAll(const void* buffer, size_t size) { + const char* buffer_c = static_cast<const char*>(buffer); + + while (size > 0) { + FileOperationResult bytes_written = Write(buffer_c, size); + if (bytes_written < 0) { + return false; + } + + DCHECK_NE(bytes_written, 0); + + buffer_c += bytes_written; + size -= bytes_written; + } + + return true; +} + +} // namespace internal + +bool ReadFileExactly(FileHandle file, void* buffer, size_t size) { + FileIOReadExactly read_exactly(file); + return read_exactly.ReadExactly(buffer, size, false); +} + +bool LoggingReadFileExactly(FileHandle file, void* buffer, size_t size) { + FileIOReadExactly read_exactly(file); + return read_exactly.ReadExactly(buffer, size, true); +} + +bool WriteFile(FileHandle file, const void* buffer, size_t size) { + FileIOWriteAll write_all(file); + return write_all.WriteAll(buffer, size); +} + bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size) { - FileOperationResult expect = base::checked_cast<FileOperationResult>(size); - FileOperationResult rv = WriteFile(file, buffer, size); - if (rv < 0) { - PLOG(ERROR) << "write"; - return false; - } - if (rv != expect) { - LOG(ERROR) << "write: expected " << expect << ", observed " << rv; + if (!WriteFile(file, buffer, size)) { + PLOG(ERROR) << internal::kNativeWriteFunctionName; return false; } return true; } -void CheckedReadFile(FileHandle file, void* buffer, size_t size) { - CHECK(LoggingReadFile(file, buffer, size)); +void CheckedReadFileExactly(FileHandle file, void* buffer, size_t size) { + CHECK(LoggingReadFileExactly(file, buffer, size)); } void CheckedWriteFile(FileHandle file, const void* buffer, size_t size) { @@ -61,9 +150,9 @@ char c; FileOperationResult rv = ReadFile(file, &c, 1); if (rv < 0) { - PCHECK(rv == 0) << "read"; + PCHECK(rv == 0) << internal::kNativeReadFunctionName; } else { - CHECK_EQ(rv, 0) << "read"; + CHECK_EQ(rv, 0) << internal::kNativeReadFunctionName; } }
diff --git a/third_party/crashpad/crashpad/util/file/file_io.h b/third_party/crashpad/crashpad/util/file/file_io.h index ff20488..87c4070 100644 --- a/third_party/crashpad/crashpad/util/file/file_io.h +++ b/third_party/crashpad/crashpad/util/file/file_io.h
@@ -26,27 +26,6 @@ #include "util/win/scoped_handle.h" #endif -//! \file - -#if defined(OS_POSIX) || DOXYGEN - -//! \brief A `PLOG()` macro usable for standard input/output error conditions. -//! -//! The `PLOG()` macro uses `errno` on POSIX and is appropriate to report -//! errors from standard input/output functions. On Windows, `PLOG()` uses -//! `GetLastError()`, and cannot be used to report errors from standard -//! input/output functions. This macro uses `PLOG()` when appropriate for -//! standard I/O functions, and `LOG()` otherwise. -#define STDIO_PLOG(x) PLOG(x) - -#else - -#define STDIO_PLOG(x) LOG(x) -#define fseeko(file, offset, whence) _fseeki64(file, offset, whence) -#define ftello(file) _ftelli64(file) - -#endif - namespace base { class FilePath; } // namespace base @@ -114,82 +93,205 @@ kExclusive, }; -//! \brief Reads from a file, retrying when interrupted on POSIX or following a -//! short read. +//! \brief Determines the FileHandle that StdioFileHandle() returns. +enum class StdioStream { + //! \brief Standard input, or `stdin`. + kStandardInput, + + //! \brief Standard output, or `stdout`. + kStandardOutput, + + //! \brief Standard error, or `stderr`. + kStandardError, +}; + +namespace internal { + +//! \brief The name of the native read function used by ReadFile(). //! -//! This function reads into \a buffer, stopping only when \a size bytes have -//! been read or when end-of-file has been reached. On Windows, reading from -//! sockets is not currently supported. +//! This value may be useful for logging. +//! +//! \sa kNativeWriteFunctionName +extern const char kNativeReadFunctionName[]; + +//! \brief The name of the native write function used by WriteFile(). +//! +//! This value may be useful for logging. +//! +//! \sa kNativeReadFunctionName +extern const char kNativeWriteFunctionName[]; + +//! \brief The internal implementation of ReadFileExactly() and its wrappers. +//! +//! The logic is exposed so that it may be reused by FileReaderInterface, and +//! so that it may be tested without requiring large files to be read. It is not +//! intended to be used more generally. Use ReadFileExactly(), +//! LoggingReadFileExactly(), CheckedReadFileExactly(), or +//! FileReaderInterface::ReadExactly() instead. +class ReadExactlyInternal { + public: + //! \brief Calls Read(), retrying following a short read, ensuring that + //! exactly \a size bytes are read. + //! + //! \return `true` on success. `false` if the underlying Read() fails or if + //! fewer than \a size bytes were read. When returning `false`, if \a + //! can_log is `true`, logs a message. + bool ReadExactly(void* buffer, size_t size, bool can_log); + + protected: + ReadExactlyInternal() {} + ~ReadExactlyInternal() {} + + private: + //! \brief Wraps a read operation, such as ReadFile(). + //! + //! \return The number of bytes read and placed into \a buffer, or `-1` on + //! error. When returning `-1`, if \a can_log is `true`, logs a message. + virtual FileOperationResult Read(void* buffer, size_t size, bool can_log) = 0; + + DISALLOW_COPY_AND_ASSIGN(ReadExactlyInternal); +}; + +//! \brief The internal implementation of WriteFile() and its wrappers. +//! +//! The logic is exposed so that it may be tested without requiring large files +//! to be written. It is not intended to be used more generally. Use +//! WriteFile(), LoggingWriteFile(), CheckedWriteFile(), or +//! FileWriterInterface::Write() instead. +class WriteAllInternal { + public: + //! \brief Calls Write(), retrying following a short write, ensuring that + //! exactly \a size bytes are written. + //! + //! \return `true` on success. `false` if the underlying Write() fails or if + //! fewer than \a size bytes were written. + bool WriteAll(const void* buffer, size_t size); + + protected: + WriteAllInternal() {} + ~WriteAllInternal() {} + + private: + //! \brief Wraps a write operation, such as NativeWriteFile(). + //! + //! \return The number of bytes written from \a buffer, or `-1` on error. + virtual FileOperationResult Write(const void* buffer, size_t size) = 0; + + DISALLOW_COPY_AND_ASSIGN(WriteAllInternal); +}; + +//! \brief Writes to a file, retrying when interrupted on POSIX. +//! +//! Fewer than \a size bytes may be written to \a file. This can happen if the +//! underlying write operation returns before writing the entire buffer, or if +//! the buffer is too large to write in a single operation, possibly due to a +//! limitation of a data type used to express the number of bytes written. +//! +//! This function adapts native write operations for uniform use by WriteFile(). +//! This function should only be called by WriteFile(). Other code should call +//! WriteFile() or another function that wraps WriteFile(). +//! +//! \param[in] file The file to write to. +//! \param[in] buffer A buffer containing data to be written. +//! \param[in] size The number of bytes from \a buffer to write. +//! +//! \return The number of bytes actually written from \a buffer to \a file on +//! success. `-1` on error, with `errno` or `GetLastError()` set +//! appropriately. +FileOperationResult NativeWriteFile(FileHandle file, + const void* buffer, + size_t size); + +} // namespace internal + +//! \brief Reads from a file, retrying when interrupted before reading any data +//! on POSIX. +//! +//! This function reads into \a buffer. Fewer than \a size bytes may be read. +//! On Windows, reading from sockets is not currently supported. //! //! \return The number of bytes read and placed into \a buffer, or `-1` on //! error, with `errno` or `GetLastError()` set appropriately. On error, a //! portion of \a file may have been read into \a buffer. //! //! \sa WriteFile -//! \sa LoggingReadFile -//! \sa CheckedReadFile +//! \sa ReadFileExactly +//! \sa LoggingReadFileExactly +//! \sa CheckedReadFileExactly //! \sa CheckedReadFileAtEOF FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); -//! \brief Writes to a file, retrying when interrupted or following a short -//! write on POSIX. +//! \brief Writes to a file, retrying when interrupted on POSIX or following a +//! short write. //! //! This function writes to \a file, stopping only when \a size bytes have been //! written. //! -//! \return The number of bytes written from \a buffer, or `-1` on error, with -//! `errno` or `GetLastError()` set appropriately. On error, a portion of -//! \a buffer may have been written to \a file. +//! \return `true` on success. `false` on error, with `errno` or +//! `GetLastError()` set appropriately. On error, a portion of \a buffer may +//! have been written to \a file. //! //! \sa ReadFile //! \sa LoggingWriteFile //! \sa CheckedWriteFile -FileOperationResult WriteFile(FileHandle file, const void* buffer, size_t size); +bool WriteFile(FileHandle file, const void* buffer, size_t size); -//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. +//! \brief Wraps ReadFile(), retrying following a short read, ensuring that +//! exactly \a size bytes are read. //! -//! \return `true` on success. If \a size is out of the range of possible -//! ReadFile() return values, if the underlying ReadFile() fails, or if -//! other than \a size bytes were read, this function logs a message and +//! \return `true` on success. If the underlying ReadFile() fails, or if fewer +//! than \a size bytes were read, this function logs a message and //! returns `false`. //! //! \sa LoggingWriteFile //! \sa ReadFile -//! \sa CheckedReadFile +//! \sa LoggingReadFileExactly +//! \sa CheckedReadFileExactly //! \sa CheckedReadFileAtEOF -bool LoggingReadFile(FileHandle file, void* buffer, size_t size); +bool ReadFileExactly(FileHandle file, void* buffer, size_t size); + +//! \brief Wraps ReadFile(), retrying following a short read, ensuring that +//! exactly \a size bytes are read. +//! +//! \return `true` on success. If the underlying ReadFile() fails, or if fewer +//! than \a size bytes were read, this function logs a message and +//! returns `false`. +//! +//! \sa LoggingWriteFile +//! \sa ReadFile +//! \sa ReadFileExactly +//! \sa CheckedReadFileExactly +//! \sa CheckedReadFileAtEOF +bool LoggingReadFileExactly(FileHandle file, void* buffer, size_t size); //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. //! -//! \return `true` on success. If \a size is out of the range of possible -//! WriteFile() return values, if the underlying WriteFile() fails, or if -//! other than \a size bytes were written, this function logs a message and +//! \return `true` on success. If the underlying WriteFile() fails, or if fewer +//! than \a size bytes were written, this function logs a message and //! returns `false`. //! -//! \sa LoggingReadFile +//! \sa LoggingReadFileExactly //! \sa WriteFile //! \sa CheckedWriteFile bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); //! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. //! -//! If \a size is out of the range of possible ReadFile() return values, if the -//! underlying ReadFile() fails, or if other than \a size bytes were read, this -//! function causes execution to terminate without returning. +//! If the underlying ReadFile() fails, or if fewer than \a size bytes were +//! read, this function causes execution to terminate without returning. //! //! \sa CheckedWriteFile //! \sa ReadFile -//! \sa LoggingReadFile +//! \sa LoggingReadFileExactly //! \sa CheckedReadFileAtEOF -void CheckedReadFile(FileHandle file, void* buffer, size_t size); +void CheckedReadFileExactly(FileHandle file, void* buffer, size_t size); //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. //! -//! If \a size is out of the range of possible WriteFile() return values, if the -//! underlying WriteFile() fails, or if other than \a size bytes were written, -//! this function causes execution to terminate without returning. +//! if the underlying WriteFile() fails, or if fewer than \a size bytes were +//! written, this function causes execution to terminate without returning. //! -//! \sa CheckedReadFile +//! \sa CheckedReadFileExactly //! \sa WriteFile //! \sa LoggingWriteFile void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); @@ -200,7 +302,7 @@ //! If the underlying ReadFile() fails, or if a byte actually is read, this //! function causes execution to terminate without returning. //! -//! \sa CheckedReadFile +//! \sa CheckedReadFileExactly //! \sa ReadFile void CheckedReadFileAtEOF(FileHandle file); @@ -345,12 +447,27 @@ //! \brief Determines the size of a file. //! //! \param[in] file The handle to the file for which the size should be -//! retrived. +//! retrieved. //! //! \return The size of the file. If an error occurs when attempting to //! determine its size, returns `-1` with an error logged. FileOffset LoggingFileSizeByHandle(FileHandle file); +//! \brief Returns a FileHandle corresponding to the requested standard I/O +//! stream. +//! +//! The returned FileHandle should not be closed on POSIX, where it is +//! important to maintain valid file descriptors occupying the slots reserved +//! for these streams. If a need to close such a stream arises on POSIX, +//! `dup2()` should instead be used to replace the existing file descriptor with +//! one opened to `/dev/null`. See CloseStdinAndStdout(). +//! +//! \param[in] stdio_stream The requested standard I/O stream. +//! +//! \return A corresponding FileHandle on success. kInvalidFileHandle on error, +//! with a message logged. +FileHandle StdioFileHandle(StdioStream stdio_stream); + } // namespace crashpad #endif // CRASHPAD_UTIL_FILE_FILE_IO_H_
diff --git a/third_party/crashpad/crashpad/util/file/file_io_posix.cc b/third_party/crashpad/crashpad/util/file/file_io_posix.cc index 1534db15..4944124 100644 --- a/third_party/crashpad/crashpad/util/file/file_io_posix.cc +++ b/third_party/crashpad/crashpad/util/file/file_io_posix.cc
@@ -19,63 +19,49 @@ #include <sys/stat.h> #include <unistd.h> +#include <algorithm> +#include <limits> + #include "base/files/file_path.h" #include "base/logging.h" -#include "base/numerics/safe_conversions.h" #include "base/posix/eintr_wrapper.h" +namespace crashpad { + namespace { struct ReadTraits { - using VoidBufferType = void*; - using CharBufferType = char*; - static crashpad::FileOperationResult Operate(int fd, - CharBufferType buffer, - size_t size) { + using BufferType = void*; + static FileOperationResult Operate(int fd, BufferType buffer, size_t size) { return read(fd, buffer, size); } }; struct WriteTraits { - using VoidBufferType = const void*; - using CharBufferType = const char*; - static crashpad::FileOperationResult Operate(int fd, - CharBufferType buffer, - size_t size) { + using BufferType = const void*; + static FileOperationResult Operate(int fd, BufferType buffer, size_t size) { return write(fd, buffer, size); } }; template <typename Traits> -crashpad::FileOperationResult -ReadOrWrite(int fd, typename Traits::VoidBufferType buffer, size_t size) { - typename Traits::CharBufferType buffer_c = - reinterpret_cast<typename Traits::CharBufferType>(buffer); +FileOperationResult ReadOrWrite(int fd, + typename Traits::BufferType buffer, + size_t size) { + constexpr size_t kMaxReadWriteSize = + static_cast<size_t>(std::numeric_limits<ssize_t>::max()); + const size_t requested_bytes = std::min(size, kMaxReadWriteSize); - crashpad::FileOperationResult total_bytes = 0; - while (size > 0) { - crashpad::FileOperationResult bytes = - HANDLE_EINTR(Traits::Operate(fd, buffer_c, size)); - if (bytes < 0) { - return bytes; - } else if (bytes == 0) { - break; - } - - buffer_c += bytes; - size -= bytes; - total_bytes += bytes; + FileOperationResult transacted_bytes = + HANDLE_EINTR(Traits::Operate(fd, buffer, requested_bytes)); + if (transacted_bytes < 0) { + return -1; } - return total_bytes; + DCHECK_LE(static_cast<size_t>(transacted_bytes), requested_bytes); + return transacted_bytes; } -} // namespace - -namespace crashpad { - -namespace { - FileHandle OpenFileForOutput(int rdwr_or_wronly, const base::FilePath& path, FileWriteMode mode, @@ -108,14 +94,21 @@ } // namespace -FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size) { - return ReadOrWrite<ReadTraits>(file, buffer, size); +namespace internal { + +const char kNativeReadFunctionName[] = "read"; +const char kNativeWriteFunctionName[] = "write"; + +FileOperationResult NativeWriteFile(FileHandle file, + const void* buffer, + size_t size) { + return ReadOrWrite<WriteTraits>(file, buffer, size); } -FileOperationResult WriteFile(FileHandle file, - const void* buffer, - size_t size) { - return ReadOrWrite<WriteTraits>(file, buffer, size); +} // namespace internal + +FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size) { + return ReadOrWrite<ReadTraits>(file, buffer, size); } FileHandle OpenFileForRead(const base::FilePath& path) { @@ -199,4 +192,18 @@ return st.st_size; } +FileHandle StdioFileHandle(StdioStream stdio_stream) { + switch (stdio_stream) { + case StdioStream::kStandardInput: + return STDIN_FILENO; + case StdioStream::kStandardOutput: + return STDOUT_FILENO; + case StdioStream::kStandardError: + return STDERR_FILENO; + } + + NOTREACHED(); + return kInvalidFileHandle; +} + } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_io_test.cc b/third_party/crashpad/crashpad/util/file/file_io_test.cc index b8444d41..c4e6058 100644 --- a/third_party/crashpad/crashpad/util/file/file_io_test.cc +++ b/third_party/crashpad/crashpad/util/file/file_io_test.cc
@@ -14,9 +14,15 @@ #include "util/file/file_io.h" +#include <stdio.h> + +#include <limits> +#include <type_traits> + #include "base/atomicops.h" #include "base/files/file_path.h" #include "base/macros.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" #include "test/errors.h" #include "test/file.h" @@ -28,6 +34,342 @@ namespace test { namespace { +using testing::_; +using testing::InSequence; +using testing::Return; + +class MockReadExactly : public internal::ReadExactlyInternal { + public: + MockReadExactly() : ReadExactlyInternal() {} + ~MockReadExactly() {} + + // Since it’s more convenient for the test to use uintptr_t than void*, + // ReadExactlyInt() and ReadInt() adapt the types. + + bool ReadExactlyInt(uintptr_t data, size_t size, bool can_log) { + return ReadExactly(reinterpret_cast<void*>(data), size, can_log); + } + + MOCK_METHOD3(ReadInt, FileOperationResult(uintptr_t, size_t, bool)); + + // ReadExactlyInternal: + FileOperationResult Read(void* data, size_t size, bool can_log) { + return ReadInt(reinterpret_cast<uintptr_t>(data), size, can_log); + } + + private: + DISALLOW_COPY_AND_ASSIGN(MockReadExactly); +}; + +TEST(FileIO, ReadExactly_Zero) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(_, _, false)).Times(0); + EXPECT_TRUE(read_exactly.ReadExactlyInt(100, 0, false)); +} + +TEST(FileIO, ReadExactly_SingleSmallSuccess) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(1000, 1, false)).WillOnce(Return(1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(1000, 1, false)); +} + +TEST(FileIO, ReadExactly_SingleSmallSuccessCanLog) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(1000, 1, true)).WillOnce(Return(1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(1000, 1, true)); +} + +TEST(FileIO, ReadExactly_SingleSmallFailure) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(1000, 1, false)).WillOnce(Return(-1)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(1000, 1, false)); +} + +TEST(FileIO, ReadExactly_SingleSmallFailureCanLog) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(1000, 1, true)).WillOnce(Return(-1)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(1000, 1, true)); +} + +TEST(FileIO, ReadExactly_DoubleSmallSuccess) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0x1000, 2, false)).WillOnce(Return(1)); + EXPECT_CALL(read_exactly, ReadInt(0x1001, 1, false)).WillOnce(Return(1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(0x1000, 2, false)); +} + +TEST(FileIO, ReadExactly_DoubleSmallShort) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0x20000, 2, false)).WillOnce(Return(1)); + EXPECT_CALL(read_exactly, ReadInt(0x20001, 1, false)).WillOnce(Return(0)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(0x20000, 2, false)); +} + +TEST(FileIO, ReadExactly_DoubleSmallShortCanLog) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0x20000, 2, true)).WillOnce(Return(1)); + EXPECT_CALL(read_exactly, ReadInt(0x20001, 1, true)).WillOnce(Return(0)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(0x20000, 2, true)); +} + +TEST(FileIO, ReadExactly_Medium) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0x80000000, 0x20000000, false)) + .WillOnce(Return(0x10000000)); + EXPECT_CALL(read_exactly, ReadInt(0x90000000, 0x10000000, false)) + .WillOnce(Return(0x8000000)); + EXPECT_CALL(read_exactly, ReadInt(0x98000000, 0x8000000, false)) + .WillOnce(Return(0x4000000)); + EXPECT_CALL(read_exactly, ReadInt(0x9c000000, 0x4000000, false)) + .WillOnce(Return(0x2000000)); + EXPECT_CALL(read_exactly, ReadInt(0x9e000000, 0x2000000, false)) + .WillOnce(Return(0x1000000)); + EXPECT_CALL(read_exactly, ReadInt(0x9f000000, 0x1000000, false)) + .WillOnce(Return(0x800000)); + EXPECT_CALL(read_exactly, ReadInt(0x9f800000, 0x800000, false)) + .WillOnce(Return(0x400000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fc00000, 0x400000, false)) + .WillOnce(Return(0x200000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fe00000, 0x200000, false)) + .WillOnce(Return(0x100000)); + EXPECT_CALL(read_exactly, ReadInt(0x9ff00000, 0x100000, false)) + .WillOnce(Return(0x80000)); + EXPECT_CALL(read_exactly, ReadInt(0x9ff80000, 0x80000, false)) + .WillOnce(Return(0x40000)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffc0000, 0x40000, false)) + .WillOnce(Return(0x20000)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffe0000, 0x20000, false)) + .WillOnce(Return(0x10000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fff0000, 0x10000, false)) + .WillOnce(Return(0x8000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fff8000, 0x8000, false)) + .WillOnce(Return(0x4000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffc000, 0x4000, false)) + .WillOnce(Return(0x2000)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffe000, 0x2000, false)) + .WillOnce(Return(0x1000)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffff000, 0x1000, false)) + .WillOnce(Return(0x800)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffff800, 0x800, false)) + .WillOnce(Return(0x400)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffc00, 0x400, false)) + .WillOnce(Return(0x200)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffe00, 0x200, false)) + .WillOnce(Return(0x100)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffff00, 0x100, false)) + .WillOnce(Return(0x80)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffff80, 0x80, false)) + .WillOnce(Return(0x40)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffffc0, 0x40, false)) + .WillOnce(Return(0x20)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffffe0, 0x20, false)) + .WillOnce(Return(0x10)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffff0, 0x10, false)) + .WillOnce(Return(0x8)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffff8, 0x8, false)) + .WillOnce(Return(0x4)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffffc, 0x4, false)) + .WillOnce(Return(0x2)); + EXPECT_CALL(read_exactly, ReadInt(0x9ffffffe, 0x2, false)) + .WillOnce(Return(0x1)); + EXPECT_CALL(read_exactly, ReadInt(0x9fffffff, 0x1, false)) + .WillOnce(Return(0x1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(0x80000000, 0x20000000, false)); +} + +TEST(FileIO, ReadExactly_LargeSuccess) { + MockReadExactly read_exactly; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<uint32_t>::max(); + constexpr size_t increment = std::numeric_limits<int32_t>::max(); + EXPECT_CALL(read_exactly, ReadInt(0, max, false)).WillOnce(Return(increment)); + EXPECT_CALL(read_exactly, ReadInt(increment, max - increment, false)) + .WillOnce(Return(increment)); + EXPECT_CALL(read_exactly, ReadInt(2 * increment, 1, false)) + .WillOnce(Return(1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(0, max, false)); +} + +TEST(FileIO, ReadExactly_LargeShort) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0, 0xffffffff, false)) + .WillOnce(Return(0x7fffffff)); + EXPECT_CALL(read_exactly, ReadInt(0x7fffffff, 0x80000000, false)) + .WillOnce(Return(0x10000000)); + EXPECT_CALL(read_exactly, ReadInt(0x8fffffff, 0x70000000, false)) + .WillOnce(Return(0)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(0, 0xffffffff, false)); +} + +TEST(FileIO, ReadExactly_LargeFailure) { + MockReadExactly read_exactly; + InSequence in_sequence; + EXPECT_CALL(read_exactly, ReadInt(0, 0xffffffff, false)) + .WillOnce(Return(0x7fffffff)); + EXPECT_CALL(read_exactly, ReadInt(0x7fffffff, 0x80000000, false)) + .WillOnce(Return(-1)); + EXPECT_FALSE(read_exactly.ReadExactlyInt(0, 0xffffffff, false)); +} + +TEST(FileIO, ReadExactly_TripleMax) { + MockReadExactly read_exactly; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<size_t>::max(); + constexpr size_t increment = + std::numeric_limits<std::make_signed<size_t>::type>::max(); + EXPECT_CALL(read_exactly, ReadInt(0, max, false)).WillOnce(Return(increment)); + EXPECT_CALL(read_exactly, ReadInt(increment, max - increment, false)) + .WillOnce(Return(increment)); + EXPECT_CALL(read_exactly, ReadInt(2 * increment, 1, false)) + .WillOnce(Return(1)); + EXPECT_TRUE(read_exactly.ReadExactlyInt(0, max, false)); +} + +class MockWriteAll : public internal::WriteAllInternal { + public: + MockWriteAll() : WriteAllInternal() {} + ~MockWriteAll() {} + + // Since it’s more convenient for the test to use uintptr_t than const void*, + // WriteAllInt() and WriteInt() adapt the types. + + bool WriteAllInt(uintptr_t data, size_t size) { + return WriteAll(reinterpret_cast<const void*>(data), size); + } + + MOCK_METHOD2(WriteInt, FileOperationResult(uintptr_t, size_t)); + + // WriteAllInternal: + FileOperationResult Write(const void* data, size_t size) { + return WriteInt(reinterpret_cast<uintptr_t>(data), size); + } + + private: + DISALLOW_COPY_AND_ASSIGN(MockWriteAll); +}; + +TEST(FileIO, WriteAll_Zero) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(_, _)).Times(0); + EXPECT_TRUE(write_all.WriteAllInt(100, 0)); +} + +TEST(FileIO, WriteAll_SingleSmallSuccess) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(1000, 1)).WillOnce(Return(1)); + EXPECT_TRUE(write_all.WriteAllInt(1000, 1)); +} + +TEST(FileIO, WriteAll_SingleSmallFailure) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(1000, 1)).WillOnce(Return(-1)); + EXPECT_FALSE(write_all.WriteAllInt(1000, 1)); +} + +TEST(FileIO, WriteAll_DoubleSmall) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(0x1000, 2)).WillOnce(Return(1)); + EXPECT_CALL(write_all, WriteInt(0x1001, 1)).WillOnce(Return(1)); + EXPECT_TRUE(write_all.WriteAllInt(0x1000, 2)); +} + +TEST(FileIO, WriteAll_Medium) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(0x80000000, 0x20000000)) + .WillOnce(Return(0x10000000)); + EXPECT_CALL(write_all, WriteInt(0x90000000, 0x10000000)) + .WillOnce(Return(0x8000000)); + EXPECT_CALL(write_all, WriteInt(0x98000000, 0x8000000)) + .WillOnce(Return(0x4000000)); + EXPECT_CALL(write_all, WriteInt(0x9c000000, 0x4000000)) + .WillOnce(Return(0x2000000)); + EXPECT_CALL(write_all, WriteInt(0x9e000000, 0x2000000)) + .WillOnce(Return(0x1000000)); + EXPECT_CALL(write_all, WriteInt(0x9f000000, 0x1000000)) + .WillOnce(Return(0x800000)); + EXPECT_CALL(write_all, WriteInt(0x9f800000, 0x800000)) + .WillOnce(Return(0x400000)); + EXPECT_CALL(write_all, WriteInt(0x9fc00000, 0x400000)) + .WillOnce(Return(0x200000)); + EXPECT_CALL(write_all, WriteInt(0x9fe00000, 0x200000)) + .WillOnce(Return(0x100000)); + EXPECT_CALL(write_all, WriteInt(0x9ff00000, 0x100000)) + .WillOnce(Return(0x80000)); + EXPECT_CALL(write_all, WriteInt(0x9ff80000, 0x80000)) + .WillOnce(Return(0x40000)); + EXPECT_CALL(write_all, WriteInt(0x9ffc0000, 0x40000)) + .WillOnce(Return(0x20000)); + EXPECT_CALL(write_all, WriteInt(0x9ffe0000, 0x20000)) + .WillOnce(Return(0x10000)); + EXPECT_CALL(write_all, WriteInt(0x9fff0000, 0x10000)) + .WillOnce(Return(0x8000)); + EXPECT_CALL(write_all, WriteInt(0x9fff8000, 0x8000)).WillOnce(Return(0x4000)); + EXPECT_CALL(write_all, WriteInt(0x9fffc000, 0x4000)).WillOnce(Return(0x2000)); + EXPECT_CALL(write_all, WriteInt(0x9fffe000, 0x2000)).WillOnce(Return(0x1000)); + EXPECT_CALL(write_all, WriteInt(0x9ffff000, 0x1000)).WillOnce(Return(0x800)); + EXPECT_CALL(write_all, WriteInt(0x9ffff800, 0x800)).WillOnce(Return(0x400)); + EXPECT_CALL(write_all, WriteInt(0x9ffffc00, 0x400)).WillOnce(Return(0x200)); + EXPECT_CALL(write_all, WriteInt(0x9ffffe00, 0x200)).WillOnce(Return(0x100)); + EXPECT_CALL(write_all, WriteInt(0x9fffff00, 0x100)).WillOnce(Return(0x80)); + EXPECT_CALL(write_all, WriteInt(0x9fffff80, 0x80)).WillOnce(Return(0x40)); + EXPECT_CALL(write_all, WriteInt(0x9fffffc0, 0x40)).WillOnce(Return(0x20)); + EXPECT_CALL(write_all, WriteInt(0x9fffffe0, 0x20)).WillOnce(Return(0x10)); + EXPECT_CALL(write_all, WriteInt(0x9ffffff0, 0x10)).WillOnce(Return(0x8)); + EXPECT_CALL(write_all, WriteInt(0x9ffffff8, 0x8)).WillOnce(Return(0x4)); + EXPECT_CALL(write_all, WriteInt(0x9ffffffc, 0x4)).WillOnce(Return(0x2)); + EXPECT_CALL(write_all, WriteInt(0x9ffffffe, 0x2)).WillOnce(Return(0x1)); + EXPECT_CALL(write_all, WriteInt(0x9fffffff, 0x1)).WillOnce(Return(0x1)); + EXPECT_TRUE(write_all.WriteAllInt(0x80000000, 0x20000000)); +} + +TEST(FileIO, WriteAll_LargeSuccess) { + MockWriteAll write_all; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<uint32_t>::max(); + constexpr size_t increment = std::numeric_limits<int32_t>::max(); + EXPECT_CALL(write_all, WriteInt(0, max)).WillOnce(Return(increment)); + EXPECT_CALL(write_all, WriteInt(increment, max - increment)) + .WillOnce(Return(increment)); + EXPECT_CALL(write_all, WriteInt(2 * increment, 1)).WillOnce(Return(1)); + EXPECT_TRUE(write_all.WriteAllInt(0, max)); +} + +TEST(FileIO, WriteAll_LargeFailure) { + MockWriteAll write_all; + InSequence in_sequence; + EXPECT_CALL(write_all, WriteInt(0, 0xffffffff)).WillOnce(Return(0x7fffffff)); + EXPECT_CALL(write_all, WriteInt(0x7fffffff, 0x80000000)).WillOnce(Return(-1)); + EXPECT_FALSE(write_all.WriteAllInt(0, 0xffffffff)); +} + +TEST(FileIO, WriteAll_TripleMax) { + MockWriteAll write_all; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<size_t>::max(); + constexpr size_t increment = + std::numeric_limits<std::make_signed<size_t>::type>::max(); + EXPECT_CALL(write_all, WriteInt(0, max)).WillOnce(Return(increment)); + EXPECT_CALL(write_all, WriteInt(increment, max - increment)) + .WillOnce(Return(increment)); + EXPECT_CALL(write_all, WriteInt(2 * increment, 1)).WillOnce(Return(1)); + EXPECT_TRUE(write_all.WriteAllInt(0, max)); +} + void TestOpenFileForWrite(FileHandle (*opener)(const base::FilePath&, FileWriteMode, FilePermissions)) { @@ -324,6 +666,26 @@ EXPECT_EQ(9, LoggingFileSizeByHandle(file_handle.get())); } +FileHandle FileHandleForFILE(FILE* file) { + int fd = fileno(file); +#if defined(OS_POSIX) + return fd; +#elif defined(OS_WIN) + return reinterpret_cast<HANDLE>(_get_osfhandle(fd)); +#else +#error Port +#endif +} + +TEST(FileIO, StdioFileHandle) { + EXPECT_EQ(FileHandleForFILE(stdin), + StdioFileHandle(StdioStream::kStandardInput)); + EXPECT_EQ(FileHandleForFILE(stdout), + StdioFileHandle(StdioStream::kStandardOutput)); + EXPECT_EQ(FileHandleForFILE(stderr), + StdioFileHandle(StdioStream::kStandardError)); +} + } // namespace } // namespace test } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_io_win.cc b/third_party/crashpad/crashpad/util/file/file_io_win.cc index 5144869..467fc3c 100644 --- a/third_party/crashpad/crashpad/util/file/file_io_win.cc +++ b/third_party/crashpad/crashpad/util/file/file_io_win.cc
@@ -14,9 +14,11 @@ #include "util/file/file_io.h" +#include <algorithm> +#include <limits> + #include "base/files/file_path.h" #include "base/logging.h" -#include "base/numerics/safe_conversions.h" #include "base/strings/utf_string_conversions.h" namespace { @@ -37,6 +39,16 @@ namespace { +// kMaxReadWriteSize needs to be limited to the range of DWORD for the calls to +// ::ReadFile() and ::WriteFile(), and also limited to the range of +// FileOperationResult to be able to adequately express the number of bytes read +// and written in the return values from ReadFile() and NativeWriteFile(). In a +// 64-bit build, the former will control, and the limit will be (2^32)-1. In a +// 32-bit build, the latter will control, and the limit will be (2^31)-1. +constexpr size_t kMaxReadWriteSize = std::min( + static_cast<size_t>(std::numeric_limits<DWORD>::max()), + static_cast<size_t>(std::numeric_limits<FileOperationResult>::max())); + FileHandle OpenFileForOutput(DWORD access, const base::FilePath& path, FileWriteMode mode, @@ -70,51 +82,58 @@ } // namespace -// TODO(scottmg): Handle > DWORD sized writes if necessary. +namespace internal { + +const char kNativeReadFunctionName[] = "ReadFile"; +const char kNativeWriteFunctionName[] = "WriteFile"; + +FileOperationResult NativeWriteFile(FileHandle file, + const void* buffer, + size_t size) { + // TODO(scottmg): This might need to handle the limit for pipes across a + // network in the future. + + const DWORD write_size = + static_cast<DWORD>(std::min(size, kMaxReadWriteSize)); + + DWORD bytes_written; + if (!::WriteFile(file, buffer, write_size, &bytes_written, nullptr)) + return -1; + + CHECK_NE(bytes_written, static_cast<DWORD>(-1)); + DCHECK_LE(static_cast<size_t>(bytes_written), write_size); + return bytes_written; +} + +} // namespace internal FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size) { DCHECK(!IsSocketHandle(file)); - DWORD size_dword = base::checked_cast<DWORD>(size); - DWORD total_read = 0; - char* buffer_c = reinterpret_cast<char*>(buffer); - while (size_dword > 0) { + + const DWORD read_size = static_cast<DWORD>(std::min(size, kMaxReadWriteSize)); + + while (true) { DWORD bytes_read; - BOOL success = ::ReadFile(file, buffer_c, size_dword, &bytes_read, nullptr); + BOOL success = ::ReadFile(file, buffer, read_size, &bytes_read, nullptr); if (!success) { if (GetLastError() == ERROR_BROKEN_PIPE) { // When reading a pipe and the write handle has been closed, ReadFile // fails with ERROR_BROKEN_PIPE, but only once all pending data has been - // read. - break; - } else if (GetLastError() != ERROR_MORE_DATA) { - return -1; + // read. Treat this as EOF. + return 0; } - } else if (bytes_read == 0 && GetFileType(file) != FILE_TYPE_PIPE) { + return -1; + } + + CHECK_NE(bytes_read, static_cast<DWORD>(-1)); + DCHECK_LE(bytes_read, read_size); + if (bytes_read != 0 || GetFileType(file) != FILE_TYPE_PIPE) { // Zero bytes read for a file indicates reaching EOF. Zero bytes read from // a pipe indicates only that there was a zero byte WriteFile issued on // the other end, so continue reading. - break; + return bytes_read; } - - buffer_c += bytes_read; - size_dword -= bytes_read; - total_read += bytes_read; } - return total_read; -} - -FileOperationResult WriteFile(FileHandle file, - const void* buffer, - size_t size) { - // TODO(scottmg): This might need to handle the limit for pipes across a - // network in the future. - DWORD size_dword = base::checked_cast<DWORD>(size); - DWORD bytes_written; - BOOL rv = ::WriteFile(file, buffer, size_dword, &bytes_written, nullptr); - if (!rv) - return -1; - CHECK_EQ(bytes_written, size_dword); - return bytes_written; } FileHandle OpenFileForRead(const base::FilePath& path) { @@ -245,4 +264,26 @@ return file_size.QuadPart; } +FileHandle StdioFileHandle(StdioStream stdio_stream) { + DWORD standard_handle; + switch (stdio_stream) { + case StdioStream::kStandardInput: + standard_handle = STD_INPUT_HANDLE; + break; + case StdioStream::kStandardOutput: + standard_handle = STD_OUTPUT_HANDLE; + break; + case StdioStream::kStandardError: + standard_handle = STD_ERROR_HANDLE; + break; + default: + NOTREACHED(); + return INVALID_HANDLE_VALUE; + } + + HANDLE handle = GetStdHandle(standard_handle); + PLOG_IF(ERROR, handle == INVALID_HANDLE_VALUE) << "GetStdHandle"; + return handle; +} + } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_reader.cc b/third_party/crashpad/crashpad/util/file/file_reader.cc index 4f5ae773..6f272f0 100644 --- a/third_party/crashpad/crashpad/util/file/file_reader.cc +++ b/third_party/crashpad/crashpad/util/file/file_reader.cc
@@ -20,18 +20,31 @@ namespace crashpad { -bool FileReaderInterface::ReadExactly(void* data, size_t size) { - FileOperationResult expect = base::checked_cast<FileOperationResult>(size); - FileOperationResult rv = Read(data, size); - if (rv < 0) { - // Read() will have logged its own error. - return false; - } else if (rv != expect) { - LOG(ERROR) << "ReadExactly(): expected " << expect << ", observed " << rv; - return false; +namespace { + +class FileReaderReadExactly final : public internal::ReadExactlyInternal { + public: + explicit FileReaderReadExactly(FileReaderInterface* file_reader) + : ReadExactlyInternal(), file_reader_(file_reader) {} + ~FileReaderReadExactly() {} + + private: + // ReadExactlyInternal: + FileOperationResult Read(void* buffer, size_t size, bool can_log) override { + DCHECK(can_log); + return file_reader_->Read(buffer, size); } - return true; + FileReaderInterface* file_reader_; // weak + + DISALLOW_COPY_AND_ASSIGN(FileReaderReadExactly); +}; + +} // namespace + +bool FileReaderInterface::ReadExactly(void* data, size_t size) { + FileReaderReadExactly read_exactly(this); + return read_exactly.ReadExactly(data, size, true); } WeakFileHandleFileReader::WeakFileHandleFileReader(FileHandle file_handle) @@ -44,13 +57,10 @@ FileOperationResult WeakFileHandleFileReader::Read(void* data, size_t size) { DCHECK_NE(file_handle_, kInvalidFileHandle); - // Don’t use LoggingReadFile(), which insists on a full read and only returns - // a bool. This method permits short reads and returns the number of bytes - // read. base::checked_cast<FileOperationResult>(size); FileOperationResult rv = ReadFile(file_handle_, data, size); if (rv < 0) { - PLOG(ERROR) << "read"; + PLOG(ERROR) << internal::kNativeReadFunctionName; return -1; } @@ -98,43 +108,4 @@ return weak_file_handle_file_reader_.Seek(offset, whence); } -WeakStdioFileReader::WeakStdioFileReader(FILE* file) - : file_(file) { -} - -WeakStdioFileReader::~WeakStdioFileReader() { -} - -FileOperationResult WeakStdioFileReader::Read(void* data, size_t size) { - DCHECK(file_); - - size_t rv = fread(data, 1, size, file_); - if (rv != size && ferror(file_)) { - STDIO_PLOG(ERROR) << "fread"; - return -1; - } - if (rv > size) { - LOG(ERROR) << "fread: expected " << size << ", observed " << rv; - return -1; - } - - return rv; -} - -FileOffset WeakStdioFileReader::Seek(FileOffset offset, int whence) { - DCHECK(file_); - if (fseeko(file_, offset, whence) == -1) { - STDIO_PLOG(ERROR) << "fseeko"; - return -1; - } - - FileOffset new_offset = ftello(file_); - if (new_offset == -1) { - STDIO_PLOG(ERROR) << "ftello"; - return -1; - } - - return new_offset; -} - } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_reader.h b/third_party/crashpad/crashpad/util/file/file_reader.h index 39225e54..d44be1c1 100644 --- a/third_party/crashpad/crashpad/util/file/file_reader.h +++ b/third_party/crashpad/crashpad/util/file/file_reader.h
@@ -15,7 +15,6 @@ #ifndef CRASHPAD_UTIL_FILE_FILE_READER_H_ #define CRASHPAD_UTIL_FILE_FILE_READER_H_ -#include <stdio.h> #include <sys/types.h> #include "base/files/file_path.h" @@ -42,7 +41,7 @@ //! \brief Wraps Read(), ensuring that the read succeeded and exactly \a size //! bytes were read. //! - //! Semantically, this behaves as LoggingReadFile(). + //! Semantically, this behaves as LoggingReadFileExactly(). //! //! \return `true` if the operation succeeded, `false` if it failed, with an //! error message logged. Short reads are treated as failures. @@ -142,40 +141,6 @@ DISALLOW_COPY_AND_ASSIGN(FileReader); }; -//! \brief A file reader backed by a standard input/output `FILE*`. -//! -//! This class accepts an already-open `FILE*`. It is not responsible for -//! opening or closing this `FILE*`. Users of this class must ensure that the -//! `FILE*` is closed appropriately elsewhere. Objects of this class may be used -//! to read from `FILE*` objects not associated with filesystem-based files, -//! although special attention should be paid to the Seek() method, which may -//! not function on `FILE*` objects that do not refer to disk-based files. -//! -//! This class is expected to be used when other code is responsible for -//! opening `FILE*` objects and already provides `FILE*` objects. A good use -//! would be a WeakStdioFileReader for `stdin`. -class WeakStdioFileReader : public FileReaderInterface { - public: - explicit WeakStdioFileReader(FILE* file); - ~WeakStdioFileReader() override; - - // FileReaderInterface: - FileOperationResult Read(void* data, size_t size) override; - - // FileSeekerInterface: - - //! \copydoc FileReaderInterface::Seek() - //! - //! \note This method is only guaranteed to function on `FILE*` objects - //! referring to disk-based files. - FileOffset Seek(FileOffset offset, int whence) override; - - private: - FILE* file_; // weak - - DISALLOW_COPY_AND_ASSIGN(WeakStdioFileReader); -}; - } // namespace crashpad #endif // CRASHPAD_UTIL_FILE_FILE_READER_H_
diff --git a/third_party/crashpad/crashpad/util/file/file_reader_test.cc b/third_party/crashpad/crashpad/util/file/file_reader_test.cc new file mode 100644 index 0000000..7c168bb --- /dev/null +++ b/third_party/crashpad/crashpad/util/file/file_reader_test.cc
@@ -0,0 +1,205 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/file/file_reader.h" + +#include <stdint.h> + +#include <limits> +#include <type_traits> + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace crashpad { +namespace test { +namespace { + +using testing::_; +using testing::InSequence; +using testing::Return; + +class MockFileReader : public FileReaderInterface { + public: + MockFileReader() : FileReaderInterface() {} + ~MockFileReader() override {} + + // Since it’s more convenient for the test to use uintptr_t than void*, + // ReadExactlyInt() and ReadInt() adapt the types. + + bool ReadExactlyInt(uintptr_t data, size_t size) { + return ReadExactly(reinterpret_cast<void*>(data), size); + } + + MOCK_METHOD2(ReadInt, FileOperationResult(uintptr_t, size_t)); + + // FileReaderInterface: + FileOperationResult Read(void* data, size_t size) { + return ReadInt(reinterpret_cast<uintptr_t>(data), size); + } + + // FileSeekerInterface: + MOCK_METHOD2(Seek, FileOffset(FileOffset, int)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockFileReader); +}; + +TEST(FileReader, ReadExactly_Zero) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(_, _)).Times(0); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(100, 0)); +} + +TEST(FileReader, ReadExactly_SingleSmallSuccess) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(1000, 1)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(1000, 1)); +} + +TEST(FileReader, ReadExactly_SingleSmallFailure) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(1000, 1)).WillOnce(Return(-1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_FALSE(file_reader.ReadExactlyInt(1000, 1)); +} + +TEST(FileReader, ReadExactly_DoubleSmallSuccess) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(0x1000, 2)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, ReadInt(0x1001, 1)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(0x1000, 2)); +} + +TEST(FileReader, ReadExactly_DoubleSmallShort) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(0x20000, 2)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, ReadInt(0x20001, 1)).WillOnce(Return(0)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_FALSE(file_reader.ReadExactlyInt(0x20000, 2)); +} + +TEST(FileReader, ReadExactly_Medium) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(0x80000000, 0x20000000)) + .WillOnce(Return(0x10000000)); + EXPECT_CALL(file_reader, ReadInt(0x90000000, 0x10000000)) + .WillOnce(Return(0x8000000)); + EXPECT_CALL(file_reader, ReadInt(0x98000000, 0x8000000)) + .WillOnce(Return(0x4000000)); + EXPECT_CALL(file_reader, ReadInt(0x9c000000, 0x4000000)) + .WillOnce(Return(0x2000000)); + EXPECT_CALL(file_reader, ReadInt(0x9e000000, 0x2000000)) + .WillOnce(Return(0x1000000)); + EXPECT_CALL(file_reader, ReadInt(0x9f000000, 0x1000000)) + .WillOnce(Return(0x800000)); + EXPECT_CALL(file_reader, ReadInt(0x9f800000, 0x800000)) + .WillOnce(Return(0x400000)); + EXPECT_CALL(file_reader, ReadInt(0x9fc00000, 0x400000)) + .WillOnce(Return(0x200000)); + EXPECT_CALL(file_reader, ReadInt(0x9fe00000, 0x200000)) + .WillOnce(Return(0x100000)); + EXPECT_CALL(file_reader, ReadInt(0x9ff00000, 0x100000)) + .WillOnce(Return(0x80000)); + EXPECT_CALL(file_reader, ReadInt(0x9ff80000, 0x80000)) + .WillOnce(Return(0x40000)); + EXPECT_CALL(file_reader, ReadInt(0x9ffc0000, 0x40000)) + .WillOnce(Return(0x20000)); + EXPECT_CALL(file_reader, ReadInt(0x9ffe0000, 0x20000)) + .WillOnce(Return(0x10000)); + EXPECT_CALL(file_reader, ReadInt(0x9fff0000, 0x10000)) + .WillOnce(Return(0x8000)); + EXPECT_CALL(file_reader, ReadInt(0x9fff8000, 0x8000)) + .WillOnce(Return(0x4000)); + EXPECT_CALL(file_reader, ReadInt(0x9fffc000, 0x4000)) + .WillOnce(Return(0x2000)); + EXPECT_CALL(file_reader, ReadInt(0x9fffe000, 0x2000)) + .WillOnce(Return(0x1000)); + EXPECT_CALL(file_reader, ReadInt(0x9ffff000, 0x1000)).WillOnce(Return(0x800)); + EXPECT_CALL(file_reader, ReadInt(0x9ffff800, 0x800)).WillOnce(Return(0x400)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffc00, 0x400)).WillOnce(Return(0x200)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffe00, 0x200)).WillOnce(Return(0x100)); + EXPECT_CALL(file_reader, ReadInt(0x9fffff00, 0x100)).WillOnce(Return(0x80)); + EXPECT_CALL(file_reader, ReadInt(0x9fffff80, 0x80)).WillOnce(Return(0x40)); + EXPECT_CALL(file_reader, ReadInt(0x9fffffc0, 0x40)).WillOnce(Return(0x20)); + EXPECT_CALL(file_reader, ReadInt(0x9fffffe0, 0x20)).WillOnce(Return(0x10)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffff0, 0x10)).WillOnce(Return(0x8)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffff8, 0x8)).WillOnce(Return(0x4)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffffc, 0x4)).WillOnce(Return(0x2)); + EXPECT_CALL(file_reader, ReadInt(0x9ffffffe, 0x2)).WillOnce(Return(0x1)); + EXPECT_CALL(file_reader, ReadInt(0x9fffffff, 0x1)).WillOnce(Return(0x1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(0x80000000, 0x20000000)); +} + +TEST(FileReader, ReadExactly_LargeSuccess) { + MockFileReader file_reader; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<uint32_t>::max(); + constexpr size_t increment = std::numeric_limits<int32_t>::max(); + EXPECT_CALL(file_reader, ReadInt(0, max)).WillOnce(Return(increment)); + EXPECT_CALL(file_reader, ReadInt(increment, max - increment)) + .WillOnce(Return(increment)); + EXPECT_CALL(file_reader, ReadInt(2 * increment, 1)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(0, max)); +} + +TEST(FileReader, ReadExactly_LargeShort) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(0, 0xffffffff)).WillOnce(Return(0x7fffffff)); + EXPECT_CALL(file_reader, ReadInt(0x7fffffff, 0x80000000)) + .WillOnce(Return(0x10000000)); + EXPECT_CALL(file_reader, ReadInt(0x8fffffff, 0x70000000)).WillOnce(Return(0)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_FALSE(file_reader.ReadExactlyInt(0, 0xffffffff)); +} + +TEST(FileReader, ReadExactly_LargeFailure) { + MockFileReader file_reader; + InSequence in_sequence; + EXPECT_CALL(file_reader, ReadInt(0, 0xffffffff)).WillOnce(Return(0x7fffffff)); + EXPECT_CALL(file_reader, ReadInt(0x7fffffff, 0x80000000)) + .WillOnce(Return(-1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_FALSE(file_reader.ReadExactlyInt(0, 0xffffffff)); +} + +TEST(FileReader, ReadExactly_TripleMax) { + MockFileReader file_reader; + InSequence in_sequence; + constexpr size_t max = std::numeric_limits<size_t>::max(); + constexpr size_t increment = + std::numeric_limits<std::make_signed<size_t>::type>::max(); + EXPECT_CALL(file_reader, ReadInt(0, max)).WillOnce(Return(increment)); + EXPECT_CALL(file_reader, ReadInt(increment, max - increment)) + .WillOnce(Return(increment)); + EXPECT_CALL(file_reader, ReadInt(2 * increment, 1)).WillOnce(Return(1)); + EXPECT_CALL(file_reader, Seek(_, _)).Times(0); + EXPECT_TRUE(file_reader.ReadExactlyInt(0, max)); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_writer.cc b/third_party/crashpad/crashpad/util/file/file_writer.cc index d22a1a3..13ac6cf 100644 --- a/third_party/crashpad/crashpad/util/file/file_writer.cc +++ b/third_party/crashpad/crashpad/util/file/file_writer.cc
@@ -15,6 +15,7 @@ #include "util/file/file_writer.h" #include <limits.h> +#include <stddef.h> #include <string.h> #include <algorithm> @@ -192,66 +193,4 @@ return weak_file_handle_file_writer_.Seek(offset, whence); } -WeakStdioFileWriter::WeakStdioFileWriter(FILE* file) - : file_(file) { -} - -WeakStdioFileWriter::~WeakStdioFileWriter() { -} - -bool WeakStdioFileWriter::Write(const void* data, size_t size) { - DCHECK(file_); - - size_t rv = fwrite(data, 1, size, file_); - if (rv != size) { - if (ferror(file_)) { - STDIO_PLOG(ERROR) << "fwrite"; - } else { - LOG(ERROR) << "fwrite: expected " << size << ", observed " << rv; - } - return false; - } - - return true; -} - -bool WeakStdioFileWriter::WriteIoVec(std::vector<WritableIoVec>* iovecs) { - DCHECK(file_); - - if (iovecs->empty()) { - LOG(ERROR) << "WriteIoVec(): no iovecs"; - return false; - } - - for (const WritableIoVec& iov : *iovecs) { - if (!Write(iov.iov_base, iov.iov_len)) { - return false; - } - } - -#ifndef NDEBUG - // The interface says that |iovecs| is not sacred, so scramble it to make sure - // that nobody depends on it. - memset(&(*iovecs)[0], 0xa5, sizeof((*iovecs)[0]) * iovecs->size()); -#endif - - return true; -} - -FileOffset WeakStdioFileWriter::Seek(FileOffset offset, int whence) { - DCHECK(file_); - if (fseeko(file_, offset, whence) == -1) { - STDIO_PLOG(ERROR) << "fseeko"; - return -1; - } - - FileOffset new_offset = ftello(file_); - if (new_offset == -1) { - STDIO_PLOG(ERROR) << "ftello"; - return -1; - } - - return new_offset; -} - } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/file/file_writer.h b/third_party/crashpad/crashpad/util/file/file_writer.h index 007e5f3..ed261ec 100644 --- a/third_party/crashpad/crashpad/util/file/file_writer.h +++ b/third_party/crashpad/crashpad/util/file/file_writer.h
@@ -167,41 +167,6 @@ DISALLOW_COPY_AND_ASSIGN(FileWriter); }; -//! \brief A file writer backed by a standard input/output `FILE*`. -//! -//! This class accepts an already-open `FILE*`. It is not responsible for -//! opening or closing this `FILE*`. Users of this class must ensure that the -//! `FILE*` is closed appropriately elsewhere. Objects of this class may be used -//! to write to `FILE*` objects not associated with filesystem-based files, -//! although special attention should be paid to the Seek() method, which may -//! not function on `FILE*` objects that do not refer to disk-based files. -//! -//! This class is expected to be used when other code is responsible for -//! opening `FILE*` objects and already provides `FILE*` objects. A good use -//! would be a WeakStdioFileWriter for `stdout`. -class WeakStdioFileWriter : public FileWriterInterface { - public: - explicit WeakStdioFileWriter(FILE* file); - ~WeakStdioFileWriter() override; - - // FileWriterInterface: - bool Write(const void* data, size_t size) override; - bool WriteIoVec(std::vector<WritableIoVec>* iovecs) override; - - // FileSeekerInterface: - - //! \copydoc FileWriterInterface::Seek() - //! - //! \note This method is only guaranteed to function on `FILE*` objects - //! referring to disk-based files. - FileOffset Seek(FileOffset offset, int whence) override; - - private: - FILE* file_; // weak - - DISALLOW_COPY_AND_ASSIGN(WeakStdioFileWriter); -}; - } // namespace crashpad #endif // CRASHPAD_UTIL_FILE_FILE_WRITER_H_
diff --git a/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc b/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc index 51aad90..e3624d7 100644 --- a/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc +++ b/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc
@@ -403,20 +403,20 @@ child_port_token_t* token, std::string* service_name) { // Read the token from the pipe. - if (!LoggingReadFile(client_read_fd, token, sizeof(*token))) { + if (!LoggingReadFileExactly(client_read_fd, token, sizeof(*token))) { return false; } // Read the service name from the pipe. uint32_t service_name_length; - if (!LoggingReadFile( - client_read_fd, &service_name_length, sizeof(service_name_length))) { + if (!LoggingReadFileExactly( + client_read_fd, &service_name_length, sizeof(service_name_length))) { return false; } service_name->resize(service_name_length); if (!service_name->empty() && - !LoggingReadFile( + !LoggingReadFileExactly( client_read_fd, &(*service_name)[0], service_name_length)) { return false; }
diff --git a/third_party/crashpad/crashpad/util/mach/exception_ports_test.cc b/third_party/crashpad/crashpad/util/mach/exception_ports_test.cc index 37c7d11..f3d4002 100644 --- a/third_party/crashpad/crashpad/util/mach/exception_ports_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exception_ports_test.cc
@@ -244,7 +244,7 @@ CheckedWriteFile(test_exception_ports_->WritePipeHandle(), &c, 1); // Wait for the parent process to say that its end is set up. - CheckedReadFile(test_exception_ports_->ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(test_exception_ports_->ReadPipeHandle(), &c, 1); EXPECT_EQ('\0', c); // Regardless of where ExceptionPorts::SetExceptionPort() ran, @@ -352,7 +352,7 @@ // Wait for the child process to be ready. It needs to have all of its // threads set up before proceeding if in kSetOutOfProcess mode. char c; - CheckedReadFile(ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(ReadPipeHandle(), &c, 1); EXPECT_EQ('\0', c); mach_port_t local_port = LocalPort();
diff --git a/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc b/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc index a2d2eb1f..2c4c8e1d 100644 --- a/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc
@@ -344,7 +344,7 @@ if (options_.parent_wait_for_child_pipe) { // Wait until the child is done sending what it’s going to send. char c; - CheckedReadFile(ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(ReadPipeHandle(), &c, 1); EXPECT_EQ('\0', c); } @@ -397,7 +397,7 @@ if (options_.child_wait_for_parent_pipe_early) { // Wait until the parent is done setting things up on its end. char c; - CheckedReadFile(ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(ReadPipeHandle(), &c, 1); EXPECT_EQ('\0', c); } @@ -431,7 +431,7 @@ if (options_.child_wait_for_parent_pipe_late) { char c; - CheckedReadFile(ReadPipeHandle(), &c, 1); + CheckedReadFileExactly(ReadPipeHandle(), &c, 1); ASSERT_EQ('\0', c); } }
diff --git a/third_party/crashpad/crashpad/util/mach/notify_server_test.cc b/third_party/crashpad/crashpad/util/mach/notify_server_test.cc index 445e35b..b0ef4a3 100644 --- a/third_party/crashpad/crashpad/util/mach/notify_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/notify_server_test.cc
@@ -14,6 +14,8 @@ #include "util/mach/notify_server.h" +#include <stddef.h> + #include "base/compiler_specific.h" #include "base/mac/scoped_mach_port.h" #include "gmock/gmock.h"
diff --git a/third_party/crashpad/crashpad/util/misc/uuid.cc b/third_party/crashpad/crashpad/util/misc/uuid.cc index d4345a8a..ac2468c 100644 --- a/third_party/crashpad/crashpad/util/misc/uuid.cc +++ b/third_party/crashpad/crashpad/util/misc/uuid.cc
@@ -19,6 +19,7 @@ #include "util/misc/uuid.h" #include <inttypes.h> +#include <stddef.h> #include <stdio.h> #include <string.h>
diff --git a/third_party/crashpad/crashpad/util/net/http_transport_libcurl.cc b/third_party/crashpad/crashpad/util/net/http_transport_libcurl.cc index 96ea750..1a20913a 100644 --- a/third_party/crashpad/crashpad/util/net/http_transport_libcurl.cc +++ b/third_party/crashpad/crashpad/util/net/http_transport_libcurl.cc
@@ -48,28 +48,64 @@ // as the user process’ architecture. On Linux, these names are normally // defined in each architecture’s Makefile as UTS_MACHINE, but can be // overridden in architecture-specific configuration as COMPAT_UTS_MACHINE. - // See linux-4.4.52/arch/*/Makefile and - // linux-4.4.52/arch/*/include/asm/compat.h. In turn, on some systems, these + // See linux-4.9.17/arch/*/Makefile and + // linux-4.9.17/arch/*/include/asm/compat.h. In turn, on some systems, these // names are further overridden or refined in early kernel startup code by - // modifying the string returned by linux-4.4.52/include/linux/utsname.h + // modifying the string returned by linux-4.9.17/include/linux/utsname.h // init_utsname() as noted. #if defined(ARCH_CPU_X86) - // linux-4.4.52/arch/x86/kernel/cpu/bugs.c check_bugs() sets the first digit - // to 4, 5, or 6, but no higher. Assume 6. + // linux-4.9.17/arch/x86/kernel/cpu/bugs.c check_bugs() sets the first digit + // to 4, 5, or 6, but no higher. +#if defined(__i686__) const char arch[] = "i686"; +#elif defined(__i586__) + const char arch[] = "i586"; +#elif defined(__i486__) + const char arch[] = "i486"; +#else + const char arch[] = "i386"; +#endif #elif defined(ARCH_CPU_X86_64) const char arch[] = "x86_64"; #elif defined(ARCH_CPU_ARMEL) - // linux-4.4.52/arch/arm/kernel/setup.c setup_processor() bases the string + // linux-4.9.17/arch/arm/kernel/setup.c setup_processor() bases the string // on the ARM processor name and a character identifying little- or // big-endian. The processor name comes from a definition in - // arch/arm/mm/proc-*.S. Assume armv7, little-endian. - const char arch[] = "armv7l"; + // arch/arm/mm/proc-*.S. +#if defined(__ARM_ARCH_4T__) + const char arch[] = "armv4t" +#elif defined(__ARM_ARCH_5TEJ__) + const char arch[] = "armv5tej" +#elif defined(__ARM_ARCH_5TE__) + const char arch[] = "armv5te" +#elif defined(__ARM_ARCH_5T__) + const char arch[] = "armv5t" +#elif defined(__ARM_ARCH_7M__) + const char arch[] = "armv7m" +#else + // Most ARM architectures fall into here, including all profile variants of + // armv6, armv7, armv8, with one exception, armv7m, handled above. + // xstr(__ARM_ARCH) will be the architecture revision number, such as 6, 7, + // or 8. +#define xstr(s) str(s) +#define str(s) #s + const char arch[] = "armv" xstr(__ARM_ARCH) +#undef str +#undef xstr +#endif +#if defined(ARCH_CPU_LITTLE_ENDIAN) + "l"; +#elif defined(ARCH_CPU_BIG_ENDIAN) + "b"; +#endif #elif defined(ARCH_CPU_ARM64) // ARM64 uses aarch64 or aarch64_be as directed by ELF_PLATFORM. See - // linux-4.4.52/arch/arm64/kernel/setup.c setup_arch(). Assume - // little-endian. + // linux-4.9.17/arch/arm64/kernel/setup.c setup_arch(). +#if defined(ARCH_CPU_LITTLE_ENDIAN) const char arch[] = "aarch64"; +#elif defined(ARCH_CPU_BIG_ENDIAN) + const char arch[] = "aarch64_be"; +#endif #elif defined(ARCH_CPU_MIPSEL) const char arch[] = "mips"; #elif defined(ARCH_CPU_MIPS64EL)
diff --git a/third_party/crashpad/crashpad/util/net/http_transport_test.cc b/third_party/crashpad/crashpad/util/net/http_transport_test.cc index 8dfa68a4..cb5c4f1 100644 --- a/third_party/crashpad/crashpad/util/net/http_transport_test.cc +++ b/third_party/crashpad/crashpad/util/net/http_transport_test.cc
@@ -81,7 +81,7 @@ // The child will write the HTTP server port number as a packed unsigned // short to stdout. uint16_t port; - ASSERT_TRUE(LoggingReadFile(ReadPipeHandle(), &port, sizeof(port))); + ASSERT_TRUE(LoggingReadFileExactly(ReadPipeHandle(), &port, sizeof(port))); // Then the parent will tell the web server what response code to send // for the HTTP request.
diff --git a/third_party/crashpad/crashpad/util/posix/close_multiple.cc b/third_party/crashpad/crashpad/util/posix/close_multiple.cc index 172a8f0..3749191b 100644 --- a/third_party/crashpad/crashpad/util/posix/close_multiple.cc +++ b/third_party/crashpad/crashpad/util/posix/close_multiple.cc
@@ -179,7 +179,7 @@ max_fd = std::max(max_fd, getdtablesize()); #endif -#if !defined(OS_LINUX) || defined(OPEN_MAX) +#if !(defined(OS_LINUX) || defined(OS_ANDROID)) || defined(OPEN_MAX) // Linux does not provide OPEN_MAX. See // https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/include/linux/limits.h?id=77293034696e3e0b6c8b8fc1f96be091104b3d2b. max_fd = std::max(max_fd, OPEN_MAX);
diff --git a/third_party/crashpad/crashpad/util/posix/process_info.h b/third_party/crashpad/crashpad/util/posix/process_info.h index 1aa23d8c..5e1a6108 100644 --- a/third_party/crashpad/crashpad/util/posix/process_info.h +++ b/third_party/crashpad/crashpad/util/posix/process_info.h
@@ -25,6 +25,7 @@ #include "base/macros.h" #include "build/build_config.h" +#include "util/misc/initialization_state.h" #include "util/misc/initialization_state_dcheck.h" #if defined(OS_MACOSX) @@ -113,13 +114,21 @@ //! `execve()` as a result of executing a setuid or setgid executable. bool DidChangePrivileges() const; - //! \return `true` if the target task is a 64-bit process. - bool Is64Bit() const; + //! \brief Determines the target process’ bitness. + //! + //! \param[out] is_64_bit `true` if the target task is a 64-bit process. + //! + //! \return `true` on success, with \a is_64_bit set. Otherwise, `false` with + //! a message logged. + bool Is64Bit(bool* is_64_bit) const; //! \brief Determines the target process’ start time. //! //! \param[out] start_time The time that the process started. - void StartTime(timeval* start_time) const; + //! + //! \return `true` on success, with \a start_time set. Otherwise, `false` with + //! a message logged. + bool StartTime(timeval* start_time) const; //! \brief Obtains the arguments used to launch a process. //! @@ -141,6 +150,25 @@ private: #if defined(OS_MACOSX) kinfo_proc kern_proc_info_; +#elif defined(OS_LINUX) || defined(OS_ANDROID) + // Some members are marked mutable so that they can be lazily initialized by + // const methods. These are always InitializationState-protected so that + // multiple successive calls will always produce the same return value and out + // parameters. This is necessary for intergration with the Snapshot interface. + // See https://crashpad.chromium.org/bug/9. + std::set<gid_t> supplementary_groups_; + mutable timeval start_time_; + pid_t pid_; + pid_t ppid_; + uid_t uid_; + uid_t euid_; + uid_t suid_; + gid_t gid_; + gid_t egid_; + gid_t sgid_; + mutable InitializationState start_time_initialized_; + mutable InitializationState is_64_bit_initialized_; + mutable bool is_64_bit_; #endif InitializationStateDcheck initialized_;
diff --git a/third_party/crashpad/crashpad/util/posix/process_info_linux.cc b/third_party/crashpad/crashpad/util/posix/process_info_linux.cc new file mode 100644 index 0000000..bd4202a --- /dev/null +++ b/third_party/crashpad/crashpad/util/posix/process_info_linux.cc
@@ -0,0 +1,520 @@ +// Copyright 2017 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/posix/process_info.h" + +#include <ctype.h> +#include <elf.h> +#include <errno.h> +#include <string.h> +#include <sys/ptrace.h> +#include <sys/uio.h> +#include <sys/user.h> +#include <sys/wait.h> +#include <time.h> +#include <unistd.h> + +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/logging.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece.h" +#include "util/file/delimited_file_reader.h" +#include "util/file/file_reader.h" + +namespace crashpad { + +namespace { + +// If the string |pattern| is matched exactly at the start of |input|, advance +// |input| past |pattern| and return true. +bool AdvancePastPrefix(const char** input, const char* pattern) { + size_t length = strlen(pattern); + if (strncmp(*input, pattern, length) == 0) { + *input += length; + return true; + } + return false; +} + +#define MAKE_ADAPTER(type, function) \ + bool ConvertStringToNumber(const base::StringPiece& input, type* value) { \ + return function(input, value); \ + } +MAKE_ADAPTER(int, base::StringToInt) +MAKE_ADAPTER(unsigned int, base::StringToUint) +MAKE_ADAPTER(uint64_t, base::StringToUint64) +#undef MAKE_ADAPTER + +// Attempt to convert a prefix of |input| to numeric type T. On success, set +// |value| to the number, advance |input| past the number, and return true. +template <typename T> +bool AdvancePastNumber(const char** input, T* value) { + size_t length = 0; + if (std::numeric_limits<T>::is_signed && **input == '-') { + ++length; + } + while (isdigit((*input)[length])) { + ++length; + } + bool success = ConvertStringToNumber(base::StringPiece(*input, length), + value); + if (success) { + *input += length; + return true; + } + return false; +} + +bool ReadEntireFile(const char* path, std::string* contents) { + FileReader file; + if (!file.Open(base::FilePath(path))) { + return false; + } + + char buffer[4096]; + FileOperationResult length; + while ((length = file.Read(buffer, sizeof(buffer))) > 0) { + contents->append(buffer, length); + } + return length >= 0; +} + +void SubtractTimespec(const timespec& t1, const timespec& t2, + timespec* result) { + result->tv_sec = t1.tv_sec - t2.tv_sec; + result->tv_nsec = t1.tv_nsec - t2.tv_nsec; + if (result->tv_nsec < 0) { + result->tv_sec -= 1; + result->tv_nsec += static_cast<long>(1E9); + } +} + +void TimespecToTimeval(const timespec& ts, timeval* tv) { + tv->tv_sec = ts.tv_sec; + tv->tv_usec = ts.tv_nsec / 1000; +} + +class ScopedPtraceDetach { + public: + explicit ScopedPtraceDetach(pid_t pid) : pid_(pid) {} + ~ScopedPtraceDetach() { + if (ptrace(PTRACE_DETACH, pid_, nullptr, nullptr) != 0) { + PLOG(ERROR) << "ptrace"; + } + } + + private: + pid_t pid_; + + DISALLOW_COPY_AND_ASSIGN(ScopedPtraceDetach); +}; + +} // namespace + +ProcessInfo::ProcessInfo() + : supplementary_groups_(), + start_time_(), + pid_(-1), + ppid_(-1), + uid_(-1), + euid_(-1), + suid_(-1), + gid_(-1), + egid_(-1), + sgid_(-1), + start_time_initialized_(), + is_64_bit_initialized_(), + is_64_bit_(false), + initialized_() {} + +ProcessInfo::~ProcessInfo() {} + +bool ProcessInfo::Initialize(pid_t pid) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + pid_ = pid; + + { + char path[32]; + snprintf(path, sizeof(path), "/proc/%d/status", pid_); + FileReader status_file; + if (!status_file.Open(base::FilePath(path))) { + return false; + } + + DelimitedFileReader status_file_line_reader(&status_file); + + bool have_ppid = false; + bool have_uids = false; + bool have_gids = false; + bool have_groups = false; + std::string line; + DelimitedFileReader::Result result; + while ((result = status_file_line_reader.GetLine(&line)) == + DelimitedFileReader::Result::kSuccess) { + if (line.back() != '\n') { + LOG(ERROR) << "format error: unterminated line at EOF"; + return false; + } + + bool understood_line = false; + const char* line_c = line.c_str(); + if (AdvancePastPrefix(&line_c, "PPid:\t")) { + if (have_ppid) { + LOG(ERROR) << "format error: multiple PPid lines"; + return false; + } + have_ppid = AdvancePastNumber(&line_c, &ppid_); + if (!have_ppid) { + LOG(ERROR) << "format error: unrecognized PPid format"; + return false; + } + understood_line = true; + } else if (AdvancePastPrefix(&line_c, "Uid:\t")) { + if (have_uids) { + LOG(ERROR) << "format error: multiple Uid lines"; + return false; + } + uid_t fsuid; + have_uids = AdvancePastNumber(&line_c, &uid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &euid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &suid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &fsuid); + if (!have_uids) { + LOG(ERROR) << "format error: unrecognized Uid format"; + return false; + } + understood_line = true; + } else if (AdvancePastPrefix(&line_c, "Gid:\t")) { + if (have_gids) { + LOG(ERROR) << "format error: multiple Gid lines"; + return false; + } + gid_t fsgid; + have_gids = AdvancePastNumber(&line_c, &gid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &egid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &sgid_) && + AdvancePastPrefix(&line_c, "\t") && + AdvancePastNumber(&line_c, &fsgid); + if (!have_gids) { + LOG(ERROR) << "format error: unrecognized Gid format"; + return false; + } + understood_line = true; + } else if (AdvancePastPrefix(&line_c, "Groups:\t")) { + if (have_groups) { + LOG(ERROR) << "format error: multiple Groups lines"; + return false; + } + gid_t group; + while (AdvancePastNumber(&line_c, &group)) { + supplementary_groups_.insert(group); + if (!AdvancePastPrefix(&line_c, " ")) { + LOG(ERROR) << "format error: unrecognized Groups format"; + return false; + } + } + have_groups = true; + understood_line = true; + } + + if (understood_line && line_c != &line.back()) { + LOG(ERROR) << "format error: unconsumed trailing data"; + return false; + } + } + if (result != DelimitedFileReader::Result::kEndOfFile) { + return false; + } + if (!have_ppid || !have_uids || !have_gids || !have_groups) { + LOG(ERROR) << "format error: missing fields"; + return false; + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +pid_t ProcessInfo::ProcessID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return pid_; +} + +pid_t ProcessInfo::ParentProcessID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return ppid_; +} + +uid_t ProcessInfo::RealUserID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return uid_; +} + +uid_t ProcessInfo::EffectiveUserID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return euid_; +} + +uid_t ProcessInfo::SavedUserID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return suid_; +} + +gid_t ProcessInfo::RealGroupID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return gid_; +} + +gid_t ProcessInfo::EffectiveGroupID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return egid_; +} + +gid_t ProcessInfo::SavedGroupID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return sgid_; +} + +std::set<gid_t> ProcessInfo::SupplementaryGroups() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return supplementary_groups_; +} + +std::set<gid_t> ProcessInfo::AllGroups() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + std::set<gid_t> all_groups = SupplementaryGroups(); + all_groups.insert(RealGroupID()); + all_groups.insert(EffectiveGroupID()); + all_groups.insert(SavedGroupID()); + return all_groups; +} + +bool ProcessInfo::DidChangePrivileges() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(jperaza): Is this possible to determine? + return false; +} + +bool ProcessInfo::Is64Bit(bool* is_64_bit) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + if (is_64_bit_initialized_.is_uninitialized()) { + is_64_bit_initialized_.set_invalid(); + +#if defined(ARCH_CPU_64_BITS) + const bool am_64_bit = true; +#else + const bool am_64_bit = false; +#endif + + if (pid_ == getpid()) { + is_64_bit_ = am_64_bit; + } else { + if (ptrace(PTRACE_ATTACH, pid_, nullptr, nullptr) != 0) { + PLOG(ERROR) << "ptrace"; + return false; + } + + ScopedPtraceDetach ptrace_detach(pid_); + + if (HANDLE_EINTR(waitpid(pid_, nullptr, __WALL)) < 0) { + PLOG(ERROR) << "waitpid"; + return false; + } + + // Allocate more buffer space than is required to hold registers for this + // process. If the kernel fills the extra space, the target process uses + // more/larger registers than this process. If the kernel fills less space + // than sizeof(regs) then the target process uses smaller/fewer registers. + struct { +#if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM64) + using PrStatusType = user_regs_struct; +#elif defined(ARCH_CPU_ARMEL) + using PrStatusType = user_regs; +#endif + PrStatusType regs; + char extra; + } regbuf; + + iovec iov; + iov.iov_base = ®buf; + iov.iov_len = sizeof(regbuf); + if (ptrace(PTRACE_GETREGSET, + pid_, + reinterpret_cast<void*>(NT_PRSTATUS), + &iov) != 0) { + switch (errno) { +#if defined(ARCH_CPU_ARMEL) + case EIO: + // PTRACE_GETREGSET, introduced in Linux 2.6.34 (2225a122ae26), + // requires kernel support enabled by HAVE_ARCH_TRACEHOOK. This has + // been set for x86 (including x86_64) since Linux 2.6.28 + // (99bbc4b1e677a), but for ARM only since Linux 3.5.0 + // (0693bf68148c4). Fortunately, 64-bit ARM support only appeared in + // Linux 3.7.0, so if PTRACE_GETREGSET fails on ARM with EIO, + // indicating that the request is not supported, the kernel must be + // old enough that 64-bit ARM isn’t supported either. + // + // TODO(mark): Once helpers to interpret the kernel version are + // available, add a DCHECK to ensure that the kernel is older than + // 3.5. + is_64_bit_ = false; + break; +#endif + default: + PLOG(ERROR) << "ptrace"; + return false; + } + } else { + is_64_bit_ = am_64_bit == (iov.iov_len == sizeof(regbuf.regs)); + } + } + + is_64_bit_initialized_.set_valid(); + } + + if (!is_64_bit_initialized_.is_valid()) { + return false; + } + + *is_64_bit = is_64_bit_; + return true; +} + +bool ProcessInfo::StartTime(timeval* start_time) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + if (start_time_initialized_.is_uninitialized()) { + start_time_initialized_.set_invalid(); + + char path[32]; + snprintf(path, sizeof(path), "/proc/%d/stat", pid_); + std::string stat_contents; + if (!ReadEntireFile(path, &stat_contents)) { + return false; + } + + // The process start time is the 22nd column. + // The second column is the executable name in parentheses. + // The executable name may have parentheses itself, so find the end of the + // second column by working backwards to find the last closing parens and + // then count forward to the 22nd column. + size_t stat_pos = stat_contents.rfind(')'); + if (stat_pos == std::string::npos) { + LOG(ERROR) << "format error"; + return false; + } + + for (int index = 1; index < 21; ++index) { + stat_pos = stat_contents.find(' ', stat_pos); + if (stat_pos == std::string::npos) { + break; + } + ++stat_pos; + } + if (stat_pos >= stat_contents.size()) { + LOG(ERROR) << "format error"; + return false; + } + + const char* ticks_ptr = &stat_contents[stat_pos]; + + // start time is in jiffies instead of clock ticks pre 2.6. + uint64_t ticks_after_boot; + if (!AdvancePastNumber<uint64_t>(&ticks_ptr, &ticks_after_boot)) { + LOG(ERROR) << "format error"; + return false; + } + long clock_ticks_per_s = sysconf(_SC_CLK_TCK); + if (clock_ticks_per_s <= 0) { + PLOG(ERROR) << "sysconf"; + return false; + } + timeval time_after_boot; + time_after_boot.tv_sec = ticks_after_boot / clock_ticks_per_s; + time_after_boot.tv_usec = + (ticks_after_boot % clock_ticks_per_s) * + (static_cast<long>(1E6) / clock_ticks_per_s); + + timespec uptime; + if (clock_gettime(CLOCK_BOOTTIME, &uptime) != 0) { + PLOG(ERROR) << "clock_gettime"; + return false; + } + + timespec current_time; + if (clock_gettime(CLOCK_REALTIME, ¤t_time) != 0) { + PLOG(ERROR) << "clock_gettime"; + return false; + } + + timespec boot_time_ts; + SubtractTimespec(current_time, uptime, &boot_time_ts); + timeval boot_time_tv; + TimespecToTimeval(boot_time_ts, &boot_time_tv); + timeradd(&boot_time_tv, &time_after_boot, &start_time_); + + start_time_initialized_.set_valid(); + } + + if (!start_time_initialized_.is_valid()) { + return false; + } + + *start_time = start_time_; + return true; +} + +bool ProcessInfo::Arguments(std::vector<std::string>* argv) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + char path[32]; + snprintf(path, sizeof(path), "/proc/%d/cmdline", pid_); + FileReader cmdline_file; + if (!cmdline_file.Open(base::FilePath(path))) { + return false; + } + + DelimitedFileReader cmdline_file_field_reader(&cmdline_file); + + std::vector<std::string> local_argv; + std::string argument; + DelimitedFileReader::Result result; + while ((result = cmdline_file_field_reader.GetDelim('\0', &argument)) == + DelimitedFileReader::Result::kSuccess) { + if (argument.back() != '\0') { + LOG(ERROR) << "format error"; + return false; + } + argument.pop_back(); + local_argv.push_back(argument); + } + if (result != DelimitedFileReader::Result::kEndOfFile) { + return false; + } + + argv->swap(local_argv); + return true; +} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/posix/process_info_mac.cc b/third_party/crashpad/crashpad/util/posix/process_info_mac.cc index 17d205a..4a1fc58 100644 --- a/third_party/crashpad/crashpad/util/posix/process_info_mac.cc +++ b/third_party/crashpad/crashpad/util/posix/process_info_mac.cc
@@ -132,14 +132,16 @@ return kern_proc_info_.kp_proc.p_flag & P_SUGID; } -bool ProcessInfo::Is64Bit() const { +bool ProcessInfo::Is64Bit(bool* is_64_bit) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return kern_proc_info_.kp_proc.p_flag & P_LP64; + *is_64_bit = kern_proc_info_.kp_proc.p_flag & P_LP64; + return true; } -void ProcessInfo::StartTime(timeval* start_time) const { +bool ProcessInfo::StartTime(timeval* start_time) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); *start_time = kern_proc_info_.kp_proc.p_starttime; + return true; } bool ProcessInfo::Arguments(std::vector<std::string>* argv) const {
diff --git a/third_party/crashpad/crashpad/util/posix/process_info_test.cc b/third_party/crashpad/crashpad/util/posix/process_info_test.cc index c07b1ef7..6a1a132 100644 --- a/third_party/crashpad/crashpad/util/posix/process_info_test.cc +++ b/third_party/crashpad/crashpad/util/posix/process_info_test.cc
@@ -14,32 +14,27 @@ #include "util/posix/process_info.h" +#include <signal.h> #include <time.h> -#include <stdio.h> #include <unistd.h> +#include <algorithm> #include <set> #include <string> #include <vector> -#include "base/files/scoped_file.h" +#include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/errors.h" +#include "test/main_arguments.h" #include "util/misc/implicit_cast.h" -#if defined(OS_MACOSX) -#include <crt_externs.h> -#endif - namespace crashpad { namespace test { namespace { -void TestSelfProcess(const ProcessInfo& process_info) { - EXPECT_EQ(getpid(), process_info.ProcessID()); - EXPECT_EQ(getppid(), process_info.ParentProcessID()); - +void TestProcessSelfOrClone(const ProcessInfo& process_info) { // There’s no system call to obtain the saved set-user ID or saved set-group // ID in an easy way. Normally, they are the same as the effective user ID and // effective group ID, so just check against those. @@ -47,6 +42,7 @@ const uid_t euid = geteuid(); EXPECT_EQ(euid, process_info.EffectiveUserID()); EXPECT_EQ(euid, process_info.SavedUserID()); + const gid_t gid = getgid(); EXPECT_EQ(gid, process_info.RealGroupID()); const gid_t egid = getegid(); @@ -78,15 +74,18 @@ // The test executable isn’t expected to change privileges. EXPECT_FALSE(process_info.DidChangePrivileges()); + bool is_64_bit; + ASSERT_TRUE(process_info.Is64Bit(&is_64_bit)); #if defined(ARCH_CPU_64_BITS) - EXPECT_TRUE(process_info.Is64Bit()); + EXPECT_TRUE(is_64_bit); #else - EXPECT_FALSE(process_info.Is64Bit()); + EXPECT_FALSE(is_64_bit); #endif // Test StartTime(). This program must have started at some time in the past. timeval start_time; - process_info.StartTime(&start_time); + ASSERT_TRUE(process_info.StartTime(&start_time)); + EXPECT_FALSE(start_time.tv_sec == 0 && start_time.tv_usec == 0); time_t now; time(&now); EXPECT_LE(start_time.tv_sec, now); @@ -94,53 +93,37 @@ std::vector<std::string> argv; ASSERT_TRUE(process_info.Arguments(&argv)); - // gtest argv processing scrambles argv, but it leaves argc and argv[0] - // intact, so test those. + const std::vector<std::string>& expect_argv = GetMainArguments(); -#if defined(OS_MACOSX) - int expect_argc = *_NSGetArgc(); - char** expect_argv = *_NSGetArgv(); -#elif defined(OS_LINUX) || defined(OS_ANDROID) - std::vector<std::string> expect_arg_vector; - { - base::ScopedFILE cmdline(fopen("/proc/self/cmdline", "re")); - ASSERT_NE(nullptr, cmdline.get()) << ErrnoMessage("fopen"); + // expect_argv always contains the initial view of the arguments at the time + // the program was invoked. argv may contain this view, or it may contain the + // current view of arguments after gtest argv processing. argv may be a subset + // of expect_argv. + // + // gtest argv processing always leaves argv[0] intact, so this can be checked + // directly. + ASSERT_FALSE(expect_argv.empty()); + ASSERT_FALSE(argv.empty()); + EXPECT_EQ(expect_argv[0], argv[0]); - int expect_arg_char; - std::string expect_arg_string; - while ((expect_arg_char = fgetc(cmdline.get())) != EOF) { - if (expect_arg_char != '\0') { - expect_arg_string.append(1, expect_arg_char); - } else { - expect_arg_vector.push_back(expect_arg_string); - expect_arg_string.clear(); - } - } - ASSERT_EQ(0, ferror(cmdline.get())) << ErrnoMessage("fgetc"); - ASSERT_TRUE(expect_arg_string.empty()); + EXPECT_LE(argv.size(), expect_argv.size()); + + // Everything else in argv should have a match in expect_argv too, but things + // may have moved around. + for (size_t arg_index = 1; arg_index < argv.size(); ++arg_index) { + const std::string& arg = argv[arg_index]; + SCOPED_TRACE( + base::StringPrintf("arg_index %zu, arg %s", arg_index, arg.c_str())); + EXPECT_NE(expect_argv.end(), std::find(argv.begin(), argv.end(), arg)); } - - std::vector<const char*> expect_argv_storage; - for (const std::string& expect_arg_string : expect_arg_vector) { - expect_argv_storage.push_back(expect_arg_string.c_str()); - } - - int expect_argc = expect_argv_storage.size(); - const char* const* expect_argv = - !expect_argv_storage.empty() ? &expect_argv_storage[0] : nullptr; -#else -#error Obtain expect_argc and expect_argv correctly on your system. -#endif - - int argc = implicit_cast<int>(argv.size()); - EXPECT_EQ(expect_argc, argc); - - ASSERT_GE(expect_argc, 1); - ASSERT_GE(argc, 1); - - EXPECT_EQ(std::string(expect_argv[0]), argv[0]); } +void TestSelfProcess(const ProcessInfo& process_info) { + EXPECT_EQ(getpid(), process_info.ProcessID()); + EXPECT_EQ(getppid(), process_info.ParentProcessID()); + + TestProcessSelfOrClone(process_info); +} TEST(ProcessInfo, Self) { ProcessInfo process_info; @@ -173,6 +156,24 @@ EXPECT_FALSE(process_info.AllGroups().empty()); } +TEST(ProcessInfo, Forked) { + pid_t pid = fork(); + if (pid == 0) { + raise(SIGSTOP); + _exit(0); + } + ASSERT_GE(pid, 0) << ErrnoMessage("fork"); + + ProcessInfo process_info; + ASSERT_TRUE(process_info.Initialize(pid)); + + EXPECT_EQ(pid, process_info.ProcessID()); + EXPECT_EQ(getpid(), process_info.ParentProcessID()); + + TestProcessSelfOrClone(process_info); + kill(pid, SIGKILL); +} + } // namespace } // namespace test } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/thread/worker_thread_test.cc b/third_party/crashpad/crashpad/util/thread/worker_thread_test.cc index 0cbee18..044734c 100644 --- a/third_party/crashpad/crashpad/util/thread/worker_thread_test.cc +++ b/third_party/crashpad/crashpad/util/thread/worker_thread_test.cc
@@ -30,8 +30,11 @@ ~WorkDelegate() {} void DoWork(const WorkerThread* thread) override { - if (++work_count_ == waiting_for_count_) - semaphore_.Signal(); + if (work_count_ < waiting_for_count_) { + if (++work_count_ == waiting_for_count_) { + semaphore_.Signal(); + } + } } void SetDesiredWorkCount(int times) { @@ -59,6 +62,7 @@ WorkerThread thread(0.05, &delegate); uint64_t start = ClockMonotonicNanoseconds(); + delegate.SetDesiredWorkCount(2); thread.Start(0); EXPECT_TRUE(thread.is_running()); @@ -103,12 +107,12 @@ WorkDelegate delegate; WorkerThread thread(100, &delegate); + uint64_t start = ClockMonotonicNanoseconds(); + delegate.SetDesiredWorkCount(1); thread.Start(0); EXPECT_TRUE(thread.is_running()); - uint64_t start = ClockMonotonicNanoseconds(); - delegate.WaitForWorkCount(); EXPECT_EQ(1, delegate.work_count());
diff --git a/third_party/crashpad/crashpad/util/util.gyp b/third_party/crashpad/crashpad/util/util.gyp index f1f004c..4890012a 100644 --- a/third_party/crashpad/crashpad/util/util.gyp +++ b/third_party/crashpad/crashpad/util/util.gyp
@@ -30,6 +30,8 @@ '<(INTERMEDIATE_DIR)', ], 'sources': [ + 'file/delimited_file_reader.cc', + 'file/delimited_file_reader.h', 'file/file_io.cc', 'file/file_io.h', 'file/file_io_posix.cc', @@ -135,6 +137,7 @@ 'posix/drop_privileges.cc', 'posix/drop_privileges.h', 'posix/process_info.h', + 'posix/process_info_linux.cc', 'posix/process_info_mac.cc', 'posix/signals.cc', 'posix/signals.h', @@ -313,6 +316,13 @@ ], }], ], + 'target_conditions': [ + ['OS=="android"', { + 'sources/': [ + ['include', '^posix/process_info_linux\\.cc$'], + ], + }], + ], }, ], }
diff --git a/third_party/crashpad/crashpad/util/util_test.gyp b/third_party/crashpad/crashpad/util/util_test.gyp index a33e474..495c5e6 100644 --- a/third_party/crashpad/crashpad/util/util_test.gyp +++ b/third_party/crashpad/crashpad/util/util_test.gyp
@@ -24,9 +24,9 @@ 'util.gyp:crashpad_util', '../client/client.gyp:crashpad_client', '../compat/compat.gyp:crashpad_compat', + '../test/test.gyp:crashpad_gmock_main', '../test/test.gyp:crashpad_test', '../third_party/gtest/gmock.gyp:gmock', - '../third_party/gtest/gmock.gyp:gmock_main', '../third_party/gtest/gtest.gyp:gtest', '../third_party/mini_chromium/mini_chromium.gyp:base', '../third_party/zlib/zlib.gyp:zlib', @@ -35,7 +35,9 @@ '..', ], 'sources': [ + 'file/delimited_file_reader_test.cc', 'file/file_io_test.cc', + 'file/file_reader_test.cc', 'file/string_file_test.cc', 'mac/launchd_test.mm', 'mac/mac_util_test.mm', @@ -120,6 +122,18 @@ ], }, }], + ['OS=="android"', { + # Things not yet ported to Android + 'sources/' : [ + ['exclude', '^net/http_transport_test\\.cc$'], + ] + }], + ['OS=="android" or OS=="linux"' , { + # Things not yet ported to Android or Linux + 'sources/' : [ + ['exclude', '^numeric/checked_address_range_test\\.cc$'], + ] + }], ], }, ],
diff --git a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc index 70955c8..fdc159c 100644 --- a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc +++ b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc
@@ -396,7 +396,8 @@ const internal::PipeServiceContext& service_context) { ClientToServerMessage message; - if (!LoggingReadFile(service_context.pipe(), &message, sizeof(message))) + if (!LoggingReadFileExactly( + service_context.pipe(), &message, sizeof(message))) return false; switch (message.type) {
diff --git a/third_party/crashpad/crashpad/util/win/exception_handler_server_test.cc b/third_party/crashpad/crashpad/util/win/exception_handler_server_test.cc index e94b91d..e9f865b 100644 --- a/third_party/crashpad/crashpad/util/win/exception_handler_server_test.cc +++ b/third_party/crashpad/crashpad/util/win/exception_handler_server_test.cc
@@ -143,10 +143,11 @@ std::wstring ReadWString(FileHandle handle) { size_t length = 0; - EXPECT_TRUE(LoggingReadFile(handle, &length, sizeof(length))); + EXPECT_TRUE(LoggingReadFileExactly(handle, &length, sizeof(length))); std::wstring str(length, L'\0'); if (length > 0) { - EXPECT_TRUE(LoggingReadFile(handle, &str[0], length * sizeof(str[0]))); + EXPECT_TRUE( + LoggingReadFileExactly(handle, &str[0], length * sizeof(str[0]))); } return str; }
diff --git a/third_party/crashpad/crashpad/util/win/process_info.cc b/third_party/crashpad/crashpad/util/win/process_info.cc index 2e285b8..cb2051c 100644 --- a/third_party/crashpad/crashpad/util/win/process_info.cc +++ b/third_party/crashpad/crashpad/util/win/process_info.cc
@@ -14,6 +14,7 @@ #include "util/win/process_info.h" +#include <stddef.h> #include <winternl.h> #include <algorithm>
diff --git a/third_party/crashpad/crashpad/util/win/process_info_test.cc b/third_party/crashpad/crashpad/util/win/process_info_test.cc index e377a6ee..dfa6564 100644 --- a/third_party/crashpad/crashpad/util/win/process_info_test.cc +++ b/third_party/crashpad/crashpad/util/win/process_info_test.cc
@@ -156,7 +156,7 @@ // The child sends us a code address we can look up in the memory map. WinVMAddress code_address; - CheckedReadFile( + CheckedReadFileExactly( child.stdout_read_handle(), &code_address, sizeof(code_address)); ASSERT_TRUE(process_info.Initialize(child.process_handle()));
diff --git a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc index e5cbd8d..87c45748 100644 --- a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc +++ b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
@@ -14,6 +14,7 @@ #include "util/win/registration_protocol_win.h" +#include <stddef.h> #include <windows.h> #include "base/logging.h"
diff --git a/third_party/crashpad/crashpad/util/win/scoped_process_suspend.cc b/third_party/crashpad/crashpad/util/win/scoped_process_suspend.cc index fc75ce0..f07acc3 100644 --- a/third_party/crashpad/crashpad/util/win/scoped_process_suspend.cc +++ b/third_party/crashpad/crashpad/util/win/scoped_process_suspend.cc
@@ -14,6 +14,7 @@ #include "util/win/scoped_process_suspend.h" +#include <stddef.h> #include <winternl.h> #include "util/win/nt_internals.h"
diff --git a/third_party/crashpad/crashpad/util/win/scoped_process_suspend_test.cc b/third_party/crashpad/crashpad/util/win/scoped_process_suspend_test.cc index c968f71..f770456 100644 --- a/third_party/crashpad/crashpad/util/win/scoped_process_suspend_test.cc +++ b/third_party/crashpad/crashpad/util/win/scoped_process_suspend_test.cc
@@ -14,6 +14,7 @@ #include "util/win/scoped_process_suspend.h" +#include <stddef.h> #include <tlhelp32.h> #include <algorithm> @@ -80,7 +81,7 @@ int Run() override { char c; // Wait for notification from parent. - EXPECT_TRUE(LoggingReadFile(ReadPipeHandle(), &c, sizeof(c))); + EXPECT_TRUE(LoggingReadFileExactly(ReadPipeHandle(), &c, sizeof(c))); EXPECT_EQ(' ', c); return EXIT_SUCCESS; }
diff --git a/third_party/libvpx/BUILD.gn b/third_party/libvpx/BUILD.gn index 2c79ee0f..bfc93ce 100644 --- a/third_party/libvpx/BUILD.gn +++ b/third_party/libvpx/BUILD.gn
@@ -71,6 +71,15 @@ # libvpx has many static functions in header, which trigger this warning. "-Wno-unused-function", ] + # Fixes a mac link error for vpx_scaled_2d: + # Undefined symbols for architecture x86_64: + # "_vpx_scaled_2d", referenced from: + # _vp9_scale_and_extend_frame_c in libvpx.a(vp9_frame_scale.o) + # (maybe you meant: _vpx_scaled_2d_ssse3) + # ld: symbol(s) not found for architecture x86_64 + if (is_mac) { + cflags += [ "-fno-common" ] + } } else if (!is_win) { cflags = [ "-Wno-unused-function",
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index 7161aa8..9afc8d67 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@ License File: source/libvpx/LICENSE Security Critical: yes -Date: Friday February 24 2017 +Date: Tuesday March 21 2017 Branch: master -Commit: 8121f85473b28183c93fdcef290ed6f74b0b52db +Commit: 2fac50fa0ee099c632d97a941a9871e7cecbe720 Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/libvpx_srcs.gni b/third_party/libvpx/libvpx_srcs.gni index 7a4c241..a39f457 100644 --- a/third_party/libvpx/libvpx_srcs.gni +++ b/third_party/libvpx/libvpx_srcs.gni
@@ -222,6 +222,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -663,6 +664,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -1107,6 +1109,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -1467,6 +1470,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -1837,6 +1841,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -2257,6 +2262,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -2619,6 +2625,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -2952,6 +2959,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h", @@ -3285,6 +3293,7 @@ "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_extend.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h", + "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_frame_scale.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_job_queue.h", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c", "//third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h",
diff --git a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm index 08380931..bef9c425 100644 --- a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm +++ b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm
@@ -8,6 +8,7 @@ .set ARCH_MIPS , 0 .set ARCH_X86 , 0 .set ARCH_X86_64 , 0 +.set ARCH_PPC , 0 .set HAVE_NEON , 1 .set HAVE_NEON_ASM , 1 .set HAVE_MIPS32 , 0 @@ -22,6 +23,7 @@ .set HAVE_SSE4_1 , 0 .set HAVE_AVX , 0 .set HAVE_AVX2 , 0 +.set HAVE_VSX , 0 .set HAVE_VPX_PORTS , 1 .set HAVE_PTHREAD_H , 1 .set HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.h b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.h index 2d9a3ced..ce52249 100644 --- a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.h +++ b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 1 #define HAVE_NEON_ASM 1 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/ios/arm64/vpx_config.asm b/third_party/libvpx/source/config/ios/arm64/vpx_config.asm index 787a3e8..ada44e3 100644 --- a/third_party/libvpx/source/config/ios/arm64/vpx_config.asm +++ b/third_party/libvpx/source/config/ios/arm64/vpx_config.asm
@@ -8,6 +8,7 @@ .set ARCH_MIPS , 0 .set ARCH_X86 , 0 .set ARCH_X86_64 , 0 +.set ARCH_PPC , 0 .set HAVE_NEON , 1 .set HAVE_NEON_ASM , 0 .set HAVE_MIPS32 , 0 @@ -22,6 +23,7 @@ .set HAVE_SSE4_1 , 0 .set HAVE_AVX , 0 .set HAVE_AVX2 , 0 +.set HAVE_VSX , 0 .set HAVE_VPX_PORTS , 1 .set HAVE_PTHREAD_H , 1 .set HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/ios/arm64/vpx_config.h b/third_party/libvpx/source/config/ios/arm64/vpx_config.h index 9a9ecb4..27a3e2d3 100644 --- a/third_party/libvpx/source/config/ios/arm64/vpx_config.h +++ b/third_party/libvpx/source/config/ios/arm64/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 1 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.asm b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.asm index 7907ec7b..d31b3a0 100644 --- a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.asm
@@ -5,6 +5,7 @@ .equ ARCH_MIPS , 0 .equ ARCH_X86 , 0 .equ ARCH_X86_64 , 0 +.equ ARCH_PPC , 0 .equ HAVE_NEON , 1 .equ HAVE_NEON_ASM , 1 .equ HAVE_MIPS32 , 0 @@ -19,6 +20,7 @@ .equ HAVE_SSE4_1 , 0 .equ HAVE_AVX , 0 .equ HAVE_AVX2 , 0 +.equ HAVE_VSX , 0 .equ HAVE_VPX_PORTS , 1 .equ HAVE_PTHREAD_H , 1 .equ HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.h b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.h index e7972cfe..961acde 100644 --- a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.h +++ b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 1 #define HAVE_NEON_ASM 1 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/arm-neon/vpx_config.asm b/third_party/libvpx/source/config/linux/arm-neon/vpx_config.asm index 3675109..cdcf0e3 100644 --- a/third_party/libvpx/source/config/linux/arm-neon/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/arm-neon/vpx_config.asm
@@ -5,6 +5,7 @@ .equ ARCH_MIPS , 0 .equ ARCH_X86 , 0 .equ ARCH_X86_64 , 0 +.equ ARCH_PPC , 0 .equ HAVE_NEON , 1 .equ HAVE_NEON_ASM , 1 .equ HAVE_MIPS32 , 0 @@ -19,6 +20,7 @@ .equ HAVE_SSE4_1 , 0 .equ HAVE_AVX , 0 .equ HAVE_AVX2 , 0 +.equ HAVE_VSX , 0 .equ HAVE_VPX_PORTS , 1 .equ HAVE_PTHREAD_H , 1 .equ HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/linux/arm-neon/vpx_config.h b/third_party/libvpx/source/config/linux/arm-neon/vpx_config.h index 2d9a3ced..ce52249 100644 --- a/third_party/libvpx/source/config/linux/arm-neon/vpx_config.h +++ b/third_party/libvpx/source/config/linux/arm-neon/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 1 #define HAVE_NEON_ASM 1 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/arm/vpx_config.asm b/third_party/libvpx/source/config/linux/arm/vpx_config.asm index 307a7a2a..99fa36b2 100644 --- a/third_party/libvpx/source/config/linux/arm/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/arm/vpx_config.asm
@@ -5,6 +5,7 @@ .equ ARCH_MIPS , 0 .equ ARCH_X86 , 0 .equ ARCH_X86_64 , 0 +.equ ARCH_PPC , 0 .equ HAVE_NEON , 0 .equ HAVE_NEON_ASM , 0 .equ HAVE_MIPS32 , 0 @@ -19,6 +20,7 @@ .equ HAVE_SSE4_1 , 0 .equ HAVE_AVX , 0 .equ HAVE_AVX2 , 0 +.equ HAVE_VSX , 0 .equ HAVE_VPX_PORTS , 1 .equ HAVE_PTHREAD_H , 1 .equ HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/linux/arm/vpx_config.h b/third_party/libvpx/source/config/linux/arm/vpx_config.h index 1f3fe53..547ec0df 100644 --- a/third_party/libvpx/source/config/linux/arm/vpx_config.h +++ b/third_party/libvpx/source/config/linux/arm/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/arm64/vpx_config.asm b/third_party/libvpx/source/config/linux/arm64/vpx_config.asm index 88c2d262..4194c9b 100644 --- a/third_party/libvpx/source/config/linux/arm64/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/arm64/vpx_config.asm
@@ -5,6 +5,7 @@ .equ ARCH_MIPS , 0 .equ ARCH_X86 , 0 .equ ARCH_X86_64 , 0 +.equ ARCH_PPC , 0 .equ HAVE_NEON , 1 .equ HAVE_NEON_ASM , 0 .equ HAVE_MIPS32 , 0 @@ -19,6 +20,7 @@ .equ HAVE_SSE4_1 , 0 .equ HAVE_AVX , 0 .equ HAVE_AVX2 , 0 +.equ HAVE_VSX , 0 .equ HAVE_VPX_PORTS , 1 .equ HAVE_PTHREAD_H , 1 .equ HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/linux/arm64/vpx_config.h b/third_party/libvpx/source/config/linux/arm64/vpx_config.h index 9a9ecb4..27a3e2d3 100644 --- a/third_party/libvpx/source/config/linux/arm64/vpx_config.h +++ b/third_party/libvpx/source/config/linux/arm64/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 1 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/generic/vpx_config.asm b/third_party/libvpx/source/config/linux/generic/vpx_config.asm index 827b4a7..4fb5955 100644 --- a/third_party/libvpx/source/config/linux/generic/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/generic/vpx_config.asm
@@ -5,6 +5,7 @@ .equ ARCH_MIPS , 0 .equ ARCH_X86 , 0 .equ ARCH_X86_64 , 0 +.equ ARCH_PPC , 0 .equ HAVE_NEON , 0 .equ HAVE_NEON_ASM , 0 .equ HAVE_MIPS32 , 0 @@ -19,6 +20,7 @@ .equ HAVE_SSE4_1 , 0 .equ HAVE_AVX , 0 .equ HAVE_AVX2 , 0 +.equ HAVE_VSX , 0 .equ HAVE_VPX_PORTS , 1 .equ HAVE_PTHREAD_H , 1 .equ HAVE_UNISTD_H , 0
diff --git a/third_party/libvpx/source/config/linux/generic/vpx_config.h b/third_party/libvpx/source/config/linux/generic/vpx_config.h index 9d83281..8f7899a0 100644 --- a/third_party/libvpx/source/config/linux/generic/vpx_config.h +++ b/third_party/libvpx/source/config/linux/generic/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h index 3f920cc2a4..dae716e 100644 --- a/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h
@@ -916,6 +916,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1_add vpx_highbd_idct32x32_1_add_c
diff --git a/third_party/libvpx/source/config/linux/ia32/vpx_config.asm b/third_party/libvpx/source/config/linux/ia32/vpx_config.asm index 74395aa..a81eaba5 100644 --- a/third_party/libvpx/source/config/linux/ia32/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/ia32/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 1 %define ARCH_X86_64 0 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 1 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/ia32/vpx_config.h b/third_party/libvpx/source/config/linux/ia32/vpx_config.h index 949b8bcf..56f9a81 100644 --- a/third_party/libvpx/source/config/linux/ia32/vpx_config.h +++ b/third_party/libvpx/source/config/linux/ia32/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 1 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h index 47fe5dd..9d312fe 100644 --- a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h
@@ -1102,6 +1102,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); RTCD_EXTERN void (*vpx_highbd_idct32x32_1_add)(const tran_low_t *input, uint8_t *dest, int stride, int bd);
diff --git a/third_party/libvpx/source/config/linux/mips64el/vpx_config.h b/third_party/libvpx/source/config/linux/mips64el/vpx_config.h index f9071f94..69cf190 100644 --- a/third_party/libvpx/source/config/linux/mips64el/vpx_config.h +++ b/third_party/libvpx/source/config/linux/mips64el/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 1 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/mipsel/vpx_config.h b/third_party/libvpx/source/config/linux/mipsel/vpx_config.h index b9eafb6e..f72f165 100644 --- a/third_party/libvpx/source/config/linux/mipsel/vpx_config.h +++ b/third_party/libvpx/source/config/linux/mipsel/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 1 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 1 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/x64/vpx_config.asm b/third_party/libvpx/source/config/linux/x64/vpx_config.asm index f8636744..a79dc6d 100644 --- a/third_party/libvpx/source/config/linux/x64/vpx_config.asm +++ b/third_party/libvpx/source/config/linux/x64/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 0 %define ARCH_X86_64 1 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 1 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/x64/vpx_config.h b/third_party/libvpx/source/config/linux/x64/vpx_config.h index f57a7da9..36be42b 100644 --- a/third_party/libvpx/source/config/linux/x64/vpx_config.h +++ b/third_party/libvpx/source/config/linux/x64/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 1 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h index df2e81e7..8d710d7 100644 --- a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h
@@ -1109,6 +1109,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1_add vpx_highbd_idct32x32_1_add_sse2
diff --git a/third_party/libvpx/source/config/mac/ia32/vpx_config.asm b/third_party/libvpx/source/config/mac/ia32/vpx_config.asm index 74395aa..a81eaba5 100644 --- a/third_party/libvpx/source/config/mac/ia32/vpx_config.asm +++ b/third_party/libvpx/source/config/mac/ia32/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 1 %define ARCH_X86_64 0 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 1 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/mac/ia32/vpx_config.h b/third_party/libvpx/source/config/mac/ia32/vpx_config.h index 949b8bcf..56f9a81 100644 --- a/third_party/libvpx/source/config/mac/ia32/vpx_config.h +++ b/third_party/libvpx/source/config/mac/ia32/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 1 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h index 47fe5dd..9d312fe 100644 --- a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h
@@ -1102,6 +1102,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); RTCD_EXTERN void (*vpx_highbd_idct32x32_1_add)(const tran_low_t *input, uint8_t *dest, int stride, int bd);
diff --git a/third_party/libvpx/source/config/mac/x64/vpx_config.asm b/third_party/libvpx/source/config/mac/x64/vpx_config.asm index f8636744..a79dc6d 100644 --- a/third_party/libvpx/source/config/mac/x64/vpx_config.asm +++ b/third_party/libvpx/source/config/mac/x64/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 0 %define ARCH_X86_64 1 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 1 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/mac/x64/vpx_config.h b/third_party/libvpx/source/config/mac/x64/vpx_config.h index f57a7da9..36be42b 100644 --- a/third_party/libvpx/source/config/mac/x64/vpx_config.h +++ b/third_party/libvpx/source/config/mac/x64/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 1 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h index df2e81e7..8d710d7 100644 --- a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h
@@ -1109,6 +1109,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1_add vpx_highbd_idct32x32_1_add_sse2
diff --git a/third_party/libvpx/source/config/nacl/vpx_config.h b/third_party/libvpx/source/config/nacl/vpx_config.h index 9d83281..8f7899a0 100644 --- a/third_party/libvpx/source/config/nacl/vpx_config.h +++ b/third_party/libvpx/source/config/nacl/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 0 #define HAVE_AVX 0 #define HAVE_AVX2 0 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 1 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h index 3f920cc2a4..dae716e 100644 --- a/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h
@@ -916,6 +916,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1_add vpx_highbd_idct32x32_1_add_c
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index 2b51b30..020ec66 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -1,7 +1,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 6 #define VERSION_PATCH 1 -#define VERSION_EXTRA "263-g8121f8547" +#define VERSION_EXTRA "375-g2fac50fa0" #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.6.1-263-g8121f8547" -#define VERSION_STRING " v1.6.1-263-g8121f8547" +#define VERSION_STRING_NOSP "v1.6.1-375-g2fac50fa0" +#define VERSION_STRING " v1.6.1-375-g2fac50fa0"
diff --git a/third_party/libvpx/source/config/win/ia32/vpx_config.asm b/third_party/libvpx/source/config/win/ia32/vpx_config.asm index d60fd89..da91ab9 100644 --- a/third_party/libvpx/source/config/win/ia32/vpx_config.asm +++ b/third_party/libvpx/source/config/win/ia32/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 1 %define ARCH_X86_64 0 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 0 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/win/ia32/vpx_config.h b/third_party/libvpx/source/config/win/ia32/vpx_config.h index 3b93eeec..ac078f9 100644 --- a/third_party/libvpx/source/config/win/ia32/vpx_config.h +++ b/third_party/libvpx/source/config/win/ia32/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 1 #define ARCH_X86_64 0 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 0 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h index 47fe5dd..9d312fe 100644 --- a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h
@@ -1102,6 +1102,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); RTCD_EXTERN void (*vpx_highbd_idct32x32_1_add)(const tran_low_t *input, uint8_t *dest, int stride, int bd);
diff --git a/third_party/libvpx/source/config/win/x64/vpx_config.asm b/third_party/libvpx/source/config/win/x64/vpx_config.asm index 6e21c59c..b2a8837a 100644 --- a/third_party/libvpx/source/config/win/x64/vpx_config.asm +++ b/third_party/libvpx/source/config/win/x64/vpx_config.asm
@@ -2,6 +2,7 @@ %define ARCH_MIPS 0 %define ARCH_X86 0 %define ARCH_X86_64 1 +%define ARCH_PPC 0 %define HAVE_NEON 0 %define HAVE_NEON_ASM 0 %define HAVE_MIPS32 0 @@ -16,6 +17,7 @@ %define HAVE_SSE4_1 1 %define HAVE_AVX 1 %define HAVE_AVX2 1 +%define HAVE_VSX 0 %define HAVE_VPX_PORTS 1 %define HAVE_PTHREAD_H 0 %define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/win/x64/vpx_config.h b/third_party/libvpx/source/config/win/x64/vpx_config.h index c37c012..441ed94f 100644 --- a/third_party/libvpx/source/config/win/x64/vpx_config.h +++ b/third_party/libvpx/source/config/win/x64/vpx_config.h
@@ -14,6 +14,7 @@ #define ARCH_MIPS 0 #define ARCH_X86 0 #define ARCH_X86_64 1 +#define ARCH_PPC 0 #define HAVE_NEON 0 #define HAVE_NEON_ASM 0 #define HAVE_MIPS32 0 @@ -28,6 +29,7 @@ #define HAVE_SSE4_1 1 #define HAVE_AVX 1 #define HAVE_AVX2 1 +#define HAVE_VSX 0 #define HAVE_VPX_PORTS 1 #define HAVE_PTHREAD_H 0 #define HAVE_UNISTD_H 0
diff --git a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h index df2e81e7..8d710d7 100644 --- a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h
@@ -1109,6 +1109,9 @@ void vpx_highbd_idct32x32_1024_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1024_add vpx_highbd_idct32x32_1024_add_c +void vpx_highbd_idct32x32_135_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); +#define vpx_highbd_idct32x32_135_add vpx_highbd_idct32x32_135_add_c + void vpx_highbd_idct32x32_1_add_c(const tran_low_t *input, uint8_t *dest, int stride, int bd); void vpx_highbd_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest, int stride, int bd); #define vpx_highbd_idct32x32_1_add vpx_highbd_idct32x32_1_add_sse2
diff --git a/tools/gn/value.cc b/tools/gn/value.cc index 0afbc7d..b5e21f0 100644 --- a/tools/gn/value.cc +++ b/tools/gn/value.cc
@@ -73,7 +73,7 @@ scope_value_ = other.scope_value_->MakeClosure(); } -Value::Value(Value&& other) noexcept = default; +Value::Value(Value&& other) = default; Value::~Value() { }
diff --git a/tools/gn/value.h b/tools/gn/value.h index 3ce0117f..0428818e 100644 --- a/tools/gn/value.h +++ b/tools/gn/value.h
@@ -43,7 +43,7 @@ Value(const ParseNode* origin, std::unique_ptr<Scope> scope); Value(const Value& other); - Value(Value&& other) noexcept; + Value(Value&& other); ~Value(); Value& operator=(const Value& other);
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 7dd3ac02..675021d 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -1087,14 +1087,11 @@ output_path=None) if android and test_type != "script": - # TODO(crbug.com/693203): Reenable logcat logdog uploading when outage - # has been resolved. cmdline = [ - self.PathJoin('bin', 'run_%s' % target), - '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats', + '../../build/android/test_wrapper/logdog_wrapper.py', + '--target', target, '--target-devices-file', '${SWARMING_BOT_FILE}', - '-v' - ] + '--logdog-bin-cmd', '../../bin/logdog_butler'] elif use_xvfb and test_type == 'windowed_test_launcher': extra_files = [ '../../testing/test_env.py',
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 6f03475e..bcc80bf 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -14,7 +14,7 @@ # below). MB uses this dict to look up which config to use for a given bot. 'masters': { 'chromeos.chrome': { - 'amd64-generic Trusty (Informational)': 'cros_chrome_sdk', + 'chrome-tot-chromeos-amd64-generic': 'cros_chrome_sdk', 'Chrome4CROS Packages': 'chromeos_with_codecs_release_bot', 'Linux ChromeOS Buildspec Tests': 'chromeos_with_codecs_release_bot', },
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 643d0c9..761bac7 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -10531,8 +10531,8 @@ <owner>amohammadkhan@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> - The request and reponse size of the messages exchanged by a service. It is - logged when the URLReqeust of a service is completed. The service name is + The request and response size of the messages exchanged by a service. It is + logged when the URLRequest of a service is completed. The service name is added as a suffix to this histogram name. </summary> </histogram> @@ -10541,7 +10541,7 @@ <owner>amohammadkhan@chromium.org</owner> <owner>bengr@chromium.org</owner> <summary> - The request and reponse size of the messages exchanged by all the services. + The request and response size of the messages exchanged by all the services. Whenever a URLRequest of a service is completed, the number of exchanged bytes is logged in this histogram. The buckets in this histogram are services, so it makes it possible to compare the use of different services @@ -38032,6 +38032,17 @@ <summary>True if a URLRequest's referrer is empty or valid when set.</summary> </histogram> +<histogram name="Net.ValidDNSName" enum="Boolean"> + <owner>palmer@chromium.org</owner> + <summary> + True if a DNS name contains only characters for which + |net::IsValidLabelCharacter| returns true. Used to see if we can deprecate + and remove support for arbitrary bytes in DNS names. This histogram is + recorded when converting dotted DNS names into DNS query form, in + preparation for issuing a DNS request. + </summary> +</histogram> + <histogram name="Net.WebSocket.DeflateMode" enum="WebSocketNewPerMessageDeflateContextTakeoverMode"> <owner>yhirano@chromium.org</owner> @@ -61863,6 +61874,9 @@ </histogram> <histogram name="Search.ContextualSearchDurationNonPrefetched" units="ms"> + <obsolete> + Discontinued on 2/2017 Due to data being buggy and not useful. + </obsolete> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -61872,6 +61886,9 @@ </histogram> <histogram name="Search.ContextualSearchDurationPrefetched" units="ms"> + <obsolete> + Discontinued on 2/2017 Due to data being buggy and not useful. + </obsolete> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -62146,6 +62163,9 @@ <histogram name="Search.ContextualSearchPrefetchSummary" enum="ContextualSearchPrefetchSummary"> + <obsolete> + Discontinued on 2/2017 Due to data not being useful. + </obsolete> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -62468,6 +62488,9 @@ <histogram name="Search.ContextualSearchSerpLoadedOnClose" enum="ContextualSearchLoaded"> + <obsolete> + Removed 02/2017 because the data is no longer valuable. + </obsolete> <owner>donnd@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -80291,6 +80314,23 @@ <summary>The type of category clicked in the Windows Jumplist</summary> </histogram> +<histogram name="WinJumplist.DeleteStatusJumpListIcons" + enum="JumplisticonsDeleteCategory"> + <owner>chengx@chromium.org</owner> + <summary> + This metric records the detailed delete result of JumpListIcons directory. + </summary> +</histogram> + +<histogram name="WinJumplist.DeleteStatusJumpListIconsOld" + enum="JumplisticonsDeleteCategory"> + <owner>chengx@chromium.org</owner> + <summary> + This metric records the detailed delete result of JumpListIconsOld + directory. + </summary> +</histogram> + <histogram name="WinJumplist.DetailedFolderMoveResults" enum="JumplistIconsDetailedFolderMoveCategory"> <obsolete> @@ -80328,6 +80368,10 @@ <histogram name="WinJumplist.DetailedFolderResultsDeleteUpdated" enum="JumplistIconsDetailedFolderOperationDeleteUpdatedCategory"> + <obsolete> + Obselete 03/20/2016. New metrics named WinJumplist.DeleteStatusJumpListIcons + and WinJumplist.DeleteStatusJumpListIconsOld are used instead. + </obsolete> <owner>chengx@chromium.org</owner> <summary> This metric is recorded when folders JumpListIcons and JumpListIconsOld get @@ -80343,6 +80387,14 @@ </summary> </histogram> +<histogram name="WinJumplist.EmptyStatusJumpListIcons" + enum="JumpListIconsFolderEmptyCategory"> + <owner>chengx@chromium.org</owner> + <summary> + This metric records the empty status of folder JumpListIcons. + </summary> +</histogram> + <histogram name="WinJumplist.FolderMoveResults" enum="JumplistIconsFolderMoveCategory"> <obsolete> @@ -82415,6 +82467,7 @@ <enum name="AutoplaySource" type="int"> <int value="0" label="autoplay attribute"/> <int value="1" label="play() method"/> + <int value="2" label="dual source"/> </enum> <enum name="AutoSigninFirstRun" type="int"> @@ -85713,6 +85766,10 @@ <int value="30" label="Call"/> <int value="31" label="Send text message"/> <int value="32" label="Copy phone number"/> + <int value="33" label="Open in new Chrome tab (CCT)"/> + <int value="34" label="Open in Chrome incognito tab (CCT)"/> + <int value="35" label="Open in browser (CCT)"/> + <int value="36" label="Open in Chrome (Fullscreen)"/> </enum> <enum name="ContextMenuSaveLinkType" type="int"> @@ -95917,7 +95974,7 @@ <int value="5" label="Invalid parameters"/> <int value="6" label="Service unavailable"/> <int value="7" label="Internal server error"/> - <int value="8" label="HTTP reponse code not OK"/> + <int value="8" label="HTTP response code not OK"/> <int value="9" label="Unknown error"/> <int value="10" label="Reached maximum number of retries"/> <int value="11" label="Device registration error"/> @@ -98132,6 +98189,17 @@ </int> </enum> +<enum name="JumplisticonsDeleteCategory" type="int"> + <int value="0" label="Success"/> + <int value="1" label="Fail as directory name length exceeds MAX_PATH"/> + <int value="2" label="Fail as directory is read-only"/> + <int value="3" label="Fail as the input directory is actually a file"/> + <int value="4" label="Fail as sub-directory exists"/> + <int value="5" label="Fail to delete max files without attempt failures"/> + <int value="6" label="Fail as maximum attempt failures allowed are hit"/> + <int value="7" label="Fail to remove the raw directory"/> +</enum> + <enum name="JumplistIconsDetailedFolderMoveCategory" type="int"> <int value="0" label="DelTargetDir Succeed - MoveFileEx Succeed - CopyFile Succeed - @@ -98478,6 +98546,11 @@ <int value="7" label="Del Fail - Mov Fail - Create Fail"/> </enum> +<enum name="JumpListIconsFolderEmptyCategory" type="int"> + <int value="0" label="Empty"/> + <int value="1" label="Non-Empty"/> +</enum> + <enum name="JumplistIconsFolderMoveCategory" type="int"> <int value="0" label="Del Succeed - MaxPathCheck Succeed - MoveFileEx Succeed - @@ -100107,6 +100180,7 @@ <int value="-86788587" label="allow-autofill-sync-credential"/> <int value="-80353187" label="disable-display-color-calibration"/> <int value="-78035185" label="custom_summary"/> + <int value="-77872983" label="BookmarkAppsMac:disabled"/> <int value="-76631048" label="disable-offline-auto-reload-visible-only"/> <int value="-70595606" label="ash-enable-unified-desktop"/> <int value="-68877684" label="BackgroundVideoTrackOptimization:enabled"/> @@ -100178,6 +100252,7 @@ <int value="262382944" label="GuestViewCrossProcessFrames:disabled"/> <int value="266702296" label="disable-plugin-power-saver"/> <int value="270267831" label="enable-scripts-require-action"/> + <int value="272631627" label="BookmarkAppsMac:enabled"/> <int value="274103741" label="enable-ntp-popular-sites"/> <int value="278756320" label="disable-app-list-app-info"/> <int value="280644887" label="mash"/> @@ -100509,6 +100584,7 @@ <int value="1579461102" label="MemoryCoordinator:disabled"/> <int value="1586022426" label="AutofillCreditCardAssist:enabled"/> <int value="1589341623" label="disable-easy-unlock"/> + <int value="1605611615" label="enable-webrtc-srtp-aes-gcm"/> <int value="1612446645" label="enable-weak-memorycache"/> <int value="1612871297" label="WebPayments:disabled"/> <int value="1612974229" label="allow-insecure-localhost"/>
diff --git a/tools/metrics/rappor/rappor.xml b/tools/metrics/rappor/rappor.xml index 73eaef5d..9e90e2042 100644 --- a/tools/metrics/rappor/rappor.xml +++ b/tools/metrics/rappor/rappor.xml
@@ -1362,6 +1362,17 @@ </summary> </rappor-metric> +<rappor-metric name="Media.Video.Autoplay.Muted.DualSource.Frame" + type="ETLD_PLUS_ONE"> + <owner>avayvod@chromium.org</owner> + <owner>mlamouri@chromium.org</owner> + <owner>zqzhang@chromium.org</owner> + <summary> + The eTLD+1 of the frame URL that has an autoplay muted video by both + attribute and play() method. + </summary> +</rappor-metric> + <rappor-metric name="Media.Video.Autoplay.Muted.PlayMethod.Frame" type="ETLD_PLUS_ONE"> <owner>avayvod@chromium.org</owner>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv new file mode 100644 index 0000000..b3cdb82f --- /dev/null +++ b/tools/perf/benchmark.csv
@@ -0,0 +1,208 @@ +AUTOGENERATED FILE DO NOT EDIT +See //tools/perf/generate_perf_data.py to make changes +Benchmark name,Individual owners,Component +angle_perftests,jmadill@chromium.org, +battor.steady_state,charliea@chromium.org, +battor.trivial_pages,charliea@chromium.org, +blink_perf.bindings,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +blink_perf.blink_gc,, +blink_perf.canvas,junov@chromium.org, +blink_perf.css,rune@opera.com, +blink_perf.dom,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +blink_perf.events,hayato@chromium.org, +blink_perf.layout,eae@chromium.org, +blink_perf.paint,wangxianzhu@chromium.org, +blink_perf.parser,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +blink_perf.pywebsocket,"tyoshino@chromium.org, yhirano@chromium.org", +blink_perf.shadow_dom,hayato@chromium.org, +blink_perf.svg,"kouhei@chromium.org, fs@opera.com", +blink_perf.xml_http_request,"tyoshino@chromium.org, hiroshige@chromium.org", +blink_style.key_mobile_sites,, +blink_style.polymer,, +blink_style.top_25,, +blob_storage.blob_storage,, +cc_perftests,enne@chromium.org, +dromaeo.cssqueryjquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.domcoreattr,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.domcoremodify,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.domcorequery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.domcoretraverse,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibattrjquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibattrprototype,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibeventjquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibeventprototype,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibmodifyjquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibmodifyprototype,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibstylejquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibstyleprototype,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibtraversejquery,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dromaeo.jslibtraverseprototype,"yukishiino@chromium.org, bashi@chromium.org, haraken@chromium.org", +dummy_benchmark.noisy_benchmark_1,, +dummy_benchmark.stable_benchmark_1,, +gpu_perftests,reveman@chromium.org, +gpu_times.gpu_rasterization.key_mobile_sites_smooth,, +gpu_times.gpu_rasterization.top_25_smooth,, +gpu_times.key_mobile_sites_smooth,, +gpu_times.top_25_smooth,, +image_decoding.image_decoding_measurement,"cblume@chromium.org, reveman@chromium.org", +jetstream,"bmeurer@chromium.org, mvstanton@chromium.org", +jitter,jaydasika@chromium.org, +kraken,"bmeurer@chromium.org, mvstanton@chromium.org", +load_library_perf_tests,, +loading.cluster_telemetry,, +loading.mobile,"kouhei@chromium.org, ksakamoto@chromium.org", +media.android.tough_video_cases,, +media.chromeOS.tough_video_cases,, +media.chromeOS4kOnly.tough_video_cases,, +media.media_cns_cases,"crouleau@chromium.org, videostack-eng@google.com", +media.mse_cases,"crouleau@chromium.org, videostack-eng@google.com", +media.tough_video_cases,, +media.tough_video_cases_extra,"crouleau@chromium.org, videostack-eng@google.com", +media.tough_video_cases_tbmv2,"johnchen@chromium.org, crouleau@chromium.org",Internals>Media +media_perftests,crouleau@chromium.org, +memory.blink_memory_mobile,bashi@chromium.org, +memory.desktop,erikchen@chromium.org, +memory.dual_browser_test,perezju@chromium.org, +memory.long_running_dual_browser_test,perezju@chromium.org, +memory.long_running_idle_gmail_background_tbmv2,ulan@chromium.org, +memory.long_running_idle_gmail_tbmv2,ulan@chromium.org, +memory.top_10_mobile,perezju@chromium.org, +memory.top_10_mobile_stress,perezju@chromium.org, +octane,"bmeurer@chromium.org, mvstanton@chromium.org", +oilpan_gc_times.blink_perf_stress,, +oilpan_gc_times.key_silk_cases,, +oilpan_gc_times.sync_scroll.key_mobile_sites_smooth,, +oilpan_gc_times.tough_animation_cases,peria@chromium.org, +oortonline,, +oortonline_tbmv2,, +page_cycler_v2.basic_oopif,nasko@chromium.org, +page_cycler_v2.intl_ar_fa_he,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.intl_es_fr_pt-BR,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.intl_hi_ru,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.intl_ja_zh,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.intl_ko_th_vi,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.top_10_mobile,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.tough_layout_cases,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2.typical_25,"kouhei@chromium.org, ksakamoto@chromium.org", +page_cycler_v2_site_isolation.basic_oopif,nasko@chromium.org, +performance_browser_tests,"hubbe@chromium.org, justinlin@chromium.org, miu@chromium.org", +power.android_acceptance,perezju@chromium.org, +power.gpu_rasterization.top_10,, +power.gpu_rasterization.top_25,, +power.gpu_rasterization.typical_10_mobile,, +power.steady_state,, +power.top_10,, +power.top_25,, +power.tough_ad_cases,skyostil@chromium.org, +power.trivial_pages,erikchen@chromium.org, +power.typical_10_mobile,perezju@chromium.org, +power.typical_10_mobile_reload,, +rasterize_and_record_micro.key_mobile_sites,, +rasterize_and_record_micro.key_silk_cases,vmpstr@chromium.org, +rasterize_and_record_micro.partial_invalidation,, +rasterize_and_record_micro.polymer,, +rasterize_and_record_micro.top_25,, +repaint.gpu_rasterization.key_mobile_sites_repaint,"wkorman@chromium.org, vmpstr@chromium.org", +repaint.key_mobile_sites_repaint,"wkorman@chromium.org, vmpstr@chromium.org", +robohornet_pro,, +scheduler.tough_scheduling_cases,"skyostil@chromium.org, brianderson@chromium.org", +service_worker.service_worker,horo@chromium.org, +service_worker.service_worker_micro_benchmark,horo@chromium.org, +smoothness.desktop_tough_pinch_zoom_cases,ericrk@chromium.org, +smoothness.gpu_rasterization.polymer,vmiura@chromium.org, +smoothness.gpu_rasterization.top_25_smooth,vmiura@chromium.org, +smoothness.gpu_rasterization.tough_filters_cases,senorblanco@chromium.org, +smoothness.gpu_rasterization.tough_path_rendering_cases,senorblanco@chromium.org, +smoothness.gpu_rasterization.tough_pinch_zoom_cases,ericrk@chromium.org, +smoothness.gpu_rasterization.tough_scrolling_cases,ericrk@chromium.org, +smoothness.gpu_rasterization_and_decoding.image_decoding_cases,cblume@chromium.org, +smoothness.image_decoding_cases,cblume@chromium.org, +smoothness.key_desktop_move_cases,ssid@chromium.org, +smoothness.key_mobile_sites_smooth,"vmiura@chromium.org, tdresser@chromium.org", +smoothness.key_silk_cases,ajuma@chromium.org, +smoothness.maps,"kbr@chromium.org, zmo@chromium.org", +smoothness.pathological_mobile_sites,picksi@chromium.org, +smoothness.scrolling_tough_ad_cases,skyostil@chromium.org, +smoothness.simple_mobile_sites,vmiura@chromium.org, +smoothness.sync_scroll.key_mobile_sites_smooth,"tdresser@chromium.org, rbyers@chromium.org", +smoothness.top_25_smooth,vmiura@chromium.org, +smoothness.tough_ad_cases,skyostil@chromium.org, +smoothness.tough_animation_cases,alancutter@chromium.org, +smoothness.tough_canvas_cases,junov@chromium.org, +smoothness.tough_filters_cases,senorblanco@chromium.org, +smoothness.tough_image_decode_cases,, +smoothness.tough_path_rendering_cases,senorblanco@chromium.org, +smoothness.tough_pinch_zoom_cases,bokan@chromium.org, +smoothness.tough_scrolling_cases,reveman@chromium.org, +smoothness.tough_texture_upload_cases,vmiura@chromium.org, +smoothness.tough_webgl_ad_cases,skyostil@chromium.org, +smoothness.tough_webgl_cases,"kbr@chromium.org, zmo@chromium.org", +spaceport,junov@chromium.org, +speedometer,"bmeurer@chromium.org, mvstanton@chromium.org", +speedometer-classic,hablich@chromium.org, +speedometer-turbo,hablich@chromium.org, +start_with_ext.cold.blank_page,, +start_with_ext.warm.blank_page,, +start_with_url.cold.startup_pages,pasko@chromium.org, +start_with_url.warm.startup_pages,pasko@chromium.org, +startup.cold.blank_page,, +startup.large_profile.cold.blank_page,, +startup.large_profile.warm.blank_page,, +startup.warm.blank_page,, +startup.warm.chrome_signin,, +storage.indexeddb_endure,cmumford@chromium.org, +storage.indexeddb_endure_tracing,cmumford@chromium.org, +sunspider,"bmeurer@chromium.org, mvstanton@chromium.org", +system_health.common_desktop,"charliea@chromium.org, nednguyen@chromium.org", +system_health.common_mobile,"charliea@chromium.org, nednguyen@chromium.org", +system_health.memory_desktop,perezju@chromium.org, +system_health.memory_mobile,perezju@chromium.org, +system_health.webview_startup,"perezju@chromium.org, torne@chromium.org", +system_health.webview_startup_multiprocess,, +tab_switching.typical_25,, +text_selection.character,mfomitchev@chromium.org, +text_selection.direction,mfomitchev@chromium.org, +thread_times.key_hit_test_cases,, +thread_times.key_idle_power_cases,skyostil@chromium.org, +thread_times.key_mobile_sites_smooth,, +thread_times.key_noop_cases,, +thread_times.key_silk_cases,vmiura@chromium.org, +thread_times.polymer,ykyyip@chromium.org, +thread_times.simple_mobile_sites,vmiura@chromium.org, +thread_times.tough_compositor_cases,vmiura@chromium.org, +thread_times.tough_scrolling_cases,tdresser@chromium.org, +tracing.tracing_with_background_memory_infra,ssid@chromium.org, +tracing.tracing_with_debug_overhead,"oysteine@chromium.org, nednguyen@chromium.org, zhenw@chromium.org", +tracing_perftests,"kkraynov@chromium.org, primiano@chromium.org", +v8.browsing_desktop,ulan@chromium.org, +v8.browsing_desktop_classic,hablich@chromium.org, +v8.browsing_desktop_turbo,mvstaton@chromium.org, +v8.browsing_mobile,ulan@chromium.org, +v8.browsing_mobile_classic,hablich@chromium.org, +v8.browsing_mobile_turbo,mvstaton@chromium.org, +v8.detached_context_age_in_gc,, +v8.google,hablich@chromium.org, +v8.infinite_scroll-classic_tbmv2,hablich@chromium.org, +v8.infinite_scroll-turbo_tbmv2,mvstaton@chromium.org, +v8.infinite_scroll_tbmv2,ulan@chromium.org, +v8.key_mobile_sites_smooth,"hpayer@chromium.org, rmcilroy@chromium.org", +v8.mobile_infinite_scroll-classic_tbmv2,hablich@chromium.org, +v8.mobile_infinite_scroll-turbo_tbmv2,mvstaton@chromium.org, +v8.mobile_infinite_scroll_tbmv2,ulan@chromium.org, +v8.runtime_stats.top_25,cbruni@chromium.org, +v8.runtimestats.browsing_desktop,mythria@chromium.org, +v8.runtimestats.browsing_desktop_classic,hablich@chromium.org, +v8.runtimestats.browsing_desktop_turbo,mythria@chromium.org, +v8.runtimestats.browsing_mobile,mythria@chromium.org, +v8.runtimestats.browsing_mobile_classic,hablich@chromium.org, +v8.runtimestats.browsing_mobile_turbo,mythria@chromium.org, +v8.todomvc,jochen@chromium.org, +v8.todomvc-classic,hablich@chromium.org, +v8.todomvc-turbo,mvstaton@chromium.org, +v8.top_25_smooth,"hpayer@chromium.org, rmcilroy@chromium.org", +webrtc.datachannel,phoglund@chromium.org, +webrtc.getusermedia,, +webrtc.peerconnection,, +webrtc.stress,"ehmaldonado@chromium.org, phoglund@chromium.org", +webrtc.webrtc_smoothness,qiangchen@chromium.org, +webrtc.webrtc_smoothness_tbmv2,"ehmaldonado@chromium.org, phoglund@chromium.org, qiangchen@chromium.org",
diff --git a/tools/perf/benchmarks/startup.py b/tools/perf/benchmarks/startup.py index 2ae0d45c..0f11502 100644 --- a/tools/perf/benchmarks/startup.py +++ b/tools/perf/benchmarks/startup.py
@@ -85,6 +85,7 @@ 'android', # http://crbug.com/481919 'yosemite', # http://crbug.com/605485 'mac', # http://crbug.com/700843 + 'win', # http://crbug.com/704137 'content-shell') # No pregenerated profiles. class StartupLargeProfileWarmBlankPage(_StartupWarm): """Measures warm startup time with a large profile."""
diff --git a/tools/perf/benchmarks/v8.py b/tools/perf/benchmarks/v8.py index 36ebe31..29a72472 100644 --- a/tools/perf/benchmarks/v8.py +++ b/tools/perf/benchmarks/v8.py
@@ -39,11 +39,6 @@ page_set = page_sets.V8Top25SmoothPageSet @classmethod - def ShouldDisable(cls, possible_browser): # http://crbug.com/597656 - return (possible_browser.browser_type == 'reference' and - possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X') - - @classmethod def Name(cls): return 'v8.top_25_smooth' @@ -61,11 +56,6 @@ def Name(cls): return 'v8.key_mobile_sites_smooth' - @classmethod - def ShouldDisable(cls, possible_browser): # http://crbug.com/597656 - return (possible_browser.browser_type == 'reference' and - possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X') - class V8DetachedContextAgeInGC(perf_benchmark.PerfBenchmark): """Measures the number of GCs needed to collect a detached context. @@ -242,11 +232,6 @@ def Name(cls): return 'v8.mobile_infinite_scroll_tbmv2' - @classmethod - def ShouldDisable(cls, possible_browser): # http://crbug.com/597656 - return (possible_browser.browser_type == 'reference' and - possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X') - @benchmark.Disabled('all') # was enabled only on android @benchmark.Owner(emails=['mvstaton@chromium.org'])
diff --git a/tools/perf/benchmarks/v8_browsing.py b/tools/perf/benchmarks/v8_browsing.py index 8dce7ec..8b88d03 100644 --- a/tools/perf/benchmarks/v8_browsing.py +++ b/tools/perf/benchmarks/v8_browsing.py
@@ -243,6 +243,7 @@ @benchmark.Owner(emails=['mythria@chromium.org']) +@benchmark.Disabled('win') # http://crbug.com/704197 class V8RuntimeStatsDesktopBrowsingBenchmark( _V8RuntimeStatsBrowsingBenchmark): PLATFORM = 'desktop' @@ -277,7 +278,8 @@ return 'v8.runtimestats.browsing_desktop_turbo' -@benchmark.Disabled('reference') # http://crbug.com/700390 +@benchmark.Disabled('reference', # http://crbug.com/700390 + 'win') # http://crbug.com/704197 @benchmark.Owner(emails=['hablich@chromium.org']) class V8RuntimeStatsDesktopClassicBrowsingBenchmark( _V8RuntimeStatsBrowsingBenchmark):
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 62c4c60..df4e92e 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -4,18 +4,23 @@ # found in the LICENSE file. """Script to generate chromium.perf.json and chromium.perf.fyi.json in -the src/testing/buildbot directory. Maintaining these files by hand is -too unwieldy. +the src/testing/buildbot directory and benchmark.csv in the src/tools/perf +directory. Maintaining these files by hand is too unwieldy. """ import argparse +import collections +import csv import json import os +import re import sys +import sets from chrome_telemetry_build import chromium_config sys.path.append(chromium_config.GetTelemetryDir()) from telemetry import benchmark as benchmark_module +from telemetry import decorators from telemetry.core import discover from telemetry.util import bot_utils @@ -489,7 +494,7 @@ # Always say this is true regardless of whether the tester # supports swarming. It doesn't hurt. 'can_use_on_swarming_builders': True, - 'expiration': 7 * 60 * 60, # 7 hour timeout for now. See crbug.com/699312 + 'expiration': 10 * 60 * 60, # 10 hour timeout for now (crbug.com/699312) 'hard_timeout': swarming_timeout if swarming_timeout else 7200, 'io_timeout': 3600, 'dimension_sets': swarming_dimensions, @@ -789,22 +794,32 @@ return os.path.join(buildbot_dir, filename) -def tests_are_up_to_date(waterfall): - tests = generate_all_tests(waterfall) - tests_data = json.dumps(tests, indent=2, separators=(',', ': '), - sort_keys=True) - config_file = get_json_config_file_for_waterfall(waterfall) - with open(config_file, 'r') as fp: - config_data = fp.read().strip() - return tests_data == config_data +def tests_are_up_to_date(waterfalls): + up_to_date = True + all_tests = {} + for w in waterfalls: + tests = generate_all_tests(w) + tests_data = json.dumps(tests, indent=2, separators=(',', ': '), + sort_keys=True) + config_file = get_json_config_file_for_waterfall(w) + with open(config_file, 'r') as fp: + config_data = fp.read().strip() + all_tests.update(tests) + up_to_date &= tests_data == config_data + verify_all_tests_in_benchmark_csv(all_tests, get_all_benchmarks_metadata()) + return up_to_date -def update_all_tests(waterfall): - tests = generate_all_tests(waterfall) - config_file = get_json_config_file_for_waterfall(waterfall) - with open(config_file, 'w') as fp: - json.dump(tests, fp, indent=2, separators=(',', ': '), sort_keys=True) - fp.write('\n') +def update_all_tests(waterfalls): + all_tests = {} + for w in waterfalls: + tests = generate_all_tests(w) + config_file = get_json_config_file_for_waterfall(w) + with open(config_file, 'w') as fp: + json.dump(tests, fp, indent=2, separators=(',', ': '), sort_keys=True) + fp.write('\n') + all_tests.update(tests) + verify_all_tests_in_benchmark_csv(all_tests, get_all_benchmarks_metadata()) def src_dir(): @@ -813,11 +828,98 @@ os.path.dirname(os.path.dirname(file_path)))) +BenchmarkMetadata = collections.namedtuple( + 'BenchmarkMetadata', 'emails component') +NON_TELEMETRY_BENCHMARKS = { + 'angle_perftests': BenchmarkMetadata('jmadill@chromium.org', None), + 'cc_perftests': BenchmarkMetadata('enne@chromium.org', None), + 'gpu_perftests': BenchmarkMetadata('reveman@chromium.org', None), + 'tracing_perftests': BenchmarkMetadata( + 'kkraynov@chromium.org, primiano@chromium.org', None), + 'load_library_perf_tests': BenchmarkMetadata(None, None), + 'media_perftests': BenchmarkMetadata('crouleau@chromium.org', None), + 'performance_browser_tests': BenchmarkMetadata( + 'hubbe@chromium.org, justinlin@chromium.org, miu@chromium.org', None) +} + + +# Returns a dictionary mapping benchmark name to benchmark owner metadata +def get_all_benchmarks_metadata(): + metadata = NON_TELEMETRY_BENCHMARKS + benchmark_list = current_benchmarks(False) + + for benchmark in benchmark_list: + emails = decorators.GetEmails(benchmark) + if emails: + emails = ', '.join(emails) + metadata[benchmark.Name()] = BenchmarkMetadata( + emails, decorators.GetComponent(benchmark)) + return metadata + + +def verify_all_tests_in_benchmark_csv(tests, benchmark_metadata): + benchmark_names = sets.Set(benchmark_metadata) + test_names = sets.Set() + for t in tests: + scripts = [] + if 'isolated_scripts' in tests[t]: + scripts = tests[t]['isolated_scripts'] + elif 'scripts' in tests[t]: + scripts = tests[t]['scripts'] + else: + assert('Android Compile' == t + or 'Android arm64 Compile' == t + or t.startswith('AAAAA')), 'Unknown test data %s' % t + for s in scripts: + name = s['name'] + name = re.sub('\\.reference$', '', name) + test_names.add(name) + + error_messages = [] + for test in benchmark_names - test_names: + error_messages.append('Remove ' + test + ' from NON_TELEMETRY_BENCHMARKS') + for test in test_names - benchmark_names: + error_messages.append('Add ' + test + ' to NON_TELEMETRY_BENCHMARKS') + + assert benchmark_names == test_names, ('Please update ' + 'NON_TELEMETRY_BENCHMARKS as below:\n' + '\n'.join(error_messages)) + + +def update_benchmark_csv(): + """Updates go/chrome-benchmarks. + + Updates telemetry/perf/benchmark.csv containing the current benchmark names, + owners, and components. + """ + header_data = [['AUTOGENERATED FILE DO NOT EDIT'], + ['See //tools/perf/generate_perf_data.py to make changes'], + ['Benchmark name', 'Individual owners', 'Component'] + ] + + csv_data = [] + benchmark_metadata = get_all_benchmarks_metadata() + for benchmark_name in benchmark_metadata: + csv_data.append([ + benchmark_name, + benchmark_metadata[benchmark_name].emails, + benchmark_metadata[benchmark_name].component + ]) + + csv_data = sorted(csv_data, key=lambda b: b[0]) + csv_data = header_data + csv_data + + perf_dir = os.path.join(src_dir(), 'tools', 'perf') + benchmark_file = os.path.join(perf_dir, 'benchmark.csv') + with open(benchmark_file, 'wb') as f: + writer = csv.writer(f) + writer.writerows(csv_data) + + def main(args): parser = argparse.ArgumentParser( - description=('Generate perf test\' json config. This need to be done ' - 'anytime you add/remove any existing benchmarks in ' - 'tools/perf/benchmarks.')) + description=('Generate perf test\' json config and benchmark.csv. ' + 'This needs to be done anytime you add/remove any existing' + 'benchmarks in tools/perf/benchmarks.')) parser.add_argument( '--validate-only', action='store_true', default=False, help=('Validate whether the perf json generated will be the same as the ' @@ -831,15 +933,15 @@ fyi_waterfall['name'] = 'chromium.perf.fyi' if options.validate_only: - if tests_are_up_to_date(fyi_waterfall) and tests_are_up_to_date(waterfall): + if tests_are_up_to_date([fyi_waterfall, waterfall]): print 'All the perf JSON config files are up-to-date. \\o/' return 0 else: print ('The perf JSON config files are not up-to-date. Please run %s ' 'without --validate-only flag to update the perf JSON ' - 'configs.') % sys.argv[0] + 'configs and benchmark.csv.') % sys.argv[0] return 1 else: - update_all_tests(fyi_waterfall) - update_all_tests(waterfall) + update_all_tests([fyi_waterfall, waterfall]) + update_benchmark_csv() return 0
diff --git a/tools/perf/core/perf_data_generator_unittest.py b/tools/perf/core/perf_data_generator_unittest.py new file mode 100644 index 0000000..cdfe688b --- /dev/null +++ b/tools/perf/core/perf_data_generator_unittest.py
@@ -0,0 +1,66 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +import unittest + +from core import perf_data_generator +from core.perf_data_generator import BenchmarkMetadata + + +class PerfDataGeneratorTest(unittest.TestCase): + + def testVerifyAllTestsInBenchmarkCsvPassesWithCorrectInput(self): + tests = { + 'AAAAA1 AUTOGENERATED': {}, + 'Android Nexus5 Perf (2)': { + 'scripts': [ + {'name': 'benchmark_name_1'}, + {'name': 'benchmark_name_2'} + ] + }, + 'Linux Perf': { + 'isolated_scripts': [ + {'name': 'benchmark_name_2.reference'}, + {'name': 'benchmark_name_3'} + ] + } + } + benchmarks = { + 'benchmark_name_1': BenchmarkMetadata(None, None), + 'benchmark_name_2': BenchmarkMetadata(None, None), + 'benchmark_name_3': BenchmarkMetadata(None, None) + } + + perf_data_generator.verify_all_tests_in_benchmark_csv(tests, benchmarks) + + + def testVerifyAllTestsInBenchmarkCsvCatchesMismatchedTests(self): + tests = { + 'Android Nexus5 Perf (2)': { + 'scripts': [ + {'name': 'benchmark_name_1'}, + {'name': 'benchmark_name_2'} + ] + } + } + benchmarks = { + 'benchmark_name_2': BenchmarkMetadata(None, None), + 'benchmark_name_3': BenchmarkMetadata(None, None), + } + + with self.assertRaises(AssertionError) as context: + perf_data_generator.verify_all_tests_in_benchmark_csv(tests, benchmarks) + exception = context.exception.message + self.assertTrue('Add benchmark_name_1' in exception) + self.assertTrue('Remove benchmark_name_3' in exception) + + + def testVerifyAllTestsInBenchmarkCsvFindsFakeTest(self): + tests = {'Random fake test': {}} + benchmarks = { + 'benchmark_name_1': BenchmarkMetadata(None, None) + } + + with self.assertRaises(AssertionError) as context: + perf_data_generator.verify_all_tests_in_benchmark_csv(tests, benchmarks) + self.assertTrue('Unknown test' in context.exception.message)
diff --git a/tools/perf/page_sets/trivial_sites.py b/tools/perf/page_sets/trivial_sites.py index c0bd865d..ae951d7 100644 --- a/tools/perf/page_sets/trivial_sites.py +++ b/tools/perf/page_sets/trivial_sites.py
@@ -118,6 +118,19 @@ measure_memory=measure_memory) +class TrivialAnimationPage(_BasePage): + + def __init__(self, page_set, shared_page_state_class, wait_in_seconds, + measure_memory): + super(TrivialAnimationPage, self).__init__( + url='file://trivial_sites/trivial_animation.html', + page_set=page_set, + name=self.__class__.__name__ + shared_page_state_class.__name__, + shared_page_state_class=shared_page_state_class, + wait_in_seconds=wait_in_seconds, + measure_memory=measure_memory) + + class TrivialSitesStorySet(story.StorySet): def __init__(self, shared_state = shared_page_state.SharedPageState, wait_in_seconds=0, measure_memory=False): @@ -138,3 +151,5 @@ self, shared_state, wait_in_seconds, measure_memory)) self.AddStory(TrivialGifPage( self, shared_state, wait_in_seconds, measure_memory)) + self.AddStory(TrivialAnimationPage( + self, shared_state, wait_in_seconds, measure_memory))
diff --git a/tools/perf/page_sets/trivial_sites/trivial_animation.html b/tools/perf/page_sets/trivial_sites/trivial_animation.html new file mode 100644 index 0000000..712371d2 --- /dev/null +++ b/tools/perf/page_sets/trivial_sites/trivial_animation.html
@@ -0,0 +1,39 @@ +<!doctype html> +<!-- +Copyright 2017 The Chromium Authors. All rights reserved. +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<html> +<head> + <title>Trivial Animation</title> +</head> +<body> + <!-- The image is a 625 × 831 dark gray rect. --> + <img id="the_image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAM/CAMAAACJdnSiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDdFNEU2MkEwNzY1MTFFNzk0M0I4N0U2RDY3MDgxNjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDdFNEU2MkIwNzY1MTFFNzk0M0I4N0U2RDY3MDgxNjkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNzgzMEQ4OTA3NjUxMUU3OTQzQjg3RTZENjcwODE2OSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNzgzMEQ4QTA3NjUxMUU3OTQzQjg3RTZENjcwODE2OSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvC96s8AAAAGUExURTMzMwAAACOWWdUAAAIRSURBVHja7MExAQAAAMKg9U9tCU+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnibAAPB3AAHlB06MAAAAAElFTkSuQmCC" /> +</body> +<script> + var image = null; + var offset = 0; + + function init() { + image = document.getElementById('the_image'); + image.style.position = 'relative'; + image.style.left = '0px'; + animate(); + } + + function animate() { + offset++; + if (offset > 500) { + offset = 0; + } + image.style.left = offset + 'px'; + + // Move the image 1pt every 16ms. + setTimeout(animate, 16); + } + + window.onload = init; +</script> +</html>
diff --git a/tools/resource_prefetch_predictor/prefetch_benchmark.py b/tools/resource_prefetch_predictor/prefetch_benchmark.py index fae9d24..29519b2 100755 --- a/tools/resource_prefetch_predictor/prefetch_benchmark.py +++ b/tools/resource_prefetch_predictor/prefetch_benchmark.py
@@ -19,6 +19,7 @@ sys.path.append(os.path.join( _SRC_PATH, 'tools', 'android', 'customtabs_benchmark', 'scripts')) import customtabs_benchmark +import chrome_setup import device_setup sys.path.append(os.path.join(_SRC_PATH, 'tools', 'android', 'loading')) @@ -98,7 +99,7 @@ disable_prefetch = prefetch_delay_ms == -1 # Startup tracing to ease debugging. - chrome_args = (customtabs_benchmark.CHROME_ARGS + chrome_args = (chrome_setup.CHROME_ARGS + ['--trace-startup', '--trace-startup-duration=20']) # Speculative Prefetch is enabled through an experiment. chrome_args.extend([
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn index b134067..adf3629 100644 --- a/ui/accessibility/BUILD.gn +++ b/ui/accessibility/BUILD.gn
@@ -105,6 +105,15 @@ configs += [ "//build/config/linux:glib" ] } } + + if (use_aura) { + sources += [ + "platform/aura_window_properties.cc", + "platform/aura_window_properties.h", + ] + + public_deps += [ "//ui/aura" ] + } } if (is_android) {
diff --git a/ui/accessibility/DEPS b/ui/accessibility/DEPS index 0198e2c..f3b2cb5 100644 --- a/ui/accessibility/DEPS +++ b/ui/accessibility/DEPS
@@ -1,5 +1,7 @@ include_rules = [ "+third_party/iaccessible2", + "+ui/aura", + "+ui/base", "+ui/base/l10n", "+ui/base/win", "+ui/gfx",
diff --git a/ui/accessibility/ax_tree_id_registry.cc b/ui/accessibility/ax_tree_id_registry.cc index d880b79..d05fa5ee 100644 --- a/ui/accessibility/ax_tree_id_registry.cc +++ b/ui/accessibility/ax_tree_id_registry.cc
@@ -10,9 +10,6 @@ namespace ui { // static -const AXTreeIDRegistry::AXTreeID AXTreeIDRegistry::kNoAXTreeID = -1; - -// static AXTreeIDRegistry* AXTreeIDRegistry::GetInstance() { return base::Singleton<AXTreeIDRegistry>::get(); }
diff --git a/ui/accessibility/ax_tree_id_registry.h b/ui/accessibility/ax_tree_id_registry.h index d983ecd..3cdcc61 100644 --- a/ui/accessibility/ax_tree_id_registry.h +++ b/ui/accessibility/ax_tree_id_registry.h
@@ -34,7 +34,7 @@ using AXTreeID = int; - static const AXTreeID kNoAXTreeID; + static constexpr AXTreeID kNoAXTreeID = -1; // Get the single instance of this class. static AXTreeIDRegistry* GetInstance();
diff --git a/ui/accessibility/platform/aura_window_properties.cc b/ui/accessibility/platform/aura_window_properties.cc new file mode 100644 index 0000000..146ad75 --- /dev/null +++ b/ui/accessibility/platform/aura_window_properties.cc
@@ -0,0 +1,15 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/accessibility/platform/aura_window_properties.h" + +#include "ui/base/class_property.h" + +namespace ui { + +DEFINE_UI_CLASS_PROPERTY_KEY(AXTreeIDRegistry::AXTreeID, + kChildAXTreeID, + AXTreeIDRegistry::kNoAXTreeID); + +} // namespace ui
diff --git a/ui/accessibility/platform/aura_window_properties.h b/ui/accessibility/platform/aura_window_properties.h new file mode 100644 index 0000000..8c8ea13 --- /dev/null +++ b/ui/accessibility/platform/aura_window_properties.h
@@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_ACCESSIBILITY_PLATFORM_AURA_WINDOW_PROPERTIES_H_ +#define UI_ACCESSIBILITY_PLATFORM_AURA_WINDOW_PROPERTIES_H_ + +#include "ui/accessibility/ax_export.h" +#include "ui/accessibility/ax_tree_id_registry.h" +#include "ui/aura/window.h" + +namespace ui { + +AX_EXPORT extern const aura::WindowProperty<AXTreeIDRegistry::AXTreeID>* const + kChildAXTreeID; + +} // namespace ui + +#endif // UI_ACCESSIBILITY_PLATFORM_AURA_WINDOW_PROPERTIES_H_
diff --git a/ui/android/java/src/org/chromium/ui/base/TouchDevice.java b/ui/android/java/src/org/chromium/ui/base/TouchDevice.java index 86d6a13..b285037 100644 --- a/ui/android/java/src/org/chromium/ui/base/TouchDevice.java +++ b/ui/android/java/src/org/chromium/ui/base/TouchDevice.java
@@ -49,10 +49,9 @@ } /** - * @return the pointer-types supported by the device, as the union (bitwise OR) of PointerType - * bits in result[0] - * the hover-types supported by the device, as the union (bitwise OR) of HoverType bits - * in result[1]. + * @return an array of two ints: result[0] represents the pointer-types and result[1] represents + * the hover-types supported by the device, where each int is the union (bitwise OR) of + * corresponding type (PointerType/HoverType) bits. */ @CalledByNative private static int[] availablePointerAndHoverTypes(Context context) { @@ -80,7 +79,7 @@ result[1] |= HoverType.HOVER; } else if (hasSource(sources, InputDevice.SOURCE_STYLUS) || hasSource(sources, InputDevice.SOURCE_TOUCHSCREEN)) { - result[1] |= HoverType.ON_DEMAND; + result[1] |= HoverType.NONE; } // Remaining InputDevice sources: SOURCE_DPAD, SOURCE_GAMEPAD, SOURCE_JOYSTICK,
diff --git a/ui/aura/mus/input_method_mus.cc b/ui/aura/mus/input_method_mus.cc index d86152d..c67c222 100644 --- a/ui/aura/mus/input_method_mus.cc +++ b/ui/aura/mus/input_method_mus.cc
@@ -195,6 +195,12 @@ void InputMethodMus::ProcessKeyEventCallback( const ui::KeyEvent& event, bool handled) { + // Remove the callback as DispatchKeyEventPostIME() may lead to calling + // AckPendingCallbacksUnhandled(), which mutates |pending_callbacks_|. + DCHECK(!pending_callbacks_.empty()); + std::unique_ptr<EventResultCallback> ack_callback = + std::move(pending_callbacks_.front()); + pending_callbacks_.pop_front(); EventResult event_result; if (!handled) { // If not handled by IME, try dispatching the event to delegate to see if @@ -207,10 +213,6 @@ } else { event_result = EventResult::HANDLED; } - DCHECK(!pending_callbacks_.empty()); - std::unique_ptr<EventResultCallback> ack_callback = - std::move(pending_callbacks_.front()); - pending_callbacks_.pop_front(); // |ack_callback| can be null if the standard form of DispatchKeyEvent() is // called instead of the version which provides a callback. In mus+ash we // use the version with callback, but some unittests use the standard form.
diff --git a/ui/aura/mus/input_method_mus_unittest.cc b/ui/aura/mus/input_method_mus_unittest.cc index cb2cdefa..9ee10bf 100644 --- a/ui/aura/mus/input_method_mus_unittest.cc +++ b/ui/aura/mus/input_method_mus_unittest.cc
@@ -130,4 +130,67 @@ EXPECT_TRUE(was_event_result_callback_run); } +// See description of ChangeTextInputTypeWhileProcessingCallback for details. +class TestInputMethodDelegate2 : public ui::internal::InputMethodDelegate { + public: + TestInputMethodDelegate2() {} + ~TestInputMethodDelegate2() override {} + + void SetInputMethodAndClient(InputMethodMus* input_method_mus, + ui::TextInputClient* text_input_client) { + input_method_mus_ = input_method_mus; + text_input_client_ = text_input_client; + } + + bool was_dispatch_key_event_post_ime_called() const { + return was_dispatch_key_event_post_ime_called_; + } + + // ui::internal::InputMethodDelegate: + ui::EventDispatchDetails DispatchKeyEventPostIME(ui::KeyEvent* key) override { + was_dispatch_key_event_post_ime_called_ = true; + input_method_mus_->SetFocusedTextInputClient(text_input_client_); + return ui::EventDispatchDetails(); + } + + private: + InputMethodMus* input_method_mus_ = nullptr; + ui::TextInputClient* text_input_client_ = nullptr; + bool was_dispatch_key_event_post_ime_called_ = false; + + DISALLOW_COPY_AND_ASSIGN(TestInputMethodDelegate2); +}; + +// This test setups the scenario where during processing an unhandled event +// SetFocusedTextInputClient() is called. This verifies we don't crash in this +// scenario and the callback is correctly called. +TEST_F(InputMethodMusTest, ChangeTextInputTypeWhileProcessingCallback) { + aura::Window window(nullptr); + window.Init(ui::LAYER_NOT_DRAWN); + bool was_event_result_callback_run = false; + ui::DummyTextInputClient test_input_client; + // Create an InputMethodMus and foward an event to it. + TestInputMethodDelegate2 input_method_delegate; + InputMethodMus input_method_mus(&input_method_delegate, &window); + input_method_delegate.SetInputMethodAndClient(&input_method_mus, + &test_input_client); + TestInputMethod test_input_method; + InputMethodMusTestApi::SetInputMethod(&input_method_mus, &test_input_method); + std::unique_ptr<EventResultCallback> callback = + base::MakeUnique<EventResultCallback>(base::Bind( + &RunFunctionWithEventResult, &was_event_result_callback_run)); + const ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0); + InputMethodMusTestApi::CallSendKeyEventToInputMethod( + &input_method_mus, key_event, std::move(callback)); + // The event should have been queued. + ASSERT_EQ(1u, test_input_method.process_key_event_callbacks()->size()); + // Callback should not have been run yet. + EXPECT_FALSE(was_event_result_callback_run); + (*test_input_method.process_key_event_callbacks())[0].Run(false); + + // Callback should have been run. + EXPECT_TRUE(was_event_result_callback_run); + EXPECT_TRUE(input_method_delegate.was_dispatch_key_event_post_ime_called()); +} + } // namespace aura
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 6712723..75fd0ca 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -236,6 +236,7 @@ "resource/resource_bundle.cc", "resource/resource_bundle.h", "resource/resource_bundle_android.cc", + "resource/resource_bundle_android.h", "resource/resource_bundle_auralinux.cc", "resource/resource_bundle_ios.mm", "resource/resource_bundle_mac.mm", @@ -640,6 +641,7 @@ "test/material_design_controller_test_api.h", "test/ui_controls.h", "test/ui_controls_aura.cc", + "test/ui_controls_aura.h", "test/ui_controls_internal_win.cc", "test/ui_controls_internal_win.h", "test/ui_controls_mac.mm", @@ -718,7 +720,10 @@ } if (!use_aura) { - sources -= [ "test/ui_controls_aura.cc" ] + sources -= [ + "test/ui_controls_aura.cc", + "test/ui_controls_aura.h", + ] } else if (is_win) { sources -= [ "test/ui_controls_win.cc" ] }
diff --git a/ui/base/touch/touch_device.h b/ui/base/touch/touch_device.h index 0552fab..b59699bf 100644 --- a/ui/base/touch/touch_device.h +++ b/ui/base/touch/touch_device.h
@@ -37,8 +37,8 @@ UI_BASE_EXPORT int MaxTouchPoints(); // Bit field values indicating available pointer types. Identical to -// blink::WebSettings::PointerType enums, enforced by compile-time assertions -// in content/public/common/web_preferences.cc . +// blink::PointerType enums, enforced by compile-time assertions in +// content/public/common/web_preferences.cc . // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.base // GENERATED_JAVA_PREFIX_TO_STRIP: POINTER_TYPE_ enum PointerType { @@ -50,15 +50,14 @@ }; // Bit field values indicating available hover types. Identical to -// blink::WebSettings::HoverType enums, enforced by compile-time assertions -// in content/public/common/web_preferences.cc . +// blink::HoverType enums, enforced by compile-time assertions in +// content/public/common/web_preferences.cc . // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.base // GENERATED_JAVA_PREFIX_TO_STRIP: HOVER_TYPE_ enum HoverType { HOVER_TYPE_NONE = 1 << 0, HOVER_TYPE_FIRST = HOVER_TYPE_NONE, - HOVER_TYPE_ON_DEMAND = 1 << 1, - HOVER_TYPE_HOVER = 1 << 2, + HOVER_TYPE_HOVER = 1 << 1, HOVER_TYPE_LAST = HOVER_TYPE_HOVER };
diff --git a/ui/base/touch/touch_device_android.cc b/ui/base/touch/touch_device_android.cc index b8a458e..fdb4a82f 100644 --- a/ui/base/touch/touch_device_android.cc +++ b/ui/base/touch/touch_device_android.cc
@@ -45,12 +45,10 @@ } HoverType GetPrimaryHoverType(int available_hover_types) { - if (available_hover_types & HOVER_TYPE_ON_DEMAND) - return HOVER_TYPE_ON_DEMAND; - if (available_hover_types & HOVER_TYPE_HOVER) - return HOVER_TYPE_HOVER; - DCHECK_EQ(available_hover_types, HOVER_TYPE_NONE); - return HOVER_TYPE_NONE; + if (available_hover_types & HOVER_TYPE_NONE) + return HOVER_TYPE_NONE; + DCHECK_EQ(available_hover_types, HOVER_TYPE_HOVER); + return HOVER_TYPE_HOVER; } } // namespace ui
diff --git a/ui/base/touch/touch_device_linux.cc b/ui/base/touch/touch_device_linux.cc index 6b5460d..3ebf53c 100644 --- a/ui/base/touch/touch_device_linux.cc +++ b/ui/base/touch/touch_device_linux.cc
@@ -28,12 +28,9 @@ // TODO(mustaq@chromium.org): Use mouse detection logic. crbug.com/495634 int GetAvailableHoverTypes() { - // Assume a mouse is there int available_hover_types = HOVER_TYPE_HOVER; if (IsTouchDevicePresent()) - available_hover_types |= HOVER_TYPE_ON_DEMAND; - - DCHECK(available_hover_types); + available_hover_types |= HOVER_TYPE_NONE; return available_hover_types; } @@ -75,8 +72,6 @@ HoverType GetPrimaryHoverType(int available_hover_types) { if (available_hover_types & HOVER_TYPE_HOVER) return HOVER_TYPE_HOVER; - if (available_hover_types & HOVER_TYPE_ON_DEMAND) - return HOVER_TYPE_ON_DEMAND; DCHECK_EQ(available_hover_types, HOVER_TYPE_NONE); return HOVER_TYPE_NONE; }
diff --git a/ui/base/touch/touch_device_win.cc b/ui/base/touch/touch_device_win.cc index ef4c3163..bd7f1ea 100644 --- a/ui/base/touch/touch_device_win.cc +++ b/ui/base/touch/touch_device_win.cc
@@ -52,14 +52,15 @@ // This method follows the same logic as above but with hover types. int GetAvailableHoverTypes() { if (base::win::IsTabletDevice(nullptr)) - return HOVER_TYPE_ON_DEMAND; - - if (GetSystemMetrics(SM_MOUSEPRESENT) == 0) return HOVER_TYPE_NONE; - int available_hover_types = HOVER_TYPE_HOVER; - if (IsTouchDevicePresent()) - available_hover_types |= HOVER_TYPE_ON_DEMAND; + int available_hover_types; + if (GetSystemMetrics(SM_MOUSEPRESENT) != 0) { + available_hover_types = HOVER_TYPE_HOVER; + if (IsTouchDevicePresent()) + available_hover_types |= HOVER_TYPE_NONE; + } else + available_hover_types = HOVER_TYPE_NONE; return available_hover_types; } @@ -92,8 +93,6 @@ HoverType GetPrimaryHoverType(int available_hover_types) { if (available_hover_types & HOVER_TYPE_HOVER) return HOVER_TYPE_HOVER; - if (available_hover_types & HOVER_TYPE_ON_DEMAND) - return HOVER_TYPE_ON_DEMAND; DCHECK_EQ(available_hover_types, HOVER_TYPE_NONE); return HOVER_TYPE_NONE; }
diff --git a/ui/base/ui_base_switches.cc b/ui/base/ui_base_switches.cc index 0654af3..ae808387 100644 --- a/ui/base/ui_base_switches.cc +++ b/ui/base/ui_base_switches.cc
@@ -79,7 +79,4 @@ // throughout Chrome (not just top Chrome). const char kExtendMdToSecondaryUi[] = "secondary-ui-md"; -// Use an fp16 scRGB swap chain compatible with HDR output. -const char kEnableHDR[] = "enable-hdr"; - } // namespace switches
diff --git a/ui/base/ui_base_switches.h b/ui/base/ui_base_switches.h index 7d89ac9..eb581ac 100644 --- a/ui/base/ui_base_switches.h +++ b/ui/base/ui_base_switches.h
@@ -40,7 +40,6 @@ UI_BASE_EXPORT extern const char kTopChromeMDNonMaterial[]; UI_BASE_EXPORT extern const char kUseNewVirtualKeyboardBehavior[]; UI_BASE_EXPORT extern const char kExtendMdToSecondaryUi[]; -UI_BASE_EXPORT extern const char kEnableHDR[]; } // namespace switches
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn index c0d3220..229a788 100644 --- a/ui/compositor/BUILD.gn +++ b/ui/compositor/BUILD.gn
@@ -85,7 +85,7 @@ "//cc/surfaces:surfaces", "//gpu/command_buffer/common", "//skia", - "//ui/base", + "//ui/display", "//ui/gfx", "//ui/gfx/animation", "//ui/gfx/geometry",
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS index 65c25f7..60a4b3d 100644 --- a/ui/compositor/DEPS +++ b/ui/compositor/DEPS
@@ -7,6 +7,7 @@ "+third_party/khronos/GLES2/gl2.h", "+third_party/skia", "+ui/base", + "+ui/display/display_switches.h", "+ui/gfx", "+ui/gl", ]
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index b9078b680..81a93455 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -33,7 +33,6 @@ #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_settings.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "ui/base/ui_base_switches.h" #include "ui/compositor/compositor_observer.h" #include "ui/compositor/compositor_switches.h" #include "ui/compositor/compositor_vsync_manager.h" @@ -41,6 +40,7 @@ #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator_collection.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" +#include "ui/display/display_switches.h" #include "ui/gfx/icc_profile.h" #include "ui/gl/gl_switches.h"
diff --git a/ui/compositor/dip_util.cc b/ui/compositor/dip_util.cc index f7290e0..900ce710 100644 --- a/ui/compositor/dip_util.cc +++ b/ui/compositor/dip_util.cc
@@ -66,7 +66,7 @@ namespace { void CheckSnapped(float snapped_position) { - const float kEplison = 0.0001f; + const float kEplison = 0.0002f; float diff = std::abs(snapped_position - gfx::ToRoundedInt(snapped_position)); DCHECK_LT(diff, kEplison); }
diff --git a/ui/display/display.cc b/ui/display/display.cc index fb534b97..ae0eb511 100644 --- a/ui/display/display.cc +++ b/ui/display/display.cc
@@ -20,6 +20,12 @@ namespace display { namespace { +constexpr int DEFAULT_BITS_PER_PIXEL = 24; +constexpr int DEFAULT_BITS_PER_COMPONENT = 8; + +constexpr int HDR_BITS_PER_PIXEL = 48; +constexpr int HDR_BITS_PER_COMPONENT = 16; + // This variable tracks whether the forced device scale factor switch needs to // be read from the command line, i.e. if it is set to -1 then the command line // is checked. @@ -73,9 +79,6 @@ g_forced_device_scale_factor = -1.0; } -constexpr int DEFAULT_BITS_PER_PIXEL = 24; -constexpr int DEFAULT_BITS_PER_COMPONENT = 8; - Display::Display() : Display(kInvalidDisplayId) {} Display::Display(int64_t id) : Display(id, gfx::Rect()) {} @@ -87,6 +90,10 @@ device_scale_factor_(GetForcedDeviceScaleFactor()), color_depth_(DEFAULT_BITS_PER_PIXEL), depth_per_component_(DEFAULT_BITS_PER_COMPONENT) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR)) { + color_depth_ = HDR_BITS_PER_PIXEL; + depth_per_component_ = HDR_BITS_PER_COMPONENT; + } #if defined(USE_AURA) SetScaleAndBounds(device_scale_factor_, bounds); #endif
diff --git a/ui/display/display_switches.cc b/ui/display/display_switches.cc index 945635d..89171561 100644 --- a/ui/display/display_switches.cc +++ b/ui/display/display_switches.cc
@@ -38,6 +38,9 @@ // This is for debugging on linux desktop. const char kUseFirstDisplayAsInternal[] = "use-first-display-as-internal"; +// Use an fp16 scRGB swap chain compatible with HDR output. +const char kEnableHDR[] = "enable-hdr"; + #if defined(OS_CHROMEOS) const char kDisableDisplayColorCalibration[] = "disable-display-color-calibration";
diff --git a/ui/display/display_switches.h b/ui/display/display_switches.h index 57ceb04..93b741b 100644 --- a/ui/display/display_switches.h +++ b/ui/display/display_switches.h
@@ -19,6 +19,7 @@ DISPLAY_EXPORT extern const char kScreenConfig[]; DISPLAY_EXPORT extern const char kSecondaryDisplayLayout[]; DISPLAY_EXPORT extern const char kUseFirstDisplayAsInternal[]; +DISPLAY_EXPORT extern const char kEnableHDR[]; #if defined(OS_CHROMEOS) DISPLAY_EXPORT extern const char kDisableDisplayColorCalibration[];
diff --git a/ui/display/display_unittest.cc b/ui/display/display_unittest.cc index 62f6b58..dee754b4 100644 --- a/ui/display/display_unittest.cc +++ b/ui/display/display_unittest.cc
@@ -5,6 +5,7 @@ #include "ui/display/display.h" #include "base/command_line.h" +#include "base/test/scoped_command_line.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/display_switches.h" #include "ui/gfx/geometry/insets.h" @@ -52,14 +53,32 @@ // https://crbug.com/517944 TEST(DisplayTest, ForcedDeviceScaleFactorByCommandLine) { + base::test::ScopedCommandLine scoped_command_line; + base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine(); + Display::ResetForceDeviceScaleFactorForTesting(); - // Look ma, no value! - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kForceDeviceScaleFactor); + command_line->AppendSwitch(switches::kForceDeviceScaleFactor); EXPECT_EQ(1, Display::GetForcedDeviceScaleFactor()); Display::ResetForceDeviceScaleFactorForTesting(); } +TEST(DisplayTest, DisplayHDRValues) { + base::test::ScopedCommandLine scoped_command_line; + base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine(); + { + Display display; + EXPECT_EQ(24, display.color_depth()); + EXPECT_EQ(8, display.depth_per_component()); + } + + command_line->AppendSwitch(switches::kEnableHDR); + { + Display display; + EXPECT_EQ(48, display.color_depth()); + EXPECT_EQ(16, display.depth_per_component()); + } +} + } // namespace display
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn index eb8a0c7..0ce86e6a 100644 --- a/ui/events/BUILD.gn +++ b/ui/events/BUILD.gn
@@ -448,8 +448,10 @@ "ozone/chromeos/cursor_controller_unittest.cc", "ozone/evdev/event_converter_evdev_impl_unittest.cc", "ozone/evdev/event_converter_test_util.cc", + "ozone/evdev/event_converter_test_util.h", "ozone/evdev/event_device_info_unittest.cc", "ozone/evdev/event_device_test_util.cc", + "ozone/evdev/event_device_test_util.h", "ozone/evdev/input_injector_evdev_unittest.cc", "ozone/evdev/tablet_event_converter_evdev_unittest.cc", "ozone/evdev/touch_event_converter_evdev_unittest.cc",
diff --git a/ui/events/mojo/latency_info.mojom b/ui/events/mojo/latency_info.mojom index e5e77de..664499c 100644 --- a/ui/events/mojo/latency_info.mojom +++ b/ui/events/mojo/latency_info.mojom
@@ -89,6 +89,10 @@ mojo.common.mojom.TimeTicks event_time; // Count of events that happened in this component uint32 event_count; + // Time of the oldest event that happened in this component. + mojo.common.mojom.TimeTicks first_event_time; + // Time of the most recent event that happened in this component. + mojo.common.mojom.TimeTicks last_event_time; }; struct LatencyComponentPair {
diff --git a/ui/events/mojo/latency_info_struct_traits.cc b/ui/events/mojo/latency_info_struct_traits.cc index d70e957..32fc616a 100644 --- a/ui/events/mojo/latency_info_struct_traits.cc +++ b/ui/events/mojo/latency_info_struct_traits.cc
@@ -176,12 +176,30 @@ } // static +base::TimeTicks StructTraits<ui::mojom::LatencyComponentDataView, + ui::LatencyInfo::LatencyComponent>:: + first_event_time(const ui::LatencyInfo::LatencyComponent& component) { + return component.first_event_time; +} + +// static +base::TimeTicks StructTraits<ui::mojom::LatencyComponentDataView, + ui::LatencyInfo::LatencyComponent>:: + last_event_time(const ui::LatencyInfo::LatencyComponent& component) { + return component.last_event_time; +} + +// static bool StructTraits<ui::mojom::LatencyComponentDataView, ui::LatencyInfo::LatencyComponent>:: Read(ui::mojom::LatencyComponentDataView data, ui::LatencyInfo::LatencyComponent* out) { if (!data.ReadEventTime(&out->event_time)) return false; + if (!data.ReadFirstEventTime(&out->first_event_time)) + return false; + if (!data.ReadLastEventTime(&out->last_event_time)) + return false; out->sequence_number = data.sequence_number(); out->event_count = data.event_count(); return true;
diff --git a/ui/events/mojo/latency_info_struct_traits.h b/ui/events/mojo/latency_info_struct_traits.h index a46905c..6220530 100644 --- a/ui/events/mojo/latency_info_struct_traits.h +++ b/ui/events/mojo/latency_info_struct_traits.h
@@ -46,6 +46,10 @@ const ui::LatencyInfo::LatencyComponent& component); static uint32_t event_count( const ui::LatencyInfo::LatencyComponent& component); + static base::TimeTicks first_event_time( + const ui::LatencyInfo::LatencyComponent& component); + static base::TimeTicks last_event_time( + const ui::LatencyInfo::LatencyComponent& component); static bool Read(ui::mojom::LatencyComponentDataView data, ui::LatencyInfo::LatencyComponent* out); };
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index 3bdc7dc..e89ff7d 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -276,7 +276,7 @@ return true; } -EGLConfig ChooseConfig(GLSurfaceFormat format) { +EGLConfig ChooseConfig(GLSurfaceFormat format, bool surfaceless) { // Choose an EGL configuration. // On X this is only used for PBuffer surfaces. @@ -304,9 +304,8 @@ } #endif - EGLint surface_type = (format.IsSurfaceless() - ? EGL_DONT_CARE - : EGL_WINDOW_BIT | EGL_PBUFFER_BIT); + EGLint surface_type = + (surfaceless ? EGL_DONT_CARE : EGL_WINDOW_BIT | EGL_PBUFFER_BIT); for (auto renderable_type : renderable_types) { EGLint config_attribs_8888[] = {EGL_BUFFER_SIZE, @@ -500,7 +499,7 @@ EGLConfig GLSurfaceEGL::GetConfig() { if (!config_) { - config_ = ChooseConfig(format_); + config_ = ChooseConfig(format_, IsSurfaceless()); } return config_; } @@ -1206,14 +1205,9 @@ Destroy(); } -SurfacelessEGL::SurfacelessEGL(const gfx::Size& size) - : size_(size) { - format_ = GLSurfaceFormat(); - format_.SetIsSurfaceless(); -} +SurfacelessEGL::SurfacelessEGL(const gfx::Size& size) : size_(size) {} bool SurfacelessEGL::Initialize(GLSurfaceFormat format) { - format.SetIsSurfaceless(); format_ = format; return true; }
diff --git a/ui/gl/gl_surface_format.cc b/ui/gl/gl_surface_format.cc index b57dbdb..ff7f660 100644 --- a/ui/gl/gl_surface_format.cc +++ b/ui/gl/gl_surface_format.cc
@@ -11,7 +11,6 @@ } GLSurfaceFormat::GLSurfaceFormat(SurfacePixelLayout layout) { - is_default_ = false; pixel_layout_ = layout; } @@ -20,10 +19,6 @@ GLSurfaceFormat::~GLSurfaceFormat() { } -bool GLSurfaceFormat::IsSurfaceless() { - return is_surfaceless_; -} - GLSurfaceFormat::SurfacePixelLayout GLSurfaceFormat::GetPixelLayout() { return pixel_layout_; } @@ -32,7 +27,6 @@ if (pixel_layout_ == PIXEL_LAYOUT_DONT_CARE && layout != PIXEL_LAYOUT_DONT_CARE) { pixel_layout_ = layout; - is_default_ = false; } } @@ -40,12 +34,6 @@ red_bits_ = blue_bits_ = 5; green_bits_ = 6; alpha_bits_ = 0; - is_default_ = false; -} - -void GLSurfaceFormat::SetIsSurfaceless() { - is_surfaceless_ = true; - is_default_ = false; } static int GetValue(int num, int default_value) { @@ -56,14 +44,7 @@ return GetValue(num, 8); } - -bool GLSurfaceFormat::IsDefault() { - return is_default_; -} - bool GLSurfaceFormat::IsCompatible(GLSurfaceFormat other) { - if (IsDefault() && other.IsDefault()) return true; - if (GetBitSize(red_bits_) == GetBitSize(other.red_bits_) && GetBitSize(green_bits_) == GetBitSize(other.green_bits_) && GetBitSize(blue_bits_) == GetBitSize(other.blue_bits_) && @@ -71,7 +52,6 @@ GetValue(stencil_bits_, 8) == GetValue(other.stencil_bits_, 8) && GetValue(depth_bits_, 24) == GetValue(other.depth_bits_, 24) && GetValue(samples_, 0) == GetValue(other.samples_, 0) && - is_surfaceless_ == other.is_surfaceless_ && pixel_layout_ == other.pixel_layout_) { return true; } @@ -81,7 +61,6 @@ void GLSurfaceFormat::SetDepthBits(int bits) { if (bits != -1) { depth_bits_ = bits; - is_default_ = false; } } @@ -92,7 +71,6 @@ void GLSurfaceFormat::SetStencilBits(int bits) { if (bits != -1) { stencil_bits_ = bits; - is_default_ = false; } } @@ -103,7 +81,6 @@ void GLSurfaceFormat::SetSamples(int num) { if (num != -1) { samples_ = num; - is_default_ = false; } }
diff --git a/ui/gl/gl_surface_format.h b/ui/gl/gl_surface_format.h index 2fcf504f8..27cda863 100644 --- a/ui/gl/gl_surface_format.h +++ b/ui/gl/gl_surface_format.h
@@ -35,18 +35,6 @@ ~GLSurfaceFormat(); - // Helper method to determine if the format is unchanged from the - // default at creation time. TODO(klausw): can this be removed? - bool IsDefault(); - - // Surfaceless appears as a format property for backwards - // compatibility with the previous enum-based implementation. - // TODO(klausw): consider removing it and/or merging it into the - // pre-existing IsSurfaceless() predicate for the various Surface - // subclasses? - void SetIsSurfaceless(); - bool IsSurfaceless(); - // A given pair of surfaces is considered compatible if glSetSurface // can be used to switch between them without generating BAD_MATCH // errors, visual errors, or gross inefficiency, and incompatible @@ -80,9 +68,7 @@ int GetBufferSize(); private: - bool is_default_ = true; SurfacePixelLayout pixel_layout_ = PIXEL_LAYOUT_DONT_CARE; - bool is_surfaceless_ = false; int red_bits_ = -1; int green_bits_ = -1; int blue_bits_ = -1;
diff --git a/ui/gl/gl_surface_format_unittest.cc b/ui/gl/gl_surface_format_unittest.cc index 6e145c6..119f218c 100644 --- a/ui/gl/gl_surface_format_unittest.cc +++ b/ui/gl/gl_surface_format_unittest.cc
@@ -11,9 +11,7 @@ { // Check default format properties. GLSurfaceFormat format = GLSurfaceFormat(); - EXPECT_TRUE(format.IsDefault()); EXPECT_EQ(32, format.GetBufferSize()); - EXPECT_FALSE(format.IsSurfaceless()); EXPECT_EQ(GLSurfaceFormat::PIXEL_LAYOUT_DONT_CARE, format.GetPixelLayout()); } @@ -22,23 +20,13 @@ // Check rgb565 format as used for low-end Android devices. GLSurfaceFormat format = GLSurfaceFormat(); format.SetRGB565(); - EXPECT_FALSE(format.IsDefault()); EXPECT_EQ(16, format.GetBufferSize()); } { - // Check surfaceless format. - GLSurfaceFormat format = GLSurfaceFormat(); - format.SetIsSurfaceless(); - EXPECT_FALSE(format.IsDefault()); - EXPECT_TRUE(format.IsSurfaceless()); - } - - { // Check custom pixel layout. GLSurfaceFormat format = GLSurfaceFormat( GLSurfaceFormat::PIXEL_LAYOUT_RGBA); - EXPECT_FALSE(format.IsDefault()); EXPECT_EQ(GLSurfaceFormat::PIXEL_LAYOUT_RGBA, format.GetPixelLayout());
diff --git a/ui/gl/init/gl_factory_ozone.cc b/ui/gl/init/gl_factory_ozone.cc index 9bd31eb..a4e0097c 100644 --- a/ui/gl/init/gl_factory_ozone.cc +++ b/ui/gl/init/gl_factory_ozone.cc
@@ -85,7 +85,7 @@ const gfx::Size& size, GLSurfaceFormat format) { TRACE_EVENT0("gpu", "gl::init::CreateOffscreenGLSurface"); - if (!format.IsDefault()) { + if (!format.IsCompatible(GLSurfaceFormat())) { NOTREACHED() << "FATAL: Ozone only supports default-format surfaces."; return nullptr; }
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn index 528569f..713c796 100644 --- a/ui/ozone/platform/wayland/BUILD.gn +++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -75,6 +75,7 @@ "fake_server.cc", "fake_server.h", "mock_platform_window_delegate.cc", + "mock_platform_window_delegate.h", "wayland_connection_unittest.cc", "wayland_keyboard_unittest.cc", "wayland_pointer_unittest.cc",
diff --git a/ui/views/accessibility/ax_window_obj_wrapper.cc b/ui/views/accessibility/ax_window_obj_wrapper.cc index b2d80b9..4352db01 100644 --- a/ui/views/accessibility/ax_window_obj_wrapper.cc +++ b/ui/views/accessibility/ax_window_obj_wrapper.cc
@@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "ui/accessibility/ax_node_data.h" +#include "ui/accessibility/platform/aura_window_properties.h" #include "ui/aura/window.h" #include "ui/views/accessibility/ax_aura_obj_cache.h" #include "ui/views/widget/widget.h" @@ -54,6 +55,11 @@ base::UTF16ToUTF8(window_->GetTitle())); out_node_data->state = 0; out_node_data->location = gfx::RectF(window_->bounds()); + + ui::AXTreeIDRegistry::AXTreeID child_ax_tree_id = + window_->GetProperty(ui::kChildAXTreeID); + if (child_ax_tree_id != ui::AXTreeIDRegistry::kNoAXTreeID) + out_node_data->AddIntAttribute(ui::AX_ATTR_CHILD_TREE_ID, child_ax_tree_id); } int32_t AXWindowObjWrapper::GetID() {
diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc index fc75419..2bfbd210 100644 --- a/ui/views/controls/tree/tree_view.cc +++ b/ui/views/controls/tree/tree_view.cc
@@ -780,7 +780,7 @@ int icon_index = model_->GetIconIndex(node->model_node()); if (icon_index != -1) icon = icons_[icon_index]; - else if (node == selected_node_) + else if (node == selected_node_ && PlatformStyle::kTreeViewUsesOpenIcon) icon = open_icon_; else icon = closed_icon_;
diff --git a/ui/views/style/platform_style.cc b/ui/views/style/platform_style.cc index 0dff5cb..ca86255 100644 --- a/ui/views/style/platform_style.cc +++ b/ui/views/style/platform_style.cc
@@ -49,6 +49,7 @@ CustomButton::CLICK_ON_KEY_RELEASE; const bool PlatformStyle::kReturnClicksFocusedControl = true; const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = false; +const bool PlatformStyle::kTreeViewUsesOpenIcon = true; const bool PlatformStyle::kUseRipples = true; const bool PlatformStyle::kMirrorBubbleArrowInRTLByDefault = true;
diff --git a/ui/views/style/platform_style.h b/ui/views/style/platform_style.h index 5e31fa2..876dba5 100644 --- a/ui/views/style/platform_style.h +++ b/ui/views/style/platform_style.h
@@ -60,6 +60,10 @@ // label for that row. static const bool kTreeViewSelectionPaintsEntireRow; + // Whether TreeViews use a separate icon for the currently selected node's + // ancestors. + static const bool kTreeViewUsesOpenIcon; + // Whether ripples should be used for visual feedback on control activation. static const bool kUseRipples;
diff --git a/ui/views/style/platform_style_mac.mm b/ui/views/style/platform_style_mac.mm index e1d396e..7ee1380 100644 --- a/ui/views/style/platform_style_mac.mm +++ b/ui/views/style/platform_style_mac.mm
@@ -26,6 +26,7 @@ const bool PlatformStyle::kSelectWordOnRightClick = true; const bool PlatformStyle::kSelectAllOnRightClickWhenUnfocused = true; const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = true; +const bool PlatformStyle::kTreeViewUsesOpenIcon = false; const bool PlatformStyle::kUseRipples = false; // On Mac, the Cocoa browser window does not flip its UI in RTL (e.g. bookmark
diff --git a/ui/views_content_client/BUILD.gn b/ui/views_content_client/BUILD.gn index 957ae9e7..c9df61e4 100644 --- a/ui/views_content_client/BUILD.gn +++ b/ui/views_content_client/BUILD.gn
@@ -17,6 +17,7 @@ "views_content_client_main_parts_chromeos.cc", "views_content_client_main_parts_mac.mm", "views_content_main_delegate.cc", + "views_content_main_delegate.h", ] defines = [ "VIEWS_CONTENT_CLIENT_IMPLEMENTATION" ]
diff --git a/ui/wm/BUILD.gn b/ui/wm/BUILD.gn index f0a07f1..a490bbe2 100644 --- a/ui/wm/BUILD.gn +++ b/ui/wm/BUILD.gn
@@ -29,8 +29,6 @@ "core/focus_controller.cc", "core/focus_controller.h", "core/focus_rules.h", - "core/image_grid.cc", - "core/image_grid.h", "core/masked_window_targeter.cc", "core/masked_window_targeter.h", "core/native_cursor_manager.h", @@ -118,7 +116,6 @@ "core/coordinate_conversion_unittest.cc", "core/cursor_manager_unittest.cc", "core/focus_controller_unittest.cc", - "core/image_grid_unittest.cc", "core/shadow_controller_unittest.cc", "core/shadow_unittest.cc", "core/transient_window_manager_unittest.cc",
diff --git a/ui/wm/core/image_grid.cc b/ui/wm/core/image_grid.cc deleted file mode 100644 index f46aea93..0000000 --- a/ui/wm/core/image_grid.cc +++ /dev/null
@@ -1,340 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/wm/core/image_grid.h" - -#include <algorithm> - -#include "third_party/skia/include/core/SkColor.h" -#include "ui/compositor/dip_util.h" -#include "ui/compositor/paint_recorder.h" -#include "ui/gfx/canvas.h" -#include "ui/gfx/geometry/rect.h" -#include "ui/gfx/geometry/rect_conversions.h" -#include "ui/gfx/geometry/size.h" -#include "ui/gfx/geometry/size_conversions.h" -#include "ui/gfx/image/image.h" -#include "ui/gfx/image/image_skia_operations.h" -#include "ui/gfx/transform.h" - -using std::max; -using std::min; - -namespace wm { -namespace { - -// Sets the scaling for the transform applied to a layer. The left, top, -// right and bottom layers are stretched to the height or width of the -// center image. - -void ScaleWidth(const gfx::Size& center, - ui::Layer* layer, - gfx::Transform* transform) { - float layer_width = layer->bounds().width() * layer->device_scale_factor(); - float scale = static_cast<float>(center.width()) / layer_width; - transform->Scale(scale, 1.0); -} - -void ScaleHeight(const gfx::Size& center, - ui::Layer* layer, - gfx::Transform* transform) { - float layer_height = layer->bounds().height() * layer->device_scale_factor(); - float scale = static_cast<float>(center.height()) / layer_height; - transform->Scale(1.0, scale); -} - -// Returns the dimensions of |image| if non-NULL or gfx::Size(0, 0) otherwise. -gfx::Size GetImageSize(const gfx::Image* image) { - return image ? gfx::Size(image->ToImageSkia()->width(), - image->ToImageSkia()->height()) - : gfx::Size(); -} - -// Returns true if |layer|'s bounds don't fit within |size|. -bool LayerExceedsSize(const ui::Layer* layer, const gfx::Size& size) { - return layer->bounds().width() > size.width() || - layer->bounds().height() > size.height(); -} - -} // namespace - -gfx::RectF ImageGrid::TestAPI::GetTransformedLayerBounds( - const ui::Layer& layer) { - gfx::RectF bounds = gfx::RectF(layer.bounds()); - layer.transform().TransformRect(&bounds); - return bounds; -} - -ImageGrid::ImageGrid() - : layer_(new ui::Layer(ui::LAYER_NOT_DRAWN)), - top_image_height_(0), - bottom_image_height_(0), - left_image_width_(0), - right_image_width_(0), - base_top_row_height_(0), - base_bottom_row_height_(0), - base_left_column_width_(0), - base_right_column_width_(0) { -} - -ImageGrid::~ImageGrid() { -} - -void ImageGrid::SetImages(const gfx::Image* top_left_image, - const gfx::Image* top_image, - const gfx::Image* top_right_image, - const gfx::Image* left_image, - const gfx::Image* center_image, - const gfx::Image* right_image, - const gfx::Image* bottom_left_image, - const gfx::Image* bottom_image, - const gfx::Image* bottom_right_image) { - SetImage(top_left_image, &top_left_layer_, &top_left_painter_, NONE); - SetImage(top_image, &top_layer_, &top_painter_, HORIZONTAL); - SetImage(top_right_image, &top_right_layer_, &top_right_painter_, NONE); - SetImage(left_image, &left_layer_, &left_painter_, VERTICAL); - SetImage(center_image, ¢er_layer_, ¢er_painter_, NONE); - SetImage(right_image, &right_layer_, &right_painter_, VERTICAL); - SetImage(bottom_left_image, &bottom_left_layer_, &bottom_left_painter_, NONE); - SetImage(bottom_image, &bottom_layer_, &bottom_painter_, HORIZONTAL); - SetImage( - bottom_right_image, &bottom_right_layer_, &bottom_right_painter_, NONE); - - top_image_height_ = GetImageSize(top_image).height(); - bottom_image_height_ = GetImageSize(bottom_image).height(); - left_image_width_ = GetImageSize(left_image).width(); - right_image_width_ = GetImageSize(right_image).width(); - - base_top_row_height_ = max(GetImageSize(top_left_image).height(), - max(GetImageSize(top_image).height(), - GetImageSize(top_right_image).height())); - base_bottom_row_height_ = max(GetImageSize(bottom_left_image).height(), - max(GetImageSize(bottom_image).height(), - GetImageSize(bottom_right_image).height())); - base_left_column_width_ = max(GetImageSize(top_left_image).width(), - max(GetImageSize(left_image).width(), - GetImageSize(bottom_left_image).width())); - base_right_column_width_ = max(GetImageSize(top_right_image).width(), - max(GetImageSize(right_image).width(), - GetImageSize(bottom_right_image).width())); - - // Invalidate previous |size_| so calls to SetSize() will recompute it. - size_.SetSize(0, 0); -} - -void ImageGrid::SetSize(const gfx::Size& size) { - if (size_ == size) - return; - - size_ = size; - - gfx::Rect updated_bounds = layer_->bounds(); - updated_bounds.set_size(size); - layer_->SetBounds(updated_bounds); - - // Calculate the available amount of space for corner images on all sides of - // the grid. If the images don't fit, we need to clip them. - const int left = min(base_left_column_width_, size_.width() / 2); - const int right = min(base_right_column_width_, size_.width() - left); - const int top = min(base_top_row_height_, size_.height() / 2); - const int bottom = min(base_bottom_row_height_, size_.height() - top); - - // The remaining space goes to the center image. - int center_width = std::max(size.width() - left - right, 0); - int center_height = std::max(size.height() - top - bottom, 0); - - // At non-integer scale factors, the ratio of dimensions in DIP is not - // necessarily the same as the ratio in physical pixels due to rounding. Set - // the transform on each of the layers based on dimensions in pixels. - gfx::Size center_size_in_pixels = gfx::ScaleToFlooredSize( - gfx::Size(center_width, center_height), layer_->device_scale_factor()); - - if (top_layer_.get()) { - if (center_width > 0) { - gfx::Transform transform; - transform.Translate(left, 0); - ScaleWidth(center_size_in_pixels, top_layer_.get(), &transform); - top_layer_->SetTransform(transform); - } - top_layer_->SetVisible(center_width > 0); - } - if (bottom_layer_.get()) { - if (center_width > 0) { - gfx::Transform transform; - transform.Translate( - left, size.height() - bottom_layer_->bounds().height()); - ScaleWidth(center_size_in_pixels, bottom_layer_.get(), &transform); - bottom_layer_->SetTransform(transform); - } - bottom_layer_->SetVisible(center_width > 0); - } - if (left_layer_.get()) { - if (center_height > 0) { - gfx::Transform transform; - transform.Translate(0, top); - ScaleHeight(center_size_in_pixels, left_layer_.get(), &transform); - left_layer_->SetTransform(transform); - } - left_layer_->SetVisible(center_height > 0); - } - if (right_layer_.get()) { - if (center_height > 0) { - gfx::Transform transform; - transform.Translate( - size.width() - right_layer_->bounds().width(), top); - ScaleHeight(center_size_in_pixels, right_layer_.get(), &transform); - right_layer_->SetTransform(transform); - } - right_layer_->SetVisible(center_height > 0); - } - - if (top_left_layer_.get()) { - // No transformation needed; it should be at (0, 0) and unscaled. - top_left_painter_->SetClipRect( - LayerExceedsSize(top_left_layer_.get(), gfx::Size(left, top)) ? - gfx::Rect(gfx::Rect(0, 0, left, top)) : - gfx::Rect(), - top_left_layer_.get()); - } - if (top_right_layer_.get()) { - gfx::Transform transform; - transform.Translate(size.width() - top_right_layer_->bounds().width(), 0.0); - top_right_layer_->SetTransform(transform); - top_right_painter_->SetClipRect( - LayerExceedsSize(top_right_layer_.get(), gfx::Size(right, top)) ? - gfx::Rect(top_right_layer_->bounds().width() - right, 0, - right, top) : - gfx::Rect(), - top_right_layer_.get()); - } - if (bottom_left_layer_.get()) { - gfx::Transform transform; - transform.Translate( - 0.0, size.height() - bottom_left_layer_->bounds().height()); - bottom_left_layer_->SetTransform(transform); - bottom_left_painter_->SetClipRect( - LayerExceedsSize(bottom_left_layer_.get(), gfx::Size(left, bottom)) ? - gfx::Rect(0, bottom_left_layer_->bounds().height() - bottom, - left, bottom) : - gfx::Rect(), - bottom_left_layer_.get()); - } - if (bottom_right_layer_.get()) { - gfx::Transform transform; - transform.Translate( - size.width() - bottom_right_layer_->bounds().width(), - size.height() - bottom_right_layer_->bounds().height()); - bottom_right_layer_->SetTransform(transform); - bottom_right_painter_->SetClipRect( - LayerExceedsSize(bottom_right_layer_.get(), gfx::Size(right, bottom)) ? - gfx::Rect(bottom_right_layer_->bounds().width() - right, - bottom_right_layer_->bounds().height() - bottom, - right, bottom) : - gfx::Rect(), - bottom_right_layer_.get()); - } - - if (center_layer_.get()) { - if (center_width > 0 && center_height > 0) { - gfx::Transform transform; - transform.Translate(left, top); - transform.Scale(center_width / center_layer_->bounds().width(), - center_height / center_layer_->bounds().height()); - center_layer_->SetTransform(transform); - } - center_layer_->SetVisible(center_width > 0 && center_height > 0); - } -} - -void ImageGrid::SetContentBounds(const gfx::Rect& content_bounds) { - - SetSize(gfx::Size( - content_bounds.width() + left_image_width_ + right_image_width_, - content_bounds.height() + top_image_height_ + - bottom_image_height_)); - layer_->SetBounds( - gfx::Rect(content_bounds.x() - left_image_width_, - content_bounds.y() - top_image_height_, - layer_->bounds().width(), - layer_->bounds().height())); -} - -void ImageGrid::ImagePainter::SetClipRect(const gfx::Rect& clip_rect, - ui::Layer* layer) { - if (clip_rect != clip_rect_) { - clip_rect_ = clip_rect; - layer->SchedulePaint(layer->bounds()); - } -} - -void ImageGrid::ImagePainter::OnPaintLayer(const ui::PaintContext& context) { - gfx::Size bounding_size(image_.width(), image_.height()); - ui::PaintRecorder recorder(context, bounding_size); - if (!clip_rect_.IsEmpty()) - recorder.canvas()->ClipRect(clip_rect_); - recorder.canvas()->DrawImageInt(image_, 0, 0); -} - -void ImageGrid::ImagePainter::OnDelegatedFrameDamage( - const gfx::Rect& damage_rect_in_dip) { -} - -void ImageGrid::ImagePainter::OnDeviceScaleFactorChanged( - float device_scale_factor) { - // Redrawing will take care of scale factor change. -} - -void ImageGrid::SetImage(const gfx::Image* image, - std::unique_ptr<ui::Layer>* layer_ptr, - std::unique_ptr<ImagePainter>* painter_ptr, - ImageType type) { - // Minimum width (for HORIZONTAL) or height (for VERTICAL) of the - // |image| so that layers are scaled property if the device scale - // factor is non integral. - const int kMinimumSize = 20; - - // Clean out old layers and painters. - layer_ptr->reset(); - painter_ptr->reset(); - - // If we're not using an image, we're done. - if (!image) - return; - - gfx::ImageSkia image_skia = image->AsImageSkia(); - switch (type) { - case HORIZONTAL: - if (image_skia.width() < kMinimumSize) { - image_skia = gfx::ImageSkiaOperations::CreateResizedImage( - image_skia, - skia::ImageOperations::RESIZE_GOOD, - gfx::Size(kMinimumSize, image_skia.height())); - } - break; - case VERTICAL: - if (image_skia.height() < kMinimumSize) { - image_skia = gfx::ImageSkiaOperations::CreateResizedImage( - image_skia, - skia::ImageOperations::RESIZE_GOOD, - gfx::Size(image_skia.width(), kMinimumSize)); - } - break; - case NONE: - break; - } - - // Set up the new layer and painter. - layer_ptr->reset(new ui::Layer(ui::LAYER_TEXTURED)); - - const gfx::Size size = image_skia.size(); - layer_ptr->get()->SetBounds(gfx::Rect(0, 0, size.width(), size.height())); - - painter_ptr->reset(new ImagePainter(image_skia)); - layer_ptr->get()->set_delegate(painter_ptr->get()); - layer_ptr->get()->SetFillsBoundsOpaquely(false); - layer_ptr->get()->SetVisible(true); - layer_->Add(layer_ptr->get()); -} - -} // namespace wm
diff --git a/ui/wm/core/image_grid.h b/ui/wm/core/image_grid.h deleted file mode 100644 index d171e9b..0000000 --- a/ui/wm/core/image_grid.h +++ /dev/null
@@ -1,221 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_WM_CORE_IMAGE_GRID_H_ -#define UI_WM_CORE_IMAGE_GRID_H_ - -#include <memory> - -#include "base/macros.h" -#include "ui/compositor/layer.h" -#include "ui/compositor/layer_delegate.h" -#include "ui/gfx/geometry/rect.h" -#include "ui/gfx/geometry/size.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/wm/wm_export.h" - -namespace gfx { -class Image; -} // namespace gfx - -namespace wm { - -// An ImageGrid is a 3x3 array of ui::Layers, each containing an image. -// -// As the grid is resized, its images fill the requested space: -// - corner images are not scaled -// - top and bottom images are scaled horizontally -// - left and right images are scaled vertically -// - the center image is scaled in both directions -// -// If one of the non-center images is smaller than the largest images in its -// row or column, it will be aligned with the outside of the grid. For -// example, given 4x4 top-left and top-right images and a 1x2 top images: -// -// +--------+---------------------+--------+ -// | | top | | -// | top- +---------------------+ top- + -// | left | | right | -// +----+---+ +---+----+ -// | | | | -// ... -// -// This may seem odd at first, but it lets ImageGrid be used to draw shadows -// with curved corners that extend inwards beyond a window's borders. In the -// below example, the top-left corner image is overlaid on top of the window's -// top-left corner: -// -// +---------+----------------------- -// | ..xxx|XXXXXXXXXXXXXXXXXX -// | .xXXXXX|XXXXXXXXXXXXXXXXXX_____ -// | .xXX | ^ window's top edge -// | .xXX | -// +---------+ -// | xXX| -// | xXX|< window's left edge -// | xXX| -// ... -// -class WM_EXPORT ImageGrid { - public: - // Helper class for use by tests. - class WM_EXPORT TestAPI { - public: - explicit TestAPI(ImageGrid* grid) : grid_(grid) {} - - gfx::Rect top_left_clip_rect() const { - return grid_->top_left_painter_->clip_rect_; - } - gfx::Rect top_right_clip_rect() const { - return grid_->top_right_painter_->clip_rect_; - } - gfx::Rect bottom_left_clip_rect() const { - return grid_->bottom_left_painter_->clip_rect_; - } - gfx::Rect bottom_right_clip_rect() const { - return grid_->bottom_right_painter_->clip_rect_; - } - - // Returns |layer|'s bounds after applying the layer's current transform. - gfx::RectF GetTransformedLayerBounds(const ui::Layer& layer); - - private: - ImageGrid* grid_; // not owned - - DISALLOW_COPY_AND_ASSIGN(TestAPI); - }; - - ImageGrid(); - ~ImageGrid(); - - ui::Layer* layer() { return layer_.get(); } - int top_image_height() const { return top_image_height_; } - int bottom_image_height() const { return bottom_image_height_; } - int left_image_width() const { return left_image_width_; } - int right_image_width() const { return right_image_width_; } - - // Visible to allow independent layer animations and for testing. - ui::Layer* top_left_layer() const { return top_left_layer_.get(); } - ui::Layer* top_layer() const { return top_layer_.get(); } - ui::Layer* top_right_layer() const { return top_right_layer_.get(); } - ui::Layer* left_layer() const { return left_layer_.get(); } - ui::Layer* center_layer() const { return center_layer_.get(); } - ui::Layer* right_layer() const { return right_layer_.get(); } - ui::Layer* bottom_left_layer() const { return bottom_left_layer_.get(); } - ui::Layer* bottom_layer() const { return bottom_layer_.get(); } - ui::Layer* bottom_right_layer() const { return bottom_right_layer_.get(); } - - // Sets the grid to display the passed-in images (any of which can be NULL). - // Ownership of the images remains with the caller. May be called more than - // once to switch images. - void SetImages(const gfx::Image* top_left_image, - const gfx::Image* top_image, - const gfx::Image* top_right_image, - const gfx::Image* left_image, - const gfx::Image* center_image, - const gfx::Image* right_image, - const gfx::Image* bottom_left_image, - const gfx::Image* bottom_image, - const gfx::Image* bottom_right_image); - - void SetSize(const gfx::Size& size); - - // Sets the grid to a position and size such that the inner edges of the top, - // bottom, left and right images will be flush with |content_bounds_in_dip|. - void SetContentBounds(const gfx::Rect& content_bounds_in_dip); - - private: - // Delegate responsible for painting a specific image on a layer. - class ImagePainter : public ui::LayerDelegate { - public: - explicit ImagePainter(const gfx::ImageSkia& image) : image_(image) {} - ~ImagePainter() override {} - - // Clips |layer| to |clip_rect|. Triggers a repaint if the clipping - // rectangle has changed. An empty rectangle disables clipping. - void SetClipRect(const gfx::Rect& clip_rect, ui::Layer* layer); - - // ui::LayerDelegate implementation: - void OnPaintLayer(const ui::PaintContext& context) override; - void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override; - void OnDeviceScaleFactorChanged(float device_scale_factor) override; - - private: - friend class TestAPI; - - const gfx::ImageSkia image_; - - gfx::Rect clip_rect_; - - DISALLOW_COPY_AND_ASSIGN(ImagePainter); - }; - - enum ImageType { - HORIZONTAL, - VERTICAL, - NONE, - }; - - // Sets |layer_ptr| and |painter_ptr| to display |image| and adds the - // passed-in layer to |layer_|. If image is NULL resets |layer_ptr| and - // |painter_ptr| and removes any existing layer from |layer_|. - // If |type| is either HORIZONTAL or VERTICAL, it may resize the image to - // guarantee that it has minimum size in order for scaling work properly - // with fractional device scale factors. crbug.com/376519. - void SetImage(const gfx::Image* image, - std::unique_ptr<ui::Layer>* layer_ptr, - std::unique_ptr<ImagePainter>* painter_ptr, - ImageType type); - - // Layer that contains all of the image layers. - std::unique_ptr<ui::Layer> layer_; - - // The grid's dimensions. - gfx::Size size_; - - // Heights and widths of the images displayed by |top_layer_|, - // |bottom_layer_|, |left_layer_|, and |right_layer_|. - int top_image_height_; - int bottom_image_height_; - int left_image_width_; - int right_image_width_; - - // Heights of the tallest images in the top and bottom rows and the widest - // images in the left and right columns. Note that we may have less actual - // space than this available if the images are large and |size_| is small. - int base_top_row_height_; - int base_bottom_row_height_; - int base_left_column_width_; - int base_right_column_width_; - - // Layers used to display the various images. Children of |layer_|. - // Positions for which no images were supplied are NULL. - std::unique_ptr<ui::Layer> top_left_layer_; - std::unique_ptr<ui::Layer> top_layer_; - std::unique_ptr<ui::Layer> top_right_layer_; - std::unique_ptr<ui::Layer> left_layer_; - std::unique_ptr<ui::Layer> center_layer_; - std::unique_ptr<ui::Layer> right_layer_; - std::unique_ptr<ui::Layer> bottom_left_layer_; - std::unique_ptr<ui::Layer> bottom_layer_; - std::unique_ptr<ui::Layer> bottom_right_layer_; - - // Delegates responsible for painting the above layers. - // Positions for which no images were supplied are NULL. - std::unique_ptr<ImagePainter> top_left_painter_; - std::unique_ptr<ImagePainter> top_painter_; - std::unique_ptr<ImagePainter> top_right_painter_; - std::unique_ptr<ImagePainter> left_painter_; - std::unique_ptr<ImagePainter> center_painter_; - std::unique_ptr<ImagePainter> right_painter_; - std::unique_ptr<ImagePainter> bottom_left_painter_; - std::unique_ptr<ImagePainter> bottom_painter_; - std::unique_ptr<ImagePainter> bottom_right_painter_; - - DISALLOW_COPY_AND_ASSIGN(ImageGrid); -}; - -} // namespace wm - -#endif // UI_WM_CORE_IMAGE_GRID_H_
diff --git a/ui/wm/core/image_grid_unittest.cc b/ui/wm/core/image_grid_unittest.cc deleted file mode 100644 index 58d511b1..0000000 --- a/ui/wm/core/image_grid_unittest.cc +++ /dev/null
@@ -1,344 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/wm/core/image_grid.h" - -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "ui/aura/test/aura_test_base.h" -#include "ui/gfx/image/image.h" -#include "ui/gfx/image/image_skia.h" - -namespace wm { - -namespace { - -// Creates a gfx::Image with the requested dimensions. -gfx::Image* CreateImage(const gfx::Size& size) { - SkBitmap bitmap; - bitmap.setInfo(SkImageInfo::MakeN32Premul(size.width(), size.height())); - return new gfx::Image(gfx::ImageSkia::CreateFrom1xBitmap(bitmap)); -} - -} // namespace - -typedef aura::test::AuraTestBase ImageGridTest; - -// Test that an ImageGrid's layers are transformed correctly when SetSize() is -// called. -TEST_F(ImageGridTest, Basic) { - // Size of the images around the grid's border. - const int kBorder = 2; - - std::unique_ptr<gfx::Image> image_1x1(CreateImage(gfx::Size(1, 1))); - std::unique_ptr<gfx::Image> image_1xB(CreateImage(gfx::Size(1, kBorder))); - std::unique_ptr<gfx::Image> image_Bx1(CreateImage(gfx::Size(kBorder, 1))); - std::unique_ptr<gfx::Image> image_BxB( - CreateImage(gfx::Size(kBorder, kBorder))); - - ImageGrid grid; - grid.SetImages(image_BxB.get(), image_1xB.get(), image_BxB.get(), - image_Bx1.get(), image_1x1.get(), image_Bx1.get(), - image_BxB.get(), image_1xB.get(), image_BxB.get()); - - ImageGrid::TestAPI test_api(&grid); - ASSERT_TRUE(grid.top_left_layer() != NULL); - ASSERT_TRUE(grid.top_layer() != NULL); - ASSERT_TRUE(grid.top_right_layer() != NULL); - ASSERT_TRUE(grid.left_layer() != NULL); - ASSERT_TRUE(grid.center_layer() != NULL); - ASSERT_TRUE(grid.right_layer() != NULL); - ASSERT_TRUE(grid.bottom_left_layer() != NULL); - ASSERT_TRUE(grid.bottom_layer() != NULL); - ASSERT_TRUE(grid.bottom_right_layer() != NULL); - - const gfx::Size size(20, 30); - grid.SetSize(size); - - // The top-left layer should be flush with the top-left corner and unscaled. - EXPECT_EQ(gfx::RectF(0, 0, kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.top_left_layer()).ToString()); - - // The top layer should be flush with the top edge and stretched horizontally - // between the two top corners. - EXPECT_EQ(gfx::RectF( - kBorder, 0, size.width() - 2 * kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.top_layer()).ToString()); - - // The top-right layer should be flush with the top-right corner and unscaled. - EXPECT_EQ(gfx::RectF(size.width() - kBorder, 0, kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.top_right_layer()).ToString()); - - // The left layer should be flush with the left edge and stretched vertically - // between the two left corners. - EXPECT_EQ(gfx::RectF( - 0, kBorder, kBorder, size.height() - 2 * kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.left_layer()).ToString()); - - // The center layer should fill the space in the middle of the grid. - EXPECT_EQ(gfx::RectF( - kBorder, kBorder, size.width() - 2 * kBorder, - size.height() - 2 * kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.center_layer()).ToString()); - - // The right layer should be flush with the right edge and stretched - // vertically between the two right corners. - EXPECT_EQ(gfx::RectF( - size.width() - kBorder, kBorder, - kBorder, size.height() - 2 * kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.right_layer()).ToString()); - - // The bottom-left layer should be flush with the bottom-left corner and - // unscaled. - EXPECT_EQ(gfx::RectF(0, size.height() - kBorder, kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.bottom_left_layer()).ToString()); - - // The bottom layer should be flush with the bottom edge and stretched - // horizontally between the two bottom corners. - EXPECT_EQ(gfx::RectF( - kBorder, size.height() - kBorder, - size.width() - 2 * kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.bottom_layer()).ToString()); - - // The bottom-right layer should be flush with the bottom-right corner and - // unscaled. - EXPECT_EQ(gfx::RectF( - size.width() - kBorder, size.height() - kBorder, - kBorder, kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.bottom_right_layer()).ToString()); -} - -// Test that an ImageGrid's layers are transformed correctly when -// SetContentBounds() is called. -TEST_F(ImageGridTest, SetContentBounds) { - // Size of the images around the grid's border. - const int kBorder = 2; - - std::unique_ptr<gfx::Image> image_1x1(CreateImage(gfx::Size(1, 1))); - std::unique_ptr<gfx::Image> image_1xB(CreateImage(gfx::Size(1, kBorder))); - std::unique_ptr<gfx::Image> image_Bx1(CreateImage(gfx::Size(kBorder, 1))); - std::unique_ptr<gfx::Image> image_BxB( - CreateImage(gfx::Size(kBorder, kBorder))); - - ImageGrid grid; - grid.SetImages(image_BxB.get(), image_1xB.get(), image_BxB.get(), - image_Bx1.get(), image_1x1.get(), image_Bx1.get(), - image_BxB.get(), image_1xB.get(), image_BxB.get()); - - ImageGrid::TestAPI test_api(&grid); - - const gfx::Point origin(5, 10); - const gfx::Size size(20, 30); - grid.SetContentBounds(gfx::Rect(origin, size)); - - // The master layer is positioned above the top-left corner of the content - // bounds and has height/width that contain the grid and bounds. - EXPECT_EQ(gfx::RectF(origin.x() - kBorder, - origin.y() - kBorder, - size.width() + 2 * kBorder, - size.height() + 2 * kBorder).ToString(), - test_api.GetTransformedLayerBounds(*grid.layer()).ToString()); -} - -// Check that we don't crash if only a single image is supplied. -TEST_F(ImageGridTest, SingleImage) { - const int kBorder = 1; - std::unique_ptr<gfx::Image> image(CreateImage(gfx::Size(kBorder, kBorder))); - - ImageGrid grid; - grid.SetImages(NULL, image.get(), NULL, - NULL, NULL, NULL, - NULL, NULL, NULL); - - ImageGrid::TestAPI test_api(&grid); - EXPECT_TRUE(grid.top_left_layer() == NULL); - ASSERT_TRUE(grid.top_layer() != NULL); - EXPECT_TRUE(grid.top_right_layer() == NULL); - EXPECT_TRUE(grid.left_layer() == NULL); - EXPECT_TRUE(grid.center_layer() == NULL); - EXPECT_TRUE(grid.right_layer() == NULL); - EXPECT_TRUE(grid.bottom_left_layer() == NULL); - EXPECT_TRUE(grid.bottom_layer() == NULL); - EXPECT_TRUE(grid.bottom_right_layer() == NULL); - - const gfx::Size kSize(10, 10); - grid.SetSize(kSize); - - // The top layer should be scaled horizontally across the entire width, but it - // shouldn't be scaled vertically. - EXPECT_EQ(gfx::RectF(0, 0, kSize.width(), kBorder).ToString(), - test_api.GetTransformedLayerBounds( - *grid.top_layer()).ToString()); -} - -// Check that we don't crash when we reset existing images to NULL and -// reset NULL images to new ones. -TEST_F(ImageGridTest, ResetImages) { - const int kBorder = 1; - std::unique_ptr<gfx::Image> image(CreateImage(gfx::Size(kBorder, kBorder))); - - ImageGrid grid; - grid.SetImages(NULL, image.get(), NULL, - NULL, NULL, NULL, - NULL, NULL, NULL); - - // Only the top edge has a layer. - ImageGrid::TestAPI test_api(&grid); - ASSERT_TRUE(grid.top_left_layer() == NULL); - ASSERT_FALSE(grid.top_layer() == NULL); - ASSERT_TRUE(grid.top_right_layer() == NULL); - ASSERT_TRUE(grid.left_layer() == NULL); - ASSERT_TRUE(grid.center_layer() == NULL); - ASSERT_TRUE(grid.right_layer() == NULL); - ASSERT_TRUE(grid.bottom_left_layer() == NULL); - ASSERT_TRUE(grid.bottom_layer() == NULL); - ASSERT_TRUE(grid.bottom_right_layer() == NULL); - - grid.SetImages(NULL, NULL, NULL, - NULL, NULL, NULL, - NULL, image.get(), NULL); - - // Now only the bottom edge has a layer. - ASSERT_TRUE(grid.top_left_layer() == NULL); - ASSERT_TRUE(grid.top_layer() == NULL); - ASSERT_TRUE(grid.top_right_layer() == NULL); - ASSERT_TRUE(grid.left_layer() == NULL); - ASSERT_TRUE(grid.center_layer() == NULL); - ASSERT_TRUE(grid.right_layer() == NULL); - ASSERT_TRUE(grid.bottom_left_layer() == NULL); - ASSERT_FALSE(grid.bottom_layer() == NULL); - ASSERT_TRUE(grid.bottom_right_layer() == NULL); -} - -// Test that side (top, left, right, bottom) layers that are narrower than their -// adjacent corner layers stay pinned to the outside edges instead of getting -// moved inwards or scaled. This exercises the scenario used for shadows. -TEST_F(ImageGridTest, SmallerSides) { - const int kCorner = 2; - const int kEdge = 1; - - std::unique_ptr<gfx::Image> top_left_image( - CreateImage(gfx::Size(kCorner, kCorner))); - std::unique_ptr<gfx::Image> top_image(CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> top_right_image( - CreateImage(gfx::Size(kCorner, kCorner))); - std::unique_ptr<gfx::Image> left_image(CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> right_image(CreateImage(gfx::Size(kEdge, kEdge))); - - ImageGrid grid; - grid.SetImages(top_left_image.get(), top_image.get(), top_right_image.get(), - left_image.get(), NULL, right_image.get(), - NULL, NULL, NULL); - ImageGrid::TestAPI test_api(&grid); - - const gfx::Size kSize(20, 30); - grid.SetSize(kSize); - - // The top layer should be flush with the top edge and stretched horizontally - // between the two top corners. - EXPECT_EQ(gfx::RectF( - kCorner, 0, kSize.width() - 2 * kCorner, kEdge).ToString(), - test_api.GetTransformedLayerBounds( - *grid.top_layer()).ToString()); - - // The left layer should be flush with the left edge and stretched vertically - // between the top left corner and the bottom. - EXPECT_EQ(gfx::RectF( - 0, kCorner, kEdge, kSize.height() - kCorner).ToString(), - test_api.GetTransformedLayerBounds( - *grid.left_layer()).ToString()); - - // The right layer should be flush with the right edge and stretched - // vertically between the top right corner and the bottom. - EXPECT_EQ(gfx::RectF( - kSize.width() - kEdge, kCorner, - kEdge, kSize.height() - kCorner).ToString(), - test_api.GetTransformedLayerBounds( - *grid.right_layer()).ToString()); -} - -// Test that we hide or clip layers as needed when the grid is assigned a small -// size. -TEST_F(ImageGridTest, TooSmall) { - const int kCorner = 5; - const int kCenter = 3; - const int kEdge = 3; - - std::unique_ptr<gfx::Image> top_left_image( - CreateImage(gfx::Size(kCorner, kCorner))); - std::unique_ptr<gfx::Image> top_image(CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> top_right_image( - CreateImage(gfx::Size(kCorner, kCorner))); - std::unique_ptr<gfx::Image> left_image(CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> center_image( - CreateImage(gfx::Size(kCenter, kCenter))); - std::unique_ptr<gfx::Image> right_image(CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> bottom_left_image( - CreateImage(gfx::Size(kCorner, kCorner))); - std::unique_ptr<gfx::Image> bottom_image( - CreateImage(gfx::Size(kEdge, kEdge))); - std::unique_ptr<gfx::Image> bottom_right_image( - CreateImage(gfx::Size(kCorner, kCorner))); - - ImageGrid grid; - grid.SetImages( - top_left_image.get(), top_image.get(), top_right_image.get(), - left_image.get(), center_image.get(), right_image.get(), - bottom_left_image.get(), bottom_image.get(), bottom_right_image.get()); - ImageGrid::TestAPI test_api(&grid); - - // Set a size that's smaller than the combined (unscaled) corner images. - const gfx::Size kSmallSize(kCorner + kCorner - 3, kCorner + kCorner - 5); - grid.SetSize(kSmallSize); - - // The scalable images around the sides and in the center should be hidden. - EXPECT_FALSE(grid.top_layer()->visible()); - EXPECT_FALSE(grid.bottom_layer()->visible()); - EXPECT_FALSE(grid.left_layer()->visible()); - EXPECT_FALSE(grid.right_layer()->visible()); - EXPECT_FALSE(grid.center_layer()->visible()); - - // The corner images' clip rects should sum to the expected size. - EXPECT_EQ(kSmallSize.width(), - test_api.top_left_clip_rect().width() + - test_api.top_right_clip_rect().width()); - EXPECT_EQ(kSmallSize.width(), - test_api.bottom_left_clip_rect().width() + - test_api.bottom_right_clip_rect().width()); - EXPECT_EQ(kSmallSize.height(), - test_api.top_left_clip_rect().height() + - test_api.bottom_left_clip_rect().height()); - EXPECT_EQ(kSmallSize.height(), - test_api.top_right_clip_rect().height() + - test_api.bottom_right_clip_rect().height()); - - // Resize the grid to be large enough to show all images. - const gfx::Size kLargeSize(kCorner + kCorner + kCenter, - kCorner + kCorner + kCenter); - grid.SetSize(kLargeSize); - - // The scalable images should be visible now. - EXPECT_TRUE(grid.top_layer()->visible()); - EXPECT_TRUE(grid.bottom_layer()->visible()); - EXPECT_TRUE(grid.left_layer()->visible()); - EXPECT_TRUE(grid.right_layer()->visible()); - EXPECT_TRUE(grid.center_layer()->visible()); - - // We shouldn't be clipping the corner images anymore. - EXPECT_TRUE(test_api.top_left_clip_rect().IsEmpty()); - EXPECT_TRUE(test_api.top_right_clip_rect().IsEmpty()); - EXPECT_TRUE(test_api.bottom_left_clip_rect().IsEmpty()); - EXPECT_TRUE(test_api.bottom_right_clip_rect().IsEmpty()); -} - -} // namespace wm
diff --git a/url/gurl.cc b/url/gurl.cc index 1fe48db3..09ab212c 100644 --- a/url/gurl.cc +++ b/url/gurl.cc
@@ -79,7 +79,7 @@ DCHECK(!is_valid_ || !SchemeIsFileSystem() || inner_url_); } -GURL::GURL(GURL&& other) noexcept +GURL::GURL(GURL&& other) : spec_(std::move(other.spec_)), is_valid_(other.is_valid_), parsed_(other.parsed_),
diff --git a/url/gurl.h b/url/gurl.h index 74efbb5..4cbd8465 100644 --- a/url/gurl.h +++ b/url/gurl.h
@@ -54,7 +54,7 @@ // Copy construction is relatively inexpensive, with most of the time going // to reallocating the string. It does not re-parse. GURL(const GURL& other); - GURL(GURL&& other) noexcept; + GURL(GURL&& other); // The strings to this contructor should be UTF-8 / UTF-16. explicit GURL(base::StringPiece url_string);
diff --git a/url/url_util.cc b/url/url_util.cc index a79e114f..a17ec4d 100644 --- a/url/url_util.cc +++ b/url/url_util.cc
@@ -81,6 +81,10 @@ kWssScheme, }; +const char* kEmptyDocumentSchemes[] = { + kAboutScheme, +}; + bool initialized = false; // Lists of the currently installed standard and referrer schemes. These lists @@ -96,6 +100,7 @@ std::vector<std::string>* cors_enabled_schemes = nullptr; std::vector<std::string>* web_storage_schemes = nullptr; std::vector<std::string>* csp_bypassing_schemes = nullptr; +std::vector<std::string>* empty_document_schemes = nullptr; // See the LockSchemeRegistries declaration in the header. bool scheme_registries_locked = false; @@ -525,6 +530,8 @@ InitSchemes(&web_storage_schemes, kWebStorageSchemes, arraysize(kWebStorageSchemes)); InitSchemes(&csp_bypassing_schemes, nullptr, 0); + InitSchemes(&empty_document_schemes, kEmptyDocumentSchemes, + arraysize(kEmptyDocumentSchemes)); initialized = true; } @@ -546,6 +553,8 @@ web_storage_schemes = nullptr; delete csp_bypassing_schemes; csp_bypassing_schemes = nullptr; + delete empty_document_schemes; + empty_document_schemes = nullptr; } void AddStandardScheme(const char* new_scheme, SchemeType type) { @@ -618,6 +627,16 @@ return *csp_bypassing_schemes; } +void AddEmptyDocumentScheme(const char* new_scheme) { + Initialize(); + DoAddScheme(new_scheme, empty_document_schemes); +} + +const std::vector<std::string>& GetEmptyDocumentSchemes() { + Initialize(); + return *empty_document_schemes; +} + void LockSchemeRegistries() { scheme_registries_locked = true; }
diff --git a/url/url_util.h b/url/url_util.h index d0a8f22..643c29d8 100644 --- a/url/url_util.h +++ b/url/url_util.h
@@ -109,6 +109,11 @@ URL_EXPORT void AddCSPBypassingScheme(const char* new_scheme); URL_EXPORT const std::vector<std::string>& GetCSPBypassingSchemes(); +// Adds an application-defined scheme to the list of schemes that are strictly +// empty documents, allowing them to commit synchronously. +URL_EXPORT void AddEmptyDocumentScheme(const char* new_scheme); +URL_EXPORT const std::vector<std::string>& GetEmptyDocumentSchemes(); + // Sets a flag to prevent future calls to Add*Scheme from succeeding. // // This is designed to help prevent errors for multithreaded applications.