Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(936)

Side by Side Diff: headless/lib/browser/headless_devtools_manager_delegate.cc

Issue 2119063002: Add commands to manage tabs and contexts to Browser Domain (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes for Sami Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "headless/lib/browser/headless_devtools_manager_delegate.h"
6
7 #include <string>
8
9 #include "base/guid.h"
10 #include "content/public/browser/web_contents.h"
11 #include "headless/lib/browser/headless_browser_context_impl.h"
12 #include "headless/lib/browser/headless_browser_impl.h"
13 #include "headless/lib/browser/headless_web_contents_impl.h"
14 #include "headless/public/domains/browser.h"
15
16 namespace headless {
17
18 HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate(
19 HeadlessBrowserImpl* browser)
20 : browser_(browser) {
21 command_map_["Browser.newPage"] = &HeadlessDevToolsManagerDelegate::NewPage;
22 command_map_["Browser.closePage"] =
23 &HeadlessDevToolsManagerDelegate::ClosePage;
24 command_map_["Browser.newBrowserContext"] =
25 &HeadlessDevToolsManagerDelegate::NewBrowserContext;
26 command_map_["Browser.closeBrowserContext"] =
27 &HeadlessDevToolsManagerDelegate::CloseBrowserContext;
28 }
29
30 HeadlessDevToolsManagerDelegate::~HeadlessDevToolsManagerDelegate() {}
31
32 base::DictionaryValue* HeadlessDevToolsManagerDelegate::HandleCommand(
33 content::DevToolsAgentHost* agent_host,
34 base::DictionaryValue* command) {
35 int id;
36 std::string method;
37 const base::DictionaryValue* params = nullptr;
38 if (!command->GetInteger("id", &id) ||
39 !command->GetString("method", &method) ||
40 !command->GetDictionary("params", &params)) {
41 return nullptr;
42 }
43 auto find_it = command_map_.find(method);
44 if (find_it == command_map_.end())
45 return nullptr;
46 CommandMemberFnPtr command_fn_ptr = find_it->second;
47 std::unique_ptr<base::Value> cmd_result(((this)->*command_fn_ptr)(params));
48 if (!cmd_result)
49 return nullptr;
50
51 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
52 result->SetInteger("id", id);
53 result->Set("result", std::move(cmd_result));
54 return result.release();
55 }
56
57 std::unique_ptr<base::Value> HeadlessDevToolsManagerDelegate::NewPage(
58 const base::DictionaryValue* params) {
59 std::string initial_url;
60 std::string browser_context_id;
61 int width = 800;
62 int height = 600;
63 params->GetString("initialUrl", &initial_url);
64 params->GetString("browserContextId", &browser_context_id);
65 params->GetInteger("width", &width);
66 params->GetInteger("height", &height);
67 HeadlessWebContentsImpl* web_contents_impl;
68 auto find_it = browser_context_map_.find(browser_context_id);
69 if (find_it != browser_context_map_.end()) {
70 web_contents_impl = HeadlessWebContentsImpl::From(
71 browser_->CreateWebContentsBuilder()
72 .SetInitialURL(GURL(initial_url))
73 .SetWindowSize(gfx::Size(width, height))
74 .SetBrowserContext(find_it->second.get())
75 .Build());
76 } else {
77 web_contents_impl = HeadlessWebContentsImpl::From(
78 browser_->CreateWebContentsBuilder()
79 .SetInitialURL(GURL(initial_url))
80 .SetWindowSize(gfx::Size(width, height))
81 .Build());
82 }
83 return browser::NewPageResult::Builder()
84 .SetPageId(web_contents_impl->GetDevtoolsAgentHostId())
85 .Build()
86 ->Serialize();
87 }
88
89 std::unique_ptr<base::Value> HeadlessDevToolsManagerDelegate::ClosePage(
90 const base::DictionaryValue* params) {
91 std::string page_id;
92 if (!params->GetString("pageId", &page_id)) {
93 return nullptr;
94 }
95 HeadlessWebContents* web_contents =
96 browser_->GetWebContentsForDevtoolsAgentHostId(page_id);
97 bool success = false;
98 if (web_contents) {
99 web_contents->Close();
100 success = true;
101 }
102 return browser::ClosePageResult::Builder()
103 .SetSuccess(success)
104 .Build()
105 ->Serialize();
106 }
107
108 std::unique_ptr<base::Value> HeadlessDevToolsManagerDelegate::NewBrowserContext(
109 const base::DictionaryValue* params) {
110 std::string browser_context_id = base::GenerateGUID();
111 browser_context_map_[browser_context_id] =
112 browser_->CreateBrowserContextBuilder().Build();
113 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
114 return browser::NewBrowserContextResult::Builder()
115 .SetBrowserContextId(browser_context_id)
116 .Build()
117 ->Serialize();
118 }
119
120 std::unique_ptr<base::Value>
121 HeadlessDevToolsManagerDelegate::CloseBrowserContext(
122 const base::DictionaryValue* params) {
123 std::string browser_context_id;
124 if (!params->GetString("browserContextId", &browser_context_id)) {
125 return nullptr;
126 }
127 auto find_it = browser_context_map_.find(browser_context_id);
128 bool success = false;
129 if (find_it != browser_context_map_.end()) {
130 success = true;
131 HeadlessBrowserContextImpl* headless_browser_context =
132 HeadlessBrowserContextImpl::From(find_it->second.get());
133 // Make sure |headless_browser_context| isn't in use!
134 for (HeadlessWebContents* headless_web_contents :
135 browser_->GetAllWebContents()) {
136 content::WebContents* web_contents =
137 HeadlessWebContentsImpl::From(headless_web_contents)->web_contents();
138 if (web_contents->GetBrowserContext() == headless_browser_context) {
139 success = false;
140 break;
141 }
142 }
143 if (success)
144 browser_context_map_.erase(find_it);
145 }
146 return browser::CloseBrowserContextResult::Builder()
147 .SetSuccess(success)
148 .Build()
149 ->Serialize();
150 }
151
152 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698