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

Side by Side Diff: chrome/browser/devtools/devtools_ui_bindings.cc

Issue 2607833002: DevTools: move front-end URL handling to DevToolsUIBindingds (Closed)
Patch Set: Created 3 years, 11 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/devtools/devtools_ui_bindings.h" 5 #include "chrome/browser/devtools/devtools_ui_bindings.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/base64.h" 12 #include "base/base64.h"
13 #include "base/json/json_reader.h" 13 #include "base/json/json_reader.h"
14 #include "base/json/json_writer.h" 14 #include "base/json/json_writer.h"
15 #include "base/json/string_escape.h" 15 #include "base/json/string_escape.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ptr_util.h" 17 #include "base/memory/ptr_util.h"
18 #include "base/metrics/histogram_macros.h" 18 #include "base/metrics/histogram_macros.h"
19 #include "base/strings/string_number_conversions.h" 19 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/string_split.h"
20 #include "base/strings/string_util.h" 21 #include "base/strings/string_util.h"
21 #include "base/strings/stringprintf.h" 22 #include "base/strings/stringprintf.h"
22 #include "base/strings/utf_string_conversions.h" 23 #include "base/strings/utf_string_conversions.h"
23 #include "base/values.h" 24 #include "base/values.h"
24 #include "build/build_config.h" 25 #include "build/build_config.h"
25 #include "chrome/browser/chrome_notification_types.h" 26 #include "chrome/browser/chrome_notification_types.h"
26 #include "chrome/browser/devtools/devtools_file_watcher.h" 27 #include "chrome/browser/devtools/devtools_file_watcher.h"
27 #include "chrome/browser/devtools/devtools_protocol.h" 28 #include "chrome/browser/devtools/devtools_protocol.h"
28 #include "chrome/browser/devtools/global_confirm_info_bar.h" 29 #include "chrome/browser/devtools/global_confirm_info_bar.h"
30 #include "chrome/browser/devtools/url_constants.h"
29 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" 31 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
30 #include "chrome/browser/infobars/infobar_service.h" 32 #include "chrome/browser/infobars/infobar_service.h"
31 #include "chrome/browser/profiles/profile.h" 33 #include "chrome/browser/profiles/profile.h"
32 #include "chrome/browser/ui/browser.h" 34 #include "chrome/browser/ui/browser.h"
33 #include "chrome/browser/ui/browser_list.h" 35 #include "chrome/browser/ui/browser_list.h"
34 #include "chrome/browser/ui/browser_window.h" 36 #include "chrome/browser/ui/browser_window.h"
35 #include "chrome/browser/ui/tabs/tab_strip_model.h" 37 #include "chrome/browser/ui/tabs/tab_strip_model.h"
36 #include "chrome/common/chrome_switches.h" 38 #include "chrome/common/chrome_switches.h"
37 #include "chrome/common/extensions/chrome_manifest_url_handlers.h" 39 #include "chrome/common/extensions/chrome_manifest_url_handlers.h"
38 #include "chrome/common/pref_names.h" 40 #include "chrome/common/pref_names.h"
(...skipping 16 matching lines...) Expand all
55 #include "content/public/browser/render_view_host.h" 57 #include "content/public/browser/render_view_host.h"
56 #include "content/public/browser/user_metrics.h" 58 #include "content/public/browser/user_metrics.h"
57 #include "content/public/browser/web_contents.h" 59 #include "content/public/browser/web_contents.h"
58 #include "content/public/browser/web_contents_observer.h" 60 #include "content/public/browser/web_contents_observer.h"
59 #include "content/public/common/renderer_preferences.h" 61 #include "content/public/common/renderer_preferences.h"
60 #include "content/public/common/url_constants.h" 62 #include "content/public/common/url_constants.h"
61 #include "extensions/browser/extension_registry.h" 63 #include "extensions/browser/extension_registry.h"
62 #include "extensions/common/constants.h" 64 #include "extensions/common/constants.h"
63 #include "extensions/common/permissions/permissions_data.h" 65 #include "extensions/common/permissions/permissions_data.h"
64 #include "ipc/ipc_channel.h" 66 #include "ipc/ipc_channel.h"
67 #include "net/base/escape.h"
65 #include "net/base/io_buffer.h" 68 #include "net/base/io_buffer.h"
66 #include "net/base/net_errors.h" 69 #include "net/base/net_errors.h"
70 #include "net/base/url_util.h"
67 #include "net/cert/x509_certificate.h" 71 #include "net/cert/x509_certificate.h"
68 #include "net/http/http_response_headers.h" 72 #include "net/http/http_response_headers.h"
69 #include "net/url_request/url_fetcher.h" 73 #include "net/url_request/url_fetcher.h"
70 #include "net/url_request/url_fetcher_response_writer.h" 74 #include "net/url_request/url_fetcher_response_writer.h"
71 #include "third_party/WebKit/public/public_features.h" 75 #include "third_party/WebKit/public/public_features.h"
72 #include "ui/base/l10n/l10n_util.h" 76 #include "ui/base/l10n/l10n_util.h"
73 #include "ui/base/page_transition_types.h" 77 #include "ui/base/page_transition_types.h"
74 78
75 using base::DictionaryValue; 79 using base::DictionaryValue;
76 using content::BrowserThread; 80 using content::BrowserThread;
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 "DevToolsAPI.streamWrite", base::Owned(id), 296 "DevToolsAPI.streamWrite", base::Owned(id),
293 base::Owned(chunkValue), base::Owned(encodedValue))); 297 base::Owned(chunkValue), base::Owned(encodedValue)));
294 return num_bytes; 298 return num_bytes;
295 } 299 }
296 300
297 int ResponseWriter::Finish(int net_error, 301 int ResponseWriter::Finish(int net_error,
298 const net::CompletionCallback& callback) { 302 const net::CompletionCallback& callback) {
299 return net::OK; 303 return net::OK;
300 } 304 }
301 305
306 GURL SanitizeFrontendURL(
307 const GURL& url,
308 const std::string& scheme,
309 const std::string& host,
310 const std::string& path,
311 bool allow_query);
312
313 std::string SanitizeRevision(const std::string& revision) {
314 for (size_t i = 0; i < revision.length(); i++) {
315 if (!(revision[i] == '@' && i == 0)
316 && !(revision[i] >= '0' && revision[i] <= '9')
317 && !(revision[i] >= 'a' && revision[i] <= 'z')
318 && !(revision[i] >= 'A' && revision[i] <= 'Z')) {
319 return std::string();
320 }
321 }
322 return revision;
323 }
324
325 std::string SanitizeFrontendPath(const std::string& path) {
326 for (size_t i = 0; i < path.length(); i++) {
327 if (path[i] != '/' && path[i] != '-' && path[i] != '_'
328 && path[i] != '.' && path[i] != '@'
329 && !(path[i] >= '0' && path[i] <= '9')
330 && !(path[i] >= 'a' && path[i] <= 'z')
331 && !(path[i] >= 'A' && path[i] <= 'Z')) {
332 return std::string();
333 }
334 }
335 return path;
336 }
337
338 std::string SanitizeEndpoint(const std::string& value) {
339 if (value.find('&') != std::string::npos
340 || value.find('?') != std::string::npos)
341 return std::string();
342 return value;
343 }
344
345 std::string SanitizeRemoteBase(const std::string& value) {
346 GURL url(value);
347 std::string path = url.path();
348 std::vector<std::string> parts = base::SplitString(
349 path, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
350 std::string revision = parts.size() > 2 ? parts[2] : "";
351 revision = SanitizeRevision(revision);
352 path = base::StringPrintf("/%s/%s/", kRemoteFrontendPath, revision.c_str());
353 return SanitizeFrontendURL(url, url::kHttpsScheme,
354 kRemoteFrontendDomain, path, false).spec();
355 }
356
357 std::string SanitizeRemoteFrontendURL(const std::string& value) {
358 GURL url(net::UnescapeURLComponent(value,
359 net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS |
360 net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS |
361 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE));
362 std::string path = url.path();
363 std::vector<std::string> parts = base::SplitString(
364 path, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
365 std::string revision = parts.size() > 2 ? parts[2] : "";
366 revision = SanitizeRevision(revision);
367 std::string filename = parts.size() ? parts[parts.size() - 1] : "";
368 if (filename != "devtools.html")
369 filename = "inspector.html";
370 path = base::StringPrintf("/serve_rev/%s/%s",
371 revision.c_str(), filename.c_str());
372 std::string sanitized = SanitizeFrontendURL(url, url::kHttpsScheme,
373 kRemoteFrontendDomain, path, true).spec();
374 return net::EscapeQueryParamValue(sanitized, false);
375 }
376
377 std::string SanitizeFrontendQueryParam(
378 const std::string& key,
379 const std::string& value) {
380 // Convert boolean flags to true.
381 if (key == "can_dock" || key == "debugFrontend" || key == "experiments" ||
382 key == "isSharedWorker" || key == "v8only" || key == "remoteFrontend")
383 return "true";
384
385 // Pass connection endpoints as is.
386 if (key == "ws" || key == "service-backend")
387 return SanitizeEndpoint(value);
388
389 // Only support undocked for old frontends.
390 if (key == "dockSide" && value == "undocked")
391 return value;
392
393 if (key == "panel" && (value == "elements" || value == "console"))
394 return value;
395
396 if (key == "remoteBase")
397 return SanitizeRemoteBase(value);
398
399 if (key == "remoteFrontendUrl")
400 return SanitizeRemoteFrontendURL(value);
401
402 return std::string();
403 }
404
405 GURL SanitizeFrontendURL(
406 const GURL& url,
407 const std::string& scheme,
408 const std::string& host,
409 const std::string& path,
410 bool allow_query) {
411 std::vector<std::string> query_parts;
412 if (allow_query) {
413 for (net::QueryIterator it(url); !it.IsAtEnd(); it.Advance()) {
414 std::string value = SanitizeFrontendQueryParam(it.GetKey(),
415 it.GetValue());
416 if (!value.empty()) {
417 query_parts.push_back(
418 base::StringPrintf("%s=%s", it.GetKey().c_str(), value.c_str()));
419 }
420 }
421 }
422 std::string query =
423 query_parts.empty() ? "" : "?" + base::JoinString(query_parts, "&");
424 std::string constructed = base::StringPrintf("%s://%s%s%s",
425 scheme.c_str(), host.c_str(), path.c_str(), query.c_str());
426 GURL result = GURL(constructed);
427 if (!result.is_valid())
428 return GURL();
429 return result;
430 }
431
302 } // namespace 432 } // namespace
303 433
304 // DevToolsUIBindings::FrontendWebContentsObserver ---------------------------- 434 // DevToolsUIBindings::FrontendWebContentsObserver ----------------------------
305 435
306 class DevToolsUIBindings::FrontendWebContentsObserver 436 class DevToolsUIBindings::FrontendWebContentsObserver
307 : public content::WebContentsObserver { 437 : public content::WebContentsObserver {
308 public: 438 public:
309 explicit FrontendWebContentsObserver(DevToolsUIBindings* ui_bindings); 439 explicit FrontendWebContentsObserver(DevToolsUIBindings* ui_bindings);
310 ~FrontendWebContentsObserver() override; 440 ~FrontendWebContentsObserver() override;
311 441
(...skipping 16 matching lines...) Expand all
328 DevToolsUIBindings::FrontendWebContentsObserver::FrontendWebContentsObserver( 458 DevToolsUIBindings::FrontendWebContentsObserver::FrontendWebContentsObserver(
329 DevToolsUIBindings* devtools_ui_bindings) 459 DevToolsUIBindings* devtools_ui_bindings)
330 : WebContentsObserver(devtools_ui_bindings->web_contents()), 460 : WebContentsObserver(devtools_ui_bindings->web_contents()),
331 devtools_bindings_(devtools_ui_bindings) { 461 devtools_bindings_(devtools_ui_bindings) {
332 } 462 }
333 463
334 DevToolsUIBindings::FrontendWebContentsObserver:: 464 DevToolsUIBindings::FrontendWebContentsObserver::
335 ~FrontendWebContentsObserver() { 465 ~FrontendWebContentsObserver() {
336 } 466 }
337 467
468 // static
469 GURL DevToolsUIBindings::SanitizeFrontendURL(const GURL& url) {
470 return ::SanitizeFrontendURL(url, content::kChromeDevToolsScheme,
471 chrome::kChromeUIDevToolsHost, SanitizeFrontendPath(url.path()), true);
472 }
473
338 void DevToolsUIBindings::FrontendWebContentsObserver::RenderProcessGone( 474 void DevToolsUIBindings::FrontendWebContentsObserver::RenderProcessGone(
339 base::TerminationStatus status) { 475 base::TerminationStatus status) {
340 bool crashed = true; 476 bool crashed = true;
341 switch (status) { 477 switch (status) {
342 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: 478 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
343 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: 479 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
344 #if defined(OS_CHROMEOS) 480 #if defined(OS_CHROMEOS)
345 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: 481 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM:
346 #endif 482 #endif
347 case base::TERMINATION_STATUS_PROCESS_CRASHED: 483 case base::TERMINATION_STATUS_PROCESS_CRASHED:
348 case base::TERMINATION_STATUS_LAUNCH_FAILED: 484 case base::TERMINATION_STATUS_LAUNCH_FAILED:
349 if (devtools_bindings_->agent_host_.get()) 485 if (devtools_bindings_->agent_host_.get())
350 devtools_bindings_->Detach(); 486 devtools_bindings_->Detach();
351 break; 487 break;
352 default: 488 default:
353 crashed = false; 489 crashed = false;
354 break; 490 break;
355 } 491 }
356 devtools_bindings_->delegate_->RenderProcessGone(crashed); 492 devtools_bindings_->delegate_->RenderProcessGone(crashed);
357 } 493 }
358 494
359 void DevToolsUIBindings::FrontendWebContentsObserver:: 495 void DevToolsUIBindings::FrontendWebContentsObserver::
360 DidStartNavigationToPendingEntry(const GURL& url, 496 DidStartNavigationToPendingEntry(const GURL& url,
361 content::ReloadType reload_type) { 497 content::ReloadType reload_type) {
362 devtools_bindings_->frontend_host_.reset( 498 devtools_bindings_->UpdateFrontendHost();
363 content::DevToolsFrontendHost::Create(
364 web_contents()->GetMainFrame(),
365 base::Bind(&DevToolsUIBindings::HandleMessageFromDevToolsFrontend,
366 base::Unretained(devtools_bindings_))));
367 } 499 }
368 500
369 void DevToolsUIBindings::FrontendWebContentsObserver:: 501 void DevToolsUIBindings::FrontendWebContentsObserver::
370 DocumentAvailableInMainFrame() { 502 DocumentAvailableInMainFrame() {
371 devtools_bindings_->DocumentAvailableInMainFrame(); 503 devtools_bindings_->DocumentAvailableInMainFrame();
372 } 504 }
373 505
374 void DevToolsUIBindings::FrontendWebContentsObserver:: 506 void DevToolsUIBindings::FrontendWebContentsObserver::
375 DocumentOnLoadCompletedInMainFrame() { 507 DocumentOnLoadCompletedInMainFrame() {
376 devtools_bindings_->DocumentOnLoadCompletedInMainFrame(); 508 devtools_bindings_->DocumentOnLoadCompletedInMainFrame();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false; 543 web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false;
412 544
413 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_, this)); 545 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_, this));
414 file_system_indexer_ = new DevToolsFileSystemIndexer(); 546 file_system_indexer_ = new DevToolsFileSystemIndexer();
415 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( 547 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
416 web_contents_); 548 web_contents_);
417 549
418 // Register on-load actions. 550 // Register on-load actions.
419 embedder_message_dispatcher_.reset( 551 embedder_message_dispatcher_.reset(
420 DevToolsEmbedderMessageDispatcher::CreateForDevToolsFrontend(this)); 552 DevToolsEmbedderMessageDispatcher::CreateForDevToolsFrontend(this));
421 553 UpdateFrontendHost();
422 frontend_host_.reset(content::DevToolsFrontendHost::Create(
423 web_contents_->GetMainFrame(),
424 base::Bind(&DevToolsUIBindings::HandleMessageFromDevToolsFrontend,
425 base::Unretained(this))));
426 } 554 }
427 555
428 DevToolsUIBindings::~DevToolsUIBindings() { 556 DevToolsUIBindings::~DevToolsUIBindings() {
429 for (const auto& pair : pending_requests_) 557 for (const auto& pair : pending_requests_)
430 delete pair.first; 558 delete pair.first;
431 559
432 if (agent_host_.get()) 560 if (agent_host_.get())
433 agent_host_->DetachClient(this); 561 agent_host_->DetachClient(this);
434 562
435 for (IndexingJobsMap::const_iterator jobs_it(indexing_jobs_.begin()); 563 for (IndexingJobsMap::const_iterator jobs_it(indexing_jobs_.begin());
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 1004
877 void DevToolsUIBindings::DispatchProtocolMessageFromDevToolsFrontend( 1005 void DevToolsUIBindings::DispatchProtocolMessageFromDevToolsFrontend(
878 const std::string& message) { 1006 const std::string& message) {
879 if (agent_host_.get()) 1007 if (agent_host_.get())
880 agent_host_->DispatchProtocolMessage(this, message); 1008 agent_host_->DispatchProtocolMessage(this, message);
881 } 1009 }
882 1010
883 void DevToolsUIBindings::RecordEnumeratedHistogram(const std::string& name, 1011 void DevToolsUIBindings::RecordEnumeratedHistogram(const std::string& name,
884 int sample, 1012 int sample,
885 int boundary_value) { 1013 int boundary_value) {
1014 if (!frontend_host_) {
1015 NOTREACHED();
dgozman 2016/12/29 01:16:50 This could actually happen, because navigation is
1016 return;
1017 }
886 if (!(boundary_value >= 0 && boundary_value <= 100 && sample >= 0 && 1018 if (!(boundary_value >= 0 && boundary_value <= 100 && sample >= 0 &&
887 sample < boundary_value)) { 1019 sample < boundary_value)) {
888 // TODO(nick): Replace with chrome::bad_message::ReceivedBadMessage(). 1020 // TODO(nick): Replace with chrome::bad_message::ReceivedBadMessage().
889 frontend_host_->BadMessageRecieved(); 1021 frontend_host_->BadMessageRecieved();
890 return; 1022 return;
891 } 1023 }
892 // Each histogram name must follow a different code path in 1024 // Each histogram name must follow a different code path in
893 // order to UMA_HISTOGRAM_ENUMERATION work correctly. 1025 // order to UMA_HISTOGRAM_ENUMERATION work correctly.
894 if (name == kDevToolsActionTakenHistogram) 1026 if (name == kDevToolsActionTakenHistogram)
895 UMA_HISTOGRAM_ENUMERATION(name, sample, boundary_value); 1027 UMA_HISTOGRAM_ENUMERATION(name, sample, boundary_value);
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 const InfoBarCallback& callback) { 1193 const InfoBarCallback& callback) {
1062 if (!delegate_->GetInfoBarService()) { 1194 if (!delegate_->GetInfoBarService()) {
1063 callback.Run(false); 1195 callback.Run(false);
1064 return; 1196 return;
1065 } 1197 }
1066 std::unique_ptr<DevToolsConfirmInfoBarDelegate> delegate( 1198 std::unique_ptr<DevToolsConfirmInfoBarDelegate> delegate(
1067 new DevToolsConfirmInfoBarDelegate(callback, message)); 1199 new DevToolsConfirmInfoBarDelegate(callback, message));
1068 GlobalConfirmInfoBar::Show(std::move(delegate)); 1200 GlobalConfirmInfoBar::Show(std::move(delegate));
1069 } 1201 }
1070 1202
1203 void DevToolsUIBindings::UpdateFrontendHost() {
1204 GURL url = web_contents_->GetVisibleURL();
dgozman 2016/12/29 01:16:50 Wrong indent.
1205 if (url.spec() != SanitizeFrontendURL(url).spec()) {
1206 LOG(ERROR) << "Attempt to navigate to an invalid DevTools front-end URL: "
1207 << url.spec();
1208 frontend_host_.reset();
1209 return;
1210 }
1211 frontend_host_.reset(content::DevToolsFrontendHost::Create(
1212 web_contents_->GetMainFrame(),
1213 base::Bind(&DevToolsUIBindings::HandleMessageFromDevToolsFrontend,
1214 base::Unretained(this))));
1215 }
1216
1071 void DevToolsUIBindings::AddDevToolsExtensionsToClient() { 1217 void DevToolsUIBindings::AddDevToolsExtensionsToClient() {
1072 const extensions::ExtensionRegistry* registry = 1218 const extensions::ExtensionRegistry* registry =
1073 extensions::ExtensionRegistry::Get(profile_->GetOriginalProfile()); 1219 extensions::ExtensionRegistry::Get(profile_->GetOriginalProfile());
1074 if (!registry) 1220 if (!registry)
1075 return; 1221 return;
1076 1222
1077 base::ListValue results; 1223 base::ListValue results;
1078 for (const scoped_refptr<const extensions::Extension>& extension : 1224 for (const scoped_refptr<const extensions::Extension>& extension :
1079 registry->enabled_extensions()) { 1225 registry->enabled_extensions()) {
1080 if (extensions::chrome_manifest_urls::GetDevToolsPage(extension.get()) 1226 if (extensions::chrome_manifest_urls::GetDevToolsPage(extension.get())
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 bool DevToolsUIBindings::IsAttachedTo(content::DevToolsAgentHost* agent_host) { 1280 bool DevToolsUIBindings::IsAttachedTo(content::DevToolsAgentHost* agent_host) {
1135 return agent_host_.get() == agent_host; 1281 return agent_host_.get() == agent_host;
1136 } 1282 }
1137 1283
1138 void DevToolsUIBindings::CallClientFunction(const std::string& function_name, 1284 void DevToolsUIBindings::CallClientFunction(const std::string& function_name,
1139 const base::Value* arg1, 1285 const base::Value* arg1,
1140 const base::Value* arg2, 1286 const base::Value* arg2,
1141 const base::Value* arg3) { 1287 const base::Value* arg3) {
1142 if (!web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)) 1288 if (!web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme))
1143 return; 1289 return;
1290 // If we're not exposing bindings, we shouldn't call functions either.
1291 if (!frontend_host_)
1292 return;
1144 std::string javascript = function_name + "("; 1293 std::string javascript = function_name + "(";
1145 if (arg1) { 1294 if (arg1) {
1146 std::string json; 1295 std::string json;
1147 base::JSONWriter::Write(*arg1, &json); 1296 base::JSONWriter::Write(*arg1, &json);
1148 javascript.append(json); 1297 javascript.append(json);
1149 if (arg2) { 1298 if (arg2) {
1150 base::JSONWriter::Write(*arg2, &json); 1299 base::JSONWriter::Write(*arg2, &json);
1151 javascript.append(", ").append(json); 1300 javascript.append(", ").append(json);
1152 if (arg3) { 1301 if (arg3) {
1153 base::JSONWriter::Write(*arg3, &json); 1302 base::JSONWriter::Write(*arg3, &json);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 void DevToolsUIBindings::FrontendLoaded() { 1335 void DevToolsUIBindings::FrontendLoaded() {
1187 if (frontend_loaded_) 1336 if (frontend_loaded_)
1188 return; 1337 return;
1189 frontend_loaded_ = true; 1338 frontend_loaded_ = true;
1190 1339
1191 // Call delegate first - it seeds importants bit of information. 1340 // Call delegate first - it seeds importants bit of information.
1192 delegate_->OnLoadCompleted(); 1341 delegate_->OnLoadCompleted();
1193 1342
1194 AddDevToolsExtensionsToClient(); 1343 AddDevToolsExtensionsToClient();
1195 } 1344 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_ui_bindings.h ('k') | chrome/browser/devtools/devtools_ui_bindings_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698