| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 ~FrontendWebContentsObserver() { | 465 ~FrontendWebContentsObserver() { |
| 466 } | 466 } |
| 467 | 467 |
| 468 // static | 468 // static |
| 469 GURL DevToolsUIBindings::SanitizeFrontendURL(const GURL& url) { | 469 GURL DevToolsUIBindings::SanitizeFrontendURL(const GURL& url) { |
| 470 return ::SanitizeFrontendURL(url, content::kChromeDevToolsScheme, | 470 return ::SanitizeFrontendURL(url, content::kChromeDevToolsScheme, |
| 471 chrome::kChromeUIDevToolsHost, SanitizeFrontendPath(url.path()), true); | 471 chrome::kChromeUIDevToolsHost, SanitizeFrontendPath(url.path()), true); |
| 472 } | 472 } |
| 473 | 473 |
| 474 bool DevToolsUIBindings::IsValidFrontendURL(const GURL& url) { | 474 bool DevToolsUIBindings::IsValidFrontendURL(const GURL& url) { |
| 475 if (url.SchemeIs(content::kChromeUIScheme) && |
| 476 url.host() == content::kChromeUITracingHost && |
| 477 !url.has_query() && !url.has_ref()) { |
| 478 return true; |
| 479 } |
| 480 |
| 475 return SanitizeFrontendURL(url).spec() == url.spec(); | 481 return SanitizeFrontendURL(url).spec() == url.spec(); |
| 476 } | 482 } |
| 477 | 483 |
| 478 void DevToolsUIBindings::FrontendWebContentsObserver::RenderProcessGone( | 484 void DevToolsUIBindings::FrontendWebContentsObserver::RenderProcessGone( |
| 479 base::TerminationStatus status) { | 485 base::TerminationStatus status) { |
| 480 bool crashed = true; | 486 bool crashed = true; |
| 481 switch (status) { | 487 switch (status) { |
| 482 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 488 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
| 483 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 489 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
| 484 #if defined(OS_CHROMEOS) | 490 #if defined(OS_CHROMEOS) |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 DevToolsUIBindingsList* instances = g_instances.Pointer(); | 581 DevToolsUIBindingsList* instances = g_instances.Pointer(); |
| 576 DevToolsUIBindingsList::iterator it( | 582 DevToolsUIBindingsList::iterator it( |
| 577 std::find(instances->begin(), instances->end(), this)); | 583 std::find(instances->begin(), instances->end(), this)); |
| 578 DCHECK(it != instances->end()); | 584 DCHECK(it != instances->end()); |
| 579 instances->erase(it); | 585 instances->erase(it); |
| 580 } | 586 } |
| 581 | 587 |
| 582 // content::DevToolsFrontendHost::Delegate implementation --------------------- | 588 // content::DevToolsFrontendHost::Delegate implementation --------------------- |
| 583 void DevToolsUIBindings::HandleMessageFromDevToolsFrontend( | 589 void DevToolsUIBindings::HandleMessageFromDevToolsFrontend( |
| 584 const std::string& message) { | 590 const std::string& message) { |
| 585 if (!web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)) | 591 if (!frontend_host_) |
| 586 return; | 592 return; |
| 587 std::string method; | 593 std::string method; |
| 588 base::ListValue empty_params; | 594 base::ListValue empty_params; |
| 589 base::ListValue* params = &empty_params; | 595 base::ListValue* params = &empty_params; |
| 590 | 596 |
| 591 base::DictionaryValue* dict = NULL; | 597 base::DictionaryValue* dict = NULL; |
| 592 std::unique_ptr<base::Value> parsed_message = base::JSONReader::Read(message); | 598 std::unique_ptr<base::Value> parsed_message = base::JSONReader::Read(message); |
| 593 if (!parsed_message || | 599 if (!parsed_message || |
| 594 !parsed_message->GetAsDictionary(&dict) || | 600 !parsed_message->GetAsDictionary(&dict) || |
| 595 !dict->GetString(kFrontendHostMethod, &method) || | 601 !dict->GetString(kFrontendHostMethod, &method) || |
| 596 (dict->HasKey(kFrontendHostParams) && | 602 (dict->HasKey(kFrontendHostParams) && |
| 597 !dict->GetList(kFrontendHostParams, ¶ms))) { | 603 !dict->GetList(kFrontendHostParams, ¶ms))) { |
| 598 LOG(ERROR) << "Invalid message was sent to embedder: " << message; | 604 LOG(ERROR) << "Invalid message was sent to embedder: " << message; |
| 599 return; | 605 return; |
| 600 } | 606 } |
| 601 int id = 0; | 607 int id = 0; |
| 602 dict->GetInteger(kFrontendHostId, &id); | 608 dict->GetInteger(kFrontendHostId, &id); |
| 603 embedder_message_dispatcher_->Dispatch( | 609 embedder_message_dispatcher_->Dispatch( |
| 604 base::Bind(&DevToolsUIBindings::SendMessageAck, | 610 base::Bind(&DevToolsUIBindings::SendMessageAck, |
| 605 weak_factory_.GetWeakPtr(), | 611 weak_factory_.GetWeakPtr(), |
| 606 id), | 612 id), |
| 607 method, | 613 method, |
| 608 params); | 614 params); |
| 609 } | 615 } |
| 610 | 616 |
| 611 // content::DevToolsAgentHostClient implementation -------------------------- | 617 // content::DevToolsAgentHostClient implementation -------------------------- |
| 612 void DevToolsUIBindings::DispatchProtocolMessage( | 618 void DevToolsUIBindings::DispatchProtocolMessage( |
| 613 content::DevToolsAgentHost* agent_host, const std::string& message) { | 619 content::DevToolsAgentHost* agent_host, const std::string& message) { |
| 614 DCHECK(agent_host == agent_host_.get()); | 620 DCHECK(agent_host == agent_host_.get()); |
| 615 if (!web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)) | 621 if (!frontend_host_) |
| 616 return; | 622 return; |
| 617 | 623 |
| 618 if (message.length() < kMaxMessageChunkSize) { | 624 if (message.length() < kMaxMessageChunkSize) { |
| 619 std::string param; | 625 std::string param; |
| 620 base::EscapeJSONString(message, true, ¶m); | 626 base::EscapeJSONString(message, true, ¶m); |
| 621 base::string16 javascript = | 627 base::string16 javascript = |
| 622 base::UTF8ToUTF16("DevToolsAPI.dispatchMessage(" + param + ");"); | 628 base::UTF8ToUTF16("DevToolsAPI.dispatchMessage(" + param + ");"); |
| 623 web_contents_->GetMainFrame()->ExecuteJavaScript(javascript); | 629 web_contents_->GetMainFrame()->ExecuteJavaScript(javascript); |
| 624 return; | 630 return; |
| 625 } | 631 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 } | 727 } |
| 722 | 728 |
| 723 void DevToolsUIBindings::AppendToFile(const std::string& url, | 729 void DevToolsUIBindings::AppendToFile(const std::string& url, |
| 724 const std::string& content) { | 730 const std::string& content) { |
| 725 file_helper_->Append(url, content, | 731 file_helper_->Append(url, content, |
| 726 base::Bind(&DevToolsUIBindings::AppendedTo, | 732 base::Bind(&DevToolsUIBindings::AppendedTo, |
| 727 weak_factory_.GetWeakPtr(), url)); | 733 weak_factory_.GetWeakPtr(), url)); |
| 728 } | 734 } |
| 729 | 735 |
| 730 void DevToolsUIBindings::RequestFileSystems() { | 736 void DevToolsUIBindings::RequestFileSystems() { |
| 731 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 737 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 732 std::vector<DevToolsFileHelper::FileSystem> file_systems = | 738 std::vector<DevToolsFileHelper::FileSystem> file_systems = |
| 733 file_helper_->GetFileSystems(); | 739 file_helper_->GetFileSystems(); |
| 734 base::ListValue file_systems_value; | 740 base::ListValue file_systems_value; |
| 735 for (size_t i = 0; i < file_systems.size(); ++i) | 741 for (size_t i = 0; i < file_systems.size(); ++i) |
| 736 file_systems_value.Append(CreateFileSystemValue(file_systems[i])); | 742 file_systems_value.Append(CreateFileSystemValue(file_systems[i])); |
| 737 CallClientFunction("DevToolsAPI.fileSystemsLoaded", | 743 CallClientFunction("DevToolsAPI.fileSystemsLoaded", |
| 738 &file_systems_value, NULL, NULL); | 744 &file_systems_value, NULL, NULL); |
| 739 } | 745 } |
| 740 | 746 |
| 741 void DevToolsUIBindings::AddFileSystem(const std::string& file_system_path) { | 747 void DevToolsUIBindings::AddFileSystem(const std::string& file_system_path) { |
| 742 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 748 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 743 file_helper_->AddFileSystem( | 749 file_helper_->AddFileSystem( |
| 744 file_system_path, | 750 file_system_path, |
| 745 base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar, | 751 base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar, |
| 746 weak_factory_.GetWeakPtr())); | 752 weak_factory_.GetWeakPtr())); |
| 747 } | 753 } |
| 748 | 754 |
| 749 void DevToolsUIBindings::RemoveFileSystem(const std::string& file_system_path) { | 755 void DevToolsUIBindings::RemoveFileSystem(const std::string& file_system_path) { |
| 750 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 756 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 751 file_helper_->RemoveFileSystem(file_system_path); | 757 file_helper_->RemoveFileSystem(file_system_path); |
| 752 } | 758 } |
| 753 | 759 |
| 754 void DevToolsUIBindings::UpgradeDraggedFileSystemPermissions( | 760 void DevToolsUIBindings::UpgradeDraggedFileSystemPermissions( |
| 755 const std::string& file_system_url) { | 761 const std::string& file_system_url) { |
| 756 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 762 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 757 file_helper_->UpgradeDraggedFileSystemPermissions( | 763 file_helper_->UpgradeDraggedFileSystemPermissions( |
| 758 file_system_url, | 764 file_system_url, |
| 759 base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar, | 765 base::Bind(&DevToolsUIBindings::ShowDevToolsConfirmInfoBar, |
| 760 weak_factory_.GetWeakPtr())); | 766 weak_factory_.GetWeakPtr())); |
| 761 } | 767 } |
| 762 | 768 |
| 763 void DevToolsUIBindings::IndexPath(int index_request_id, | 769 void DevToolsUIBindings::IndexPath(int index_request_id, |
| 764 const std::string& file_system_path) { | 770 const std::string& file_system_path) { |
| 765 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 771 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 766 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 772 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 767 if (!file_helper_->IsFileSystemAdded(file_system_path)) { | 773 if (!file_helper_->IsFileSystemAdded(file_system_path)) { |
| 768 IndexingDone(index_request_id, file_system_path); | 774 IndexingDone(index_request_id, file_system_path); |
| 769 return; | 775 return; |
| 770 } | 776 } |
| 771 if (indexing_jobs_.count(index_request_id) != 0) | 777 if (indexing_jobs_.count(index_request_id) != 0) |
| 772 return; | 778 return; |
| 773 indexing_jobs_[index_request_id] = | 779 indexing_jobs_[index_request_id] = |
| 774 scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob>( | 780 scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob>( |
| 775 file_system_indexer_->IndexPath( | 781 file_system_indexer_->IndexPath( |
| 776 file_system_path, | 782 file_system_path, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 794 if (it == indexing_jobs_.end()) | 800 if (it == indexing_jobs_.end()) |
| 795 return; | 801 return; |
| 796 it->second->Stop(); | 802 it->second->Stop(); |
| 797 indexing_jobs_.erase(it); | 803 indexing_jobs_.erase(it); |
| 798 } | 804 } |
| 799 | 805 |
| 800 void DevToolsUIBindings::SearchInPath(int search_request_id, | 806 void DevToolsUIBindings::SearchInPath(int search_request_id, |
| 801 const std::string& file_system_path, | 807 const std::string& file_system_path, |
| 802 const std::string& query) { | 808 const std::string& query) { |
| 803 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 809 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 804 CHECK(web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)); | 810 CHECK(IsValidFrontendURL(web_contents_->GetURL()) && frontend_host_); |
| 805 if (!file_helper_->IsFileSystemAdded(file_system_path)) { | 811 if (!file_helper_->IsFileSystemAdded(file_system_path)) { |
| 806 SearchCompleted(search_request_id, | 812 SearchCompleted(search_request_id, |
| 807 file_system_path, | 813 file_system_path, |
| 808 std::vector<std::string>()); | 814 std::vector<std::string>()); |
| 809 return; | 815 return; |
| 810 } | 816 } |
| 811 file_system_indexer_->SearchInPath(file_system_path, | 817 file_system_indexer_->SearchInPath(file_system_path, |
| 812 query, | 818 query, |
| 813 Bind(&DevToolsUIBindings::SearchCompleted, | 819 Bind(&DevToolsUIBindings::SearchCompleted, |
| 814 weak_factory_.GetWeakPtr(), | 820 weak_factory_.GetWeakPtr(), |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 } | 1286 } |
| 1281 | 1287 |
| 1282 bool DevToolsUIBindings::IsAttachedTo(content::DevToolsAgentHost* agent_host) { | 1288 bool DevToolsUIBindings::IsAttachedTo(content::DevToolsAgentHost* agent_host) { |
| 1283 return agent_host_.get() == agent_host; | 1289 return agent_host_.get() == agent_host; |
| 1284 } | 1290 } |
| 1285 | 1291 |
| 1286 void DevToolsUIBindings::CallClientFunction(const std::string& function_name, | 1292 void DevToolsUIBindings::CallClientFunction(const std::string& function_name, |
| 1287 const base::Value* arg1, | 1293 const base::Value* arg1, |
| 1288 const base::Value* arg2, | 1294 const base::Value* arg2, |
| 1289 const base::Value* arg3) { | 1295 const base::Value* arg3) { |
| 1290 if (!web_contents_->GetURL().SchemeIs(content::kChromeDevToolsScheme)) | |
| 1291 return; | |
| 1292 // If we're not exposing bindings, we shouldn't call functions either. | 1296 // If we're not exposing bindings, we shouldn't call functions either. |
| 1293 if (!frontend_host_) | 1297 if (!frontend_host_) |
| 1294 return; | 1298 return; |
| 1295 std::string javascript = function_name + "("; | 1299 std::string javascript = function_name + "("; |
| 1296 if (arg1) { | 1300 if (arg1) { |
| 1297 std::string json; | 1301 std::string json; |
| 1298 base::JSONWriter::Write(*arg1, &json); | 1302 base::JSONWriter::Write(*arg1, &json); |
| 1299 javascript.append(json); | 1303 javascript.append(json); |
| 1300 if (arg2) { | 1304 if (arg2) { |
| 1301 base::JSONWriter::Write(*arg2, &json); | 1305 base::JSONWriter::Write(*arg2, &json); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1337 void DevToolsUIBindings::FrontendLoaded() { | 1341 void DevToolsUIBindings::FrontendLoaded() { |
| 1338 if (frontend_loaded_) | 1342 if (frontend_loaded_) |
| 1339 return; | 1343 return; |
| 1340 frontend_loaded_ = true; | 1344 frontend_loaded_ = true; |
| 1341 | 1345 |
| 1342 // Call delegate first - it seeds importants bit of information. | 1346 // Call delegate first - it seeds importants bit of information. |
| 1343 delegate_->OnLoadCompleted(); | 1347 delegate_->OnLoadCompleted(); |
| 1344 | 1348 |
| 1345 AddDevToolsExtensionsToClient(); | 1349 AddDevToolsExtensionsToClient(); |
| 1346 } | 1350 } |
| OLD | NEW |