Chromium Code Reviews| Index: ash/common/devtools/ash_devtools_css_agent.cc |
| diff --git a/ash/common/devtools/ash_devtools_css_agent.cc b/ash/common/devtools/ash_devtools_css_agent.cc |
| index aebfb21763dc9ef264594363dead046a5d08a875..efcd6052421fb4b93fd6eecb26cd9a3a337f4694 100644 |
| --- a/ash/common/devtools/ash_devtools_css_agent.cc |
| +++ b/ash/common/devtools/ash_devtools_css_agent.cc |
| @@ -4,7 +4,11 @@ |
| #include "ash/common/devtools/ash_devtools_css_agent.h" |
| +#include "ash/common/wm_lookup.h" |
| #include "ash/common/wm_window.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| +#include "ui/display/display.h" |
| namespace ash { |
| namespace devtools { |
| @@ -12,9 +16,24 @@ namespace devtools { |
| namespace { |
| using namespace ui::devtools::protocol; |
| +const char kHeight[] = "height"; |
| +const char kWidth[] = "width"; |
| +const char kX[] = "x"; |
| +const char kY[] = "y"; |
| + |
| +std::unique_ptr<CSS::SourceRange> BuildDefaultSourceRange() { |
| + return CSS::SourceRange::create() |
| + .setStartLine(0) |
| + .setEndLine(0) |
| + .setStartColumn(0) |
| + .setEndColumn(0) |
|
sadrul
2016/12/06 20:56:30
What do these mean?
Sarmad Hashmi
2016/12/07 01:23:27
Added comment.
|
| + .build(); |
| +} |
| + |
| std::unique_ptr<CSS::CSSProperty> BuildCSSProperty(const std::string& name, |
| int value) { |
| return CSS::CSSProperty::create() |
| + .setRange(BuildDefaultSourceRange()) |
| .setName(name) |
| .setValue(base::IntToString(value)) |
| .build(); |
| @@ -23,26 +42,54 @@ std::unique_ptr<CSS::CSSProperty> BuildCSSProperty(const std::string& name, |
| std::unique_ptr<Array<CSS::CSSProperty>> BuildBoundsCSSPropertyArray( |
| const gfx::Rect& bounds) { |
| auto cssProperties = Array<CSS::CSSProperty>::create(); |
| - cssProperties->addItem(BuildCSSProperty("height", bounds.height())); |
| - cssProperties->addItem(BuildCSSProperty("width", bounds.width())); |
| - cssProperties->addItem(BuildCSSProperty("x", bounds.x())); |
| - cssProperties->addItem(BuildCSSProperty("y", bounds.y())); |
| + cssProperties->addItem(BuildCSSProperty(kHeight, bounds.height())); |
| + cssProperties->addItem(BuildCSSProperty(kWidth, bounds.width())); |
| + cssProperties->addItem(BuildCSSProperty(kX, bounds.x())); |
| + cssProperties->addItem(BuildCSSProperty(kY, bounds.y())); |
| return cssProperties; |
| } |
| std::unique_ptr<CSS::CSSStyle> BuildCSSStyle(int node_id, |
| const gfx::Rect& bounds) { |
| return CSS::CSSStyle::create() |
| + .setRange(BuildDefaultSourceRange()) |
| + .setStyleSheetId(base::IntToString(node_id)) |
| .setCssProperties(BuildBoundsCSSPropertyArray(bounds)) |
| .setShorthandEntries(Array<std::string>::create()) |
| .build(); |
| } |
| +Response ParseBounds(const std::string& style_text, gfx::Rect& bounds) { |
| + std::vector<std::string> tokens = base::SplitString( |
| + style_text, ":;", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
| + for (size_t i = 0; i < tokens.size() - 1; i += 2) { |
| + std::string property = tokens.at(i); |
|
sadrul
2016/12/06 20:56:30
Use const & to avoid extra string copy
Sarmad Hashmi
2016/12/07 01:23:27
Done.
|
| + int value; |
| + if (!base::StringToInt(tokens.at(i + 1), &value)) |
| + return Response::Error("Unable to parse value for property=" + property); |
| + |
| + if (property == kHeight) { |
| + bounds.set_height(value); |
| + } else if (property == kWidth) { |
| + bounds.set_width(value); |
| + } else if (property == kX) |
| + bounds.set_x(value); |
| + else if (property == kY) |
|
sadrul
2016/12/06 20:56:30
Use {} for all, or none.
Sarmad Hashmi
2016/12/07 01:23:27
Removed {}
|
| + bounds.set_y(value); |
| + else |
| + return Response::Error("Unsupported property=" + property); |
| + } |
| + return Response::OK(); |
| +} |
| + |
| } // namespace |
| -AshDevToolsCSSAgent::AshDevToolsCSSAgent(AshDevToolsDOMAgent* dom_agent) |
| - : dom_agent_(dom_agent) { |
| +AshDevToolsCSSAgent::AshDevToolsCSSAgent( |
| + AshDevToolsDOMAgent* dom_agent, |
| + scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) |
| + : main_thread_task_runner_(main_thread_task_runner), dom_agent_(dom_agent) { |
| DCHECK(dom_agent_); |
| + DCHECK(main_thread_task_runner_); |
| } |
| AshDevToolsCSSAgent::~AshDevToolsCSSAgent() { |
| @@ -71,6 +118,43 @@ ui::devtools::protocol::Response AshDevToolsCSSAgent::getMatchedStylesForNode( |
| return ui::devtools::protocol::Response::OK(); |
| } |
| +ui::devtools::protocol::Response AshDevToolsCSSAgent::setStyleTexts( |
| + std::unique_ptr<ui::devtools::protocol::Array< |
| + ui::devtools::protocol::CSS::StyleDeclarationEdit>> edits, |
| + std::unique_ptr< |
| + ui::devtools::protocol::Array<ui::devtools::protocol::CSS::CSSStyle>>* |
| + result) { |
| + std::unique_ptr< |
| + ui::devtools::protocol::Array<ui::devtools::protocol::CSS::CSSStyle>> |
| + updated_styles = ui::devtools::protocol::Array< |
| + ui::devtools::protocol::CSS::CSSStyle>::create(); |
| + for (size_t i = 0; i < edits->length(); i++) { |
| + auto edit = edits->get(i); |
|
sadrul
2016/12/06 20:56:30
auto&?
Sarmad Hashmi
2016/12/07 01:23:27
Done.
|
| + int node_id; |
| + if (!base::StringToInt(edit->getStyleSheetId(), &node_id)) |
| + return ui::devtools::protocol::Response::Error("Invalid node id"); |
| + |
| + gfx::Rect updated_bounds; |
| + if (!GetBoundsForNodeId(node_id, updated_bounds)) { |
| + return ui::devtools::protocol::Response::Error( |
| + "No node found with that id"); |
| + } |
| + |
| + ui::devtools::protocol::Response response( |
| + ParseBounds(edit->getText(), updated_bounds)); |
| + if (!response.isSuccess()) |
| + return response; |
| + |
| + updated_styles->addItem(BuildCSSStyle(node_id, updated_bounds)); |
| + main_thread_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&AshDevToolsCSSAgent::UpdateBounds, |
| + base::Unretained(this), node_id, updated_bounds)); |
|
sadrul
2016/12/06 20:56:30
Why post-task?
Sarmad Hashmi
2016/12/07 01:23:27
As discussed, removed.
|
| + } |
| + |
| + *result = std::move(updated_styles); |
| + return ui::devtools::protocol::Response::OK(); |
| +} |
| + |
| void AshDevToolsCSSAgent::OnWindowBoundsChanged(WmWindow* window) { |
| InvalidateStyleSheet(dom_agent_->GetNodeIdFromWindow(window)); |
| } |
| @@ -85,24 +169,50 @@ void AshDevToolsCSSAgent::OnViewBoundsChanged(views::View* view) { |
| std::unique_ptr<ui::devtools::protocol::CSS::CSSStyle> |
| AshDevToolsCSSAgent::GetStylesForNode(int node_id) { |
| + gfx::Rect bounds; |
| + return GetBoundsForNodeId(node_id, bounds) ? BuildCSSStyle(node_id, bounds) |
| + : nullptr; |
| +} |
| + |
| +void AshDevToolsCSSAgent::InvalidateStyleSheet(int node_id) { |
| + // The stylesheetId for each node is equivalent to its node_id (as a string). |
| + frontend()->styleSheetChanged(base::IntToString(node_id)); |
| +} |
| + |
| +bool AshDevToolsCSSAgent::GetBoundsForNodeId(int node_id, gfx::Rect& bounds) { |
| WmWindow* window = dom_agent_->GetWindowFromNodeId(node_id); |
| - if (window) |
| - return BuildCSSStyle(node_id, window->GetBounds()); |
| + if (window) { |
| + bounds = window->GetBounds(); |
| + return true; |
| + } |
| views::Widget* widget = dom_agent_->GetWidgetFromNodeId(node_id); |
| - if (widget) |
| - return BuildCSSStyle(node_id, widget->GetWindowBoundsInScreen()); |
| + if (widget) { |
| + bounds = widget->GetRestoredBounds(); |
| + return true; |
| + } |
| views::View* view = dom_agent_->GetViewFromNodeId(node_id); |
| - if (view) |
| - return BuildCSSStyle(node_id, view->bounds()); |
| + if (view) { |
| + bounds = view->bounds(); |
| + return true; |
| + } |
| - return nullptr; |
| + return false; |
| } |
| -void AshDevToolsCSSAgent::InvalidateStyleSheet(int node_id) { |
| - // The stylesheetId for each node is equivalent to its node_id (as a string). |
| - frontend()->styleSheetChanged(base::IntToString(node_id)); |
| +void AshDevToolsCSSAgent::UpdateBounds(int node_id, const gfx::Rect& bounds) { |
| + WmWindow* window = dom_agent_->GetWindowFromNodeId(node_id); |
| + if (window) |
| + window->SetBounds(bounds); |
|
sadrul
2016/12/06 20:56:30
return too from here, right?
Sarmad Hashmi
2016/12/07 01:23:27
Done.
|
| + |
| + views::Widget* widget = dom_agent_->GetWidgetFromNodeId(node_id); |
| + if (widget) |
| + widget->SetBounds(bounds); |
|
sadrul
2016/12/06 20:56:30
ditto
Sarmad Hashmi
2016/12/07 01:23:27
Done.
|
| + |
| + views::View* view = dom_agent_->GetViewFromNodeId(node_id); |
| + if (view) |
| + view->SetBoundsRect(bounds); |
| } |
| } // namespace devtools |