Index: chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc |
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc |
index 97f746f60fc83e28d20ef544598de70092f3d14e..8c034c18df0052288145411af379f58a8c9e3568 100644 |
--- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc |
+++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc |
@@ -22,7 +22,9 @@ |
#include "chromeos/chromeos_switches.h" |
#include "components/arc/arc_bridge_service.h" |
#include "components/arc/instance_holder.h" |
+#include "components/exo/surface.h" |
#include "content/public/browser/browser_thread.h" |
+#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/window.h" |
#include "ui/compositor/layer.h" |
#include "ui/compositor/layer_owner.h" |
@@ -39,6 +41,8 @@ namespace arc { |
namespace { |
+using LayerSet = base::flat_set<const ui::Layer*>; |
+ |
void ScreenshotCallback( |
const mojom::VoiceInteractionFrameworkHost::CaptureFocusedWindowCallback& |
callback, |
@@ -51,9 +55,26 @@ void ScreenshotCallback( |
callback.Run(result); |
} |
+bool IsMetalayerWindow(aura::Window* window) { |
+ exo::Surface* surface = exo::Surface::AsSurface(window); |
+ return surface != nullptr && surface->IsStylusOnly(); |
+} |
+ |
+void CollectLayers(LayerSet& layers, |
+ aura::Window* root_window, |
+ base::Callback<bool(aura::Window*)> matcher_func) { |
+ if (matcher_func.Run(root_window)) |
+ layers.insert(root_window->layer()); |
+ |
+ aura::Window::Windows children = root_window->children(); |
+ for (aura::Window::Windows::iterator iter = children.begin(); |
+ iter != children.end(); ++iter) { |
+ CollectLayers(layers, *iter, matcher_func); |
+ } |
+} |
+ |
std::unique_ptr<ui::LayerTreeOwner> CreateLayerTreeForSnapshot( |
aura::Window* root_window) { |
- using LayerSet = base::flat_set<const ui::Layer*>; |
LayerSet blocked_layers; |
for (auto* browser : *BrowserList::GetInstance()) { |
if (browser->profile()->IsOffTheRecord()) |
@@ -61,15 +82,7 @@ std::unique_ptr<ui::LayerTreeOwner> CreateLayerTreeForSnapshot( |
} |
LayerSet excluded_layers; |
- // For the best UX the metalayer has to be excluded from the snapshot. |
- // It is currently impossible to identify the metalayer among others layers |
- // under kShellWindowId_SystemModalContainer. Other layers in this container |
- // are not relevant for this kind of snapshot, so it is safe to exclude all |
- // of them. |
- aura::Window* modal_container = ash::Shell::GetContainer( |
- root_window, ash::kShellWindowId_SystemModalContainer); |
- if (modal_container != nullptr) |
- excluded_layers.insert(modal_container->layer()); |
+ CollectLayers(excluded_layers, root_window, base::Bind(IsMetalayerWindow)); |
auto layer_tree_owner = ::wm::RecreateLayersWithClosure( |
root_window, base::BindRepeating( |