OLD | NEW |
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 "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 using base::DictionaryValue; | 56 using base::DictionaryValue; |
57 using content::BrowserThread; | 57 using content::BrowserThread; |
58 | 58 |
59 namespace { | 59 namespace { |
60 | 60 |
61 static const char kFrontendHostId[] = "id"; | 61 static const char kFrontendHostId[] = "id"; |
62 static const char kFrontendHostMethod[] = "method"; | 62 static const char kFrontendHostMethod[] = "method"; |
63 static const char kFrontendHostParams[] = "params"; | 63 static const char kFrontendHostParams[] = "params"; |
64 static const char kTitleFormat[] = "Developer Tools - %s"; | 64 static const char kTitleFormat[] = "Developer Tools - %s"; |
65 | 65 |
66 static const char kDevicesChanged[] = "DevicesChanged"; | |
67 static const char kDeviceCountChanged[] = "DeviceCountChanged"; | |
68 | |
69 std::string SkColorToRGBAString(SkColor color) { | 66 std::string SkColorToRGBAString(SkColor color) { |
70 // We avoid StringPrintf because it will use locale specific formatters for | 67 // We avoid StringPrintf because it will use locale specific formatters for |
71 // the double (e.g. ',' instead of '.' in German). | 68 // the double (e.g. ',' instead of '.' in German). |
72 return "rgba(" + base::IntToString(SkColorGetR(color)) + "," + | 69 return "rgba(" + base::IntToString(SkColorGetR(color)) + "," + |
73 base::IntToString(SkColorGetG(color)) + "," + | 70 base::IntToString(SkColorGetG(color)) + "," + |
74 base::IntToString(SkColorGetB(color)) + "," + | 71 base::IntToString(SkColorGetB(color)) + "," + |
75 base::DoubleToString(SkColorGetA(color) / 255.0) + ")"; | 72 base::DoubleToString(SkColorGetA(color) / 255.0) + ")"; |
76 } | 73 } |
77 | 74 |
78 base::DictionaryValue* CreateFileSystemValue( | 75 base::DictionaryValue* CreateFileSystemValue( |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 switches::kEnableDevToolsExperiments)) | 297 switches::kEnableDevToolsExperiments)) |
301 url_string += "&experiments=true"; | 298 url_string += "&experiments=true"; |
302 return GURL(url_string); | 299 return GURL(url_string); |
303 } | 300 } |
304 | 301 |
305 DevToolsUIBindings::DevToolsUIBindings(content::WebContents* web_contents, | 302 DevToolsUIBindings::DevToolsUIBindings(content::WebContents* web_contents, |
306 const GURL& url) | 303 const GURL& url) |
307 : profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), | 304 : profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())), |
308 web_contents_(web_contents), | 305 web_contents_(web_contents), |
309 delegate_(new DefaultBindingsDelegate(web_contents_)), | 306 delegate_(new DefaultBindingsDelegate(web_contents_)), |
310 device_listener_enabled_(false), | 307 device_count_updates_enabled_(false), |
| 308 devices_updates_enabled_(false), |
311 url_(url), | 309 url_(url), |
312 weak_factory_(this) { | 310 weak_factory_(this) { |
313 frontend_contents_observer_.reset(new FrontendWebContentsObserver(this)); | 311 frontend_contents_observer_.reset(new FrontendWebContentsObserver(this)); |
314 web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false; | 312 web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false; |
315 | 313 |
316 frontend_host_.reset(content::DevToolsClientHost::CreateDevToolsFrontendHost( | 314 frontend_host_.reset(content::DevToolsClientHost::CreateDevToolsFrontendHost( |
317 web_contents_, this)); | 315 web_contents_, this)); |
318 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_)); | 316 file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_)); |
319 file_system_indexer_ = new DevToolsFileSystemIndexer(); | 317 file_system_indexer_ = new DevToolsFileSystemIndexer(); |
320 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | 318 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( |
(...skipping 21 matching lines...) Expand all Loading... |
342 | 340 |
343 DevToolsUIBindings::~DevToolsUIBindings() { | 341 DevToolsUIBindings::~DevToolsUIBindings() { |
344 content::DevToolsManager::GetInstance()->ClientHostClosing( | 342 content::DevToolsManager::GetInstance()->ClientHostClosing( |
345 frontend_host_.get()); | 343 frontend_host_.get()); |
346 | 344 |
347 for (IndexingJobsMap::const_iterator jobs_it(indexing_jobs_.begin()); | 345 for (IndexingJobsMap::const_iterator jobs_it(indexing_jobs_.begin()); |
348 jobs_it != indexing_jobs_.end(); ++jobs_it) { | 346 jobs_it != indexing_jobs_.end(); ++jobs_it) { |
349 jobs_it->second->Stop(); | 347 jobs_it->second->Stop(); |
350 } | 348 } |
351 indexing_jobs_.clear(); | 349 indexing_jobs_.clear(); |
352 | 350 SetDeviceCountUpdatesEnabled(false); |
353 while (!subscribers_.empty()) | 351 SetDevicesUpdatesEnabled(false); |
354 Unsubscribe(*subscribers_.begin()); | |
355 } | 352 } |
356 | 353 |
357 void DevToolsUIBindings::InspectedContentsClosing() { | 354 void DevToolsUIBindings::InspectedContentsClosing() { |
358 delegate_->InspectedContentsClosing(); | 355 delegate_->InspectedContentsClosing(); |
359 } | 356 } |
360 | 357 |
361 void DevToolsUIBindings::Observe(int type, | 358 void DevToolsUIBindings::Observe(int type, |
362 const content::NotificationSource& source, | 359 const content::NotificationSource& source, |
363 const content::NotificationDetails& details) { | 360 const content::NotificationDetails& details) { |
364 DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type); | 361 DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 | 561 |
565 void DevToolsUIBindings::OpenUrlOnRemoteDeviceAndInspect( | 562 void DevToolsUIBindings::OpenUrlOnRemoteDeviceAndInspect( |
566 const std::string& browser_id, | 563 const std::string& browser_id, |
567 const std::string& url) { | 564 const std::string& url) { |
568 if (remote_targets_handler_) { | 565 if (remote_targets_handler_) { |
569 remote_targets_handler_->Open(browser_id, url, | 566 remote_targets_handler_->Open(browser_id, url, |
570 base::Bind(&InspectTarget, profile_)); | 567 base::Bind(&InspectTarget, profile_)); |
571 } | 568 } |
572 } | 569 } |
573 | 570 |
574 void DevToolsUIBindings::Subscribe(const std::string& event_type) { | 571 void DevToolsUIBindings::SetDeviceCountUpdatesEnabled(bool enabled) { |
575 if (subscribers_.find(event_type) != subscribers_.end()) { | 572 if (device_count_updates_enabled_ == enabled) |
576 LOG(ERROR) << "Already subscribed for [" << event_type << "]."; | |
577 return; | 573 return; |
578 } | |
579 | |
580 subscribers_.insert(event_type); | |
581 | |
582 if (event_type == kDevicesChanged) { | |
583 remote_targets_handler_ = DevToolsTargetsUIHandler::CreateForAdb( | |
584 base::Bind(&DevToolsUIBindings::PopulateRemoteDevices, | |
585 base::Unretained(this)), | |
586 profile_); | |
587 } else if (event_type == kDeviceCountChanged) { | |
588 EnableRemoteDeviceCounter(true); | |
589 } else { | |
590 LOG(ERROR) << "Attempt to start unknown event listener " << event_type; | |
591 } | |
592 } | |
593 | |
594 void DevToolsUIBindings::Unsubscribe(const std::string& event_type) { | |
595 if (subscribers_.find(event_type) == subscribers_.end()) { | |
596 LOG(ERROR) << "Not yet subscribed for [" << event_type << "]"; | |
597 return; | |
598 } | |
599 | |
600 if (event_type == kDevicesChanged) { | |
601 remote_targets_handler_.reset(); | |
602 } else if (event_type == kDeviceCountChanged) { | |
603 EnableRemoteDeviceCounter(false); | |
604 } else { | |
605 LOG(ERROR) << "Attempt to stop unknown event listener " << event_type; | |
606 } | |
607 | |
608 subscribers_.erase(event_type); | |
609 } | |
610 | |
611 void DevToolsUIBindings::EnableRemoteDeviceCounter(bool enable) { | |
612 DevToolsAndroidBridge* adb_bridge = | 574 DevToolsAndroidBridge* adb_bridge = |
613 DevToolsAndroidBridge::Factory::GetForProfile(profile_); | 575 DevToolsAndroidBridge::Factory::GetForProfile(profile_); |
614 if (!adb_bridge) | 576 if (!adb_bridge) |
615 return; | 577 return; |
616 | 578 |
617 DCHECK(device_listener_enabled_ != enable); | 579 device_count_updates_enabled_ = enabled; |
618 device_listener_enabled_ = enable; | 580 if (enabled) |
619 if (enable) | |
620 adb_bridge->AddDeviceCountListener(this); | 581 adb_bridge->AddDeviceCountListener(this); |
621 else | 582 else |
622 adb_bridge->RemoveDeviceCountListener(this); | 583 adb_bridge->RemoveDeviceCountListener(this); |
623 } | 584 } |
624 | 585 |
625 void DevToolsUIBindings::DeviceCountChanged(int count) { | 586 void DevToolsUIBindings::SetDevicesUpdatesEnabled(bool enabled) { |
626 DispatchEventOnFrontend(kDeviceCountChanged, base::FundamentalValue(count)); | 587 if (devices_updates_enabled_ == enabled) |
| 588 return; |
| 589 devices_updates_enabled_ = enabled; |
| 590 if (enabled) { |
| 591 remote_targets_handler_ = DevToolsTargetsUIHandler::CreateForAdb( |
| 592 base::Bind(&DevToolsUIBindings::DevicesUpdated, |
| 593 base::Unretained(this)), |
| 594 profile_); |
| 595 } else { |
| 596 remote_targets_handler_.reset(); |
| 597 } |
627 } | 598 } |
628 | 599 |
629 void DevToolsUIBindings::PopulateRemoteDevices( | 600 void DevToolsUIBindings::DeviceCountChanged(int count) { |
| 601 base::FundamentalValue value(count); |
| 602 CallClientFunction("InspectorFrontendAPI.deviceCountUpdated", &value, NULL, |
| 603 NULL); |
| 604 } |
| 605 |
| 606 void DevToolsUIBindings::DevicesUpdated( |
630 const std::string& source, | 607 const std::string& source, |
631 const base::ListValue& targets) { | 608 const base::ListValue& targets) { |
632 DispatchEventOnFrontend(kDevicesChanged, targets); | 609 CallClientFunction("InspectorFrontendAPI.devicesUpdated", &targets, NULL, |
| 610 NULL); |
633 } | 611 } |
634 | 612 |
635 void DevToolsUIBindings::FileSavedAs(const std::string& url) { | 613 void DevToolsUIBindings::FileSavedAs(const std::string& url) { |
636 base::StringValue url_value(url); | 614 base::StringValue url_value(url); |
637 CallClientFunction("InspectorFrontendAPI.savedURL", &url_value, NULL, NULL); | 615 CallClientFunction("InspectorFrontendAPI.savedURL", &url_value, NULL, NULL); |
638 } | 616 } |
639 | 617 |
640 void DevToolsUIBindings::CanceledFileSaveAs(const std::string& url) { | 618 void DevToolsUIBindings::CanceledFileSaveAs(const std::string& url) { |
641 base::StringValue url_value(url); | 619 base::StringValue url_value(url); |
642 CallClientFunction("InspectorFrontendAPI.canceledSaveURL", | 620 CallClientFunction("InspectorFrontendAPI.canceledSaveURL", |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 base::JSONWriter::Write(arg3, &json); | 764 base::JSONWriter::Write(arg3, &json); |
787 params.append(", " + json); | 765 params.append(", " + json); |
788 } | 766 } |
789 } | 767 } |
790 } | 768 } |
791 base::string16 javascript = | 769 base::string16 javascript = |
792 base::UTF8ToUTF16(function_name + "(" + params + ");"); | 770 base::UTF8ToUTF16(function_name + "(" + params + ");"); |
793 web_contents_->GetMainFrame()->ExecuteJavaScript(javascript); | 771 web_contents_->GetMainFrame()->ExecuteJavaScript(javascript); |
794 } | 772 } |
795 | 773 |
796 void DevToolsUIBindings::DispatchEventOnFrontend( | |
797 const std::string& event_type, | |
798 const base::Value& event_data) { | |
799 if (subscribers_.find(event_type) == subscribers_.end()) | |
800 return; | |
801 base::StringValue event_type_value(event_type); | |
802 CallClientFunction("InspectorFrontendAPI.dispatchEventToListeners", | |
803 &event_type_value, | |
804 &event_data, | |
805 NULL); | |
806 } | |
807 | |
808 void DevToolsUIBindings::DocumentOnLoadCompletedInMainFrame() { | 774 void DevToolsUIBindings::DocumentOnLoadCompletedInMainFrame() { |
809 // Call delegate first - it seeds importants bit of information. | 775 // Call delegate first - it seeds importants bit of information. |
810 delegate_->OnLoadCompleted(); | 776 delegate_->OnLoadCompleted(); |
811 | 777 |
812 UpdateTheme(); | 778 UpdateTheme(); |
813 AddDevToolsExtensionsToClient(); | 779 AddDevToolsExtensionsToClient(); |
814 } | 780 } |
OLD | NEW |