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

Side by Side Diff: components/devtools_http_handler/devtools_http_handler.cc

Issue 1114503002: [DevTools] Cleanup DevToolsTarget and DevToolsManagerDelegate after moving to devtools_discovery. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@devtools-discovery-chrome
Patch Set: Created 5 years, 7 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <algorithm> 5 #include <algorithm>
6 #include <utility> 6 #include <utility>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop/message_loop_proxy.h" 13 #include "base/message_loop/message_loop_proxy.h"
14 #include "base/stl_util.h" 14 #include "base/stl_util.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
17 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
18 #include "base/threading/thread.h" 18 #include "base/threading/thread.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "components/devtools_discovery/devtools_discovery_manager.h"
20 #include "components/devtools_http_handler/devtools_http_handler.h" 21 #include "components/devtools_http_handler/devtools_http_handler.h"
21 #include "components/devtools_http_handler/devtools_http_handler_delegate.h" 22 #include "components/devtools_http_handler/devtools_http_handler_delegate.h"
22 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
23 #include "content/public/browser/devtools_agent_host.h" 24 #include "content/public/browser/devtools_agent_host.h"
24 #include "content/public/browser/devtools_target.h"
25 #include "content/public/common/url_constants.h" 25 #include "content/public/common/url_constants.h"
26 #include "content/public/common/user_agent.h" 26 #include "content/public/common/user_agent.h"
27 #include "net/base/escape.h" 27 #include "net/base/escape.h"
28 #include "net/base/io_buffer.h" 28 #include "net/base/io_buffer.h"
29 #include "net/base/ip_endpoint.h" 29 #include "net/base/ip_endpoint.h"
30 #include "net/base/net_errors.h" 30 #include "net/base/net_errors.h"
31 #include "net/server/http_server.h" 31 #include "net/server/http_server.h"
32 #include "net/server/http_server_request_info.h" 32 #include "net/server/http_server_request_info.h"
33 #include "net/server/http_server_response_info.h" 33 #include "net/server/http_server_response_info.h"
34 #include "net/socket/server_socket.h" 34 #include "net/socket/server_socket.h"
35 35
36 #if defined(OS_ANDROID) 36 #if defined(OS_ANDROID)
37 #include "base/android/build_info.h" 37 #include "base/android/build_info.h"
38 #endif 38 #endif
39 39
40 using content::BrowserThread; 40 using content::BrowserThread;
41 using content::DevToolsAgentHost; 41 using content::DevToolsAgentHost;
42 using content::DevToolsAgentHostClient; 42 using content::DevToolsAgentHostClient;
43 using content::DevToolsManagerDelegate; 43 using devtools_discovery::DevToolsTargetDescriptor;
44 using content::DevToolsTarget;
45 44
46 namespace devtools_http_handler { 45 namespace devtools_http_handler {
47 46
48 namespace { 47 namespace {
49 48
50 const base::FilePath::CharType kDevToolsActivePortFileName[] = 49 const base::FilePath::CharType kDevToolsActivePortFileName[] =
51 FILE_PATH_LITERAL("DevToolsActivePort"); 50 FILE_PATH_LITERAL("DevToolsActivePort");
52 51
53 const char kDevToolsHandlerThreadName[] = "Chrome_DevToolsHandlerThread"; 52 const char kDevToolsHandlerThreadName[] = "Chrome_DevToolsHandlerThread";
54 53
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 agent_host_->DispatchProtocolMessage(message); 311 agent_host_->DispatchProtocolMessage(message);
313 } 312 }
314 313
315 private: 314 private:
316 base::MessageLoop* const message_loop_; 315 base::MessageLoop* const message_loop_;
317 ServerWrapper* const server_wrapper_; 316 ServerWrapper* const server_wrapper_;
318 const int connection_id_; 317 const int connection_id_;
319 scoped_refptr<DevToolsAgentHost> agent_host_; 318 scoped_refptr<DevToolsAgentHost> agent_host_;
320 }; 319 };
321 320
322 static bool TimeComparator(const DevToolsTarget* target1, 321 static bool TimeComparator(const DevToolsTargetDescriptor* desc1,
323 const DevToolsTarget* target2) { 322 const DevToolsTargetDescriptor* desc2) {
324 return target1->GetLastActivityTime() > target2->GetLastActivityTime(); 323 return desc1->GetLastActivityTime() > desc2->GetLastActivityTime();
325 } 324 }
326 325
327 // DevToolsHttpHandler::ServerSocketFactory ---------------------------------- 326 // DevToolsHttpHandler::ServerSocketFactory ----------------------------------
328 327
329 scoped_ptr<net::ServerSocket> 328 scoped_ptr<net::ServerSocket>
330 DevToolsHttpHandler::ServerSocketFactory::CreateForHttpServer() { 329 DevToolsHttpHandler::ServerSocketFactory::CreateForHttpServer() {
331 return scoped_ptr<net::ServerSocket>(); 330 return scoped_ptr<net::ServerSocket>();
332 } 331 }
333 332
334 scoped_ptr<net::ServerSocket> 333 scoped_ptr<net::ServerSocket>
335 DevToolsHttpHandler::ServerSocketFactory::CreateForTethering( 334 DevToolsHttpHandler::ServerSocketFactory::CreateForTethering(
336 std::string* name) { 335 std::string* name) {
337 return scoped_ptr<net::ServerSocket>(); 336 return scoped_ptr<net::ServerSocket>();
338 } 337 }
339 338
340 // DevToolsHttpHandler ------------------------------------------------------- 339 // DevToolsHttpHandler -------------------------------------------------------
341 340
342 DevToolsHttpHandler::~DevToolsHttpHandler() { 341 DevToolsHttpHandler::~DevToolsHttpHandler() {
343 TerminateOnUI(thread_, server_wrapper_, socket_factory_); 342 TerminateOnUI(thread_, server_wrapper_, socket_factory_);
344 STLDeleteValues(&target_map_); 343 STLDeleteValues(&descriptor_map_);
345 STLDeleteValues(&connection_to_client_); 344 STLDeleteValues(&connection_to_client_);
346 } 345 }
347 346
348 GURL DevToolsHttpHandler::GetFrontendURL(const std::string& path) { 347 GURL DevToolsHttpHandler::GetFrontendURL(const std::string& path) {
349 if (!server_ip_address_) 348 if (!server_ip_address_)
350 return GURL(); 349 return GURL();
351 return GURL(std::string("http://") + server_ip_address_->ToString() + 350 return GURL(std::string("http://") + server_ip_address_->ToString() +
352 (path.empty() ? frontend_url_ : path)); 351 (path.empty() ? frontend_url_ : path));
353 } 352 }
354 353
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 #if defined(OS_ANDROID) 557 #if defined(OS_ANDROID)
559 version.SetString("Android-Package", 558 version.SetString("Android-Package",
560 base::android::BuildInfo::GetInstance()->package_name()); 559 base::android::BuildInfo::GetInstance()->package_name());
561 #endif 560 #endif
562 SendJson(connection_id, net::HTTP_OK, &version, std::string()); 561 SendJson(connection_id, net::HTTP_OK, &version, std::string());
563 return; 562 return;
564 } 563 }
565 564
566 if (command == "list") { 565 if (command == "list") {
567 std::string host = info.headers["host"]; 566 std::string host = info.headers["host"];
568 if (manager_delegate_) { 567 DevToolsTargetDescriptor::List descriptors =
569 manager_delegate_->EnumerateTargets( 568 devtools_discovery::DevToolsDiscoveryManager::GetInstance()->
570 base::Bind(&DevToolsHttpHandler::OnTargetListReceivedWeak, 569 GetDescriptors();
571 weak_factory_.GetWeakPtr(), connection_id, host)); 570 std::sort(descriptors.begin(), descriptors.end(), TimeComparator);
572 } else { 571 STLDeleteValues(&descriptor_map_);
573 DevToolsManagerDelegate::TargetList empty_list; 572 base::ListValue list_value;
574 OnTargetListReceived(connection_id, host, empty_list); 573 for (DevToolsTargetDescriptor* descriptor : descriptors) {
574 descriptor_map_[descriptor->GetId()] = descriptor;
575 list_value.Append(SerializeDescriptor(*descriptor, host));
575 } 576 }
577 SendJson(connection_id, net::HTTP_OK, &list_value, std::string());
576 return; 578 return;
577 } 579 }
578 580
579 if (command == "new") { 581 if (command == "new") {
580 GURL url(net::UnescapeURLComponent( 582 GURL url(net::UnescapeURLComponent(
581 query, net::UnescapeRule::URL_SPECIAL_CHARS)); 583 query, net::UnescapeRule::URL_SPECIAL_CHARS));
582 if (!url.is_valid()) 584 if (!url.is_valid())
583 url = GURL(url::kAboutBlankURL); 585 url = GURL(url::kAboutBlankURL);
584 scoped_ptr<DevToolsTarget> target; 586 scoped_ptr<DevToolsTargetDescriptor> descriptor =
585 if (manager_delegate_) 587 devtools_discovery::DevToolsDiscoveryManager::GetInstance()->
586 target = manager_delegate_->CreateNewTarget(url); 588 CreateNew(url);
587 if (!target) { 589 if (!descriptor) {
588 SendJson(connection_id, 590 SendJson(connection_id,
589 net::HTTP_INTERNAL_SERVER_ERROR, 591 net::HTTP_INTERNAL_SERVER_ERROR,
590 NULL, 592 NULL,
591 "Could not create new page"); 593 "Could not create new page");
592 return; 594 return;
593 } 595 }
594 std::string host = info.headers["host"]; 596 std::string host = info.headers["host"];
595 scoped_ptr<base::DictionaryValue> dictionary( 597 scoped_ptr<base::DictionaryValue> dictionary(
596 SerializeTarget(*target.get(), host)); 598 SerializeDescriptor(*descriptor.get(), host));
597 SendJson(connection_id, net::HTTP_OK, dictionary.get(), std::string()); 599 SendJson(connection_id, net::HTTP_OK, dictionary.get(), std::string());
598 const std::string target_id = target->GetId(); 600 const std::string target_id = descriptor->GetId();
599 target_map_[target_id] = target.release(); 601 descriptor_map_[target_id] = descriptor.release();
600 return; 602 return;
601 } 603 }
602 604
603 if (command == "activate" || command == "close") { 605 if (command == "activate" || command == "close") {
604 DevToolsTarget* target = GetTarget(target_id); 606 DevToolsTargetDescriptor* descriptor = GetDescriptor(target_id);
605 if (!target) { 607 if (!descriptor) {
606 SendJson(connection_id, 608 SendJson(connection_id,
607 net::HTTP_NOT_FOUND, 609 net::HTTP_NOT_FOUND,
608 NULL, 610 NULL,
609 "No such target id: " + target_id); 611 "No such target id: " + target_id);
610 return; 612 return;
611 } 613 }
612 614
613 if (command == "activate") { 615 if (command == "activate") {
614 if (target->Activate()) { 616 if (descriptor->Activate()) {
615 SendJson(connection_id, net::HTTP_OK, NULL, "Target activated"); 617 SendJson(connection_id, net::HTTP_OK, NULL, "Target activated");
616 } else { 618 } else {
617 SendJson(connection_id, 619 SendJson(connection_id,
618 net::HTTP_INTERNAL_SERVER_ERROR, 620 net::HTTP_INTERNAL_SERVER_ERROR,
619 NULL, 621 NULL,
620 "Could not activate target id: " + target_id); 622 "Could not activate target id: " + target_id);
621 } 623 }
622 return; 624 return;
623 } 625 }
624 626
625 if (command == "close") { 627 if (command == "close") {
626 if (target->Close()) { 628 if (descriptor->Close()) {
627 SendJson(connection_id, net::HTTP_OK, NULL, "Target is closing"); 629 SendJson(connection_id, net::HTTP_OK, NULL, "Target is closing");
628 } else { 630 } else {
629 SendJson(connection_id, 631 SendJson(connection_id,
630 net::HTTP_INTERNAL_SERVER_ERROR, 632 net::HTTP_INTERNAL_SERVER_ERROR,
631 NULL, 633 NULL,
632 "Could not close target id: " + target_id); 634 "Could not close target id: " + target_id);
633 } 635 }
634 return; 636 return;
635 } 637 }
636 } 638 }
637 SendJson(connection_id, 639 SendJson(connection_id,
638 net::HTTP_NOT_FOUND, 640 net::HTTP_NOT_FOUND,
639 NULL, 641 NULL,
640 "Unknown command: " + command); 642 "Unknown command: " + command);
641 return; 643 return;
642 } 644 }
643 645
644 // static 646 DevToolsTargetDescriptor* DevToolsHttpHandler::GetDescriptor(
645 void DevToolsHttpHandler::OnTargetListReceivedWeak( 647 const std::string& target_id) {
646 base::WeakPtr<DevToolsHttpHandler> handler, 648 DescriptorMap::const_iterator it = descriptor_map_.find(target_id);
647 int connection_id, 649 if (it == descriptor_map_.end())
648 const std::string& host, 650 return nullptr;
649 const DevToolsManagerDelegate::TargetList& targets) {
650 if (handler) {
651 handler->OnTargetListReceived(connection_id, host, targets);
652 } else {
653 STLDeleteContainerPointers(targets.begin(), targets.end());
654 }
655 }
656
657 void DevToolsHttpHandler::OnTargetListReceived(
658 int connection_id,
659 const std::string& host,
660 const DevToolsManagerDelegate::TargetList& targets) {
661 DevToolsManagerDelegate::TargetList sorted_targets = targets;
662 std::sort(sorted_targets.begin(), sorted_targets.end(), TimeComparator);
663
664 STLDeleteValues(&target_map_);
665 base::ListValue list_value;
666 for (DevToolsManagerDelegate::TargetList::const_iterator it =
667 sorted_targets.begin(); it != sorted_targets.end(); ++it) {
668 DevToolsTarget* target = *it;
669 target_map_[target->GetId()] = target;
670 list_value.Append(SerializeTarget(*target, host));
671 }
672 SendJson(connection_id, net::HTTP_OK, &list_value, std::string());
673 }
674
675 DevToolsTarget* DevToolsHttpHandler::GetTarget(const std::string& id) {
676 TargetMap::const_iterator it = target_map_.find(id);
677 if (it == target_map_.end())
678 return NULL;
679 return it->second; 651 return it->second;
680 } 652 }
681 653
682 void DevToolsHttpHandler::OnThumbnailRequest( 654 void DevToolsHttpHandler::OnThumbnailRequest(
683 int connection_id, const std::string& target_id) { 655 int connection_id, const std::string& target_id) {
684 DevToolsTarget* target = GetTarget(target_id); 656 DevToolsTargetDescriptor* descriptor = GetDescriptor(target_id);
685 GURL page_url; 657 GURL page_url;
686 if (target) 658 if (descriptor)
687 page_url = target->GetURL(); 659 page_url = descriptor->GetURL();
688 std::string data = manager_delegate_ ? 660 std::string data = delegate_->GetPageThumbnailData(page_url);
689 manager_delegate_->GetPageThumbnailData(page_url) : "";
690 if (!data.empty()) 661 if (!data.empty())
691 Send200(connection_id, data, "image/png"); 662 Send200(connection_id, data, "image/png");
692 else 663 else
693 Send404(connection_id); 664 Send404(connection_id);
694 } 665 }
695 666
696 void DevToolsHttpHandler::OnDiscoveryPageRequest(int connection_id) { 667 void DevToolsHttpHandler::OnDiscoveryPageRequest(int connection_id) {
697 std::string response = delegate_->GetDiscoveryPageHTML(); 668 std::string response = delegate_->GetDiscoveryPageHTML();
698 Send200(connection_id, response, "text/html; charset=UTF-8"); 669 Send200(connection_id, response, "text/html; charset=UTF-8");
699 } 670 }
(...skipping 24 matching lines...) Expand all
724 AcceptWebSocket(connection_id, request); 695 AcceptWebSocket(connection_id, request);
725 return; 696 return;
726 } 697 }
727 698
728 size_t pos = request.path.find(kPageUrlPrefix); 699 size_t pos = request.path.find(kPageUrlPrefix);
729 if (pos != 0) { 700 if (pos != 0) {
730 Send404(connection_id); 701 Send404(connection_id);
731 return; 702 return;
732 } 703 }
733 704
734 std::string page_id = request.path.substr(strlen(kPageUrlPrefix)); 705 std::string target_id = request.path.substr(strlen(kPageUrlPrefix));
735 DevToolsTarget* target = GetTarget(page_id); 706 DevToolsTargetDescriptor* descriptor = GetDescriptor(target_id);
736 scoped_refptr<DevToolsAgentHost> agent = 707 scoped_refptr<DevToolsAgentHost> agent =
737 target ? target->GetAgentHost() : NULL; 708 descriptor ? descriptor->GetAgentHost() : nullptr;
738 if (!agent.get()) { 709 if (!agent.get()) {
739 Send500(connection_id, "No such target id: " + page_id); 710 Send500(connection_id, "No such target id: " + target_id);
740 return; 711 return;
741 } 712 }
742 713
743 if (agent->IsAttached()) { 714 if (agent->IsAttached()) {
744 Send500(connection_id, 715 Send500(connection_id,
745 "Target with given id is being inspected: " + page_id); 716 "Target with given id is being inspected: " + target_id);
746 return; 717 return;
747 } 718 }
748 719
749 DevToolsAgentHostClientImpl* client_host = new DevToolsAgentHostClientImpl( 720 DevToolsAgentHostClientImpl* client_host = new DevToolsAgentHostClientImpl(
750 thread_->message_loop(), server_wrapper_, connection_id, agent); 721 thread_->message_loop(), server_wrapper_, connection_id, agent);
751 connection_to_client_[connection_id] = client_host; 722 connection_to_client_[connection_id] = client_host;
752 723
753 AcceptWebSocket(connection_id, request); 724 AcceptWebSocket(connection_id, request);
754 } 725 }
755 726
(...skipping 12 matching lines...) Expand all
768 if (it != connection_to_client_.end()) { 739 if (it != connection_to_client_.end()) {
769 delete it->second; 740 delete it->second;
770 connection_to_client_.erase(connection_id); 741 connection_to_client_.erase(connection_id);
771 } 742 }
772 } 743 }
773 744
774 DevToolsHttpHandler::DevToolsHttpHandler( 745 DevToolsHttpHandler::DevToolsHttpHandler(
775 scoped_ptr<ServerSocketFactory> server_socket_factory, 746 scoped_ptr<ServerSocketFactory> server_socket_factory,
776 const std::string& frontend_url, 747 const std::string& frontend_url,
777 DevToolsHttpHandlerDelegate* delegate, 748 DevToolsHttpHandlerDelegate* delegate,
778 DevToolsManagerDelegate* manager_delegate,
779 const base::FilePath& output_directory, 749 const base::FilePath& output_directory,
780 const base::FilePath& debug_frontend_dir, 750 const base::FilePath& debug_frontend_dir,
781 const std::string& product_name, 751 const std::string& product_name,
782 const std::string& user_agent) 752 const std::string& user_agent)
783 : thread_(nullptr), 753 : thread_(nullptr),
784 frontend_url_(frontend_url), 754 frontend_url_(frontend_url),
785 product_name_(product_name), 755 product_name_(product_name),
786 user_agent_(user_agent), 756 user_agent_(user_agent),
787 server_wrapper_(nullptr), 757 server_wrapper_(nullptr),
788 delegate_(delegate), 758 delegate_(delegate),
789 manager_delegate_(manager_delegate),
790 socket_factory_(nullptr), 759 socket_factory_(nullptr),
791 weak_factory_(this) { 760 weak_factory_(this) {
792 bool bundles_resources = frontend_url_.empty(); 761 bool bundles_resources = frontend_url_.empty();
793 if (frontend_url_.empty()) 762 if (frontend_url_.empty())
794 frontend_url_ = "/devtools/inspector.html"; 763 frontend_url_ = "/devtools/inspector.html";
795 764
796 BrowserThread::PostTask( 765 BrowserThread::PostTask(
797 BrowserThread::FILE, FROM_HERE, 766 BrowserThread::FILE, FROM_HERE,
798 base::Bind(&StartServerOnFile, 767 base::Bind(&StartServerOnFile,
799 weak_factory_.GetWeakPtr(), 768 weak_factory_.GetWeakPtr(),
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 if (!thread_) 874 if (!thread_)
906 return; 875 return;
907 thread_->message_loop()->PostTask( 876 thread_->message_loop()->PostTask(
908 FROM_HERE, 877 FROM_HERE,
909 base::Bind(&ServerWrapper::AcceptWebSocket, 878 base::Bind(&ServerWrapper::AcceptWebSocket,
910 base::Unretained(server_wrapper_), 879 base::Unretained(server_wrapper_),
911 connection_id, 880 connection_id,
912 request)); 881 request));
913 } 882 }
914 883
915 base::DictionaryValue* DevToolsHttpHandler::SerializeTarget( 884 base::DictionaryValue* DevToolsHttpHandler::SerializeDescriptor(
916 const DevToolsTarget& target, 885 const DevToolsTargetDescriptor& descriptor,
917 const std::string& host) { 886 const std::string& host) {
918 base::DictionaryValue* dictionary = new base::DictionaryValue; 887 base::DictionaryValue* dictionary = new base::DictionaryValue;
919 888
920 std::string id = target.GetId(); 889 std::string id = descriptor.GetId();
921 dictionary->SetString(kTargetIdField, id); 890 dictionary->SetString(kTargetIdField, id);
922 std::string parent_id = target.GetParentId(); 891 std::string parent_id = descriptor.GetParentId();
923 if (!parent_id.empty()) 892 if (!parent_id.empty())
924 dictionary->SetString(kTargetParentIdField, parent_id); 893 dictionary->SetString(kTargetParentIdField, parent_id);
925 dictionary->SetString(kTargetTypeField, target.GetType()); 894 dictionary->SetString(kTargetTypeField, descriptor.GetType());
926 dictionary->SetString(kTargetTitleField, 895 dictionary->SetString(kTargetTitleField,
927 net::EscapeForHTML(target.GetTitle())); 896 net::EscapeForHTML(descriptor.GetTitle()));
928 dictionary->SetString(kTargetDescriptionField, target.GetDescription()); 897 dictionary->SetString(kTargetDescriptionField, descriptor.GetDescription());
929 898
930 GURL url = target.GetURL(); 899 GURL url = descriptor.GetURL();
931 dictionary->SetString(kTargetUrlField, url.spec()); 900 dictionary->SetString(kTargetUrlField, url.spec());
932 901
933 GURL favicon_url = target.GetFaviconURL(); 902 GURL favicon_url = descriptor.GetFaviconURL();
934 if (favicon_url.is_valid()) 903 if (favicon_url.is_valid())
935 dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec()); 904 dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec());
936 905
937 if (manager_delegate_ && 906 if (!delegate_->GetPageThumbnailData(url).empty()) {
938 !manager_delegate_->GetPageThumbnailData(url).empty()) {
939 dictionary->SetString(kTargetThumbnailUrlField, 907 dictionary->SetString(kTargetThumbnailUrlField,
940 std::string(kThumbUrlPrefix) + id); 908 std::string(kThumbUrlPrefix) + id);
941 } 909 }
942 910
943 if (!target.IsAttached()) { 911 if (!descriptor.IsAttached()) {
944 dictionary->SetString(kTargetWebSocketDebuggerUrlField, 912 dictionary->SetString(kTargetWebSocketDebuggerUrlField,
945 base::StringPrintf("ws://%s%s%s", 913 base::StringPrintf("ws://%s%s%s",
946 host.c_str(), 914 host.c_str(),
947 kPageUrlPrefix, 915 kPageUrlPrefix,
948 id.c_str())); 916 id.c_str()));
949 std::string devtools_frontend_url = GetFrontendURLInternal( 917 std::string devtools_frontend_url = GetFrontendURLInternal(
950 id.c_str(), 918 id.c_str(),
951 host); 919 host);
952 dictionary->SetString( 920 dictionary->SetString(
953 kTargetDevtoolsFrontendUrlField, devtools_frontend_url); 921 kTargetDevtoolsFrontendUrlField, devtools_frontend_url);
954 } 922 }
955 923
956 return dictionary; 924 return dictionary;
957 } 925 }
958 926
959 } // namespace devtools_http_handler 927 } // namespace devtools_http_handler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698