diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-02-10 11:44:20 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-02-11 11:39:03 +0000 |
commit | 1d119e1884d6ee26f1122136867c75fb50091d4f (patch) | |
tree | 50e1b2a0e16140946936f184844aec45e15c4318 | |
parent | c3dcc07f4f3f94ed510dc4bc646e0a897cc57860 (diff) | |
download | qtwebengine-chromium-1d119e1884d6ee26f1122136867c75fb50091d4f.tar.gz |
Fix building with MSVC 2017
Work-around various issues to make Chromium build on VS 2017
Change-Id: I582454dce657014d5cbb4864ea281a4c327172a4
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
10 files changed, 71 insertions, 23 deletions
diff --git a/chromium/base/containers/span.h b/chromium/base/containers/span.h index f866926f893..12ad2d608da 100644 --- a/chromium/base/containers/span.h +++ b/chromium/base/containers/span.h @@ -270,6 +270,7 @@ class span : public internal::ExtentStorage<Extent> { // Conversion from a container that has compatible base::data() and integral // base::size(). +#ifndef _MSC_VER template < typename Container, internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic<Container&, @@ -301,7 +302,18 @@ class span : public internal::ExtentStorage<Extent> { Extent> = false> constexpr explicit span(const Container& container) noexcept : span(base::data(container), base::size(container)) {} - +#else + // Visual Studio has problems with the double declarations above. + template < + typename Container, + typename = internal::EnableIfSpanCompatibleContainer<Container&, T>> + constexpr span(Container& container) noexcept + : span(base::data(container), base::size(container)) {} + template <typename Container, + typename = internal::EnableIfSpanCompatibleContainer<const Container&, T>> + constexpr span(const Container& container) noexcept + : span(base::data(container), base::size(container)) {} +#endif constexpr span(const span& other) noexcept = default; // Conversions from spans of compatible types and extents: this allows a diff --git a/chromium/base/immediate_crash.h b/chromium/base/immediate_crash.h index 94158fe3ceb..14f09bea707 100644 --- a/chromium/base/immediate_crash.h +++ b/chromium/base/immediate_crash.h @@ -132,7 +132,11 @@ // calling function, but to this anonymous lambda. This is still useful as the // full name of the lambda will typically include the name of the function that // calls CHECK() and the debugger will still break at the right line of code. -#if !defined(COMPILER_GCC) +#if defined(COMPILER_MSVC) && !defined(__clang__) + +#define WRAPPED_TRAP_SEQUENCE_() TRAP_SEQUENCE1_() + +#elif !defined(COMPILER_GCC) #define WRAPPED_TRAP_SEQUENCE_() TRAP_SEQUENCE_() diff --git a/chromium/base/parameter_pack.h b/chromium/base/parameter_pack.h index 8fec8fbac7e..3e13dd7f527 100644 --- a/chromium/base/parameter_pack.h +++ b/chromium/base/parameter_pack.h @@ -48,6 +48,29 @@ inline constexpr size_t count(std::initializer_list<T> ilist, T value) { return c; } +template <class... Ts > +struct if_all; + +template <> +struct if_all<> + : std::integral_constant<bool, true> {}; + +template <class T, class... Ts > +struct if_all<T, Ts...> + : std::conditional<T::value, if_all<Ts...>, std::integral_constant<bool, false>>::type {}; + + +template <class... Ts > +struct if_any; + +template <> +struct if_any<> + : std::integral_constant<bool, false> {}; + +template <class T, class... Ts > +struct if_any<T, Ts...> + : std::conditional<T::value, std::integral_constant<bool, true>, if_any<Ts...>>::type {}; + constexpr size_t pack_npos = -1; template <typename... Ts> diff --git a/chromium/base/task/promise/helpers.h b/chromium/base/task/promise/helpers.h index 87d9ff64bec..0502b5f8ea3 100644 --- a/chromium/base/task/promise/helpers.h +++ b/chromium/base/task/promise/helpers.h @@ -165,9 +165,9 @@ struct UseMoveSemantics : public std::integral_constant<bool, UseMove<T>()> { // to be moved according to UseMove<>. template <typename... Ts> struct UseMoveSemantics<std::tuple<Ts...>> - : public std::integral_constant<bool, any_of({UseMove<Ts>()...})> { + : public if_any<UseMoveSemantics<Ts>...> { static constexpr PromiseExecutor::ArgumentPassingType argument_passing_type = - any_of({UseMove<Ts>()...}) + if_any<UseMoveSemantics<Ts>...>::value ? PromiseExecutor::ArgumentPassingType::kMove : PromiseExecutor::ArgumentPassingType::kNormal; }; diff --git a/chromium/base/task/promise/promise_value.h b/chromium/base/task/promise/promise_value.h index 3ca338845ff..cc51684cebb 100644 --- a/chromium/base/task/promise/promise_value.h +++ b/chromium/base/task/promise/promise_value.h @@ -43,8 +43,8 @@ struct Resolved { // Conversion constructor accepts any arguments except Resolved<T>. template < typename... Args, - std::enable_if_t<!all_of( - {std::is_same<Resolved, std::decay_t<Args>>::value...})>* = nullptr> + std::enable_if_t<!if_all< + std::is_same<Resolved, std::decay_t<Args>>...>::value>* = nullptr> Resolved(Args&&... args) noexcept : value(std::forward<Args>(args)...) {} T value; @@ -75,8 +75,8 @@ struct Rejected { // Conversion constructor accepts any arguments except Rejected<T>. template < typename... Args, - std::enable_if_t<!all_of( - {std::is_same<Rejected, std::decay_t<Args>>::value...})>* = nullptr> + std::enable_if_t<!if_all< + std::is_same<Rejected, std::decay_t<Args>>...>::value>* = nullptr> Rejected(Args&&... args) noexcept : value(std::forward<Args>(args)...) { static_assert(!std::is_same<T, NoReject>::value, "Can't have Rejected<NoReject>"); diff --git a/chromium/base/traits_bag.h b/chromium/base/traits_bag.h index d6b1d7b56a3..c50ba1c9bd0 100644 --- a/chromium/base/traits_bag.h +++ b/chromium/base/traits_bag.h @@ -200,10 +200,12 @@ struct RequiredEnumTraitFilter : public BasicTraitFilter<ArgType> { // Note EmptyTrait is always regarded as valid to support filtering. template <class ValidTraits, class T> -inline constexpr bool IsValidTrait() { - return std::is_constructible<ValidTraits, T>::value || - std::is_same<T, EmptyTrait>::value; -} +struct IsValidTrait + : std::is_constructible<ValidTraits, T> {}; + +template <class T> +struct IsValidTrait<EmptyTrait, T> + : std::integral_constant<bool, true> {}; // Tests whether a given trait type is valid or invalid by testing whether it is // convertible to the provided ValidTraits type. To use, define a ValidTraits @@ -221,12 +223,11 @@ inline constexpr bool IsValidTrait() { // MoreValidTraits(MyOtherTrait); // ... // }; + template <class ValidTraits, class... ArgTypes> struct AreValidTraits : std::integral_constant<bool, - all_of( - {IsValidTrait<ValidTraits, ArgTypes>()...})> { -}; + if_all<IsValidTrait<ValidTraits, ArgTypes>...>::value> {}; // Helper to make getting an enum from a trait more readable. template <typename Enum, typename... Args> diff --git a/chromium/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/chromium/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index 7e371d0776a..c42d8af65b9 100644 --- a/chromium/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/chromium/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc @@ -205,8 +205,8 @@ class ReusingTextShaper final { return shape_results; for (const NGInlineItem *item = std::lower_bound( reusable_items_->begin(), reusable_items_->end(), start_offset, - [](const NGInlineItem&item, unsigned offset) { - return item.EndOffset() <= offset; + [](const NGInlineItem& this_item, unsigned offset) { + return this_item.EndOffset() <= offset; }); item != reusable_items_->end(); ++item) { if (end_offset <= item->StartOffset()) diff --git a/chromium/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/chromium/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc index 6cb415e4519..2f417229949 100644 --- a/chromium/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc +++ b/chromium/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc @@ -1130,9 +1130,11 @@ void ShapeResult::InsertRun(scoped_refptr<ShapeResult::RunInfo> run) { return run->start_index_ > start_index; }; - Vector<scoped_refptr<RunInfo>>::iterator iterator = std::lower_bound( - runs_.begin(), runs_.end(), run->start_index_, - HB_DIRECTION_IS_FORWARD(run->direction_) ? ltr_comparer : rtl_comparer); + Vector<scoped_refptr<RunInfo>>::iterator iterator; + if (HB_DIRECTION_IS_FORWARD(run->direction_)) + iterator = std::lower_bound(runs_.begin(), runs_.end(), run->start_index_, ltr_comparer); + else + iterator = std::lower_bound(runs_.begin(), runs_.end(), run->start_index_, rtl_comparer); if (iterator != runs_.end()) runs_.insert(iterator - runs_.begin(), std::move(run)); diff --git a/chromium/third_party/blink/renderer/platform/loader/cors/cors_error_string.cc b/chromium/third_party/blink/renderer/platform/loader/cors/cors_error_string.cc index d428a2f5a64..059d8b4dac4 100644 --- a/chromium/third_party/blink/renderer/platform/loader/cors/cors_error_string.cc +++ b/chromium/third_party/blink/renderer/platform/loader/cors/cors_error_string.cc @@ -78,7 +78,8 @@ String GetErrorString(const network::CorsErrorStatus& status, Append(builder, {"(redirected from '", initial_request_url.GetString(), "') "}); } - Append(builder, {"from origin '", origin.ToString(), + String originString = origin.ToString(); // StringView of temporary String is illegal. + Append(builder, {"from origin '", originString, "' has been blocked by CORS policy: "}); if (IsPreflightError(status.cors_error)) { @@ -155,11 +156,13 @@ String GetErrorString(const network::CorsErrorStatus& status, "attribute."); } break; - case CorsError::kCorsDisabledScheme: + case CorsError::kCorsDisabledScheme: { + String listOfCORSEnabledURLSchemes = SchemeRegistry::ListOfCorsEnabledURLSchemes(); Append(builder, {"Cross origin requests are only supported for protocol schemes: ", - SchemeRegistry::ListOfCorsEnabledURLSchemes(), "."}); + listOfCORSEnabledURLSchemes, "."}); break; + } case CorsError::kPreflightInvalidStatus: builder.Append("It does not have HTTP ok status."); break; diff --git a/chromium/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/chromium/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc index 1779e616c30..a7557b837db 100644 --- a/chromium/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc +++ b/chromium/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc @@ -685,11 +685,14 @@ void PageSchedulerImpl::PageLifecycleStateTracker::SetPageLifecycleState( return; base::Optional<PageLifecycleStateTransition> transition = ComputePageLifecycleStateTransition(current_state_, new_state); +#if !defined(OS_WIN) || !defined(TOOLKIT_QT) + // ### For some reason MSVC2017 just can't handle this if (transition) { UMA_HISTOGRAM_ENUMERATION( kHistogramPageLifecycleStateTransition, static_cast<PageLifecycleStateTransition>(transition.value())); } +#endif if (page_scheduler_impl_->delegate_) page_scheduler_impl_->delegate_->SetLifecycleState(new_state); current_state_ = new_state; |