OLD | NEW |
---|---|
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 "content/browser/devtools/devtools_http_handler_impl.h" | 5 #include "content/browser/devtools/devtools_http_handler_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
209 BrowserThread::FILE, FROM_HERE, | 209 BrowserThread::FILE, FROM_HERE, |
210 base::Bind(&DevToolsHttpHandlerImpl::StopHandlerThread, this), | 210 base::Bind(&DevToolsHttpHandlerImpl::StopHandlerThread, this), |
211 base::Bind(&DevToolsHttpHandlerImpl::ResetHandlerThreadAndRelease, this)); | 211 base::Bind(&DevToolsHttpHandlerImpl::ResetHandlerThreadAndRelease, this)); |
212 } | 212 } |
213 | 213 |
214 GURL DevToolsHttpHandlerImpl::GetFrontendURL() { | 214 GURL DevToolsHttpHandlerImpl::GetFrontendURL() { |
215 net::IPEndPoint ip_address; | 215 net::IPEndPoint ip_address; |
216 if (server_->GetLocalAddress(&ip_address)) | 216 if (server_->GetLocalAddress(&ip_address)) |
217 return GURL(); | 217 return GURL(); |
218 return GURL(std::string("http://") + ip_address.ToString() + | 218 return GURL(std::string("http://") + ip_address.ToString() + |
219 overridden_frontend_url_); | 219 frontend_url_); |
220 } | 220 } |
221 | 221 |
222 static std::string PathWithoutParams(const std::string& path) { | 222 static std::string PathWithoutParams(const std::string& path) { |
223 size_t query_position = path.find("?"); | 223 size_t query_position = path.find("?"); |
224 if (query_position != std::string::npos) | 224 if (query_position != std::string::npos) |
225 return path.substr(0, query_position); | 225 return path.substr(0, query_position); |
226 return path; | 226 return path; |
227 } | 227 } |
228 | 228 |
229 static std::string GetMimeType(const std::string& filename) { | 229 static std::string GetMimeType(const std::string& filename) { |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
380 BrowserThread::UI, | 380 BrowserThread::UI, |
381 FROM_HERE, | 381 FROM_HERE, |
382 base::Bind( | 382 base::Bind( |
383 &DevToolsHttpHandlerImpl::OnCloseUI, | 383 &DevToolsHttpHandlerImpl::OnCloseUI, |
384 this, | 384 this, |
385 connection_id)); | 385 connection_id)); |
386 } | 386 } |
387 | 387 |
388 std::string DevToolsHttpHandlerImpl::GetFrontendURLInternal( | 388 std::string DevToolsHttpHandlerImpl::GetFrontendURLInternal( |
389 const std::string id, | 389 const std::string id, |
390 const std::string& host) { | 390 const std::string& host, |
391 const std::string& frontend_url) { | |
391 return base::StringPrintf( | 392 return base::StringPrintf( |
392 "%s%sws=%s%s%s", | 393 "%s%sws=%s%s%s", |
393 overridden_frontend_url_.c_str(), | 394 frontend_url.c_str(), |
394 overridden_frontend_url_.find("?") == std::string::npos ? "?" : "&", | 395 frontend_url.find("?") == std::string::npos ? "?" : "&", |
395 host.c_str(), | 396 host.c_str(), |
396 kPageUrlPrefix, | 397 kPageUrlPrefix, |
397 id.c_str()); | 398 id.c_str()); |
398 } | 399 } |
399 | 400 |
400 static bool ParseJsonPath( | 401 static bool ParseJsonPath( |
401 const std::string& path, | 402 const std::string& path, |
402 std::string* command, | 403 std::string* command, |
403 std::string* target_id) { | 404 std::string* target_id) { |
404 | 405 |
(...skipping 17 matching lines...) Expand all Loading... | |
422 return true; | 423 return true; |
423 } | 424 } |
424 | 425 |
425 void DevToolsHttpHandlerImpl::OnJsonRequestUI( | 426 void DevToolsHttpHandlerImpl::OnJsonRequestUI( |
426 int connection_id, | 427 int connection_id, |
427 const net::HttpServerRequestInfo& info) { | 428 const net::HttpServerRequestInfo& info) { |
428 // Trim /json | 429 // Trim /json |
429 std::string path = info.path.substr(5); | 430 std::string path = info.path.substr(5); |
430 | 431 |
431 // Trim fragment and query | 432 // Trim fragment and query |
432 std::string query; | 433 GURL aux_url; |
433 size_t query_pos = path.find("?"); | 434 size_t query_pos = path.find("?"); |
434 if (query_pos != std::string::npos) { | 435 if (query_pos != std::string::npos) { |
435 query = path.substr(query_pos + 1); | 436 std::string query = path.substr(query_pos + 1); |
lushnikov
2014/03/08 15:15:18
what kind of query could be passed in here before?
pfeldman
2014/03/08 15:46:29
The only usage was passing the url to open in the
| |
436 path = path.substr(0, query_pos); | 437 path = path.substr(0, query_pos); |
438 | |
439 aux_url = GURL(net::UnescapeURLComponent( | |
440 query, net::UnescapeRule::URL_SPECIAL_CHARS)); | |
437 } | 441 } |
438 | 442 |
439 size_t fragment_pos = path.find("#"); | 443 size_t fragment_pos = path.find("#"); |
440 if (fragment_pos != std::string::npos) | 444 if (fragment_pos != std::string::npos) |
441 path = path.substr(0, fragment_pos); | 445 path = path.substr(0, fragment_pos); |
442 | 446 |
443 std::string command; | 447 std::string command; |
444 std::string target_id; | 448 std::string target_id; |
445 if (!ParseJsonPath(path, &command, &target_id)) { | 449 if (!ParseJsonPath(path, &command, &target_id)) { |
446 SendJson(connection_id, | 450 SendJson(connection_id, |
(...skipping 16 matching lines...) Expand all Loading... | |
463 #endif | 467 #endif |
464 SendJson(connection_id, net::HTTP_OK, &version, std::string()); | 468 SendJson(connection_id, net::HTTP_OK, &version, std::string()); |
465 return; | 469 return; |
466 } | 470 } |
467 | 471 |
468 if (command == "list") { | 472 if (command == "list") { |
469 std::string host = info.headers["host"]; | 473 std::string host = info.headers["host"]; |
470 AddRef(); // Balanced in OnTargetListReceived. | 474 AddRef(); // Balanced in OnTargetListReceived. |
471 delegate_->EnumerateTargets( | 475 delegate_->EnumerateTargets( |
472 base::Bind(&DevToolsHttpHandlerImpl::OnTargetListReceived, | 476 base::Bind(&DevToolsHttpHandlerImpl::OnTargetListReceived, |
473 this, connection_id, host)); | 477 this, connection_id, host, aux_url)); |
474 return; | 478 return; |
475 } | 479 } |
476 | 480 |
477 if (command == "new") { | 481 if (command == "new") { |
478 GURL url(net::UnescapeURLComponent( | 482 if (aux_url.is_valid()) |
lushnikov
2014/03/08 15:15:18
"not" seems to be missing here
pfeldman
2014/03/08 15:46:29
... and i was so happy i did it w/o the help from
| |
479 query, net::UnescapeRule::URL_SPECIAL_CHARS)); | 483 aux_url = GURL(kAboutBlankURL); |
480 if (!url.is_valid()) | 484 scoped_ptr<DevToolsTarget> target(delegate_->CreateNewTarget(aux_url)); |
481 url = GURL(kAboutBlankURL); | |
482 scoped_ptr<DevToolsTarget> target(delegate_->CreateNewTarget(url)); | |
483 if (!target) { | 485 if (!target) { |
484 SendJson(connection_id, | 486 SendJson(connection_id, |
485 net::HTTP_INTERNAL_SERVER_ERROR, | 487 net::HTTP_INTERNAL_SERVER_ERROR, |
486 NULL, | 488 NULL, |
487 "Could not create new page"); | 489 "Could not create new page"); |
488 return; | 490 return; |
489 } | 491 } |
490 std::string host = info.headers["host"]; | 492 std::string host = info.headers["host"]; |
491 scoped_ptr<base::DictionaryValue> dictionary( | 493 scoped_ptr<base::DictionaryValue> dictionary( |
492 SerializeTarget(*target.get(), host)); | 494 SerializeTarget(*target.get(), host, aux_url)); |
493 SendJson(connection_id, net::HTTP_OK, dictionary.get(), std::string()); | 495 SendJson(connection_id, net::HTTP_OK, dictionary.get(), std::string()); |
494 const std::string target_id = target->GetId(); | 496 const std::string target_id = target->GetId(); |
495 target_map_[target_id] = target.release(); | 497 target_map_[target_id] = target.release(); |
496 return; | 498 return; |
497 } | 499 } |
498 | 500 |
499 if (command == "activate" || command == "close") { | 501 if (command == "activate" || command == "close") { |
500 DevToolsTarget* target = GetTarget(target_id); | 502 DevToolsTarget* target = GetTarget(target_id); |
501 if (!target) { | 503 if (!target) { |
502 SendJson(connection_id, | 504 SendJson(connection_id, |
(...skipping 30 matching lines...) Expand all Loading... | |
533 SendJson(connection_id, | 535 SendJson(connection_id, |
534 net::HTTP_NOT_FOUND, | 536 net::HTTP_NOT_FOUND, |
535 NULL, | 537 NULL, |
536 "Unknown command: " + command); | 538 "Unknown command: " + command); |
537 return; | 539 return; |
538 } | 540 } |
539 | 541 |
540 void DevToolsHttpHandlerImpl::OnTargetListReceived( | 542 void DevToolsHttpHandlerImpl::OnTargetListReceived( |
541 int connection_id, | 543 int connection_id, |
542 const std::string& host, | 544 const std::string& host, |
545 const GURL& aux_url, | |
543 const DevToolsHttpHandlerDelegate::TargetList& targets) { | 546 const DevToolsHttpHandlerDelegate::TargetList& targets) { |
544 DevToolsHttpHandlerDelegate::TargetList sorted_targets = targets; | 547 DevToolsHttpHandlerDelegate::TargetList sorted_targets = targets; |
545 std::sort(sorted_targets.begin(), sorted_targets.end(), TimeComparator); | 548 std::sort(sorted_targets.begin(), sorted_targets.end(), TimeComparator); |
546 | 549 |
547 STLDeleteValues(&target_map_); | 550 STLDeleteValues(&target_map_); |
548 base::ListValue list_value; | 551 base::ListValue list_value; |
549 for (DevToolsHttpHandlerDelegate::TargetList::const_iterator it = | 552 for (DevToolsHttpHandlerDelegate::TargetList::const_iterator it = |
550 sorted_targets.begin(); it != sorted_targets.end(); ++it) { | 553 sorted_targets.begin(); it != sorted_targets.end(); ++it) { |
551 DevToolsTarget* target = *it; | 554 DevToolsTarget* target = *it; |
552 target_map_[target->GetId()] = target; | 555 target_map_[target->GetId()] = target; |
553 list_value.Append(SerializeTarget(*target, host)); | 556 list_value.Append(SerializeTarget(*target, host, aux_url)); |
554 } | 557 } |
555 SendJson(connection_id, net::HTTP_OK, &list_value, std::string()); | 558 SendJson(connection_id, net::HTTP_OK, &list_value, std::string()); |
556 Release(); // Balanced in OnJsonRequestUI. | 559 Release(); // Balanced in OnJsonRequestUI. |
557 } | 560 } |
558 | 561 |
559 DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) { | 562 DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) { |
560 TargetMap::const_iterator it = target_map_.find(id); | 563 TargetMap::const_iterator it = target_map_.find(id); |
561 if (it == target_map_.end()) | 564 if (it == target_map_.end()) |
562 return NULL; | 565 return NULL; |
563 return it->second; | 566 return it->second; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 DevToolsManager::GetInstance()->ClientHostClosing(client_host); | 638 DevToolsManager::GetInstance()->ClientHostClosing(client_host); |
636 delete client_host; | 639 delete client_host; |
637 connection_to_client_host_ui_.erase(connection_id); | 640 connection_to_client_host_ui_.erase(connection_id); |
638 } | 641 } |
639 } | 642 } |
640 | 643 |
641 DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( | 644 DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( |
642 const net::StreamListenSocketFactory* socket_factory, | 645 const net::StreamListenSocketFactory* socket_factory, |
643 const std::string& frontend_url, | 646 const std::string& frontend_url, |
644 DevToolsHttpHandlerDelegate* delegate) | 647 DevToolsHttpHandlerDelegate* delegate) |
645 : overridden_frontend_url_(frontend_url), | 648 : frontend_url_(frontend_url), |
646 socket_factory_(socket_factory), | 649 socket_factory_(socket_factory), |
647 delegate_(delegate) { | 650 delegate_(delegate) { |
648 if (overridden_frontend_url_.empty()) | 651 if (frontend_url_.empty()) |
649 overridden_frontend_url_ = "/devtools/devtools.html"; | 652 frontend_url_ = "/devtools/devtools.html"; |
650 | 653 |
651 // Balanced in ResetHandlerThreadAndRelease(). | 654 // Balanced in ResetHandlerThreadAndRelease(). |
652 AddRef(); | 655 AddRef(); |
653 } | 656 } |
654 | 657 |
655 // Runs on the handler thread | 658 // Runs on the handler thread |
656 void DevToolsHttpHandlerImpl::Init() { | 659 void DevToolsHttpHandlerImpl::Init() { |
657 server_ = new net::HttpServer(*socket_factory_.get(), this); | 660 server_ = new net::HttpServer(*socket_factory_.get(), this); |
658 } | 661 } |
659 | 662 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
741 if (!thread_) | 744 if (!thread_) |
742 return; | 745 return; |
743 thread_->message_loop()->PostTask( | 746 thread_->message_loop()->PostTask( |
744 FROM_HERE, | 747 FROM_HERE, |
745 base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(), | 748 base::Bind(&net::HttpServer::AcceptWebSocket, server_.get(), |
746 connection_id, request)); | 749 connection_id, request)); |
747 } | 750 } |
748 | 751 |
749 base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( | 752 base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( |
750 const DevToolsTarget& target, | 753 const DevToolsTarget& target, |
751 const std::string& host) { | 754 const std::string& host, |
755 const GURL& aux_url) { | |
752 base::DictionaryValue* dictionary = new base::DictionaryValue; | 756 base::DictionaryValue* dictionary = new base::DictionaryValue; |
753 | 757 |
754 std::string id = target.GetId(); | 758 std::string id = target.GetId(); |
755 dictionary->SetString(kTargetIdField, id); | 759 dictionary->SetString(kTargetIdField, id); |
756 dictionary->SetString(kTargetTypeField, target.GetType()); | 760 dictionary->SetString(kTargetTypeField, target.GetType()); |
757 dictionary->SetString(kTargetTitleField, | 761 dictionary->SetString(kTargetTitleField, |
758 net::EscapeForHTML(target.GetTitle())); | 762 net::EscapeForHTML(target.GetTitle())); |
759 dictionary->SetString(kTargetDescriptionField, target.GetDescription()); | 763 dictionary->SetString(kTargetDescriptionField, target.GetDescription()); |
760 | 764 |
761 GURL url = target.GetUrl(); | 765 GURL url = target.GetUrl(); |
762 dictionary->SetString(kTargetUrlField, url.spec()); | 766 dictionary->SetString(kTargetUrlField, url.spec()); |
763 | 767 |
764 GURL favicon_url = target.GetFaviconUrl(); | 768 GURL favicon_url = target.GetFaviconUrl(); |
765 if (favicon_url.is_valid()) | 769 if (favicon_url.is_valid()) |
766 dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec()); | 770 dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec()); |
767 | 771 |
768 if (!delegate_->GetPageThumbnailData(url).empty()) { | 772 if (!delegate_->GetPageThumbnailData(url).empty()) { |
769 dictionary->SetString(kTargetThumbnailUrlField, | 773 dictionary->SetString(kTargetThumbnailUrlField, |
770 std::string(kThumbUrlPrefix) + id); | 774 std::string(kThumbUrlPrefix) + id); |
771 } | 775 } |
772 | 776 |
773 if (!target.IsAttached()) { | 777 if (!target.IsAttached()) { |
774 dictionary->SetString(kTargetWebSocketDebuggerUrlField, | 778 dictionary->SetString(kTargetWebSocketDebuggerUrlField, |
775 base::StringPrintf("ws://%s%s%s", | 779 base::StringPrintf("ws://%s%s%s", |
776 host.c_str(), | 780 host.c_str(), |
777 kPageUrlPrefix, | 781 kPageUrlPrefix, |
778 id.c_str())); | 782 id.c_str())); |
783 std::string overridden_frontend_url = | |
784 aux_url.is_valid() ? aux_url.spec() : frontend_url_; | |
785 | |
779 std::string devtools_frontend_url = GetFrontendURLInternal( | 786 std::string devtools_frontend_url = GetFrontendURLInternal( |
780 id.c_str(), | 787 id.c_str(), |
781 host); | 788 host, |
789 overridden_frontend_url); | |
782 dictionary->SetString( | 790 dictionary->SetString( |
783 kTargetDevtoolsFrontendUrlField, devtools_frontend_url); | 791 kTargetDevtoolsFrontendUrlField, devtools_frontend_url); |
784 } | 792 } |
785 | 793 |
786 return dictionary; | 794 return dictionary; |
787 } | 795 } |
788 | 796 |
789 } // namespace content | 797 } // namespace content |
OLD | NEW |