diff -Nru chromium-browser-59.0.3071.86/ash/session/session_controller.cc chromium-browser-59.0.3071.109/ash/session/session_controller.cc --- chromium-browser-59.0.3071.86/ash/session/session_controller.cc 2017-06-05 19:03:00.000000000 +0000 +++ chromium-browser-59.0.3071.109/ash/session/session_controller.cc 2017-06-20 22:03:10.000000000 +0000 @@ -78,13 +78,18 @@ } bool SessionController::IsUserSessionBlocked() const { - // User sessions are blocked when session state is not ACTIVE, except that - // LOCKED state with a running unlocking animation. This is made an exception - // because the unlocking animation hides lock container at the end. During the - // unlock animation, IsUserSessionBlocked needs to return unblocked so that - // user windows are deemed activatable and ash correctly restore the active - // window before locking. + // User sessions are blocked when session state is not ACTIVE, with two + // exceptions: + // - LOGGED_IN_NOT_ACTIVE state. This is needed so that browser windows + // created by session restore (or a default new browser window) are properly + // activated before session state changes to ACTIVE. + // - LOCKED state with a running unlocking animation. This is needed because + // the unlocking animation hides the lock container at the end. During the + // unlock animation, IsUserSessionBlocked needs to return unblocked so that + // user windows are deemed activatable and ash correctly restores the active + // window before locking. return state_ != SessionState::ACTIVE && + state_ != SessionState::LOGGED_IN_NOT_ACTIVE && !(state_ == SessionState::LOCKED && is_unlocking_); } diff -Nru chromium-browser-59.0.3071.86/ash/session/session_controller_unittest.cc chromium-browser-59.0.3071.109/ash/session/session_controller_unittest.cc --- chromium-browser-59.0.3071.86/ash/session/session_controller_unittest.cc 2017-06-05 19:03:00.000000000 +0000 +++ chromium-browser-59.0.3071.109/ash/session/session_controller_unittest.cc 2017-06-20 22:03:10.000000000 +0000 @@ -186,7 +186,7 @@ } kTestCases[] = { {SessionState::OOBE, false, true}, {SessionState::LOGIN_PRIMARY, false, true}, - {SessionState::LOGGED_IN_NOT_ACTIVE, false, true}, + {SessionState::LOGGED_IN_NOT_ACTIVE, false, false}, {SessionState::ACTIVE, false, false}, {SessionState::LOCKED, true, true}, {SessionState::LOGIN_SECONDARY, false, true}, @@ -333,7 +333,7 @@ } kTestCases[] = { {SessionState::OOBE, true}, {SessionState::LOGIN_PRIMARY, true}, - {SessionState::LOGGED_IN_NOT_ACTIVE, true}, + {SessionState::LOGGED_IN_NOT_ACTIVE, false}, {SessionState::ACTIVE, false}, {SessionState::LOGIN_SECONDARY, true}, }; diff -Nru chromium-browser-59.0.3071.86/build/config/linux/gtk2/BUILD.gn chromium-browser-59.0.3071.109/build/config/linux/gtk2/BUILD.gn --- chromium-browser-59.0.3071.86/build/config/linux/gtk2/BUILD.gn 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/build/config/linux/gtk2/BUILD.gn 2017-06-20 22:03:10.000000000 +0000 @@ -26,7 +26,6 @@ # parts that explicitly need GTK2 are whitelisted on this target. group("gtk2") { visibility = [ - "//gpu/gles2_conform_support:gles2_conform_test_windowless", "//build/config/linux/gtk", "//chrome/browser/ui/libgtkui:*", ] diff -Nru chromium-browser-59.0.3071.86/build/util/LASTCHANGE chromium-browser-59.0.3071.109/build/util/LASTCHANGE --- chromium-browser-59.0.3071.86/build/util/LASTCHANGE 2017-06-05 19:04:34.000000000 +0000 +++ chromium-browser-59.0.3071.109/build/util/LASTCHANGE 2017-06-20 22:04:48.000000000 +0000 @@ -1 +1 @@ -LASTCHANGE=318f90c291355e118579a821f3eb754b8dddf100 +LASTCHANGE=9f4b44b898b326679817ee5a327256f8fac6ee75 diff -Nru chromium-browser-59.0.3071.86/build/util/LASTCHANGE.blink chromium-browser-59.0.3071.109/build/util/LASTCHANGE.blink --- chromium-browser-59.0.3071.86/build/util/LASTCHANGE.blink 2017-06-05 19:04:34.000000000 +0000 +++ chromium-browser-59.0.3071.109/build/util/LASTCHANGE.blink 2017-06-20 22:04:48.000000000 +0000 @@ -1 +1 @@ -LASTCHANGE=318f90c291355e118579a821f3eb754b8dddf100 +LASTCHANGE=9f4b44b898b326679817ee5a327256f8fac6ee75 diff -Nru chromium-browser-59.0.3071.86/cc/layers/layer_impl.cc chromium-browser-59.0.3071.109/cc/layers/layer_impl.cc --- chromium-browser-59.0.3071.86/cc/layers/layer_impl.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/layers/layer_impl.cc 2017-06-20 22:03:10.000000000 +0000 @@ -985,4 +985,26 @@ return GetPropertyTrees()->transform_tree; } +bool LayerImpl::HasValidPropertyTreeIndices() const { + // TODO(crbug.com/726423): LayerImpls should never have invalid PropertyTree + // indices. + const bool has_valid_transform_node = + !!GetTransformTree().Node(transform_tree_index()); + DCHECK(has_valid_transform_node); + + const bool has_valid_effect_node = + !!GetEffectTree().Node(effect_tree_index()); + DCHECK(has_valid_effect_node); + + const bool has_valid_clip_node = !!GetClipTree().Node(clip_tree_index()); + DCHECK(has_valid_clip_node); + + const bool has_valid_scroll_node = + !!GetScrollTree().Node(scroll_tree_index()); + DCHECK(has_valid_scroll_node); + + return has_valid_transform_node && has_valid_effect_node && + has_valid_clip_node && has_valid_scroll_node; +} + } // namespace cc diff -Nru chromium-browser-59.0.3071.86/cc/layers/layer_impl.h chromium-browser-59.0.3071.109/cc/layers/layer_impl.h --- chromium-browser-59.0.3071.86/cc/layers/layer_impl.h 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/layers/layer_impl.h 2017-06-20 22:03:10.000000000 +0000 @@ -436,6 +436,8 @@ void set_needs_show_scrollbars(bool yes) { needs_show_scrollbars_ = yes; } bool needs_show_scrollbars() { return needs_show_scrollbars_; } + bool HasValidPropertyTreeIndices() const; + protected: LayerImpl(LayerTreeImpl* layer_impl, int id, diff -Nru chromium-browser-59.0.3071.86/cc/layers/video_layer_impl.cc chromium-browser-59.0.3071.109/cc/layers/video_layer_impl.cc --- chromium-browser-59.0.3071.86/cc/layers/video_layer_impl.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/layers/video_layer_impl.cc 2017-06-20 22:03:10.000000000 +0000 @@ -101,10 +101,9 @@ return false; if (!updater_) { - updater_.reset(new VideoResourceUpdater( - layer_tree_impl()->context_provider(), - layer_tree_impl()->resource_provider(), - layer_tree_impl()->settings().use_stream_video_draw_quad)); + updater_.reset( + new VideoResourceUpdater(layer_tree_impl()->context_provider(), + layer_tree_impl()->resource_provider())); } VideoFrameExternalResources external_resources = diff -Nru chromium-browser-59.0.3071.86/cc/output/renderer_pixeltest.cc chromium-browser-59.0.3071.109/cc/output/renderer_pixeltest.cc --- chromium-browser-59.0.3071.86/cc/output/renderer_pixeltest.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/output/renderer_pixeltest.cc 2017-06-20 22:03:10.000000000 +0000 @@ -915,13 +915,12 @@ public: void SetUp() override { IntersectingQuadPixelTest::SetUp(); - bool use_stream_video_draw_quad = false; - video_resource_updater_.reset(new VideoResourceUpdater( - this->output_surface_->context_provider(), - this->resource_provider_.get(), use_stream_video_draw_quad)); - video_resource_updater2_.reset(new VideoResourceUpdater( - this->output_surface_->context_provider(), - this->resource_provider_.get(), use_stream_video_draw_quad)); + video_resource_updater_.reset( + new VideoResourceUpdater(this->output_surface_->context_provider(), + this->resource_provider_.get())); + video_resource_updater2_.reset( + new VideoResourceUpdater(this->output_surface_->context_provider(), + this->resource_provider_.get())); } protected: @@ -1242,10 +1241,8 @@ void SetUp() override { GLRendererPixelTest::SetUp(); - bool use_stream_video_draw_quad = false; video_resource_updater_.reset(new VideoResourceUpdater( - output_surface_->context_provider(), resource_provider_.get(), - use_stream_video_draw_quad)); + output_surface_->context_provider(), resource_provider_.get())); } std::unique_ptr video_resource_updater_; diff -Nru chromium-browser-59.0.3071.86/cc/resources/video_resource_updater.cc chromium-browser-59.0.3071.109/cc/resources/video_resource_updater.cc --- chromium-browser-59.0.3071.86/cc/resources/video_resource_updater.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/resources/video_resource_updater.cc 2017-06-20 22:03:10.000000000 +0000 @@ -35,8 +35,7 @@ const ResourceFormat kRGBResourceFormat = RGBA_8888; VideoFrameExternalResources::ResourceType ResourceTypeForVideoFrame( - media::VideoFrame* video_frame, - bool use_stream_video_draw_quad) { + media::VideoFrame* video_frame) { switch (video_frame->format()) { case media::PIXEL_FORMAT_ARGB: case media::PIXEL_FORMAT_XRGB: @@ -47,11 +46,10 @@ ? VideoFrameExternalResources::RGB_RESOURCE : VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE; case GL_TEXTURE_EXTERNAL_OES: - if (use_stream_video_draw_quad && - !video_frame->metadata()->IsTrue( - media::VideoFrameMetadata::COPY_REQUIRED)) - return VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE; - return VideoFrameExternalResources::RGBA_RESOURCE; + return video_frame->metadata()->IsTrue( + media::VideoFrameMetadata::COPY_REQUIRED) + ? VideoFrameExternalResources::RGBA_RESOURCE + : VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE; case GL_TEXTURE_RECTANGLE_ARB: return VideoFrameExternalResources::RGB_RESOURCE; default: @@ -174,11 +172,10 @@ VideoFrameExternalResources::~VideoFrameExternalResources() {} VideoResourceUpdater::VideoResourceUpdater(ContextProvider* context_provider, - ResourceProvider* resource_provider, - bool use_stream_video_draw_quad) + ResourceProvider* resource_provider) : context_provider_(context_provider), - resource_provider_(resource_provider), - use_stream_video_draw_quad_(use_stream_video_draw_quad) {} + resource_provider_(resource_provider) { +} VideoResourceUpdater::~VideoResourceUpdater() { for (const PlaneResource& plane_resource : all_resources_) @@ -629,8 +626,7 @@ } gfx::ColorSpace resource_color_space = video_frame->ColorSpace(); - external_resources.type = - ResourceTypeForVideoFrame(video_frame.get(), use_stream_video_draw_quad_); + external_resources.type = ResourceTypeForVideoFrame(video_frame.get()); if (external_resources.type == VideoFrameExternalResources::NONE) { DLOG(ERROR) << "Unsupported Texture format" << media::VideoPixelFormatToString(video_frame->format()); diff -Nru chromium-browser-59.0.3071.86/cc/resources/video_resource_updater.h chromium-browser-59.0.3071.109/cc/resources/video_resource_updater.h --- chromium-browser-59.0.3071.86/cc/resources/video_resource_updater.h 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/resources/video_resource_updater.h 2017-06-20 22:03:10.000000000 +0000 @@ -74,8 +74,7 @@ : public base::SupportsWeakPtr { public: VideoResourceUpdater(ContextProvider* context_provider, - ResourceProvider* resource_provider, - bool use_stream_video_draw_quad); + ResourceProvider* resource_provider); ~VideoResourceUpdater(); VideoFrameExternalResources CreateExternalResourcesFromVideoFrame( @@ -177,7 +176,6 @@ ContextProvider* context_provider_; ResourceProvider* resource_provider_; - const bool use_stream_video_draw_quad_; std::unique_ptr video_renderer_; std::vector upload_pixels_; diff -Nru chromium-browser-59.0.3071.86/cc/resources/video_resource_updater_unittest.cc chromium-browser-59.0.3071.109/cc/resources/video_resource_updater_unittest.cc --- chromium-browser-59.0.3071.86/cc/resources/video_resource_updater_unittest.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/resources/video_resource_updater_unittest.cc 2017-06-20 22:03:10.000000000 +0000 @@ -249,10 +249,8 @@ }; TEST_F(VideoResourceUpdaterTest, SoftwareFrame) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); VideoFrameExternalResources resources = @@ -261,10 +259,8 @@ } TEST_F(VideoResourceUpdaterTest, HighBitFrameNoF16) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestHighBitFrame(); VideoFrameExternalResources resources = @@ -280,10 +276,8 @@ }; TEST_F(VideoResourceUpdaterTestWithF16, HighBitFrame) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestHighBitFrame(); VideoFrameExternalResources resources = @@ -302,9 +296,7 @@ } TEST_F(VideoResourceUpdaterTest, HighBitFrameSoftwareCompositor) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), - use_stream_video_draw_quad); + VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); scoped_refptr video_frame = CreateTestHighBitFrame(); VideoFrameExternalResources resources = @@ -313,10 +305,8 @@ } TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrame) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateWonkyTestYUVVideoFrame(); VideoFrameExternalResources resources = @@ -325,9 +315,7 @@ } TEST_F(VideoResourceUpdaterTest, WonkySoftwareFrameSoftwareCompositor) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), - use_stream_video_draw_quad); + VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); scoped_refptr video_frame = CreateWonkyTestYUVVideoFrame(); VideoFrameExternalResources resources = @@ -336,10 +324,8 @@ } TEST_F(VideoResourceUpdaterTest, ReuseResource) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); @@ -370,10 +356,8 @@ } TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDelete) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); @@ -399,9 +383,7 @@ } TEST_F(VideoResourceUpdaterTest, SoftwareFrameSoftwareCompositor) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), - use_stream_video_draw_quad); + VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); VideoFrameExternalResources resources = @@ -410,9 +392,7 @@ } TEST_F(VideoResourceUpdaterTest, ReuseResourceSoftwareCompositor) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), - use_stream_video_draw_quad); + VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); @@ -443,9 +423,7 @@ } TEST_F(VideoResourceUpdaterTest, ReuseResourceNoDeleteSoftwareCompositor) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(nullptr, resource_provider_software_.get(), - use_stream_video_draw_quad); + VideoResourceUpdater updater(nullptr, resource_provider_software_.get()); scoped_refptr video_frame = CreateTestYUVVideoFrame(); video_frame->set_timestamp(base::TimeDelta::FromSeconds(1234)); @@ -472,10 +450,8 @@ } TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes) { - bool use_stream_video_draw_quad = false; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); scoped_refptr video_frame = CreateTestRGBAHardwareVideoFrame(); @@ -506,10 +482,8 @@ } TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_StreamTexture) { - bool use_stream_video_draw_quad = true; VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); + resource_provider3d_.get()); context3d_->ResetTextureCreationCount(); scoped_refptr video_frame = CreateTestStreamTextureHardwareVideoFrame(false); @@ -545,24 +519,5 @@ EXPECT_FALSE(context3d_->WasImmutableTextureCreated()); } -TEST_F(VideoResourceUpdaterTest, CreateForHardwarePlanes_TextureQuad) { - bool use_stream_video_draw_quad = false; - VideoResourceUpdater updater(context_provider_.get(), - resource_provider3d_.get(), - use_stream_video_draw_quad); - context3d_->ResetTextureCreationCount(); - scoped_refptr video_frame = - CreateTestStreamTextureHardwareVideoFrame(false); - - VideoFrameExternalResources resources = - updater.CreateExternalResourcesFromVideoFrame(video_frame); - EXPECT_EQ(VideoFrameExternalResources::RGBA_RESOURCE, resources.type); - EXPECT_EQ(1u, resources.mailboxes.size()); - EXPECT_EQ((GLenum)GL_TEXTURE_EXTERNAL_OES, resources.mailboxes[0].target()); - EXPECT_EQ(1u, resources.release_callbacks.size()); - EXPECT_EQ(0u, resources.software_resources.size()); - EXPECT_EQ(0, context3d_->TextureCreationCount()); -} - } // namespace } // namespace cc diff -Nru chromium-browser-59.0.3071.86/cc/trees/draw_property_utils.cc chromium-browser-59.0.3071.109/cc/trees/draw_property_utils.cc --- chromium-browser-59.0.3071.86/cc/trees/draw_property_utils.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/trees/draw_property_utils.cc 2017-06-20 22:03:10.000000000 +0000 @@ -458,15 +458,6 @@ transform_tree.Node(layer->transform_tree_index()); const EffectNode* effect_node = effect_tree.Node(layer->effect_tree_index()); - DCHECK(effect_node); - DCHECK(transform_node); - // TODO(crbug.com/726423) : This is a workaround for crbug.com/726225 to - // avoid crashing when there is no effect or transform node. Effect node and - // transform node should always exist here and this workaround should be - // removed. - if (!transform_node || !effect_node) - return true; - if (effect_node->has_render_surface && effect_node->num_copy_requests_in_subtree > 0) return false; @@ -866,8 +857,9 @@ // TODO(crbug.com/726423) : This is a workaround for crbug.com/725851 to // avoid crashing when layer_impl is nullptr. This workaround should be // removed as layer_impl should not be nullptr here. - if (!layer_impl) + if (!layer_impl || !layer_impl->HasValidPropertyTreeIndices()) continue; + if (!IsRootLayer(layer_impl) && LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree)) continue; diff -Nru chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_common.cc chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_common.cc --- chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_common.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_common.cc 2017-06-20 22:03:10.000000000 +0000 @@ -290,6 +290,17 @@ // all non-skipped layers to the layer list of their target surface, and // add their content rect to their target surface's accumulated content rect. for (LayerImpl* layer : *layer_tree_impl) { + DCHECK(layer); + + // TODO(crbug.com/726423): LayerImpls should never have invalid PropertyTree + // indices. + if (!layer) + continue; + + layer->set_is_drawn_render_surface_layer_list_member(false); + if (!layer->HasValidPropertyTreeIndices()) + continue; + RenderSurfaceImpl* render_surface = layer->GetRenderSurface(); if (render_surface) { render_surface->ClearLayerLists(); diff -Nru chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_impl.cc chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_impl.cc --- chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_impl.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_impl.cc 2017-06-20 22:03:10.000000000 +0000 @@ -2145,6 +2145,17 @@ if (visible_) { // TODO(crbug.com/469175): Replace with RequiresHighResToDraw. SetRequiresHighResToDraw(); + // Prior CompositorFrame may have been discarded and thus we need to ensure + // that we submit a new one, even if there are no tiles. Therefore, force a + // full viewport redraw. However, this is unnecessary when we become visible + // for the first time (before the first commit) as there is no prior + // CompositorFrame to replace. We can safely use |!active_tree_-> + // LayerListIsEmpty()| as a proxy for this, because we wouldn't be able to + // draw anything even if this is not the first time we become visible. + if (!active_tree_->LayerListIsEmpty()) { + SetFullViewportDamage(); + SetNeedsRedraw(); + } } else { EvictAllUIResources(); // Call PrepareTiles to evict tiles when we become invisible. diff -Nru chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_impl_unittest.cc chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_impl_unittest.cc --- chromium-browser-59.0.3071.86/cc/trees/layer_tree_host_impl_unittest.cc 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/trees/layer_tree_host_impl_unittest.cc 2017-06-20 22:03:10.000000000 +0000 @@ -8558,12 +8558,36 @@ } } -TEST_F(LayerTreeHostImplTest, RequireHighResWhenVisible) { +namespace { +void ExpectFullDamageAndDraw(LayerTreeHostImpl* host_impl) { + gfx::Rect full_frame_damage(host_impl->DeviceViewport().size()); + TestFrameData frame; + EXPECT_EQ(DRAW_SUCCESS, host_impl->PrepareToDraw(&frame)); + ASSERT_EQ(1u, frame.render_passes.size()); + const RenderPass* root_render_pass = frame.render_passes.back().get(); + EXPECT_EQ(full_frame_damage, root_render_pass->damage_rect); + EXPECT_TRUE(host_impl->DrawLayers(&frame)); + host_impl->DidDrawAllLayers(frame); +} +} // namespace + +TEST_F(LayerTreeHostImplTestDrawAndTestDamage, + RequireHighResAndRedrawWhenVisible) { ASSERT_TRUE(host_impl_->active_tree()); + std::unique_ptr root = + SolidColorLayerImpl::Create(host_impl_->active_tree(), 1); + root->SetBackgroundColor(SK_ColorRED); + SetupRootLayerImpl(std::move(root)); + + host_impl_->active_tree()->BuildPropertyTreesForTesting(); + // RequiresHighResToDraw is set when new output surface is used. EXPECT_TRUE(host_impl_->RequiresHighResToDraw()); + // Expect full frame damage for first frame. + EXPECT_SCOPED(ExpectFullDamageAndDraw(host_impl_.get())); + host_impl_->ResetRequiresHighResToDraw(); host_impl_->SetVisible(false); @@ -8576,8 +8600,12 @@ host_impl_->ResetRequiresHighResToDraw(); EXPECT_FALSE(host_impl_->RequiresHighResToDraw()); + did_request_redraw_ = false; host_impl_->SetVisible(true); EXPECT_TRUE(host_impl_->RequiresHighResToDraw()); + // Expect redraw and full frame damage when becoming visible. + EXPECT_TRUE(did_request_redraw_); + EXPECT_SCOPED(ExpectFullDamageAndDraw(host_impl_.get())); } TEST_F(LayerTreeHostImplTest, RequireHighResAfterGpuRasterizationToggles) { diff -Nru chromium-browser-59.0.3071.86/cc/trees/layer_tree_settings.h chromium-browser-59.0.3071.109/cc/trees/layer_tree_settings.h --- chromium-browser-59.0.3071.86/cc/trees/layer_tree_settings.h 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/cc/trees/layer_tree_settings.h 2017-06-20 22:03:10.000000000 +0000 @@ -42,7 +42,6 @@ int gpu_rasterization_msaa_sample_count = 0; float gpu_rasterization_skewport_target_time_in_seconds = 0.2f; bool create_low_res_tiling = false; - bool use_stream_video_draw_quad = false; enum ScrollbarAnimator { NO_ANIMATOR, diff -Nru chromium-browser-59.0.3071.86/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java chromium-browser-59.0.3071.109/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java --- chromium-browser-59.0.3071.86/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/android/java/src/org/chromium/chrome/browser/widget/textbubble/TextBubble.java 2017-06-20 22:03:10.000000000 +0000 @@ -16,6 +16,8 @@ import android.view.View.MeasureSpec; import android.view.View.OnTouchListener; import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.FrameLayout; import android.widget.PopupWindow; import android.widget.PopupWindow.OnDismissListener; import android.widget.TextView; @@ -302,9 +304,15 @@ private void createContentView() { if (mPopupWindow.getContentView() != null) return; + View view = LayoutInflater.from(mContext).inflate(R.layout.textbubble_text, null); ((TextView) view).setText(mStringId); mPopupWindow.setContentView(view); + + // On some versions of Android, the LayoutParams aren't set until after the popup window + // is shown. Explicitly set the LayoutParams to avoid crashing. See crbug.com/713759. + view.setLayoutParams( + new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } // OnTouchListener implementation. diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc 2017-06-20 22:03:11.000000000 +0000 @@ -88,7 +88,7 @@ return nullptr; } void BeforeSessionStart() override {} - void Finalize() override {} + void Finalize(base::OnceClosure) override {} void OnCompleteLogin() override {} void OpenProxySettings() override {} void SetStatusAreaVisible(bool visible) override {} @@ -100,7 +100,7 @@ chromeos::AppLaunchController* GetAppLaunchController() override { return nullptr; } - void StartUserAdding(const base::Closure& completion_callback) override {} + void StartUserAdding(base::OnceClosure completion_callback) override {} void CancelUserAdding() override {} void StartSignInScreen(const chromeos::LoginScreenContext& context) override { } diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/arc/arc_util.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/arc/arc_util.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/arc/arc_util.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/arc/arc_util.cc 2017-06-20 22:03:11.000000000 +0000 @@ -6,9 +6,11 @@ #include #include +#include #include "base/callback.h" #include "base/files/file_path.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/sys_info.h" #include "base/task_scheduler/post_task.h" @@ -35,6 +37,19 @@ // Let IsAllowedForProfile() return "false" for any profile. bool g_disallow_for_testing = false; +// TODO(kinaba): Temporary workaround for crbug.com/729034. +// +// Some type of accounts don't have user prefs. As a short-term workaround, +// store the compatibility info from them on memory, ignoring the defect that +// it cannot survive browser crash and restart. +// +// This will be removed once the forced migration for ARC Kiosk user is +// implemented. After it's done such types of accounts cannot even sign-in +// with incompatible filesystem. Hence it'll be safe to always regard compatible +// for them then. +base::LazyInstance>::DestructorAtExit + g_known_compatible_users = LAZY_INSTANCE_INITIALIZER; + // Returns whether ARC can run on the filesystem mounted at |path|. // This function should run only on threads where IO operations are allowed. bool IsArcCompatibleFilesystem(const base::FilePath& path) { @@ -47,6 +62,14 @@ return statfs_buf.f_type != ECRYPTFS_SUPER_MAGIC; } +FileSystemCompatibilityState GetFileSystemCompatibilityPref( + const AccountId& account_id) { + int pref_value = kFileSystemIncompatible; + user_manager::known_user::GetIntegerPref( + account_id, prefs::kArcCompatibleFilesystemChosen, &pref_value); + return static_cast(pref_value); +} + // Stores the result of IsArcCompatibleFilesystem posted back from the blocking // task runner. void StoreCompatibilityCheckResult(const AccountId& account_id, @@ -56,18 +79,17 @@ user_manager::known_user::SetIntegerPref( account_id, prefs::kArcCompatibleFilesystemChosen, arc::kFileSystemCompatible); + + // TODO(kinaba): Remove this code for accounts without user prefs. + // See the comment for |g_known_compatible_users| for the detail. + if (GetFileSystemCompatibilityPref(account_id) != + arc::kFileSystemCompatible) { + g_known_compatible_users.Get().insert(account_id); + } } callback.Run(); } -FileSystemCompatibilityState GetFileSystemCompatibilityPref( - const AccountId& account_id) { - int pref_value = kFileSystemIncompatible; - user_manager::known_user::GetIntegerPref( - account_id, prefs::kArcCompatibleFilesystemChosen, &pref_value); - return static_cast(pref_value); -} - } // namespace bool IsArcAllowedForProfile(const Profile* profile) { @@ -169,7 +191,8 @@ FileSystemCompatibilityState filesystem_compatibility = GetFileSystemCompatibilityPref(user->GetAccountId()); const bool is_filesystem_compatible = - filesystem_compatibility != kFileSystemIncompatible; + filesystem_compatibility != kFileSystemIncompatible || + g_known_compatible_users.Get().count(user->GetAccountId()) != 0; std::string arc_sdk_version; const bool is_M = base::SysInfo::GetLsbReleaseValue(kLsbReleaseArcVersionKey, &arc_sdk_version) && diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/app_launch_controller.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/app_launch_controller.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/app_launch_controller.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/app_launch_controller.cc 2017-06-20 22:03:11.000000000 +0000 @@ -329,7 +329,7 @@ splash_wait_timer_.Stop(); if (host_) - host_->Finalize(); + host_->Finalize(base::OnceClosure()); } void AppLaunchController::OnNetworkWaitTimedout() { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/arc_kiosk_controller.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/arc_kiosk_controller.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/arc_kiosk_controller.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/arc_kiosk_controller.cc 2017-06-20 22:03:11.000000000 +0000 @@ -54,7 +54,7 @@ if (profile_) ArcKioskAppService::Get(profile_)->SetDelegate(nullptr); if (host_) - host_->Finalize(); + host_->Finalize(base::OnceClosure()); } void ArcKioskController::CloseSplashScreen() { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc 2017-06-20 22:03:11.000000000 +0000 @@ -102,7 +102,7 @@ session_manager::SessionManager::Get()->SessionStarted(); - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); } void DemoAppLauncher::OnProfileLoadFailed(KioskAppLaunchError::Error error) { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc 2017-06-20 22:03:11.000000000 +0000 @@ -440,7 +440,7 @@ controller->current_screen()->Hide(); if (LoginDisplayHost::default_host()) - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); base::RunLoop().RunUntilIdle(); } diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/login_browsertest.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/login_browsertest.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/login_browsertest.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/login_browsertest.cc 2017-06-20 22:03:11.000000000 +0000 @@ -93,7 +93,7 @@ void TearDownOnMainThread() override { // Close the login manager, which otherwise holds a KeepAlive that is not // cleared in time by the end of the test. - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); } void SetUpOnMainThread() override { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/login_manager_test.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/login_manager_test.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/login_manager_test.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/login_manager_test.cc 2017-06-20 22:03:11.000000000 +0000 @@ -96,7 +96,7 @@ void LoginManagerTest::TearDownOnMainThread() { MixinBasedBrowserTest::TearDownOnMainThread(); if (LoginDisplayHost::default_host()) - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); } diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/oobe_localization_browsertest.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/oobe_localization_browsertest.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/oobe_localization_browsertest.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/oobe_localization_browsertest.cc 2017-06-20 22:03:11.000000000 +0000 @@ -415,7 +415,7 @@ EXPECT_EQ(expected_keyboard_select, DumpOptions(kKeyboardSelect)); // Shut down the display host. - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); base::RunLoop().RunUntilIdle(); // Clear the locale pref so the statistics provider is pinged next time. diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/screens/error_screen.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/screens/error_screen.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/screens/error_screen.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/screens/error_screen.cc 2017-06-20 22:03:11.000000000 +0000 @@ -297,9 +297,8 @@ WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL)); KioskAppManager::Get()->InitSession(profile, extension_id); - session_manager::SessionManager::Get()->SessionStarted(); - - LoginDisplayHost::default_host()->Finalize(); + LoginDisplayHost::default_host()->Finalize(base::BindOnce( + [] { session_manager::SessionManager::Get()->SessionStarted(); })); } void ErrorScreen::OnLaunchOobeGuestSession() { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/session/user_session_manager.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/session/user_session_manager.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/session/user_session_manager.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/session/user_session_manager.cc 2017-06-20 22:03:11.000000000 +0000 @@ -12,6 +12,7 @@ #include "base/base_paths.h" #include "base/bind.h" +#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/location.h" #include "base/logging.h" @@ -1761,11 +1762,6 @@ BootTimesRecorder::Get()->AddLoginTimeMarker("BrowserLaunched", false); - // Mark user session as started before creating browser window. Otherwise, - // ash would not activate the created browser window because it thinks - // user session is blocked. - session_manager::SessionManager::Get()->SessionStarted(); - VLOG(1) << "Launching browser..."; TRACE_EVENT0("login", "LaunchBrowser"); @@ -1818,11 +1814,18 @@ std::make_pair(profile, fingerprint_feature_notification_controller)); } + base::OnceClosure login_host_finalized_callback = base::BindOnce( + [] { session_manager::SessionManager::Get()->SessionStarted(); }); + // Mark login host for deletion after browser starts. This // guarantees that the message loop will be referenced by the // browser before it is dereferenced by the login host. - if (login_host) - login_host->Finalize(); + if (login_host) { + login_host->Finalize(std::move(login_host_finalized_callback)); + } else { + base::ResetAndReturn(&login_host_finalized_callback).Run(); + } + chromeos::BootTimesRecorder::Get()->LoginDone( user_manager::UserManager::Get()->IsCurrentUserNew()); diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host.h chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host.h --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host.h 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host.h 2017-06-20 22:03:11.000000000 +0000 @@ -7,8 +7,7 @@ #include -#include "base/callback.h" -#include "base/callback_list.h" +#include "base/callback_forward.h" #include "chrome/browser/chromeos/customization/customization_document.h" #include "chrome/browser/chromeos/login/oobe_screen.h" #include "chrome/browser/chromeos/login/ui/login_display.h" @@ -52,9 +51,10 @@ // Called when browsing session starts before creating initial browser. virtual void BeforeSessionStart() = 0; - // Called when user enters or returns to browsing session so - // LoginDisplayHost instance may delete itself. - virtual void Finalize() = 0; + // Called when user enters or returns to browsing session so LoginDisplayHost + // instance may delete itself. |completion_callback| will be invoked when the + // instance is gone. + virtual void Finalize(base::OnceClosure completion_callback) = 0; // Called when a login has completed successfully. virtual void OnCompleteLogin() = 0; @@ -82,9 +82,9 @@ virtual AppLaunchController* GetAppLaunchController() = 0; // Starts screen for adding user into session. - // |completion_callback| called before display host shutdown. + // |completion_callback| is invoked after login display host shutdown. // |completion_callback| can be null. - virtual void StartUserAdding(const base::Closure& completion_callback) = 0; + virtual void StartUserAdding(base::OnceClosure completion_callback) = 0; // Cancel addint user into session. virtual void CancelUserAdding() = 0; diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host_impl.cc chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host_impl.cc --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host_impl.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host_impl.cc 2017-06-20 22:03:11.000000000 +0000 @@ -292,6 +292,16 @@ keyboard::KEYBOARD_OVERSCROLL_OVERRIDE_NONE); } +void ScheduleCompletionCallbacks(std::vector&& callbacks) { + for (auto& callback : callbacks) { + if (callback.is_null()) + continue; + + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(callback)); + } +} + } // namespace namespace chromeos { @@ -521,6 +531,8 @@ views::FocusManager::set_arrow_key_traversal_enabled(false); ResetLoginWindowAndView(); + ScheduleCompletionCallbacks(std::move(completion_callbacks_)); + keep_alive_.reset(); default_host_ = nullptr; @@ -554,8 +566,9 @@ session_starting_ = true; } -void LoginDisplayHostImpl::Finalize() { - DVLOG(1) << "Session starting"; +void LoginDisplayHostImpl::Finalize(base::OnceClosure completion_callback) { + DVLOG(1) << "Finalizing LoginDisplayHost. User session starting"; + // When adding another user into the session, we defer the wallpaper's // animation in order to prevent the flashing of the previous user's windows. // See crbug.com/541864. @@ -564,6 +577,8 @@ ash::Shell::Get()->wallpaper_controller()->MoveToUnlockedContainer(); } + completion_callbacks_.push_back(std::move(completion_callback)); + switch (finalize_animation_type_) { case ANIMATION_NONE: ShutdownDisplayHost(false); @@ -656,11 +671,11 @@ } void LoginDisplayHostImpl::StartUserAdding( - const base::Closure& completion_callback) { + base::OnceClosure completion_callback) { DisableKeyboardOverscroll(); restore_path_ = RESTORE_ADD_USER_INTO_SESSION; - completion_callback_ = completion_callback; + completion_callbacks_.push_back(std::move(completion_callback)); // Animation is not supported in Mash if (!ash_util::IsRunningInMash()) finalize_animation_type_ = ANIMATION_ADD_USER; @@ -714,7 +729,7 @@ // canceled. Changing to ANIMATION_NONE so that Finalize() shuts down the host // immediately. finalize_animation_type_ = ANIMATION_NONE; - Finalize(); + Finalize(base::OnceClosure()); } void LoginDisplayHostImpl::StartSignInScreen( @@ -1113,10 +1128,6 @@ if (post_quit_task) base::MessageLoop::current()->QuitWhenIdle(); - if (!completion_callback_.is_null()) - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - completion_callback_); - if (ash::Shell::HasInstance() && finalize_animation_type_ == ANIMATION_ADD_USER) { if (!ash_util::IsRunningInMash()) { @@ -1132,18 +1143,11 @@ NOTIMPLEMENTED(); return; } - if (ash::Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), - ash::kShellWindowId_WallpaperContainer) - ->children() - .empty()) { - // If there is no wallpaper window, don't perform any animation on the - // default and wallpaper layer because there is nothing behind it. - return; - } if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableLoginAnimations)) + switches::kDisableLoginAnimations)) { ash::Shell::Get()->DoInitialWorkspaceAnimation(); + } } void LoginDisplayHostImpl::ScheduleFadeOutAnimation(int animation_speed_ms) { @@ -1211,7 +1215,7 @@ StartSignInScreen(LoginScreenContext()); break; case RESTORE_ADD_USER_INTO_SESSION: - StartUserAdding(completion_callback_); + StartUserAdding(base::OnceClosure()); break; default: NOTREACHED(); diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host_impl.h chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host_impl.h --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/login_display_host_impl.h 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/login_display_host_impl.h 2017-06-20 22:03:11.000000000 +0000 @@ -67,7 +67,7 @@ OobeUI* GetOobeUI() const override; WebUILoginView* GetWebUILoginView() const override; void BeforeSessionStart() override; - void Finalize() override; + void Finalize(base::OnceClosure completion_callback) override; void OnCompleteLogin() override; void OpenProxySettings() override; void SetStatusAreaVisible(bool visible) override; @@ -75,7 +75,7 @@ void StartWizard(OobeScreen first_screen) override; WizardController* GetWizardController() override; AppLaunchController* GetAppLaunchController() override; - void StartUserAdding(const base::Closure& completion_callback) override; + void StartUserAdding(base::OnceClosure completion_callback) override; void CancelUserAdding() override; void StartSignInScreen(const LoginScreenContext& context) override; void OnPreferencesChanged() override; @@ -287,8 +287,8 @@ // Stored parameters for StartWizard, required to restore in case of crash. OobeScreen first_screen_; - // Called before host deletion. - base::Closure completion_callback_; + // Called after host deletion. + std::vector completion_callbacks_; // Active instance of authentication prewarmer. std::unique_ptr auth_prewarmer_; diff -Nru chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/mock_login_display_host.h chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/mock_login_display_host.h --- chromium-browser-59.0.3071.86/chrome/browser/chromeos/login/ui/mock_login_display_host.h 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/chromeos/login/ui/mock_login_display_host.h 2017-06-20 22:03:11.000000000 +0000 @@ -22,7 +22,13 @@ MOCK_CONST_METHOD0(GetOobeUI, OobeUI*(void)); MOCK_CONST_METHOD0(GetWebUILoginView, WebUILoginView*(void)); MOCK_METHOD0(BeforeSessionStart, void(void)); - MOCK_METHOD0(Finalize, void(void)); + + // Workaround for move-only args in GMock. + MOCK_METHOD1(MockFinalize, void(base::OnceClosure*)); + void Finalize(base::OnceClosure completion_callback) override { + MockFinalize(&completion_callback); + } + MOCK_METHOD0(OnCompleteLogin, void(void)); MOCK_METHOD0(OpenProxySettings, void(void)); MOCK_METHOD1(SetStatusAreaVisible, void(bool)); @@ -31,7 +37,13 @@ MOCK_METHOD1(StartWizard, void(OobeScreen)); MOCK_METHOD0(GetWizardController, WizardController*(void)); MOCK_METHOD0(GetAppLaunchController, AppLaunchController*(void)); - MOCK_METHOD1(StartUserAdding, void(const base::Closure&)); + + // Workaround for move-only args in GMock. + MOCK_METHOD1(MockStartUserAdding, void(base::OnceClosure*)); + void StartUserAdding(base::OnceClosure completion_callback) { + MockStartUserAdding(&completion_callback); + } + MOCK_METHOD0(CancelUserAdding, void(void)); MOCK_METHOD1(StartSignInScreen, void(const LoginScreenContext&)); MOCK_METHOD0(ResumeSignInScreen, void(void)); diff -Nru chromium-browser-59.0.3071.86/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc chromium-browser-59.0.3071.109/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc --- chromium-browser-59.0.3071.86/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc 2017-06-20 22:03:11.000000000 +0000 @@ -326,7 +326,7 @@ ExtensionApiTest::TearDownOnMainThread(); if (chromeos::LoginDisplayHost::default_host()) - chromeos::LoginDisplayHost::default_host()->Finalize(); + chromeos::LoginDisplayHost::default_host()->Finalize(base::OnceClosure()); base::RunLoop().RunUntilIdle(); if (GetParam().system_token_ == SYSTEM_TOKEN_EXISTS) { diff -Nru chromium-browser-59.0.3071.86/chrome/browser/memory/tab_manager_delegate_chromeos.cc chromium-browser-59.0.3071.109/chrome/browser/memory/tab_manager_delegate_chromeos.cc --- chromium-browser-59.0.3071.86/chrome/browser/memory/tab_manager_delegate_chromeos.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/memory/tab_manager_delegate_chromeos.cc 2017-06-20 22:03:12.000000000 +0000 @@ -622,7 +622,12 @@ if (process_type == ProcessType::VISIBLE_APP || process_type == ProcessType::FOCUSED_APP || process_type == ProcessType::FOCUSED_TAB) { - MEMORY_LOG(ERROR) << "Skipped killing " << it->app()->process_name(); + if (it->app()) { + MEMORY_LOG(ERROR) << "Skipped killing " << it->app()->process_name(); + } else if (it->tab()) { + MEMORY_LOG(ERROR) << "Skipped killing " << it->tab()->title << " (" + << it->tab()->renderer_handle << ")"; + } continue; } if (it->app()) { @@ -644,7 +649,7 @@ } else { MEMORY_LOG(ERROR) << "Failed to kill " << it->app()->process_name(); } - } else { + } else if (it->tab()) { int64_t tab_id = it->tab()->tab_contents_id; // The estimation is problematic since multiple tabs may share the same // process, while the calculation counts memory used by the whole process. diff -Nru chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_browsertest.cc chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_browsertest.cc --- chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_browsertest.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_browsertest.cc 2017-06-20 22:03:12.000000000 +0000 @@ -23,6 +23,7 @@ #include "chrome/browser/browsing_data/browsing_data_remover_factory.h" #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/engagement/site_engagement_score.h" #include "chrome/browser/engagement/site_engagement_service.h" @@ -54,6 +55,7 @@ #include "components/gcm_driver/gcm_client.h" #include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h" #include "components/gcm_driver/instance_id/instance_id_driver.h" +#include "content/public/browser/notification_service.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/common/push_subscription_options.h" @@ -1074,6 +1076,31 @@ content::PUSH_DELIVERY_STATUS_SUCCESS, 1); } +IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventOnShutdown) { + std::string script_result; + + ASSERT_NO_FATAL_FAILURE(SubscribeSuccessfully()); + PushMessagingAppIdentifier app_identifier = + GetAppIdentifierForServiceWorkerRegistration(0LL); + + ASSERT_TRUE(RunScript("isControlled()", &script_result)); + ASSERT_EQ("false - is not controlled", script_result); + LoadTestPage(); // Reload to become controlled. + ASSERT_TRUE(RunScript("isControlled()", &script_result)); + ASSERT_EQ("true - is controlled", script_result); + + EXPECT_TRUE(IsRegisteredKeepAliveEqualTo(false)); + gcm::IncomingMessage message; + message.sender_id = GetTestApplicationServerKey(); + message.raw_data = "testdata"; + message.decrypted = true; + push_service()->Observe(chrome::NOTIFICATION_APP_TERMINATING, + content::NotificationService::AllSources(), + content::NotificationService::NoDetails()); + push_service()->OnMessage(app_identifier.app_id(), message); + EXPECT_TRUE(IsRegisteredKeepAliveEqualTo(false)); +} + IN_PROC_BROWSER_TEST_F(PushMessagingBrowserTest, PushEventWithoutPayload) { std::string script_result; diff -Nru chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_service_impl.cc chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_service_impl.cc --- chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_service_impl.cc 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_service_impl.cc 2017-06-20 22:03:12.000000000 +0000 @@ -19,6 +19,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/gcm/instance_id/instance_id_profile_service.h" @@ -46,6 +47,7 @@ #include "components/rappor/public/rappor_utils.h" #include "components/rappor/rappor_service_impl.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/service_worker_context.h" #include "content/public/browser/storage_partition.h" @@ -161,6 +163,9 @@ weak_factory_(this) { DCHECK(profile); HostContentSettingsMapFactory::GetForProfile(profile_)->AddObserver(this); + + registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, + content::NotificationService::AllSources()); } PushMessagingServiceImpl::~PushMessagingServiceImpl() = default; @@ -240,7 +245,7 @@ // We won't have time to process and act on the message. // TODO(peter) This should be checked at the level of the GCMDriver, so that // the message is not consumed. See https://crbug.com/612815 - if (g_browser_process->IsShuttingDown()) + if (g_browser_process->IsShuttingDown() || shutdown_started_) return; in_flight_message_deliveries_.insert(app_id); @@ -975,6 +980,19 @@ #endif // BUILDFLAG(ENABLE_BACKGROUND) } +// content::NotificationObserver methods --------------------------------------- + +void PushMessagingServiceImpl::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type); + shutdown_started_ = true; +#if BUILDFLAG(ENABLE_BACKGROUND) + in_flight_keep_alive_.reset(); +#endif // BUILDFLAG(ENABLE_BACKGROUND) +} + // Helper methods -------------------------------------------------------------- std::string PushMessagingServiceImpl::NormalizeSenderInfo( diff -Nru chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_service_impl.h chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_service_impl.h --- chromium-browser-59.0.3071.86/chrome/browser/push_messaging/push_messaging_service_impl.h 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/push_messaging/push_messaging_service_impl.h 2017-06-20 22:03:12.000000000 +0000 @@ -26,6 +26,8 @@ #include "components/gcm_driver/gcm_client.h" #include "components/gcm_driver/instance_id/instance_id.h" #include "components/keyed_service/core/keyed_service.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" #include "content/public/browser/push_messaging_service.h" #include "content/public/common/push_event_payload.h" #include "content/public/common/push_messaging_status.h" @@ -50,7 +52,8 @@ public gcm::GCMAppHandler, public content_settings::Observer, public KeyedService, - public BackgroundTrigger { + public BackgroundTrigger, + public content::NotificationObserver { public: // If any Service Workers are using push, starts GCM and adds an app handler. static void InitializeForProfile(Profile* profile); @@ -115,6 +118,11 @@ gfx::ImageSkia* GetIcon() override; void OnMenuClick() override; + // content::NotificationObserver: + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override; + void SetMessageCallbackForTesting(const base::Closure& callback); void SetUnsubscribeCallbackForTesting(const base::Closure& callback); void SetContentSettingChangedCallbackForTesting( @@ -279,6 +287,12 @@ std::unique_ptr in_flight_keep_alive_; #endif + content::NotificationRegistrar registrar_; + + // True when shutdown has started. Do not allow processing of incoming + // messages when this is true. + bool shutdown_started_ = false; + base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(PushMessagingServiceImpl); diff -Nru chromium-browser-59.0.3071.86/chrome/browser/resources/engagement/site_engagement.js chromium-browser-59.0.3071.109/chrome/browser/resources/engagement/site_engagement.js --- chromium-browser-59.0.3071.86/chrome/browser/resources/engagement/site_engagement.js 2017-06-05 19:03:02.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/browser/resources/engagement/site_engagement.js 2017-06-20 22:03:12.000000000 +0000 @@ -111,7 +111,7 @@ */ function handleScoreChange(origin, e) { var scoreInput = e.target; - uiHandler.setSiteEngagementScoreForUrl(origin, scoreInput.value); + uiHandler.setSiteEngagementBaseScoreForUrl(origin, scoreInput.value); scoreInput.barCellRef.style.width = (scoreInput.value * 4) + 'px'; scoreInput.blur(); enableAutoupdate(); diff -Nru chromium-browser-59.0.3071.86/chrome/VERSION chromium-browser-59.0.3071.109/chrome/VERSION --- chromium-browser-59.0.3071.86/chrome/VERSION 2017-06-05 19:03:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/chrome/VERSION 2017-06-20 22:03:10.000000000 +0000 @@ -1,4 +1,4 @@ MAJOR=59 MINOR=0 BUILD=3071 -PATCH=86 +PATCH=109 diff -Nru chromium-browser-59.0.3071.86/components/url_formatter/url_formatter.cc chromium-browser-59.0.3071.109/components/url_formatter/url_formatter.cc --- chromium-browser-59.0.3071.86/components/url_formatter/url_formatter.cc 2017-06-05 19:03:06.000000000 +0000 +++ chromium-browser-59.0.3071.109/components/url_formatter/url_formatter.cc 2017-06-20 22:03:16.000000000 +0000 @@ -526,6 +526,17 @@ allowed_set.remove(0x2010u); // Hyphen allowed_set.remove(0x2027u); // Hyphenation Point +#if defined(OS_MACOSX) + // The following characters are reported as present in the default macOS + // system UI font, but they render as blank. Remove them from the allowed + // set to prevent spoofing. + // Tibetan characters used for transliteration of ancient texts: + allowed_set.remove(0x0F8Cu); + allowed_set.remove(0x0F8Du); + allowed_set.remove(0x0F8Eu); + allowed_set.remove(0x0F8Fu); +#endif + uspoof_setAllowedUnicodeSet(checker_, &allowed_set, status); } diff -Nru chromium-browser-59.0.3071.86/components/url_formatter/url_formatter_unittest.cc chromium-browser-59.0.3071.109/components/url_formatter/url_formatter_unittest.cc --- chromium-browser-59.0.3071.86/components/url_formatter/url_formatter_unittest.cc 2017-06-05 19:03:06.000000000 +0000 +++ chromium-browser-59.0.3071.109/components/url_formatter/url_formatter_unittest.cc 2017-06-20 22:03:16.000000000 +0000 @@ -366,6 +366,10 @@ {"xn--ab-yod.com", L"a\x05f4" L"b.com", false}, // Hebrew Gershayim with Arabic is disallowed. {"xn--5eb7h.eg", L"\x0628\x05f4.eg", false}, +#if defined(OS_MACOSX) + // Tibetan transliteration characters are disallowed on Mac. + {"xn--com-luma.test.pl", L"\u0f8c.test.pl", false}, +#endif // Hyphens (http://unicode.org/cldr/utility/confusables.jsp?a=-) // Hyphen-Minus (the only hyphen allowed) diff -Nru chromium-browser-59.0.3071.86/content/browser/android/content_view_core_impl.cc chromium-browser-59.0.3071.109/content/browser/android/content_view_core_impl.cc --- chromium-browser-59.0.3071.86/content/browser/android/content_view_core_impl.cc 2017-06-05 19:03:06.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/browser/android/content_view_core_impl.cc 2017-06-20 22:03:17.000000000 +0000 @@ -563,9 +563,9 @@ bool ContentViewCoreImpl::FilterInputEvent(const blink::WebInputEvent& event) { if (event.GetType() != WebInputEvent::kGestureTap && - event.GetType() != WebInputEvent::kGestureDoubleTap && event.GetType() != WebInputEvent::kGestureLongTap && - event.GetType() != WebInputEvent::kGestureLongPress) + event.GetType() != WebInputEvent::kGestureLongPress && + event.GetType() != WebInputEvent::kMouseDown) return false; JNIEnv* env = AttachCurrentThread(); @@ -573,6 +573,11 @@ if (j_obj.is_null()) return false; + Java_ContentViewCore_requestFocus(env, j_obj); + + if (event.GetType() == WebInputEvent::kMouseDown) + return false; + const blink::WebGestureEvent& gesture = static_cast(event); int gesture_type = ToGestureEventType(event.GetType()); diff -Nru chromium-browser-59.0.3071.86/content/browser/indexed_db/database_impl.cc chromium-browser-59.0.3071.109/content/browser/indexed_db/database_impl.cc --- chromium-browser-59.0.3071.86/content/browser/indexed_db/database_impl.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/browser/indexed_db/database_impl.cc 2017-06-20 22:03:17.000000000 +0000 @@ -548,6 +548,10 @@ if (!connection_->IsConnected()) return; + // Can't call BadMessage as we're no longer on the IO thread. So ignore. + if (connection_->GetTransaction(transaction_id)) + return; + connection_->database()->CreateTransaction(transaction_id, connection_.get(), object_store_ids, mode); } diff -Nru chromium-browser-59.0.3071.86/content/browser/indexed_db/indexed_db_connection.cc chromium-browser-59.0.3071.109/content/browser/indexed_db/indexed_db_connection.cc --- chromium-browser-59.0.3071.86/content/browser/indexed_db/indexed_db_connection.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/browser/indexed_db/indexed_db_connection.cc 2017-06-20 22:03:17.000000000 +0000 @@ -107,7 +107,7 @@ const std::set& scope, blink::WebIDBTransactionMode mode, IndexedDBBackingStore::Transaction* backing_store_transaction) { - DCHECK_EQ(GetTransaction(id), nullptr) << "Duplicate transaction id." << id; + CHECK_EQ(GetTransaction(id), nullptr) << "Duplicate transaction id." << id; std::unique_ptr transaction = IndexedDBClassFactory::Get()->CreateIndexedDBTransaction( id, this, scope, mode, backing_store_transaction); diff -Nru chromium-browser-59.0.3071.86/content/child/web_data_consumer_handle_impl.cc chromium-browser-59.0.3071.109/content/child/web_data_consumer_handle_impl.cc --- chromium-browser-59.0.3071.86/content/child/web_data_consumer_handle_impl.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/child/web_data_consumer_handle_impl.cc 2017-06-20 22:03:17.000000000 +0000 @@ -38,7 +38,7 @@ scoped_refptr context, Client* client) : context_(context), - handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC), + handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), client_(client) { if (client_) StartWatching(); @@ -77,6 +77,8 @@ &size_to_pass, flags_to_pass); if (rv == MOJO_RESULT_OK) *read_size = size_to_pass; + if (rv == MOJO_RESULT_OK || rv == MOJO_RESULT_SHOULD_WAIT) + handle_watcher_.ArmOrNotify(); return HandleReadResult(rv); } @@ -103,6 +105,8 @@ Result WebDataConsumerHandleImpl::ReaderImpl::EndRead(size_t read_size) { MojoResult rv = mojo::EndReadDataRaw(context_->handle().get(), read_size); + if (rv == MOJO_RESULT_OK) + handle_watcher_.ArmOrNotify(); return rv == MOJO_RESULT_OK ? kOk : kUnexpectedError; } @@ -128,6 +132,7 @@ handle_watcher_.Watch( context_->handle().get(), MOJO_HANDLE_SIGNAL_READABLE, base::Bind(&ReaderImpl::OnHandleGotReadable, base::Unretained(this))); + handle_watcher_.ArmOrNotify(); } void WebDataConsumerHandleImpl::ReaderImpl::OnHandleGotReadable(MojoResult) { diff -Nru chromium-browser-59.0.3071.86/content/child/web_data_consumer_handle_impl_unittest.cc chromium-browser-59.0.3071.109/content/child/web_data_consumer_handle_impl_unittest.cc --- chromium-browser-59.0.3071.86/content/child/web_data_consumer_handle_impl_unittest.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/child/web_data_consumer_handle_impl_unittest.cc 2017-06-20 22:03:17.000000000 +0000 @@ -309,6 +309,94 @@ EXPECT_EQ(WebDataConsumerHandle::Result::kDone, rv); } +class CountDidGetReadableClient : public blink::WebDataConsumerHandle::Client { + public: + ~CountDidGetReadableClient() override {} + void DidGetReadable() override { num_did_get_readable_called_++; } + int num_did_get_readable_called() { return num_did_get_readable_called_; } + + private: + int num_did_get_readable_called_ = 0; +}; + +TEST_F(WebDataConsumerHandleImplTest, DidGetReadable) { + static constexpr size_t kBlockSize = kDataPipeCapacity / 3; + static constexpr size_t kTotalSize = kBlockSize * 3; + + std::unique_ptr client = + base::MakeUnique(); + std::unique_ptr handle( + new WebDataConsumerHandleImpl(std::move(consumer_))); + std::unique_ptr reader( + handle->ObtainReader(client.get())); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(0, client->num_did_get_readable_called()); + + // Push three blocks. + { + std::string expected; + int index = 0; + for (size_t i = 0; i < kTotalSize; ++i) { + expected += static_cast(index + 'a'); + index = (37 * index + 11) % 26; + } + uint32_t size = expected.size(); + MojoResult rv = mojo::WriteDataRaw(producer_.get(), expected.data(), &size, + MOJO_WRITE_DATA_FLAG_NONE); + EXPECT_EQ(MOJO_RESULT_OK, rv); + EXPECT_EQ(kTotalSize, size); + } + base::RunLoop().RunUntilIdle(); + // |client| is notified the pipe gets ready. + EXPECT_EQ(1, client->num_did_get_readable_called()); + + // Read a block. + { + char buffer[kBlockSize]; + size_t size = 0; + Result rv = reader->Read(&buffer, sizeof(buffer), + WebDataConsumerHandle::kFlagNone, &size); + EXPECT_EQ(Result::kOk, rv); + EXPECT_EQ(sizeof(buffer), size); + } + base::RunLoop().RunUntilIdle(); + // |client| is notified the pipe is still ready. + EXPECT_EQ(2, client->num_did_get_readable_called()); + + // Read one more block. + { + const void* buffer = nullptr; + size_t size = sizeof(buffer); + Result rv = + reader->BeginRead(&buffer, WebDataConsumerHandle::kFlagNone, &size); + EXPECT_EQ(Result::kOk, rv); + EXPECT_TRUE(buffer); + EXPECT_EQ(kTotalSize - kBlockSize, size); + base::RunLoop().RunUntilIdle(); + // |client| is NOT notified until EndRead is called. + EXPECT_EQ(2, client->num_did_get_readable_called()); + + rv = reader->EndRead(kBlockSize); + EXPECT_EQ(Result::kOk, rv); + } + base::RunLoop().RunUntilIdle(); + // |client| is notified the pipe is still ready. + EXPECT_EQ(3, client->num_did_get_readable_called()); + + // Read the final block. + { + char buffer[kBlockSize]; + size_t size = 0; + Result rv = reader->Read(&buffer, sizeof(buffer), + WebDataConsumerHandle::kFlagNone, &size); + EXPECT_EQ(Result::kOk, rv); + EXPECT_EQ(sizeof(buffer), size); + } + base::RunLoop().RunUntilIdle(); + // |client| is NOT notified because the pipe doesn't have any data. + EXPECT_EQ(3, client->num_did_get_readable_called()); +} + } // namespace } // namespace content diff -Nru chromium-browser-59.0.3071.86/content/common/sandbox_linux/android/sandbox_bpf_base_policy_android.cc chromium-browser-59.0.3071.109/content/common/sandbox_linux/android/sandbox_bpf_base_policy_android.cc --- chromium-browser-59.0.3071.86/content/common/sandbox_linux/android/sandbox_bpf_base_policy_android.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/common/sandbox_linux/android/sandbox_bpf_base_policy_android.cc 2017-06-20 22:03:17.000000000 +0000 @@ -80,8 +80,10 @@ #endif #if defined(__x86_64__) || defined(__aarch64__) case __NR_newfstatat: + case __NR_fstatfs: #elif defined(__i386__) || defined(__arm__) || defined(__mips__) case __NR_fstatat64: + case __NR_fstatfs64: case __NR_getdents: #endif case __NR_getdents64: diff -Nru chromium-browser-59.0.3071.86/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java chromium-browser-59.0.3071.109/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java --- chromium-browser-59.0.3071.86/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java 2017-06-20 22:03:17.000000000 +0000 @@ -177,6 +177,9 @@ @Override public void run() { ThreadUtils.assertOnUiThread(); + // Make sure to not call ContentMain.start twice, if startBrowserProcessesSync + // is called before this runs. + if (!sBrowserMayStartAsynchronously) return; if (contentStart() > 0) { // Failed. The callbacks may not have run, so run them. enqueueCallbackExecution(STARTUP_FAILURE, NOT_ALREADY_STARTED); diff -Nru chromium-browser-59.0.3071.86/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java chromium-browser-59.0.3071.109/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java --- chromium-browser-59.0.3071.86/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java 2017-06-20 22:03:17.000000000 +0000 @@ -1025,10 +1025,21 @@ if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { return true; } - updateForTapOrPress(type, x, y); + + if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(x, y); + return false; } + @SuppressWarnings("unused") + @CalledByNative + private void requestFocus() { + if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMode() + && !mContainerView.isFocused()) { + mContainerView.requestFocus(); + } + } + @VisibleForTesting public void sendDoubleTapForTest(long timeMs, int x, int y) { if (mNativeContentViewCore == 0) return; @@ -1621,22 +1632,6 @@ } } - private void updateForTapOrPress(int type, float xPix, float yPix) { - if (type != GestureEventType.SINGLE_TAP_CONFIRMED - && type != GestureEventType.SINGLE_TAP_UP - && type != GestureEventType.LONG_PRESS - && type != GestureEventType.LONG_TAP) { - return; - } - - if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMode() - && !mContainerView.isFocused()) { - mContainerView.requestFocus(); - } - - if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); - } - public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) { if (mNativeContentViewCore == 0) return; nativeSetMultiTouchZoomSupportEnabled(mNativeContentViewCore, supportsMultiTouchZoom); diff -Nru chromium-browser-59.0.3071.86/content/public/app/mojo/content_browser_manifest.json chromium-browser-59.0.3071.109/content/public/app/mojo/content_browser_manifest.json --- chromium-browser-59.0.3071.86/content/public/app/mojo/content_browser_manifest.json 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/public/app/mojo/content_browser_manifest.json 2017-06-20 22:03:17.000000000 +0000 @@ -45,6 +45,9 @@ ], "service_manager:service_factory": [ "service_manager::mojom::ServiceFactory" + ], + "utility": [ + "memory_instrumentation::mojom::Coordinator" ] }, "requires": { diff -Nru chromium-browser-59.0.3071.86/content/public/app/mojo/content_utility_manifest.json chromium-browser-59.0.3071.109/content/public/app/mojo/content_utility_manifest.json --- chromium-browser-59.0.3071.86/content/public/app/mojo/content_utility_manifest.json 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/public/app/mojo/content_utility_manifest.json 2017-06-20 22:03:17.000000000 +0000 @@ -14,6 +14,7 @@ ] }, "requires": { + "content_browser": [ "utility" ], "device": [ "device:power_monitor", "device:time_zone_monitor" diff -Nru chromium-browser-59.0.3071.86/content/renderer/gpu/render_widget_compositor.cc chromium-browser-59.0.3071.109/content/renderer/gpu/render_widget_compositor.cc --- chromium-browser-59.0.3071.86/content/renderer/gpu/render_widget_compositor.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/renderer/gpu/render_widget_compositor.cc 2017-06-20 22:03:17.000000000 +0000 @@ -388,7 +388,6 @@ bool using_synchronous_compositor = GetContentClient()->UsingSynchronousCompositing(); - settings.use_stream_video_draw_quad = true; settings.using_synchronous_renderer_compositor = using_synchronous_compositor; if (using_synchronous_compositor) { // Android WebView uses system scrollbars, so make ours invisible. diff -Nru chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content.cc chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content.cc --- chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content.cc 2017-06-20 22:03:17.000000000 +0000 @@ -35,7 +35,6 @@ static_assert(kDefaultScreenCastHeight <= kMaxScreenCastDimension, "Invalid kDefaultScreenCastHeight"); -const double kMinScreenCastFrameRate = 1.0 / 60.0; const double kMaxScreenCastFrameRate = 120.0; const double kDefaultScreenCastFrameRate = MediaStreamVideoSource::kDefaultFrameRate; @@ -384,7 +383,7 @@ VideoContentCaptureCandidates candidates; candidates.set_resolution_set(ScreenCastResolutionCapabilities()); candidates.set_frame_rate_set( - DoubleRangeSet(kMinScreenCastFrameRate, kMaxScreenCastFrameRate)); + DoubleRangeSet(0.0, kMaxScreenCastFrameRate)); // candidates.device_id_set and candidates.noise_reduction_set are // automatically initialized with the universal set. diff -Nru chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content.h chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content.h --- chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content.h 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content.h 2017-06-20 22:03:17.000000000 +0000 @@ -23,7 +23,6 @@ CONTENT_EXPORT extern const int kDefaultScreenCastHeight; CONTENT_EXPORT extern const double kDefaultScreenCastAspectRatio; -CONTENT_EXPORT extern const double kMinScreenCastFrameRate; CONTENT_EXPORT extern const double kMaxScreenCastFrameRate; CONTENT_EXPORT extern const double kDefaultScreenCastFrameRate; diff -Nru chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content_unittest.cc chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content_unittest.cc --- chromium-browser-59.0.3071.86/content/renderer/media/media_stream_constraints_util_video_content_unittest.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/content/renderer/media/media_stream_constraints_util_video_content_unittest.cc 2017-06-20 22:03:17.000000000 +0000 @@ -21,6 +21,7 @@ EXPECT_EQ(kDefaultScreenCastFrameRate, result.FrameRate()); EXPECT_EQ(base::Optional(), result.noise_reduction()); EXPECT_EQ(std::string(), result.device_id()); + EXPECT_EQ(0.0, result.min_frame_rate()); } void CheckNonFrameRateDefaults(const VideoCaptureSettings& result) { @@ -166,7 +167,7 @@ result.failed_constraint_name()); constraint_factory_.Reset(); - constraint_factory_.basic().frame_rate.SetMax(kMinScreenCastFrameRate - 0.1); + constraint_factory_.basic().frame_rate.SetMax(-0.1); result = SelectSettings(); EXPECT_FALSE(result.HasValue()); EXPECT_EQ(constraint_factory_.basic().frame_rate.GetName(), diff -Nru chromium-browser-59.0.3071.86/debian/changelog chromium-browser-59.0.3071.109/debian/changelog --- chromium-browser-59.0.3071.86/debian/changelog 2017-06-06 04:22:01.000000000 +0000 +++ chromium-browser-59.0.3071.109/debian/changelog 2017-06-21 04:37:28.000000000 +0000 @@ -1,3 +1,18 @@ +chromium-browser (59.0.3071.109-0ubuntu0.17.04.1360) zesty; urgency=medium + + * Upstream release: 59.0.3071.109 + + -- Olivier Tilloy Wed, 21 Jun 2017 06:37:28 +0200 + +chromium-browser (59.0.3071.104-0ubuntu0.17.04.1358) zesty; urgency=medium + + * Upstream release: 59.0.3071.104 + - CVE-2017-5087: Sandbox Escape in IndexedDB. + - CVE-2017-5088: Out of bounds read in V8. + - CVE-2017-5089: Domain spoofing in Omnibox. + + -- Olivier Tilloy Fri, 16 Jun 2017 06:44:19 +0200 + chromium-browser (59.0.3071.86-0ubuntu0.17.04.1356) zesty; urgency=medium * Upstream release: 59.0.3071.86 diff -Nru chromium-browser-59.0.3071.86/DEPS chromium-browser-59.0.3071.109/DEPS --- chromium-browser-59.0.3071.86/DEPS 2017-06-05 19:03:00.000000000 +0000 +++ chromium-browser-59.0.3071.109/DEPS 2017-06-20 22:03:09.000000000 +0000 @@ -6,7 +6,7 @@ 'boringssl_revision': 'c8ff30cbe716c72279a6f6a9d7d7d0d4091220fa', 'buildspec_platforms': - 'all', + 'win, linux64, win_recipes, mac64, win64', 'buildtools_revision': 'd3074448541662f242bcee623049c13a231b5648', 'catapult_revision': @@ -140,7 +140,7 @@ 'src/third_party/openmax_dl': (Var("chromium_git")) + '/external/webrtc/deps/third_party/openmax.git@7acede9c039ea5d14cf326f44aad1245b9e674a7', 'src/third_party/pdfium': - (Var("pdfium_git")) + '/pdfium.git@4d46901fe4ef3491bdb4375519b488de0142398e', + (Var("pdfium_git")) + '/pdfium.git@0c17bdac6ce07754402385720d3a0e70ce179949', 'src/third_party/py_trace_event/src': (Var("chromium_git")) + '/external/py_trace_event.git@dd463ea9e2c430de2b9e53dea57a77b4c3ac9b30', 'src/third_party/pyftpdlib/src': @@ -174,7 +174,7 @@ 'src/third_party/webpagereplay': (Var("chromium_git")) + '/external/github.com/chromium/web-page-replay.git@3cd3a3f6f06a1b87b14b9162c7eb16d23d141241', 'src/third_party/webrtc': - (Var("chromium_git")) + '/external/webrtc/trunk/webrtc.git@d45f54b8540f1953793026a20a828cf50d50120b', + (Var("chromium_git")) + '/external/webrtc/trunk/webrtc.git@80b8183191cb5703a22c589e8f6b893fcc41d4ea', 'src/third_party/yasm/source/patched-yasm': (Var("chromium_git")) + '/chromium/deps/yasm/patched-yasm.git@7da28c6c7c6a1387217352ce02b31754deb54d2a', 'src/tools/gyp': @@ -184,7 +184,7 @@ 'src/tools/swarming_client': (Var("chromium_git")) + '/external/swarming.client.git@11e31afa5d330756ff87aa12064bb5d032896cb5', 'src/v8': - (Var("chromium_git")) + '/v8/v8.git@630ab7d16ec13e4593cd810a40e56b1aec0151a7' + (Var("chromium_git")) + '/v8/v8.git@d96f5c48c5f4885d3624198d0b58d05f6839b8d3' } deps_os = { diff -Nru chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device_android.cc chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device_android.cc --- chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device_android.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device_android.cc 2017-06-20 22:03:17.000000000 +0000 @@ -223,7 +223,10 @@ } else { // Otherwise an existing connection was terminated. RecordConnectionTerminatedResult(status); - DidDisconnectGatt(true /* notifyDeviceChanged */); + gatt_services_.clear(); + device_uuids_.ClearServiceUUIDs(); + SetGattServicesDiscoveryComplete(false); + DidDisconnectGatt(); } } diff -Nru chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device.cc chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device.cc --- chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device.cc 2017-06-20 22:03:17.000000000 +0000 @@ -485,11 +485,7 @@ create_gatt_connection_error_callbacks_.clear(); } -void BluetoothDevice::DidDisconnectGatt(bool notifyDeviceChanged) { - gatt_services_.clear(); - device_uuids_.ClearServiceUUIDs(); - SetGattServicesDiscoveryComplete(false); - +void BluetoothDevice::DidDisconnectGatt() { // Pending calls to connect GATT are not expected, if they were then // DidFailToConnectGatt should have been called. DCHECK(create_gatt_connection_error_callbacks_.empty()); @@ -499,8 +495,7 @@ connection->InvalidateConnectionReference(); } gatt_connections_.clear(); - if (notifyDeviceChanged) - GetAdapter()->NotifyDeviceChanged(this); + GetAdapter()->NotifyDeviceChanged(this); } void BluetoothDevice::AddGattConnection(BluetoothGattConnection* connection) { diff -Nru chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device.h chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device.h --- chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_device.h 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_device.h 2017-06-20 22:03:17.000000000 +0000 @@ -616,7 +616,7 @@ // DidDisconnectGatt. void DidConnectGatt(); void DidFailToConnectGatt(ConnectErrorCode); - void DidDisconnectGatt(bool notifyDeviceChanged); + void DidDisconnectGatt(); // Tracks BluetoothGattConnection instances that act as a reference count // keeping the GATT connection open. Instances call Add/RemoveGattConnection diff -Nru chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_low_energy_device_mac.mm chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_low_energy_device_mac.mm --- chromium-browser-59.0.3071.86/device/bluetooth/bluetooth_low_energy_device_mac.mm 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/device/bluetooth/bluetooth_low_energy_device_mac.mm 2017-06-20 22:03:17.000000000 +0000 @@ -453,7 +453,7 @@ // 2. When we cancel a pending connection request. if (create_gatt_connection_error_callbacks_.empty()) { // If there are no pending callbacks then the connection broke (#1). - DidDisconnectGatt(true /* notifyDeviceChanged */); + DidDisconnectGatt(); return; } // Else we canceled the connection request (#2). diff -Nru chromium-browser-59.0.3071.86/device/bluetooth/bluez/bluetooth_device_bluez.cc chromium-browser-59.0.3071.109/device/bluetooth/bluez/bluetooth_device_bluez.cc --- chromium-browser-59.0.3071.86/device/bluetooth/bluez/bluetooth_device_bluez.cc 2017-06-05 19:03:07.000000000 +0000 +++ chromium-browser-59.0.3071.109/device/bluetooth/bluez/bluetooth_device_bluez.cc 2017-06-20 22:03:18.000000000 +0000 @@ -951,9 +951,6 @@ void BluetoothDeviceBlueZ::OnDisconnect(const base::Closure& callback) { BLUETOOTH_LOG(EVENT) << object_path_.value() << ": Disconnected"; - // Do not notify about changed device since this is already done by - // the dbus::PropertySet and the property change callback for BlueZ. - DidDisconnectGatt(false /* notifyDeviceChanged */); callback.Run(); } diff -Nru chromium-browser-59.0.3071.86/gpu/config/gpu_driver_bug_list.json chromium-browser-59.0.3071.109/gpu/config/gpu_driver_bug_list.json --- chromium-browser-59.0.3071.86/gpu/config/gpu_driver_bug_list.json 2017-06-05 19:03:08.000000000 +0000 +++ chromium-browser-59.0.3071.109/gpu/config/gpu_driver_bug_list.json 2017-06-20 22:03:18.000000000 +0000 @@ -1,6 +1,6 @@ { "name": "gpu driver bug list", - "version": "10.101", + "version": "10.102", "entries": [ { "id": 1, @@ -2493,6 +2493,19 @@ "features": [ "disable_chromium_framebuffer_multisample" ] + }, + { + "id": 231, + "description": "Disable use of Direct3D 11 on Intel Cherryview due to visual glitches.", + "cr_bugs": [730126], + "os": { + "type": "win" + }, + "vendor_id": "0x8086", + "device_id": ["0x22B0", "0x22B1", "0x22B2", "0x22B3"], + "features": [ + "disable_d3d11" + ] } ], "comment": [ diff -Nru chromium-browser-59.0.3071.86/gpu/gles2_conform_support/BUILD.gn chromium-browser-59.0.3071.109/gpu/gles2_conform_support/BUILD.gn --- chromium-browser-59.0.3071.86/gpu/gles2_conform_support/BUILD.gn 2017-06-05 19:03:08.000000000 +0000 +++ chromium-browser-59.0.3071.109/gpu/gles2_conform_support/BUILD.gn 2017-06-20 22:03:18.000000000 +0000 @@ -413,11 +413,6 @@ # Must be done this way for warning flags to be ordered correctly. ":gles2_conform_test_warnings", ] - if (is_linux) { - if (!is_chromeos) { - deps += [ "//build/config/linux/gtk2" ] - } - } if (is_win) { deps += [ "//third_party/angle:libEGL", diff -Nru chromium-browser-59.0.3071.86/ios/chrome/browser/ui/browser_view_controller.mm chromium-browser-59.0.3071.109/ios/chrome/browser/ui/browser_view_controller.mm --- chromium-browser-59.0.3071.86/ios/chrome/browser/ui/browser_view_controller.mm 2017-06-05 19:03:08.000000000 +0000 +++ chromium-browser-59.0.3071.109/ios/chrome/browser/ui/browser_view_controller.mm 2017-06-20 22:03:18.000000000 +0000 @@ -4635,6 +4635,9 @@ atIndex:(NSUInteger)index { [self uninstallDelegatesForTab:tab]; + // Cancel dialogs for |tab|'s WebState. + [self.dialogPresenter cancelDialogForWebState:tab.webState]; + // Remove stored native controllers for the tab. [_nativeControllersForTabIDs removeObjectForKey:tab.tabId]; diff -Nru chromium-browser-59.0.3071.86/media/capture/video/linux/v4l2_capture_delegate.cc chromium-browser-59.0.3071.109/media/capture/video/linux/v4l2_capture_delegate.cc --- chromium-browser-59.0.3071.86/media/capture/video/linux/v4l2_capture_delegate.cc 2017-06-05 19:03:08.000000000 +0000 +++ chromium-browser-59.0.3071.109/media/capture/video/linux/v4l2_capture_delegate.cc 2017-06-20 22:03:19.000000000 +0000 @@ -192,6 +192,9 @@ case V4L2_CID_TILT_RESET: case V4L2_CID_PAN_ABSOLUTE: case V4L2_CID_TILT_ABSOLUTE: + case V4L2_CID_ZOOM_ABSOLUTE: + case V4L2_CID_ZOOM_RELATIVE: + case V4L2_CID_ZOOM_CONTINUOUS: case V4L2_CID_PAN_SPEED: case V4L2_CID_TILT_SPEED: case V4L2_CID_PANTILT_CMD: diff -Nru chromium-browser-59.0.3071.86/media/capture/video/linux/v4l2_capture_delegate_unittest.cc chromium-browser-59.0.3071.109/media/capture/video/linux/v4l2_capture_delegate_unittest.cc --- chromium-browser-59.0.3071.86/media/capture/video/linux/v4l2_capture_delegate_unittest.cc 2017-06-05 19:03:08.000000000 +0000 +++ chromium-browser-59.0.3071.109/media/capture/video/linux/v4l2_capture_delegate_unittest.cc 2017-06-20 22:03:19.000000000 +0000 @@ -56,6 +56,9 @@ case V4L2_CID_TILT_RESET: case V4L2_CID_PAN_ABSOLUTE: case V4L2_CID_TILT_ABSOLUTE: + case V4L2_CID_ZOOM_ABSOLUTE: + case V4L2_CID_ZOOM_RELATIVE: + case V4L2_CID_ZOOM_CONTINUOUS: case V4L2_CID_PAN_SPEED: case V4L2_CID_TILT_SPEED: case V4L2_CID_PANTILT_CMD: diff -Nru chromium-browser-59.0.3071.86/media/midi/dynamically_initialized_midi_manager_win.cc chromium-browser-59.0.3071.109/media/midi/dynamically_initialized_midi_manager_win.cc --- chromium-browser-59.0.3071.86/media/midi/dynamically_initialized_midi_manager_win.cc 2017-06-05 19:03:09.000000000 +0000 +++ chromium-browser-59.0.3071.109/media/midi/dynamically_initialized_midi_manager_win.cc 2017-06-20 22:03:19.000000000 +0000 @@ -624,9 +624,7 @@ base::Unretained(manager), index, data, manager->port_manager()->CalculateInEventTime(index, param2))); } - manager->PostTask(base::Bind( - &DynamicallyInitializedMidiManagerWin::PortManager::RestoreInBuffer, - base::Unretained(manager->port_manager()), index)); + manager->port_manager()->RestoreInBuffer(index); } } diff -Nru chromium-browser-59.0.3071.86/net/quic/chromium/quic_chromium_client_session.cc chromium-browser-59.0.3071.109/net/quic/chromium/quic_chromium_client_session.cc --- chromium-browser-59.0.3071.86/net/quic/chromium/quic_chromium_client_session.cc 2017-06-05 19:03:10.000000000 +0000 +++ chromium-browser-59.0.3071.109/net/quic/chromium/quic_chromium_client_session.cc 2017-06-20 22:03:20.000000000 +0000 @@ -63,6 +63,9 @@ // migrating sessions need to wait for a new network to connect. const size_t kWaitTimeForNewNetworkSecs = 10; +// The maximum size of uncompressed QUIC headers that will be allowed. +const size_t kMaxUncompressedHeaderSize = 256 * 1024; + // Histograms for tracking down the crashes from http://crbug.com/354669 // Note: these values must be kept in sync with the corresponding values in: // tools/metrics/histograms/histograms.xml @@ -437,6 +440,7 @@ base::MakeUnique()); SetHpackDecoderDebugVisitor( base::MakeUnique()); + set_max_uncompressed_header_bytes(kMaxUncompressedHeaderSize); } void QuicChromiumClientSession::OnHeadersHeadOfLineBlocking( diff -Nru chromium-browser-59.0.3071.86/printing/backend/win_helper.cc chromium-browser-59.0.3071.109/printing/backend/win_helper.cc --- chromium-browser-59.0.3071.86/printing/backend/win_helper.cc 2017-06-05 19:03:10.000000000 +0000 +++ chromium-browser-59.0.3071.109/printing/backend/win_helper.cc 2017-06-20 22:03:20.000000000 +0000 @@ -19,7 +19,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/win/scoped_comptr.h" -#include "base/win/windows_version.h" #include "printing/backend/print_backend.h" #include "printing/backend/print_backend_consts.h" #include "printing/backend/printing_info_win.h" @@ -471,22 +470,6 @@ return ticket; } -bool IsPrinterRPCSOnly(HANDLE printer) { - PrinterInfo5 info_5; - if (!info_5.Init(printer)) - return false; - const wchar_t* name = info_5.get()->pPrinterName; - const wchar_t* port = info_5.get()->pPortName; - int num_languages = - DeviceCapabilities(name, port, DC_PERSONALITY, NULL, NULL); - if (num_languages != 1) - return false; - std::vector buf(33, 0); - DeviceCapabilities(name, port, DC_PERSONALITY, buf.data(), NULL); - static constexpr wchar_t kRPCSLanguage[] = L"RPCS"; - return wcscmp(buf.data(), kRPCSLanguage) == 0; -} - std::unique_ptr CreateDevMode(HANDLE printer, DEVMODE* in) { LONG buffer_size = DocumentProperties( @@ -501,14 +484,6 @@ std::unique_ptr out( reinterpret_cast(calloc(buffer_size, 1))); DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER; - - // Check for RPCS drivers on Windows 8+ as DocumentProperties will crash if - // called on one of these printers. See crbug.com/679160 - if (base::win::GetVersion() >= base::win::VERSION_WIN8 && - IsPrinterRPCSOnly(printer)) { - return std::unique_ptr(); - } - if (DocumentProperties( NULL, printer, const_cast(L""), out.get(), in, flags) != IDOK) { diff -Nru chromium-browser-59.0.3071.86/skia/BUILD.gn chromium-browser-59.0.3071.109/skia/BUILD.gn --- chromium-browser-59.0.3071.86/skia/BUILD.gn 2017-06-05 19:03:11.000000000 +0000 +++ chromium-browser-59.0.3071.109/skia/BUILD.gn 2017-06-20 22:03:21.000000000 +0000 @@ -43,7 +43,7 @@ defines = skia_for_chromium_defines - if (is_win) { + if (is_win || is_android) { defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ] } diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp chromium-browser-59.0.3071.109/third_party/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp --- chromium-browser-59.0.3071.86/third_party/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp 2017-06-05 19:04:21.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp 2017-06-20 22:04:34.000000000 +0000 @@ -182,12 +182,15 @@ return -1; } offset += 8; - auto pAcc = pdfium::MakeRetain(p); - pAcc->LoadAllData(true); - if (pFile->AppendBlock(pAcc->GetData(), pAcc->GetSize()) < 0) { - return -1; + if (p->GetRawSize() > 0) { + auto pAcc = pdfium::MakeRetain(p); + pAcc->LoadAllData(true); + + if (pFile->AppendBlock(pAcc->GetData(), pAcc->GetSize()) < 0) { + return -1; + } + offset += pAcc->GetSize(); } - offset += pAcc->GetSize(); if ((len = pFile->AppendString("\r\nendstream")) < 0) { return -1; } diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp chromium-browser-59.0.3071.109/third_party/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp --- chromium-browser-59.0.3071.86/third_party/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp 2017-06-05 19:04:21.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp 2017-06-20 22:04:34.000000000 +0000 @@ -724,10 +724,11 @@ } m_Pos = streamStartPos; } - - // Read up to the end of the buffer. + // Read up to the end of the buffer. Note, we allow zero length streams as + // we need to pass them through when we are importing pages into a new + // document. len = std::min(len, m_FileLen - m_Pos - m_HeaderOffset); - if (len <= 0) + if (len < 0) return nullptr; std::unique_ptr pData; @@ -745,7 +746,6 @@ pData = dest_buf.DetachBuffer(); } } - auto pStream = pdfium::MakeUnique(std::move(pData), len, std::move(pDict)); streamStartPos = m_Pos; diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp chromium-browser-59.0.3071.109/third_party/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp --- chromium-browser-59.0.3071.86/third_party/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp 2017-06-05 19:04:22.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp 2017-06-20 22:04:34.000000000 +0000 @@ -1,11 +1,11 @@ // Copyright 2016 PDFium 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 "public/fpdf_ppo.h" +#include #include "core/fxcrt/fx_basic.h" #include "public/fpdf_edit.h" +#include "public/fpdf_ppo.h" #include "public/fpdfview.h" #include "testing/embedder_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -131,7 +131,7 @@ EXPECT_TRUE(OpenDocument("bug_664284.pdf")); FPDF_PAGE page = LoadPage(0); - EXPECT_TRUE(page); + ASSERT_NE(nullptr, page); FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); EXPECT_TRUE(output_doc); @@ -140,3 +140,37 @@ UnloadPage(page); } + +TEST_F(FPDFPPOEmbeddertest, ImportWithZeroLengthStream) { + EXPECT_TRUE(OpenDocument("zero_length_stream.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_NE(nullptr, page); + + FPDF_BITMAP bitmap = RenderPage(page); + ASSERT_EQ(200, FPDFBitmap_GetWidth(bitmap)); + ASSERT_EQ(200, FPDFBitmap_GetHeight(bitmap)); + ASSERT_EQ(800, FPDFBitmap_GetStride(bitmap)); + + std::string digest = HashBitmap(bitmap, 200, 200); + FPDFBitmap_Destroy(bitmap); + FPDF_ClosePage(page); + + FPDF_DOCUMENT new_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(new_doc); + EXPECT_TRUE(FPDF_ImportPages(new_doc, document(), "1", 0)); + + EXPECT_EQ(1, FPDF_GetPageCount(new_doc)); + FPDF_PAGE new_page = FPDF_LoadPage(new_doc, 0); + ASSERT_NE(nullptr, new_page); + FPDF_BITMAP new_bitmap = RenderPage(new_page); + ASSERT_EQ(200, FPDFBitmap_GetWidth(new_bitmap)); + ASSERT_EQ(200, FPDFBitmap_GetHeight(new_bitmap)); + ASSERT_EQ(800, FPDFBitmap_GetStride(new_bitmap)); + + std::string new_digest = HashBitmap(new_bitmap, 200, 200); + FPDFBitmap_Destroy(new_bitmap); + FPDF_ClosePage(new_page); + FPDF_CloseDocument(new_doc); + + EXPECT_EQ(digest, new_digest); +} diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/testing/embedder_test.cpp chromium-browser-59.0.3071.109/third_party/pdfium/testing/embedder_test.cpp --- chromium-browser-59.0.3071.86/third_party/pdfium/testing/embedder_test.cpp 2017-06-05 19:04:22.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/testing/embedder_test.cpp 2017-06-20 22:04:34.000000000 +0000 @@ -336,6 +336,15 @@ page_index); } +std::string EmbedderTest::HashBitmap(FPDF_BITMAP bitmap, + int expected_width, + int expected_height) { + uint8_t digest[16]; + CRYPT_MD5Generate(static_cast(FPDFBitmap_GetBuffer(bitmap)), + expected_width * 4 * expected_height, digest); + return CRYPT_ToBase16(digest); +} + // static void EmbedderTest::CompareBitmap(FPDF_BITMAP bitmap, int expected_width, @@ -349,10 +358,8 @@ if (!expected_md5sum) return; - uint8_t digest[16]; - CRYPT_MD5Generate(static_cast(FPDFBitmap_GetBuffer(bitmap)), - expected_stride * expected_height, digest); - EXPECT_EQ(expected_md5sum, CRYPT_ToBase16(digest)); + EXPECT_EQ(expected_md5sum, + HashBitmap(bitmap, expected_width, expected_height)); } // Can't use gtest-provided main since we need to stash the path to the diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/testing/embedder_test.h chromium-browser-59.0.3071.109/third_party/pdfium/testing/embedder_test.h --- chromium-browser-59.0.3071.86/third_party/pdfium/testing/embedder_test.h 2017-06-05 19:04:22.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/testing/embedder_test.h 2017-06-20 22:04:34.000000000 +0000 @@ -108,6 +108,11 @@ protected: void SetupFormFillEnvironment(); + // Return the hash of |bitmap|. + static std::string HashBitmap(FPDF_BITMAP bitmap, + int expected_width, + int expected_height); + // Check |bitmap| to make sure it has the right dimensions and content. static void CompareBitmap(FPDF_BITMAP bitmap, int expected_width, diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/testing/resources/zero_length_stream.in chromium-browser-59.0.3071.109/third_party/pdfium/testing/resources/zero_length_stream.in --- chromium-browser-59.0.3071.86/third_party/pdfium/testing/resources/zero_length_stream.in 1970-01-01 00:00:00.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/testing/resources/zero_length_stream.in 2017-06-20 22:04:34.000000000 +0000 @@ -0,0 +1,63 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +{{object 2 0}} << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /Resources << + /Font << + /F1 4 0 R + /F2 5 0 R + >> + >> + /Contents [6 0 R 7 0 R] +>> +endobj +{{object 4 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Times-Roman +>> +endobj +{{object 5 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +{{object 6 0}} << + /Filter /FlateDecode + /Length 0 +>> +stream +endstream +endobj +{{object 7 0}} << +>> +stream +BT +20 50 Td +/F1 12 Tf +(Hello, world!) Tj +0 50 Td +/F2 16 Tf +(Goodbye, world!) Tj +ET +endstream +endobj +{{xref}} +trailer << + /Size 6 + /Root 1 0 R +>> +{{startxref}} +%%EOF diff -Nru chromium-browser-59.0.3071.86/third_party/pdfium/testing/resources/zero_length_stream.pdf chromium-browser-59.0.3071.109/third_party/pdfium/testing/resources/zero_length_stream.pdf --- chromium-browser-59.0.3071.86/third_party/pdfium/testing/resources/zero_length_stream.pdf 1970-01-01 00:00:00.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/pdfium/testing/resources/zero_length_stream.pdf 2017-06-20 22:04:34.000000000 +0000 @@ -0,0 +1,74 @@ +%PDF-1.7 +% ò¤ô +1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +2 0 obj << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R + /Resources << + /Font << + /F1 4 0 R + /F2 5 0 R + >> + >> + /Contents [6 0 R 7 0 R] +>> +endobj +4 0 obj << + /Type /Font + /Subtype /Type1 + /BaseFont /Times-Roman +>> +endobj +5 0 obj << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +6 0 obj << + /Filter /FlateDecode + /Length 0 +>> +stream +endstream +endobj +7 0 obj << +>> +stream +BT +20 50 Td +/F1 12 Tf +(Hello, world!) Tj +0 50 Td +/F2 16 Tf +(Goodbye, world!) Tj +ET +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000061 00000 n +0000000154 00000 n +0000000304 00000 n +0000000382 00000 n +0000000458 00000 n +0000000531 00000 n +trailer << + /Size 6 + /Root 1 0 R +>> +startxref +652 +%%EOF diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp 2017-06-20 22:03:32.000000000 +0000 @@ -29,24 +29,24 @@ // TODO(nhiroki): Throttle them again after we're convinced that it's safe // or provide a mechanism that web pages can opt-out it if throttling is not // desirable. - case TaskType::kDOMManipulation: case TaskType::kDatabaseAccess: - case TaskType::kFileReading: - case TaskType::kHistoryTraversal: - case TaskType::kPerformanceTimeline: - case TaskType::kPostedMessage: - case TaskType::kRemoteEvent: - case TaskType::kSensor: - case TaskType::kUnshippedPortMessage: - case TaskType::kWebSocket: return frame ? frame->FrameScheduler()->SuspendableTaskRunner() : Platform::Current()->CurrentThread()->GetWebTaskRunner(); + case TaskType::kDOMManipulation: case TaskType::kUserInteraction: + case TaskType::kHistoryTraversal: case TaskType::kEmbed: case TaskType::kMediaElementEvent: case TaskType::kCanvasBlobSerialization: + case TaskType::kRemoteEvent: + case TaskType::kWebSocket: case TaskType::kMicrotask: + case TaskType::kPostedMessage: + case TaskType::kUnshippedPortMessage: + case TaskType::kFileReading: case TaskType::kPresentation: + case TaskType::kSensor: + case TaskType::kPerformanceTimeline: case TaskType::kWebGL: case TaskType::kUnspecedTimer: case TaskType::kMiscPlatformAPI: diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/layout/LayoutObjectChildList.cpp chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/layout/LayoutObjectChildList.cpp --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/layout/LayoutObjectChildList.cpp 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/layout/LayoutObjectChildList.cpp 2017-06-20 22:03:32.000000000 +0000 @@ -82,7 +82,7 @@ // selection to avoid problems of invalid pointers. // FIXME: The FrameSelection should be responsible for this when it // is notified of DOM mutations. - if (old_child->IsSelectionBorder()) + if (old_child->IsSelectionBorder() && owner->View()) owner->View()->ClearSelection(); owner->NotifyOfSubtreeChange(); diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/layout/LayoutObject.cpp chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/layout/LayoutObject.cpp --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/core/layout/LayoutObject.cpp 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/core/layout/LayoutObject.cpp 2017-06-20 22:03:32.000000000 +0000 @@ -699,11 +699,13 @@ DCHECK(IsInsideFlowThread()); // See if we have the thread cached because we're in the middle of layout. - if (LayoutState* layout_state = View()->GetLayoutState()) { - // TODO(mstensho): We should really just return whatever - // layoutState->flowThread() returns here, also if the value is nullptr. - if (LayoutFlowThread* flow_thread = layout_state->FlowThread()) - return flow_thread; + if (LayoutView* view = View()) { + if (LayoutState* layout_state = view->GetLayoutState()) { + // TODO(mstensho): We should really just return whatever + // layoutState->flowThread() returns here, also if the value is nullptr. + if (LayoutFlowThread* flow_thread = layout_state->FlowThread()) + return flow_thread; + } } // Not in the middle of layout so have to find the thread the slow way. diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp 2017-06-20 22:03:33.000000000 +0000 @@ -67,6 +67,15 @@ return EventNames::FetchEvent; } +bool FetchEvent::HasPendingActivity() const { + // Prevent V8 from garbage collecting the wrapper object while waiting for the + // preload response. This is in order to keep the resolver of preloadResponse + // Promise alive. + return preload_response_property_->GetState() == + PreloadResponseProperty::kPending && + GetExecutionContext(); +} + FetchEvent::FetchEvent(ScriptState* script_state, const AtomicString& type, const FetchEventInit& initializer, @@ -74,6 +83,7 @@ WaitUntilObserver* wait_until_observer, bool navigation_preload_sent) : ExtendableEvent(type, initializer, wait_until_observer), + ContextClient(ExecutionContext::From(script_state)), observer_(respond_with_observer), preload_response_property_(new PreloadResponseProperty( ExecutionContext::From(script_state), @@ -107,6 +117,8 @@ } } +FetchEvent::~FetchEvent() {} + void FetchEvent::OnNavigationPreloadResponse( ScriptState* script_state, std::unique_ptr response, @@ -156,6 +168,7 @@ visitor->Trace(request_); visitor->Trace(preload_response_property_); ExtendableEvent::Trace(visitor); + ContextClient::Trace(visitor); } } // namespace blink diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h 2017-06-20 22:03:33.000000000 +0000 @@ -5,8 +5,10 @@ #ifndef FetchEvent_h #define FetchEvent_h +#include "bindings/core/v8/ActiveScriptWrappable.h" #include "bindings/core/v8/ScriptPromise.h" #include "bindings/core/v8/ScriptPromiseProperty.h" +#include "core/dom/ContextLifecycleObserver.h" #include "modules/EventModules.h" #include "modules/ModulesExport.h" #include "modules/fetch/Request.h" @@ -29,8 +31,12 @@ // A fetch event is dispatched by the client to a service worker's script // context. FetchRespondWithObserver can be used to notify the client about the // service worker's response. -class MODULES_EXPORT FetchEvent final : public ExtendableEvent { +class MODULES_EXPORT FetchEvent final + : public ExtendableEvent, + public ActiveScriptWrappable, + public ContextClient { DEFINE_WRAPPERTYPEINFO(); + USING_GARBAGE_COLLECTED_MIXIN(FetchEvent); public: using PreloadResponseProperty = ScriptPromiseProperty, @@ -46,6 +52,8 @@ WaitUntilObserver*, bool navigation_preload_sent); + ~FetchEvent() override; + Request* request() const; String clientId() const; bool isReload() const; @@ -61,6 +69,9 @@ const AtomicString& InterfaceName() const override; + // ScriptWrappable + bool HasPendingActivity() const override; + DECLARE_VIRTUAL_TRACE(); protected: diff -Nru chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.idl chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.idl --- chromium-browser-59.0.3071.86/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.idl 2017-06-05 19:03:25.000000000 +0000 +++ chromium-browser-59.0.3071.109/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.idl 2017-06-20 22:03:33.000000000 +0000 @@ -4,6 +4,8 @@ // https://w3c.github.io/ServiceWorker/#fetch-event-interface [ + ActiveScriptWrappable, + DependentLifetime, Constructor(DOMString type, FetchEventInit eventInitDict), ConstructorCallWith=ScriptState, Exposed=ServiceWorker, diff -Nru chromium-browser-59.0.3071.86/ui/message_center/views/message_list_view.cc chromium-browser-59.0.3071.109/ui/message_center/views/message_list_view.cc --- chromium-browser-59.0.3071.86/ui/message_center/views/message_list_view.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/message_center/views/message_list_view.cc 2017-06-20 22:03:37.000000000 +0000 @@ -301,21 +301,36 @@ } void MessageListView::OnBoundsAnimatorDone(views::BoundsAnimator* animator) { - for (auto* view : deleted_when_done_) - delete view; - deleted_when_done_.clear(); + bool need_update = false; if (clear_all_started_) { clear_all_started_ = false; + // TODO(yoshiki): we shouldn't touch views in OnAllNotificationsCleared(). + // Or rename it to like OnAllNotificationsClearing(). for (auto& observer : observers_) observer.OnAllNotificationsCleared(); + + // Need to update layout after deleting the views. + if (!deleted_when_done_.empty()) + need_update = true; } + // None of these views should be deleted. + DCHECK(std::all_of(deleted_when_done_.begin(), deleted_when_done_.end(), + [this](views::View* view) { return Contains(view); })); + + for (auto* view : deleted_when_done_) + delete view; + deleted_when_done_.clear(); + if (has_deferred_task_) { has_deferred_task_ = false; - DoUpdateIfPossible(); + need_update = true; } + if (need_update) + DoUpdateIfPossible(); + if (GetWidget()) GetWidget()->SynthesizeMouseMoveEvent(); diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/drm_buffer.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/drm_buffer.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/drm_buffer.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/drm_buffer.cc 2017-06-20 22:03:37.000000000 +0000 @@ -107,6 +107,10 @@ return fb_pixel_format_; } +uint64_t DrmBuffer::GetFormatModifier() const { + return DRM_FORMAT_MOD_NONE; +} + uint32_t DrmBuffer::GetHandle() const { return handle_; } diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/drm_buffer.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/drm_buffer.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/drm_buffer.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/drm_buffer.h 2017-06-20 22:03:37.000000000 +0000 @@ -40,6 +40,7 @@ uint32_t GetFramebufferPixelFormat() const override; uint32_t GetOpaqueFramebufferId() const override; uint32_t GetOpaqueFramebufferPixelFormat() const override; + uint64_t GetFormatModifier() const override; uint32_t GetHandle() const override; gfx::Size GetSize() const override; const DrmDevice* GetDrmDevice() const override; diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer_base.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer_base.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer_base.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer_base.cc 2017-06-20 22:03:37.000000000 +0000 @@ -24,6 +24,7 @@ framebuffer_pixel_format_ = format; opaque_framebuffer_pixel_format_ = GetFourCCFormatForOpaqueFramebuffer( GetBufferFormatFromFourCCFormat(format)); + format_modifier_ = modifier; uint32_t handles[4] = {0}; uint32_t strides[4] = {0}; @@ -86,6 +87,11 @@ return opaque_framebuffer_pixel_format_; } +uint64_t GbmBufferBase::GetFormatModifier() const { + DCHECK(framebuffer_); + return format_modifier_; +} + const DrmDevice* GbmBufferBase::GetDrmDevice() const { return drm_.get(); } diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer_base.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer_base.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer_base.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer_base.h 2017-06-20 22:03:37.000000000 +0000 @@ -32,6 +32,7 @@ gfx::Size GetSize() const override; uint32_t GetFramebufferPixelFormat() const override; uint32_t GetOpaqueFramebufferPixelFormat() const override; + uint64_t GetFormatModifier() const override; const DrmDevice* GetDrmDevice() const override; bool RequiresGlFinish() const override; @@ -54,6 +55,7 @@ // otherwise it is set to 0. uint32_t opaque_framebuffer_ = 0; uint32_t opaque_framebuffer_pixel_format_ = 0; + uint64_t format_modifier_ = 0; DISALLOW_COPY_AND_ASSIGN(GbmBufferBase); }; diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer.cc 2017-06-20 22:03:37.000000000 +0000 @@ -83,11 +83,6 @@ return planes_[index].size; } -uint64_t GbmBuffer::GetFormatModifier(size_t index) const { - DCHECK_LT(index, planes_.size()); - return planes_[index].modifier; -} - // TODO(reveman): This should not be needed once crbug.com/597932 is fixed, // as the size would be queried directly from the underlying bo. gfx::Size GbmBuffer::GetSize() const { @@ -250,7 +245,7 @@ } handle.planes.emplace_back(buffer_->GetStride(i), buffer_->GetOffset(i), buffer_->GetSize(i), - buffer_->GetFormatModifier(i)); + buffer_->GetFormatModifier()); } return handle; } @@ -283,7 +278,7 @@ } uint64_t GbmPixmap::GetDmaBufModifier(size_t plane) const { - return buffer_->GetFormatModifier(plane); + return buffer_->GetFormatModifier(); } gfx::BufferFormat GbmPixmap::GetBufferFormat() const { diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/gbm_buffer.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/gbm_buffer.h 2017-06-20 22:03:37.000000000 +0000 @@ -48,7 +48,6 @@ int GetStride(size_t plane) const; int GetOffset(size_t plane) const; size_t GetSize(size_t plane) const; - uint64_t GetFormatModifier(size_t plane) const; gfx::Size GetSize() const override; private: diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.cc 2017-06-20 22:03:37.000000000 +0000 @@ -18,6 +18,7 @@ const std::vector& crtcs, uint32_t planes_per_crtc) { const int kPlaneBaseId = 50; + const struct drm_format_modifier linear_modifier { 0x1, DRM_FORMAT_MOD_NONE }; drm_ = drm; crtcs_ = crtcs; for (size_t crtc_idx = 0; crtc_idx < crtcs_.size(); crtc_idx++) { @@ -25,7 +26,7 @@ std::unique_ptr plane( new HardwareDisplayPlane(kPlaneBaseId + i, 1 << crtc_idx)); plane->Initialize(drm, std::vector(1, DRM_FORMAT_XRGB8888), - std::vector(), // modifiers + std::vector(1, linear_modifier), false, true); planes_.push_back(std::move(plane)); } diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer.cc 2017-06-20 22:03:37.000000000 +0000 @@ -3,16 +3,30 @@ // found in the LICENSE file. #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer.h" +#include "ui/ozone/platform/drm/gpu/mock_drm_device.h" namespace ui { -MockScanoutBuffer::MockScanoutBuffer(const gfx::Size& size, uint32_t format) - : size_(size), format_(format) {} +namespace { + +uint32_t g_current_framebuffer_id = 1; + +} // namespace + +MockScanoutBuffer::MockScanoutBuffer(const gfx::Size& size, + uint32_t format, + uint64_t modifier, + const scoped_refptr& drm) + : size_(size), + format_(format), + modifier_(modifier), + id_(g_current_framebuffer_id++), + drm_(drm) {} MockScanoutBuffer::~MockScanoutBuffer() {} uint32_t MockScanoutBuffer::GetFramebufferId() const { - return 1; + return id_; } uint32_t MockScanoutBuffer::GetOpaqueFramebufferId() const { @@ -35,8 +49,12 @@ return format_; } +uint64_t MockScanoutBuffer::GetFormatModifier() const { + return modifier_; +} + const DrmDevice* MockScanoutBuffer::GetDrmDevice() const { - return nullptr; + return drm_.get(); } bool MockScanoutBuffer::RequiresGlFinish() const { diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.cc 2017-06-20 22:03:37.000000000 +0000 @@ -17,10 +17,19 @@ const scoped_refptr& drm, uint32_t format, const gfx::Size& size) { + return CreateWithModifier(drm, format, DRM_FORMAT_MOD_NONE, size); +} + +scoped_refptr MockScanoutBufferGenerator::CreateWithModifier( + const scoped_refptr& drm, + uint32_t format, + uint64_t modifier, + const gfx::Size& size) { if (allocation_failure_) return nullptr; - scoped_refptr buffer(new MockScanoutBuffer(size, format)); + scoped_refptr buffer( + new MockScanoutBuffer(size, format, modifier, drm)); return buffer; } diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h 2017-06-20 22:03:37.000000000 +0000 @@ -21,6 +21,12 @@ uint32_t format, const gfx::Size& size) override; + scoped_refptr CreateWithModifier( + const scoped_refptr& drm, + uint32_t format, + uint64_t modifier, + const gfx::Size& size); + void set_allocation_failure(bool allocation_failure) { allocation_failure_ = allocation_failure; } diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/mock_scanout_buffer.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/mock_scanout_buffer.h 2017-06-20 22:03:37.000000000 +0000 @@ -16,7 +16,9 @@ class MockScanoutBuffer : public ScanoutBuffer { public: MockScanoutBuffer(const gfx::Size& size, - uint32_t format = DRM_FORMAT_XRGB8888); + uint32_t format = DRM_FORMAT_XRGB8888, + uint64_t modifier = DRM_FORMAT_MOD_NONE, + const scoped_refptr& drm = nullptr); // ScanoutBuffer: uint32_t GetFramebufferId() const override; @@ -25,6 +27,7 @@ gfx::Size GetSize() const override; uint32_t GetFramebufferPixelFormat() const override; uint32_t GetOpaqueFramebufferPixelFormat() const override; + uint64_t GetFormatModifier() const override; const DrmDevice* GetDrmDevice() const override; bool RequiresGlFinish() const override; @@ -33,6 +36,9 @@ gfx::Size size_; uint32_t format_; + uint64_t modifier_; + uint32_t id_; + scoped_refptr drm_; DISALLOW_COPY_AND_ASSIGN(MockScanoutBuffer); }; diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/scanout_buffer.h chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/scanout_buffer.h --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/scanout_buffer.h 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/scanout_buffer.h 2017-06-20 22:03:37.000000000 +0000 @@ -34,6 +34,9 @@ // scanout when used as an opaque buffer. virtual uint32_t GetOpaqueFramebufferPixelFormat() const = 0; + // Returns format modifier for buffer. + virtual uint64_t GetFormatModifier() const = 0; + // Handle for the buffer. This is received when allocating the buffer. virtual uint32_t GetHandle() const = 0; diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/screen_manager.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/screen_manager.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/screen_manager.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/screen_manager.cc 2017-06-20 22:03:37.000000000 +0000 @@ -348,17 +348,30 @@ HardwareDisplayController* controller, const gfx::Rect& bounds) { DrmWindow* window = FindWindowAt(bounds); + + gfx::BufferFormat format = display::DisplaySnapshot::PrimaryFormat(); + uint32_t fourcc_format = ui::GetFourCCFormatForOpaqueFramebuffer(format); + if (window) { const OverlayPlane* primary = window->GetLastModesetBuffer(); const DrmDevice* drm = controller->GetAllocationDrmDevice().get(); if (primary && primary->buffer->GetSize() == bounds.size() && - primary->buffer->GetDrmDevice() == drm) - return *primary; + primary->buffer->GetDrmDevice() == drm) { + // If the controller doesn't advertise modifiers, wont have a + // modifier either and we can reuse the buffer. Otherwise, check + // to see if the controller supports the buffers format + // modifier. + const auto& modifiers = controller->GetFormatModifiers(fourcc_format); + if (modifiers.empty()) + return *primary; + for (const uint64_t modifier : modifiers) { + if (modifier == primary->buffer->GetFormatModifier()) + return *primary; + } + } } - gfx::BufferFormat format = display::DisplaySnapshot::PrimaryFormat(); scoped_refptr drm = controller->GetAllocationDrmDevice(); - uint32_t fourcc_format = ui::GetFourCCFormatForOpaqueFramebuffer(format); scoped_refptr buffer = buffer_generator_->Create(drm, fourcc_format, bounds.size()); if (!buffer) { diff -Nru chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc --- chromium-browser-59.0.3071.86/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc 2017-06-20 22:03:37.000000000 +0000 @@ -16,7 +16,7 @@ #include "ui/ozone/platform/drm/gpu/drm_window.h" #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" #include "ui/ozone/platform/drm/gpu/mock_drm_device.h" -#include "ui/ozone/platform/drm/gpu/mock_dumb_buffer_generator.h" +#include "ui/ozone/platform/drm/gpu/mock_scanout_buffer_generator.h" #include "ui/ozone/platform/drm/gpu/screen_manager.h" namespace { @@ -51,9 +51,10 @@ } void SetUp() override { - drm_ = new ui::MockDrmDevice(); + drm_ = new ui::MockDrmDevice(false, std::vector(1, kPrimaryCrtc), + 4 /* planes per crtc */); device_manager_.reset(new ui::DrmDeviceManager(nullptr)); - buffer_generator_.reset(new ui::MockDumbBufferGenerator()); + buffer_generator_.reset(new ui::MockScanoutBufferGenerator()); screen_manager_.reset(new ui::ScreenManager(buffer_generator_.get())); } void TearDown() override { @@ -64,7 +65,7 @@ protected: scoped_refptr drm_; std::unique_ptr device_manager_; - std::unique_ptr buffer_generator_; + std::unique_ptr buffer_generator_; std::unique_ptr screen_manager_; private: @@ -515,4 +516,34 @@ window = screen_manager_->RemoveWindow(1); window->Shutdown(); +} + +TEST_F(ScreenManagerTest, RejectBufferWithIncompatibleModifiers) { + std::unique_ptr window( + new ui::DrmWindow(1, device_manager_.get(), screen_manager_.get())); + window->Initialize(buffer_generator_.get()); + window->SetBounds(GetPrimaryBounds()); + scoped_refptr buffer = + buffer_generator_->CreateWithModifier(drm_, DRM_FORMAT_XRGB8888, + I915_FORMAT_MOD_X_TILED, + GetPrimaryBounds().size()); + + window->SchedulePageFlip( + std::vector(1, ui::OverlayPlane(buffer)), + base::Bind(&EmptySwapCallback)); + screen_manager_->AddWindow(1, std::move(window)); + + screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector); + screen_manager_->ConfigureDisplayController( + drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(), + kDefaultMode); + + // ScreenManager::GetModesetBuffer (called to get a buffer to + // modeset the new controller) should reject the buffer with + // I915_FORMAT_MOD_X_TILED modifier we created above and the two + // framebuffer IDs should be different. + EXPECT_NE(buffer->GetFramebufferId(), drm_->current_framebuffer()); + + window = screen_manager_->RemoveWindow(1); + window->Shutdown(); } diff -Nru chromium-browser-59.0.3071.86/ui/webui/resources/js/i18n_behavior.js chromium-browser-59.0.3071.109/ui/webui/resources/js/i18n_behavior.js --- chromium-browser-59.0.3071.86/ui/webui/resources/js/i18n_behavior.js 2017-06-05 19:03:30.000000000 +0000 +++ chromium-browser-59.0.3071.109/ui/webui/resources/js/i18n_behavior.js 2017-06-20 22:03:37.000000000 +0000 @@ -40,7 +40,10 @@ */ i18n: function(id, var_args) { var rawString = this.i18nRaw_.apply(this, arguments); - return parseHtmlSubset('' + rawString + '').firstChild.innerHTML; + var htmlStr = + parseHtmlSubset('' + rawString + '').firstChild.innerHTML; + // TODO(dschuyler): use textContent rather than innerHTML; remove replace(). + return htmlStr.replace(/ /g, '\u00a0'); }, /** diff -Nru chromium-browser-59.0.3071.86/v8/BUILD.gn chromium-browser-59.0.3071.109/v8/BUILD.gn --- chromium-browser-59.0.3071.86/v8/BUILD.gn 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/BUILD.gn 2017-06-20 22:04:42.000000000 +0000 @@ -44,6 +44,9 @@ # Sets -dENABLE_DISASSEMBLER. v8_enable_disassembler = "" + # Sets the number of internal fields on promise objects. + v8_promise_internal_field_count = 0 + # Sets -dENABLE_GDB_JIT_INTERFACE. v8_enable_gdbjit = "" @@ -218,6 +221,10 @@ if (v8_enable_disassembler) { defines += [ "ENABLE_DISASSEMBLER" ] } + if (v8_promise_internal_field_count != 0) { + defines += + [ "V8_PROMISE_INTERNAL_FIELD_COUNT=${v8_promise_internal_field_count}" ] + } if (v8_enable_future) { defines += [ "V8_ENABLE_FUTURE" ] } diff -Nru chromium-browser-59.0.3071.86/v8/gypfiles/features.gypi chromium-browser-59.0.3071.109/v8/gypfiles/features.gypi --- chromium-browser-59.0.3071.86/v8/gypfiles/features.gypi 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/gypfiles/features.gypi 2017-06-20 22:04:42.000000000 +0000 @@ -31,6 +31,8 @@ 'variables': { 'v8_enable_disassembler%': 0, + 'v8_promise_internal_field_count%': 0, + 'v8_enable_gdbjit%': 0, 'v8_enable_verify_csa%': 0, @@ -77,6 +79,9 @@ ['v8_enable_disassembler==1', { 'defines': ['ENABLE_DISASSEMBLER',], }], + ['v8_promise_internal_field_count!=0', { + 'defines': ['V8_PROMISE_INTERNAL_FIELD_COUNT','v8_promise_internal_field_count'], + }], ['v8_enable_gdbjit==1', { 'defines': ['ENABLE_GDB_JIT_INTERFACE',], }], diff -Nru chromium-browser-59.0.3071.86/v8/include/v8.h chromium-browser-59.0.3071.109/v8/include/v8.h --- chromium-browser-59.0.3071.86/v8/include/v8.h 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/include/v8.h 2017-06-20 22:04:42.000000000 +0000 @@ -3823,6 +3823,10 @@ static void CheckCast(Value* obj); }; +#ifndef V8_PROMISE_INTERNAL_FIELD_COUNT +// The number of required internal fields can be defined by embedder. +#define V8_PROMISE_INTERNAL_FIELD_COUNT 0 +#endif /** * An instance of the built-in Promise constructor (ES6 draft). @@ -3904,6 +3908,8 @@ V8_INLINE static Promise* Cast(Value* obj); + static const int kEmbedderFieldCount = V8_PROMISE_INTERNAL_FIELD_COUNT; + private: Promise(); static void CheckCast(Value* obj); diff -Nru chromium-browser-59.0.3071.86/v8/include/v8-version.h chromium-browser-59.0.3071.109/v8/include/v8-version.h --- chromium-browser-59.0.3071.86/v8/include/v8-version.h 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/include/v8-version.h 2017-06-20 22:04:42.000000000 +0000 @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 5 #define V8_MINOR_VERSION 9 #define V8_BUILD_NUMBER 211 -#define V8_PATCH_LEVEL 31 +#define V8_PATCH_LEVEL 38 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff -Nru chromium-browser-59.0.3071.86/v8/src/bootstrapper.cc chromium-browser-59.0.3071.109/v8/src/bootstrapper.cc --- chromium-browser-59.0.3071.86/v8/src/bootstrapper.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/bootstrapper.cc 2017-06-20 22:04:42.000000000 +0000 @@ -2088,9 +2088,9 @@ { // -- P r o m i s e Handle prototype = factory->NewJSObject(isolate->object_function(), TENURED); - Handle promise_fun = - InstallFunction(global, "Promise", JS_PROMISE_TYPE, JSPromise::kSize, - prototype, Builtins::kPromiseConstructor); + Handle promise_fun = InstallFunction( + global, "Promise", JS_PROMISE_TYPE, JSPromise::kSizeWithEmbedderFields, + prototype, Builtins::kPromiseConstructor); InstallWithIntrinsicDefaultProto(isolate, promise_fun, Context::PROMISE_FUNCTION_INDEX); diff -Nru chromium-browser-59.0.3071.86/v8/src/builtins/builtins-promise-gen.cc chromium-browser-59.0.3071.109/v8/src/builtins/builtins-promise-gen.cc --- chromium-browser-59.0.3071.86/v8/src/builtins/builtins-promise-gen.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/builtins/builtins-promise-gen.cc 2017-06-20 22:04:42.000000000 +0000 @@ -31,6 +31,10 @@ SmiConstant(v8::Promise::kPending)); StoreObjectFieldNoWriteBarrier(promise, JSPromise::kFlagsOffset, SmiConstant(0)); + for (int i = 0; i < v8::Promise::kEmbedderFieldCount; i++) { + int offset = JSPromise::kSize + i * kPointerSize; + StoreObjectFieldNoWriteBarrier(promise, offset, SmiConstant(Smi::kZero)); + } } Node* PromiseBuiltinsAssembler::AllocateAndInitJSPromise(Node* context) { @@ -62,6 +66,10 @@ StoreObjectFieldNoWriteBarrier(instance, JSPromise::kResultOffset, result); StoreObjectFieldNoWriteBarrier(instance, JSPromise::kFlagsOffset, SmiConstant(0)); + for (int i = 0; i < v8::Promise::kEmbedderFieldCount; i++) { + int offset = JSPromise::kSize + i * kPointerSize; + StoreObjectFieldNoWriteBarrier(instance, offset, SmiConstant(Smi::kZero)); + } Label out(this); GotoIfNot(IsPromiseHookEnabledOrDebugIsActive(), &out); @@ -98,6 +106,10 @@ debug_event = TrueConstant(); } + Label if_not_constructor(this, Label::kDeferred); + GotoIf(TaggedIsSmi(constructor), &if_not_constructor); + GotoIfNot(IsConstructorMap(LoadMap(constructor)), &if_not_constructor); + Node* native_context = LoadNativeContext(context); Node* map = LoadRoot(Heap::kJSPromiseCapabilityMapRootIndex); @@ -181,6 +193,13 @@ Unreachable(); } + BIND(&if_not_constructor); + { + Node* const message_id = SmiConstant(MessageTemplate::kNotConstructor); + CallRuntime(Runtime::kThrowTypeError, context, message_id, constructor); + Unreachable(); + } + BIND(&out); return var_result.value(); } @@ -304,6 +323,7 @@ // 7. If IsConstructor(S) is true, return S. Label throw_error(this); + GotoIf(TaggedIsSmi(species), &throw_error); Node* species_bitfield = LoadMapBitField(LoadMap(species)); GotoIfNot(Word32Equal(Word32And(species_bitfield, Int32Constant((1 << Map::kIsConstructor))), diff -Nru chromium-browser-59.0.3071.86/v8/src/compiler/access-builder.cc chromium-browser-59.0.3071.109/v8/src/compiler/access-builder.cc --- chromium-browser-59.0.3071.86/v8/src/compiler/access-builder.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/compiler/access-builder.cc 2017-06-20 22:04:42.000000000 +0000 @@ -737,9 +737,9 @@ FieldAccess AccessBuilder::ForFixedArraySlot( size_t index, WriteBarrierKind write_barrier_kind) { int offset = FixedArray::OffsetOfElementAt(static_cast(index)); - FieldAccess access = {kTaggedBase, offset, - Handle(), MaybeHandle(), - Type::NonInternal(), MachineType::AnyTagged(), + FieldAccess access = {kTaggedBase, offset, + Handle(), MaybeHandle(), + Type::Any(), MachineType::AnyTagged(), write_barrier_kind}; return access; } diff -Nru chromium-browser-59.0.3071.86/v8/src/compiler/escape-analysis.cc chromium-browser-59.0.3071.109/v8/src/compiler/escape-analysis.cc --- chromium-browser-59.0.3071.86/v8/src/compiler/escape-analysis.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/compiler/escape-analysis.cc 2017-06-20 22:04:42.000000000 +0000 @@ -853,6 +853,13 @@ case IrOpcode::kObjectIsString: case IrOpcode::kObjectIsSymbol: case IrOpcode::kObjectIsUndetectable: + case IrOpcode::kNumberLessThan: + case IrOpcode::kNumberLessThanOrEqual: + case IrOpcode::kNumberEqual: +#define CASE(opcode) case IrOpcode::k##opcode: + SIMPLIFIED_NUMBER_BINOP_LIST(CASE) + SIMPLIFIED_NUMBER_UNOP_LIST(CASE) +#undef CASE if (SetEscaped(rep)) { TRACE("Setting #%d (%s) to escaped because of use by #%d (%s)\n", rep->id(), rep->op()->mnemonic(), use->id(), diff -Nru chromium-browser-59.0.3071.86/v8/src/factory.cc chromium-browser-59.0.3071.109/v8/src/factory.cc --- chromium-browser-59.0.3071.86/v8/src/factory.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/factory.cc 2017-06-20 22:04:42.000000000 +0000 @@ -927,6 +927,9 @@ Handle promise = Handle::cast(promise_obj); promise->set_status(v8::Promise::kPending); promise->set_flags(0); + for (int i = 0; i < v8::Promise::kEmbedderFieldCount; i++) { + promise->SetEmbedderField(i, Smi::kZero); + } isolate()->RunPromiseHook(PromiseHookType::kInit, promise, undefined_value()); return promise; diff -Nru chromium-browser-59.0.3071.86/v8/src/objects.h chromium-browser-59.0.3071.109/v8/src/objects.h --- chromium-browser-59.0.3071.86/v8/src/objects.h 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/objects.h 2017-06-20 22:04:42.000000000 +0000 @@ -7339,6 +7339,8 @@ kFulfillReactionsOffset + kPointerSize; static const int kFlagsOffset = kRejectReactionsOffset + kPointerSize; static const int kSize = kFlagsOffset + kPointerSize; + static const int kSizeWithEmbedderFields = + kSize + v8::Promise::kEmbedderFieldCount * kPointerSize; // Flags layout. static const int kHasHandlerBit = 0; diff -Nru chromium-browser-59.0.3071.86/v8/src/safepoint-table.cc chromium-browser-59.0.3071.109/v8/src/safepoint-table.cc --- chromium-browser-59.0.3071.86/v8/src/safepoint-table.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/safepoint-table.cc 2017-06-20 22:04:43.000000000 +0000 @@ -52,7 +52,12 @@ SafepointEntry SafepointTable::FindEntry(Address pc) const { unsigned pc_offset = static_cast(pc - code_->instruction_start()); - for (unsigned i = 0; i < length(); i++) { + // We use kMaxUInt32 as sentinel value, so check that we don't hit that. + DCHECK_NE(kMaxUInt32, pc_offset); + unsigned len = length(); + // If pc == kMaxUInt32, then this entry covers all call sites in the function. + if (len == 1 && GetPcOffset(0) == kMaxUInt32) return GetEntry(0); + for (unsigned i = 0; i < len; i++) { // TODO(kasperl): Replace the linear search with binary search. if (GetPcOffset(i) == pc_offset) return GetEntry(i); } @@ -137,6 +142,8 @@ void SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) { + RemoveDuplicates(); + // Make sure the safepoint table is properly aligned. Pad with nops. assembler->Align(kIntSize); assembler->RecordComment(";;; Safepoint table."); @@ -211,6 +218,63 @@ return encoding; } +void SafepointTableBuilder::RemoveDuplicates() { + // If the table contains more than one entry, and all entries are identical + // (except for the pc), replace the whole table by a single entry with pc = + // kMaxUInt32. This especially compacts the table for wasm code without tagged + // pointers and without deoptimization info. + + int length = deoptimization_info_.length(); + DCHECK_EQ(length, deopt_index_list_.length()); + DCHECK_EQ(length, indexes_.length()); + DCHECK_EQ(length, registers_.length()); + + if (length < 2) return; + + // Check that all entries (1, length] are identical to entry 0. + for (int i = 1; i < length; ++i) { + if (!IsIdenticalExceptForPc(0, i)) return; + } + + // If we get here, all entries were identical. Rewind all lists to just one + // entry, and set the pc to kMaxUInt32. + deoptimization_info_.Rewind(1); + deopt_index_list_.Rewind(1); + indexes_.Rewind(1); + registers_.Rewind(1); + deoptimization_info_[0].pc = kMaxUInt32; +} + +bool SafepointTableBuilder::IsIdenticalExceptForPc(int index1, + int index2) const { + DeoptimizationInfo& deopt_info_1 = deoptimization_info_[index1]; + DeoptimizationInfo& deopt_info_2 = deoptimization_info_[index2]; + if (deopt_info_1.arguments != deopt_info_2.arguments) return false; + if (deopt_info_1.has_doubles != deopt_info_2.has_doubles) return false; + + if (deopt_index_list_[index1] != deopt_index_list_[index2]) return false; + + ZoneList* indexes1 = indexes_[index1]; + ZoneList* indexes2 = indexes_[index2]; + if (indexes1->length() != indexes2->length()) return false; + for (int i = 0; i < indexes1->length(); ++i) { + if (indexes1->at(i) != indexes2->at(i)) return false; + } + + ZoneList* registers1 = registers_[index1]; + ZoneList* registers2 = registers_[index2]; + if (registers1) { + if (!registers2) return false; + if (registers1->length() != registers2->length()) return false; + for (int i = 0; i < registers1->length(); ++i) { + if (registers1->at(i) != registers2->at(i)) return false; + } + } else if (registers2) { + return false; + } + + return true; +} } // namespace internal } // namespace v8 diff -Nru chromium-browser-59.0.3071.86/v8/src/safepoint-table.h chromium-browser-59.0.3071.109/v8/src/safepoint-table.h --- chromium-browser-59.0.3071.86/v8/src/safepoint-table.h 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/safepoint-table.h 2017-06-20 22:04:43.000000000 +0000 @@ -216,6 +216,10 @@ uint32_t EncodeExceptPC(const DeoptimizationInfo& info, unsigned index); + bool IsIdenticalExceptForPc(int index1, int index2) const; + // If all entries are identical, replace them by 1 entry with pc = kMaxUInt32. + void RemoveDuplicates(); + ZoneList deoptimization_info_; ZoneList deopt_index_list_; ZoneList*> indexes_; diff -Nru chromium-browser-59.0.3071.86/v8/src/wasm/module-decoder.cc chromium-browser-59.0.3071.109/v8/src/wasm/module-decoder.cc --- chromium-browser-59.0.3071.86/v8/src/wasm/module-decoder.cc 2017-06-05 19:04:29.000000000 +0000 +++ chromium-browser-59.0.3071.109/v8/src/wasm/module-decoder.cc 2017-06-20 22:04:43.000000000 +0000 @@ -214,7 +214,7 @@ TRACE("Section: %s\n", SectionName(section_code_)); if (section_code_ == kUnknownSectionCode && - section_end_ > decoder_.pc()) { + section_end_ >= decoder_.pc()) { // skip to the end of the unknown section. uint32_t remaining = static_cast(section_end_ - decoder_.pc());