Index: chrome/browser/devtools/devtools_targets_ui.cc |
diff --git a/chrome/browser/devtools/devtools_targets_ui.cc b/chrome/browser/devtools/devtools_targets_ui.cc |
index f45c2fbf353c7d13b5ac2caf149a229ea76eff5d..c199dd22fce74e2588130cf6d7a82876028ec62f 100644 |
--- a/chrome/browser/devtools/devtools_targets_ui.cc |
+++ b/chrome/browser/devtools/devtools_targets_ui.cc |
@@ -18,6 +18,7 @@ |
#include "base/values.h" |
#include "base/version.h" |
#include "chrome/browser/devtools/device/devtools_android_bridge.h" |
+#include "chrome/browser/devtools/serialize_dictionary_forest.h" |
#include "content/public/browser/browser_child_process_observer.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/child_process_data.h" |
@@ -233,35 +234,34 @@ void LocalTargetsUIHandler::UpdateTargets() { |
void LocalTargetsUIHandler::SendTargets( |
const content::DevToolsAgentHost::List& targets) { |
- base::ListValue list_value; |
- std::map<std::string, base::DictionaryValue*> id_to_descriptor; |
- |
- targets_.clear(); |
- for (scoped_refptr<DevToolsAgentHost> host : targets) { |
- targets_[host->GetId()] = host; |
- id_to_descriptor[host->GetId()] = Serialize(host).release(); |
- } |
+ std::vector<DictionaryForestNode> forest; |
+ forest.reserve(targets.size()); |
+ |
+ { |
+ std::map<std::string, DictionaryForestNode*> id_to_node; |
jdoerrie
2017/04/18 09:57:44
Small suggestion:
Given that you care about perfor
vabr (Chromium)
2017/04/19 11:03:17
Thanks!
What I'm reading in the description of ba
jdoerrie
2017/04/19 11:45:51
No, you are right, the main advantages of flat con
|
+ |
+ // Reset |targets_| and fill the forest with nodes without edges. |
+ targets_.clear(); |
+ for (const scoped_refptr<DevToolsAgentHost>& host : targets) { |
+ targets_[host->GetId()] = host; |
+ forest.push_back({nullptr, *Serialize(host.get())}); |
+ id_to_node[host->GetId()] = &forest.back(); |
+ } |
- for (auto& it : targets_) { |
- scoped_refptr<DevToolsAgentHost> host = it.second; |
- base::DictionaryValue* descriptor = id_to_descriptor[host->GetId()]; |
- DCHECK(descriptor); |
- std::string parent_id = host->GetParentId(); |
- if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) { |
- list_value.Append(base::WrapUnique(descriptor)); |
- } else { |
- base::DictionaryValue* parent = id_to_descriptor[parent_id]; |
- base::ListValue* guests_weak = NULL; |
- if (!parent->GetList(kGuestList, &guests_weak)) { |
- auto guests = base::MakeUnique<base::ListValue>(); |
- guests_weak = guests.get(); |
- parent->Set(kGuestList, std::move(guests)); |
- } |
- guests_weak->Append(base::WrapUnique(descriptor)); |
+ // Now add the edges. |
+ for (const scoped_refptr<DevToolsAgentHost>& host : targets) { |
+ std::string parent_id = host->GetParentId(); |
+ if (parent_id.empty()) |
+ continue; |
+ auto node_it = id_to_node.find(parent_id); |
+ if (node_it == id_to_node.end()) |
+ continue; |
+ id_to_node[host->GetId()]->parent = node_it->second; |
} |
} |
- SendSerializedTargets(list_value); |
+ SendSerializedTargets( |
+ SerializeDictionaryForest(std::move(forest), kGuestList)); |
dgozman
2017/04/17 21:22:43
Since there could be no more than one parent, I ha
vabr (Chromium)
2017/04/18 08:52:49
Thanks for the suggestion.
One thing which is les
|
} |
// AdbTargetsUIHandler -------------------------------------------------------- |
@@ -369,7 +369,8 @@ void AdbTargetsUIHandler::DeviceListChanged( |
remote_browsers_[browser_id] = browser; |
for (const auto& page : browser->pages()) { |
scoped_refptr<DevToolsAgentHost> host = page->CreateTarget(); |
- std::unique_ptr<base::DictionaryValue> target_data = Serialize(host); |
+ std::unique_ptr<base::DictionaryValue> target_data = |
+ Serialize(host.get()); |
// Pass the screen size in the target object to make sure that |
// the caching logic does not prevent the target item from updating |
// when the screen size changes. |
@@ -438,7 +439,7 @@ DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) { |
} |
std::unique_ptr<base::DictionaryValue> DevToolsTargetsUIHandler::Serialize( |
- scoped_refptr<DevToolsAgentHost> host) { |
+ DevToolsAgentHost* host) { |
auto target_data = base::MakeUnique<base::DictionaryValue>(); |
target_data->SetString(kTargetSourceField, source_id_); |
target_data->SetString(kTargetIdField, host->GetId()); |