Regression: 'fiberlamp' demo is not working after saving image from the page.
Reported by
rk...@etouch.net,
Mar 1 2016
|
|||||||||||||
Issue descriptionChrome Version: 50.0.2661.5 Revision c836bc532e4bd4bacb0be5bb10efd493b0057679-refs/branch-heads/2661@{#19}(32/64 bit) OS: All(Win-7 Aero enabled) What steps will reproduce the problem? 1. Launch chrome,navigate to http://fieldsofnoise.org/fiberlamp 2. Right click on demo and select 'Save Image As' option,then click on 'Show All' option from download bar(navigate to chrome://downloads page ). 3. Come back to previous page and click on demo,observe. Demo is not working after step 2. Demo should work. This is a regression issue,broken in 'M-49',below is bisect info: Good Build: 49.0.2622.0 Bad Build: 49.0.2623.0 Narrow Build: https://chromium.googlesource.com/chromium/src/+log/88257b623292f90c9dd33e98e5c9e0c241fb97fd..1aa3ac45628b36da02fb46f3cc47b6fc09544155?pretty=fuller&n=100 Suspecting: r 369680 ?
,
Mar 1 2016
I can't reproduce this on linux. It is unlikely to be r369680 though since border-radius does not seem to be used at all on that page.
,
Mar 9 2016
I can't reproduce on cros, either. Is this still reproducible by anyone?
,
Mar 14 2016
I can't reproduce on Mac retina 49.0.2323.87 either.
,
Mar 15 2016
With response to comment 4: Issue is reproducible on Mac,Windows and Linux using latest canary 51.0.2678.0, kindly refer the attached video.
,
Mar 15 2016
,
Mar 15 2016
I can reproduce on Linux, but it requires enabling GPU accelerated 2D canvas, which is off by default on linux. Has to be turned on using --ignore-gpu-blacklist I recorded a trace. It shows that after switching to and frome the show all pane, the animation is still running, but the canvas layer is no longer processed during compositor updates. It looks like the state of Canvas2DLayerBridge is confused. I will keep investigating.
,
Mar 22 2016
+cc enne, danakj: I need you advice.
What I have fond is that the animation halts because the layer has lost its reference to the layer tree host, so compositor invalidations are no longer propagated. This happens when we switch back to the fiberlamp tab. What I found is that the CompositorLayerMapping is torn down and never re-created. The compositor activity seem to be in response to a re-layout caused by a change to the frame size. The frame size change is because after click "show all" and coming back, the download bar has disappeared.
When the animation is frozen, resizing the window will unfreeze the animation (after a small delay)
Below is a stack trace that shows where the canvas layer's reference to the layer tree host is lost when switching back to the tab that has the canvas
#0 cc::Layer::SetLayerTreeHost (this=0x67ce70ff020, host=0x0) at ../../cc/layers/layer.cc:143
#1 0x00007f38d79b166c in cc::TextureLayer::SetLayerTreeHost (this=0x67ce70ff020, host=0x0) at ../../cc/layers/texture_layer.cc:194
#2 0x00007f38d795db7e in cc::Layer::SetLayerTreeHost (this=0x67ce6680020, host=0x0) at ../../cc/layers/layer.cc:146
#3 0x00007f38d799bf87 in cc::PictureLayer::SetLayerTreeHost (this=0x67ce6680020, host=0x0) at ../../cc/layers/picture_layer.cc:68
#4 0x00007f38d795db7e in cc::Layer::SetLayerTreeHost (this=0x67ce6680820, host=0x0) at ../../cc/layers/layer.cc:146
#5 0x00007f38d799bf87 in cc::PictureLayer::SetLayerTreeHost (this=0x67ce6680820, host=0x0) at ../../cc/layers/picture_layer.cc:68
#6 0x00007f38d795e3e1 in cc::Layer::SetParent (this=0x67ce6680820, layer=0x0) at ../../cc/layers/layer.cc:254
#7 0x00007f38d795eb84 in cc::Layer::RemoveChildOrDependent (this=0x67ce5896420, child=0x67ce6680820) at ../../cc/layers/layer.cc:305
#8 0x00007f38d795da06 in cc::Layer::RemoveFromParent (this=0x67ce6680820) at ../../cc/layers/layer.cc:282
#9 0x00007f38c1a4ed71 in cc_blink::WebLayerImpl::removeFromParent (this=0x67ce6007200) at ../../cc/blink/web_layer_impl.cc:79
#10 0x00007f38d8752cfb in blink::GraphicsLayer::removeFromParent (this=0x2fe15c736810) at ../../third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp:267
#11 0x00007f38c28ebde0 in blink::CompositedLayerMapping::updateSquashingLayers (this=0x2fe15c7441f0, needsSquashingLayers=false)
at ../../third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp:1719
#12 0x00007f38c28eac7d in blink::CompositedLayerMapping::~CompositedLayerMapping (this=0x2fe15c7441f0)
at ../../third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp:208
#13 0x00007f38c28ebfe9 in blink::CompositedLayerMapping::~CompositedLayerMapping (this=0x2fe15c7441f0)
at ../../third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp:185
#14 0x00007f38c21d7dfb in WTF::OwnedPtrDeleter<blink::DOMObjectHolderBase>::deletePtr (ptr=0x2fe15c7441f0) at ../../third_party/WebKit/Source/wtf/OwnPtrCommon.h:54
#15 0x00007f38c22870d7 in WTF::OwnPtr<blink::ThreadDebugger>::clear (this=0x67ce5ccc950) at ../../third_party/WebKit/Source/wtf/OwnPtr.h:137
#16 0x00007f38c3063688 in blink::PaintLayer::clearCompositedLayerMapping (this=0x3e7d19008498, layerBeingDestroyed=false)
at ../../third_party/WebKit/Source/core/paint/PaintLayer.cpp:2337
#17 0x00007f38c2906367 in blink::PaintLayerCompositor::allocateOrClearCompositedLayerMapping (this=0x2fe15c6681c0, layer=0x3e7d19008498,
compositedLayerUpdate=blink::RemoveOwnCompositedLayerMapping) at ../../third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp:499
#18 0x00007f38c28fdfd5 in blink::CompositingLayerAssigner::assignLayersToBackingsInternal (this=0x7ffc29da0b68, layer=0x3e7d19008498, squashingState=...,
layersNeedingPaintInvalidation=...) at ../../third_party/WebKit/Source/core/layout/compositing/CompositingLayerAssigner.cpp:264
#19 0x00007f38c28fe461 in blink::CompositingLayerAssigner::assignLayersToBackingsInternal (this=0x7ffc29da0b68, layer=0x3e7d190080f8, squashingState=...,
layersNeedingPaintInvalidation=...) at ../../third_party/WebKit/Source/core/layout/compositing/CompositingLayerAssigner.cpp:309
#20 0x00007f38c28fe461 in blink::CompositingLayerAssigner::assignLayersToBackingsInternal (this=0x7ffc29da0b68, layer=0x3e7d19008010, squashingState=...,
layersNeedingPaintInvalidation=...) at ../../third_party/WebKit/Source/core/layout/compositing/CompositingLayerAssigner.cpp:309
#21 0x00007f38c28fde39 in blink::CompositingLayerAssigner::assign (this=0x7ffc29da0b68, updateRoot=0x3e7d19008010, layersNeedingPaintInvalidation=...)
at ../../third_party/WebKit/Source/core/layout/compositing/CompositingLayerAssigner.cpp:57
#22 0x00007f38c290532a in blink::PaintLayerCompositor::updateIfNeeded (this=0x2fe15c6681c0)
at ../../third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp:375
#23 0x00007f38c2904e9b in blink::PaintLayerCompositor::updateIfNeededRecursive (this=0x2fe15c6681c0)
at ../../third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp:230
#24 0x00007f38c2db716e in blink::FrameView::updateLifecyclePhasesInternal (this=0x109a62cddb50, phases=blink::FrameView::AllPhases)
at ../../third_party/WebKit/Source/core/frame/FrameView.cpp:2439
#25 0x00007f38c2db6e82 in blink::FrameView::updateAllLifecyclePhases (this=0x109a62cddb50) at ../../third_party/WebKit/Source/core/frame/FrameView.cpp:2382
#26 0x00007f38c2ff8391 in blink::PageAnimator::updateAllLifecyclePhases (this=0x65a5dc61870, rootFrame=...)
at ../../third_party/WebKit/Source/core/page/PageAnimator.cpp:85
#27 0x00007f38d8070a75 in blink::PageWidgetDelegate::updateAllLifecyclePhases (page=..., root=...) at ../../third_party/WebKit/Source/web/PageWidgetDelegate.cpp:62
#28 0x00007f38d8151448 in blink::WebViewImpl::updateAllLifecyclePhases (this=0x2fe15c6d8010) at ../../third_party/WebKit/Source/web/WebViewImpl.cpp:1953
#29 0x00007f38d81535a0 in blink::WebViewImpl::resizeViewWhileAnchored (this=0x2fe15c6d8010, view=0x109a62cddb50)
at ../../third_party/WebKit/Source/web/WebViewImpl.cpp:1860
#30 0x00007f38d81538e6 in blink::WebViewImpl::resize (this=0x2fe15c6d8010, newSize=...) at ../../third_party/WebKit/Source/web/WebViewImpl.cpp:1899
#31 0x00007f38d4ec80b0 in content::RenderWidget::Resize (this=0x67ce5396020, params=...) at ../../content/renderer/render_widget.cc:1152
#32 0x00007f38d4ec4612 in content::RenderWidget::OnResize (this=0x67ce5396020, params=...) at ../../content/renderer/render_widget.cc:577
#33 0x00007f38d4ea0fdd in content::RenderViewImpl::OnResize (this=0x67ce5396020, params=...) at ../../content/renderer/render_view_impl.cc:2684
#34 0x00007f38d4ed3c69 in base::DispatchToMethodImpl<content::RenderWidget*, void (content::RenderWidget::*)(content::ResizeParams const&), content::ResizeParams, 0ul> (obj=@0x7ffc29da1c78: 0x67ce5396020, method=&virtual content::RenderWidget::OnResize(content::ResizeParams const&), arg=empty std::tuple)
at ../../base/tuple.h:166
#35 0x00007f38d4ed3bc5 in base::DispatchToMethod<content::RenderWidget*, void (content::RenderWidget::*)(content::ResizeParams const&), content::ResizeParams> (
obj=@0x7ffc29da1c78: 0x67ce5396020, method=&virtual content::RenderWidget::OnResize(content::ResizeParams const&), arg=empty std::tuple)
at ../../base/tuple.h:173
#36 0x00007f38d4ed3b6f in IPC::DispatchToMethod<content::RenderWidget, void (content::RenderWidget::*)(content::ResizeParams const&), void, std::tuple<content::ResizeParams> > (obj=0x67ce5396020, method=&virtual content::RenderWidget::OnResize(content::ResizeParams const&), tuple=empty std::tuple)
at ../../ipc/ipc_message_templates.h:25
#37 0x00007f38d4ecd174 in IPC::MessageT<ViewMsg_Resize_Meta, std::tuple<content::ResizeParams>, void>::Dispatch<content::RenderWidget, content::RenderWidget, void, void (content::RenderWidget::*)(content::ResizeParams const&)> (msg=0x67ce5fd31c0, obj=0x67ce5396020, sender=0x67ce5396020, parameter=0x0,
func=&virtual content::RenderWidget::OnResize(content::ResizeParams const&)) at ../../ipc/ipc_message_templates.h:119
#38 0x00007f38d4ec2e6f in content::RenderWidget::OnMessageReceived (this=0x67ce5396020, message=...) at ../../content/renderer/render_widget.cc:467
#39 0x00007f38d4e98faf in content::RenderViewImpl::OnMessageReceived (this=0x67ce5396020, message=...) at ../../content/renderer/render_view_impl.cc:1418
#40 0x00007f38d1b0cd5b in IPC::MessageRouter::RouteMessage (this=0x67ce5269a60, msg=...) at ../../ipc/message_router.cc:52
#41 0x00007f38d4829478 in content::ChildThreadImpl::ChildThreadMessageRouter::RouteMessage (this=0x67ce5269a60, msg=...)
at ../../content/child/child_thread_impl.cc:334
#42 0x00007f38d1b0ccde in IPC::MessageRouter::OnMessageReceived (this=0x67ce5269a60, msg=...) at ../../ipc/message_router.cc:44
#43 0x00007f38d482cb9d in content::ChildThreadImpl::OnMessageReceived (this=0x67ce5269a28, msg=...) at ../../content/child/child_thread_impl.cc:669
#44 0x00007f38d1ad3633 in IPC::ChannelProxy::Context::OnDispatchMessage (this=0x67ce52c67a0, message=...) at ../../ipc/ipc_channel_proxy.cc:293
#45 0x00007f38d1ad7f81 in base::internal::RunnableAdapter<void (IPC::ChannelProxy::Context::*)(IPC::Message const&)>::Run<IPC::Message const&> (
this=0x7ffc29da44f0, object=0x67ce52c67a0, args=...) at ../../base/bind_internal.h:181
#46 0x00007f38d1ad7eb1 in base::internal::InvokeHelper<false, void, base::internal::RunnableAdapter<void (IPC::ChannelProxy::Context::*)(IPC::Message const&)> >::MakeItSo<IPC::ChannelProxy::Context*, IPC::Message const&>(base::internal::RunnableAdapter<void (IPC::ChannelProxy::Context::*)(IPC::Message const&)>, IPC::ChannelProxy::Context*&&, IPC::Message const&) (runnable=..., args=..., args=...) at ../../base/bind_internal.h:301
---Type <return> to continue, or q <return> to quit---
#47 0x00007f38d1ad7e60 in base::internal::Invoker<base::IndexSequence<0ul, 1ul>, base::internal::BindState<base::internal::RunnableAdapter<void (IPC::ChannelProxy::Context::*)(IPC::Message const&)>, void (IPC::ChannelProxy::Context*, IPC::Message const&), IPC::ChannelProxy::Context*, IPC::Message const&>, base::internal::InvokeHelper<false, void, base::internal::RunnableAdapter<void (IPC::ChannelProxy::Context::*)(IPC::Message const&)> >, void ()>::Run(base::internal::BindStateBase*) (
base=0x67ce5fd31a0) at ../../base/bind_internal.h:352
#48 0x00007f38d91f11ee in base::Callback<void (), (base::internal::CopyMode)1>::Run() const (this=0x7ffc29da4850) at ../../base/callback.h:397
#49 0x00007f38d920f11e in base::debug::TaskAnnotator::RunTask (this=0x67ce525df40, queue_function=0x7f38c14afced <.L.str.13> "TaskQueueManager::PostTask",
pending_task=...) at ../../base/debug/task_annotator.cc:51
#50 0x00007f38c1466672 in scheduler::TaskQueueManager::ProcessTaskFromWorkQueue (this=0x67ce525de20, work_queue=0x67ce55400e0, out_previous_task=0x7ffc29da4b18)
at ../../components/scheduler/base/task_queue_manager.cc:288
#51 0x00007f38c14645f2 in scheduler::TaskQueueManager::DoWork (this=0x67ce525de20, run_time=..., from_main_thread=false)
at ../../components/scheduler/base/task_queue_manager.cc:200
#52 0x00007f38c146bdbe in base::internal::RunnableAdapter<void (scheduler::TaskQueueManager::*)(base::TimeTicks, bool)>::Run<base::TimeTicks const&, bool const&> (
this=0x7ffc29da4e00, object=0x67ce525de20, args=@0x67ce55550c0: false, args=@0x67ce55550c0: false) at ../../base/bind_internal.h:181
#53 0x00007f38c146bcba in base::internal::InvokeHelper<true, void, base::internal::RunnableAdapter<void (scheduler::TaskQueueManager::*)(base::TimeTicks, bool)> >::MakeItSo<base::WeakPtr<scheduler::TaskQueueManager>, base::TimeTicks const&, bool const&> (runnable=..., weak_ptr=..., args=@0x67ce55550c0: false,
args=@0x67ce55550c0: false) at ../../base/bind_internal.h:314
#54 0x00007f38c146bc38 in base::internal::Invoker<base::IndexSequence<0ul, 1ul, 2ul>, base::internal::BindState<base::internal::RunnableAdapter<void (scheduler::TaskQueueManager::*)(base::TimeTicks, bool)>, void (scheduler::TaskQueueManager*, base::TimeTicks, bool), base::WeakPtr<scheduler::TaskQueueManager>, base::TimeTicks, bool>, base::internal::InvokeHelper<true, void, base::internal::RunnableAdapter<void (scheduler::TaskQueueManager::*)(base::TimeTicks, bool)> >, void ()>::Run(base::internal::BindStateBase*) (base=0x67ce55550a0) at ../../base/bind_internal.h:352
#55 0x00007f38d91f11ee in base::Callback<void (), (base::internal::CopyMode)1>::Run() const (this=0x7ffc29da52f8) at ../../base/callback.h:397
#56 0x00007f38d920f11e in base::debug::TaskAnnotator::RunTask (this=0x67ce52c6e90, queue_function=0x7f38d9465706 <.L.str.9> "MessageLoop::PostTask",
pending_task=...) at ../../base/debug/task_annotator.cc:51
#57 0x00007f38d928144f in base::MessageLoop::RunTask (this=0x67ce52c6ca0, pending_task=...) at ../../base/message_loop/message_loop.cc:476
#58 0x00007f38d92816d8 in base::MessageLoop::DeferOrRunPendingTask (this=0x67ce52c6ca0, pending_task=...) at ../../base/message_loop/message_loop.cc:485
#59 0x00007f38d92818a2 in base::MessageLoop::DoWork (this=0x67ce52c6ca0) at ../../base/message_loop/message_loop.cc:597
#60 0x00007f38d9293083 in base::MessagePumpDefault::Run (this=0x67ce5274140, delegate=0x67ce52c6ca0) at ../../base/message_loop/message_pump_default.cc:33
#61 0x00007f38d9280e7f in base::MessageLoop::RunHandler (this=0x67ce52c6ca0) at ../../base/message_loop/message_loop.cc:440
#62 0x00007f38d92f80f4 in base::RunLoop::Run (this=0x7ffc29da5778) at ../../base/run_loop.cc:35
#63 0x00007f38d927ff24 in base::MessageLoop::Run (this=0x67ce52c6ca0) at ../../base/message_loop/message_loop.cc:293
#64 0x00007f38d4ef19d8 in content::RendererMain (parameters=...) at ../../content/renderer/renderer_main.cc:219
#65 0x00007f38d3adcd46 in content::RunZygote (main_function_params=..., delegate=0x7ffc29da67c8) at ../../content/app/content_main_runner.cc:316
#66 0x00007f38d3adcff0 in content::RunNamedProcessTypeMain (process_type="zygote", main_function_params=..., delegate=0x7ffc29da67c8)
at ../../content/app/content_main_runner.cc:403
#67 0x00007f38d3adf5dd in content::ContentMainRunnerImpl::Run (this=0x67ce5274e30) at ../../content/app/content_main_runner.cc:766
#68 0x00007f38d3adc332 in content::ContentMain (params=...) at ../../content/app/content_main.cc:19
#69 0x00007f38d9ed5fe6 in ChromeMain (argc=2, argv=0x7ffc29da6918) at ../../chrome/app/chrome_main.cc:84
#70 0x00007f38d9ed5f72 in main (argc=2, argv=0x7ffc29da6918) at ../../chrome/app/chrome_exe_main_aura.cc:17
,
Mar 22 2016
I think we need input from the blink compositing integration folks. I'm not familiar with GraphicsLayer and below. chrishtr? I'll add a few others.
,
Mar 28 2016
It looks like the canvas is losing its backing because Blink decides it doesn't need to be composited. Is that incorrect? Why did it lose its compositing triggers?
,
Mar 29 2016
The issue goes away when if I disable canvas hibernation in the code. Hibernation is this new thing where we free the GPU resources held by canvases in pages that are not visible (e.g. background tabs). While the page is in the background, attempting to paint to the canvas will result in the canvas switch to software rendering mode (not composited). When the page becomes visible again, the canvas is re-uploaded to the GPU, and GPU-accelerated rendering resumes (or at least it is supposed to). In tests this works fine.
,
Apr 4 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/30569cfdd5902ae953a0a9e07d19d828c57f5f6f commit 30569cfdd5902ae953a0a9e07d19d828c57f5f6f Author: junov <junov@chromium.org> Date: Mon Apr 04 20:20:01 2016 Disable 2D canvas switch to CPU rendering while backgrounded The switch to software rendering that happens when actively drawing to a canvas while the containing page is in the background was cause the compositing layer to get into a corrupted state. This fix disables the feature until a permanent solution can be found BUG= 591029 Review URL: https://codereview.chromium.org/1857763002 Cr-Commit-Position: refs/heads/master@{#384990} [modify] https://crrev.com/30569cfdd5902ae953a0a9e07d19d828c57f5f6f/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp [modify] https://crrev.com/30569cfdd5902ae953a0a9e07d19d828c57f5f6f/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h [modify] https://crrev.com/30569cfdd5902ae953a0a9e07d19d828c57f5f6f/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp
,
Apr 4 2016
,
Apr 5 2016
Requesting permission to merge to M50 This is a very simple fix that repairs a wider-spread issue that is causing several in-production websites to malfunction with Chrome 49. There have been reports of canvases going blank after switching tabs. Engineers from periscopedata.com have have confirmed, in a private thread, that the latest Canary, which has this fix, solves the issue.
,
Apr 5 2016
[Automated comment] Less than 2 weeks to go before stable on M50, manual review required.
,
Apr 5 2016
,
Apr 5 2016
First, this issue can not be reproduced on my laptop with GPU(Quadro1000M) acceleration Graphics Feature Status Canvas: Hardware accelerated Flash: Hardware accelerated Flash Stage3D: Hardware accelerated Flash Stage3D Baseline profile: Hardware accelerated Compositing: Hardware accelerated Multiple Raster Threads: Enabled Rasterization: Software only. Hardware acceleration disabled Video Decode: Hardware accelerated Video Encode: Hardware accelerated WebGL: Hardware accelerated Second, Issue 599177 was still reproducible in Chrome Canary: Version 51.0.2700.0 canary (64-bit)
,
Apr 7 2016
Merge approved for M50 (branch 2661). Pls go ahead merge.
,
Apr 7 2016
Please merge your change to M50 branch 2661 by 5:00 PM PST on April 8th,Friday to make into the desktop Stable final build cut. Thank you.
,
Apr 8 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/06bb6cf8eb3c04254e4f5187a644ddb086b7afcc commit 06bb6cf8eb3c04254e4f5187a644ddb086b7afcc Author: Justin Novosad <junov@chromium.org> Date: Fri Apr 08 19:05:42 2016 Disable 2D canvas switch to CPU rendering while backgrounded The switch to software rendering that happens when actively drawing to a canvas while the containing page is in the background was cause the compositing layer to get into a corrupted state. This fix disables the feature until a permanent solution can be found BUG= 591029 Review URL: https://codereview.chromium.org/1857763002 Cr-Commit-Position: refs/heads/master@{#384990} (cherry picked from commit 30569cfdd5902ae953a0a9e07d19d828c57f5f6f) Review URL: https://codereview.chromium.org/1877473002 . Cr-Commit-Position: refs/branch-heads/2661@{#532} Cr-Branched-From: ef6f6ae5e4c96622286b563658d5cd62a6cf1197-refs/heads/master@{#378081} [modify] https://crrev.com/06bb6cf8eb3c04254e4f5187a644ddb086b7afcc/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp [modify] https://crrev.com/06bb6cf8eb3c04254e4f5187a644ddb086b7afcc/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.h [modify] https://crrev.com/06bb6cf8eb3c04254e4f5187a644ddb086b7afcc/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp
,
Apr 11 2016
Issue 601382 has been merged into this issue.
,
Apr 13 2016
Tested the issue on Windows 7, Mac 10.10.5, Ubuntu 14.04 using 50.0.2661.75.Observed that 'fiberlamp' demo is working after saving image from the page. Please find attached screencast. Marking it as TE-Verified. |
|||||||||||||
►
Sign in to add a comment |
|||||||||||||
Comment 1 by ranjitkan@chromium.org
, Mar 1 2016