Commit 36deec06 authored by Alex Rudenko's avatar Alex Rudenko Committed by Commit Bot

Create AXContext lazily in the overlay agent

This CL creates AXContext instances lazily when InspectorHighlight
instances that fetch accessibility attributes are created. It relies
on the GC for cleanup instead of DOM agent's DOM listener API.

Bug: 1112066
Change-Id: I737204c2bbcd97b00c17cff989587d5d71d40184
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2416456
Commit-Queue: Alex Rudenko <alexrudenko@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Reviewed-by: default avatarSigurd Schneider <sigurds@chromium.org>
Cr-Commit-Position: refs/heads/master@{#810125}
parent 09fb9ba1
......@@ -131,6 +131,8 @@ void SearchingForNodeTool::Draw(float scale) {
!omit_tooltip_ && highlight_config_->show_info &&
node->GetLayoutObject() &&
node->GetDocument().GetFrame();
DCHECK(overlay_);
overlay_->EnsureAXContext(node);
InspectorHighlight highlight(node, *highlight_config_, contrast_info_,
append_element_info, false, is_locked_ancestor_);
if (event_target_node_) {
......@@ -336,6 +338,10 @@ void NodeHighlightTool::DrawMatchingSelector() {
ContainerNode* query_base = node_->ContainingShadowRoot();
if (!query_base)
query_base = node_->ownerDocument();
DCHECK(overlay_);
overlay_->EnsureAXContext(query_base);
StaticElementList* elements = query_base->QuerySelectorAll(
AtomicString(selector_list_), exception_state);
if (exception_state.HadException())
......@@ -363,6 +369,8 @@ std::unique_ptr<protocol::DictionaryValue>
NodeHighlightTool::GetNodeInspectorHighlightAsJson(
bool append_element_info,
bool append_distance_info) const {
DCHECK(overlay_);
overlay_->EnsureAXContext(node_.Get());
InspectorHighlight highlight(node_.Get(), *highlight_config_, contrast_info_,
append_element_info, append_distance_info,
is_locked_ancestor_);
......@@ -551,6 +559,8 @@ void NearbyDistanceTool::Draw(float scale) {
Node* node = hovered_node_.Get();
if (!node)
return;
DCHECK(overlay_);
overlay_->EnsureAXContext(node);
InspectorHighlight highlight(
node, InspectorHighlight::DefaultConfig(),
InspectorHighlightContrastInfo(), false /* append_element_info */,
......
......@@ -427,26 +427,18 @@ Response InspectorOverlayAgent::enable() {
}
backend_node_id_to_inspect_ = 0;
SetNeedsUnbufferedInput(true);
dom_agent_->AddDOMListener(this);
for (Document* document : dom_agent_->Documents())
DidAddDocument(document);
return Response::Success();
}
void InspectorOverlayAgent::DidAddDocument(Document* document) {
auto context = std::make_unique<AXContext>(*document);
document_to_ax_context_.Set(document, std::move(context));
}
void InspectorOverlayAgent::DidRemoveDocument(Document* document) {
document_to_ax_context_.erase(document);
void InspectorOverlayAgent::EnsureAXContext(Node* node) {
Document& document = node->GetDocument();
if (!document_to_ax_context_.Contains(&document)) {
auto context = std::make_unique<AXContext>(document);
document_to_ax_context_.Set(&document, std::move(context));
}
}
void InspectorOverlayAgent::WillRemoveDOMNode(Node* node) {}
void InspectorOverlayAgent::DidModifyDOMAttr(Element* element) {}
Response InspectorOverlayAgent::disable() {
enabled_.Clear();
setShowAdHighlights(false);
......@@ -474,7 +466,6 @@ Response InspectorOverlayAgent::disable() {
persistent_tool_ = nullptr;
PickTheRightTool();
SetNeedsUnbufferedInput(false);
dom_agent_->RemoveDOMListener(this);
document_to_ax_context_.clear();
return Response::Success();
}
......@@ -825,6 +816,7 @@ Response InspectorOverlayAgent::getHighlightObjectForTest(
}
NodeHighlightTool tool(node, "" /* selector_list */, std::move(config));
tool.Init(this, GetFrontend());
*result = tool.GetNodeInspectorHighlightAsJson(
true /* append_element_info */, include_distance.fromMaybe(false));
return Response::Success();
......@@ -834,6 +826,7 @@ Response InspectorOverlayAgent::getGridHighlightObjectsForTest(
std::unique_ptr<protocol::Array<int>> node_ids,
std::unique_ptr<protocol::DictionaryValue>* highlights) {
GridHighlightTool grid_highlight_tool;
grid_highlight_tool.Init(this, GetFrontend());
for (const int node_id : *node_ids) {
Node* node = nullptr;
Response response = dom_agent_->AssertNode(node_id, node);
......@@ -859,6 +852,7 @@ Response InspectorOverlayAgent::getSourceOrderHighlightObjectForTest(
InspectorSourceOrderHighlight::DefaultConfig());
SourceOrderTool tool(node, std::move(config));
tool.Init(this, GetFrontend());
*result = tool.GetNodeInspectorSourceOrderHighlightAsJson();
return Response::Success();
}
......
......@@ -130,7 +130,6 @@ class CORE_EXPORT Hinge final : public GarbageCollected<Hinge> {
class CORE_EXPORT InspectorOverlayAgent final
: public InspectorBaseAgent<protocol::Overlay::Metainfo>,
public InspectorDOMAgent::DOMListener,
public InspectorOverlayHost::Delegate {
public:
static std::unique_ptr<InspectorGridHighlightConfig> ToGridHighlightConfig(
......@@ -212,6 +211,7 @@ class CORE_EXPORT InspectorOverlayAgent final
void Dispose() override;
void Inspect(Node*);
void EnsureAXContext(Node*);
void DispatchBufferedTouchEvents();
WebInputEventResult HandleInputEvent(const WebInputEvent&);
WebInputEventResult HandleInputEventInOverlay(const WebInputEvent&);
......@@ -238,12 +238,6 @@ class CORE_EXPORT InspectorOverlayAgent final
// InspectorOverlayHost::Delegate implementation.
void Dispatch(const String& message) override;
// InspectorDOMAgent::DOMListener implementation
void DidAddDocument(Document*) override;
void DidRemoveDocument(Document*) override;
void WillRemoveDOMNode(Node*) override;
void DidModifyDOMAttr(Element*) override;
bool IsEmpty();
LocalFrame* OverlayMainFrame();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment