OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrCaps.h" | 8 #include "GrCaps.h" |
9 #include "GrContextFactory.h" | 9 #include "GrContextFactory.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include <sys/socket.h> | 23 #include <sys/socket.h> |
24 #include <microhttpd.h> | 24 #include <microhttpd.h> |
25 #include "png.h" | 25 #include "png.h" |
26 | 26 |
27 // To get image decoders linked in we have to do the below magic | 27 // To get image decoders linked in we have to do the below magic |
28 #include "SkForceLinking.h" | 28 #include "SkForceLinking.h" |
29 #include "SkImageDecoder.h" | 29 #include "SkImageDecoder.h" |
30 __SK_FORCE_IMAGE_DECODER_LINKING; | 30 __SK_FORCE_IMAGE_DECODER_LINKING; |
31 | 31 |
32 DEFINE_string(source, "https://debugger.skia.org", "Where to load the web UI fro
m."); | 32 DEFINE_string(source, "https://debugger.skia.org", "Where to load the web UI fro
m."); |
33 DEFINE_string(faviconDir, "tools/skiaserve", "The directory of the favicon"); | |
34 DEFINE_int32(port, 8888, "The port to listen on."); | 33 DEFINE_int32(port, 8888, "The port to listen on."); |
35 | 34 |
36 // TODO probably want to make this configurable | 35 // TODO probably want to make this configurable |
37 static const int kImageWidth = 1920; | 36 static const int kImageWidth = 1920; |
38 static const int kImageHeight = 1080; | 37 static const int kImageHeight = 1080; |
39 | 38 |
40 // TODO move to template file | |
41 SkString generateTemplate(SkString source) { | 39 SkString generateTemplate(SkString source) { |
42 SkString debuggerTemplate; | 40 SkString debuggerTemplate; |
43 debuggerTemplate.appendf( | 41 debuggerTemplate.appendf( |
44 "<!DOCTYPE html>\n" | 42 "<!DOCTYPE html>\n" |
45 "<html>\n" | 43 "<html>\n" |
46 "<head>\n" | 44 "<head>\n" |
47 " <title>SkDebugger</title>\n" | 45 " <title>SkDebugger</title>\n" |
48 " <meta charset=\"utf-8\" />\n" | 46 " <meta charset=\"utf-8\" />\n" |
49 " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=egde,chrome=1\">\
n" | 47 " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=egde,chrome=1\">\
n" |
50 " <meta name=\"viewport\" content=\"width=device-width, initial-scale
=1.0\">\n" | 48 " <meta name=\"viewport\" content=\"width=device-width, initial-scale
=1.0\">\n" |
51 " <script src=\"%s/res/js/core.js\" type=\"text/javascript\" charset=
\"utf-8\"></script>\n" | 49 " <script src=\"%s/res/js/core.js\" type=\"text/javascript\" charset=
\"utf-8\"></script>\n" |
52 " <link href=\"%s/res/vul/elements.html\" rel=\"import\" />\n" | 50 " <link href=\"%s/res/vul/elements.html\" rel=\"import\" />\n" |
| 51 " <link rel='shortcut icon' href='https://debugger.skia.org/res/img/f
avicon.ico' type='image/x-icon'/ >" |
53 "</head>\n" | 52 "</head>\n" |
54 "<body class=\"fullbleed layout vertical\">\n" | 53 "<body class=\"fullbleed layout vertical\">\n" |
55 " <debugger-app-sk>This is the app." | 54 " <debugger-app-sk>This is the app." |
56 " </debugger-app-sk>\n" | 55 " </debugger-app-sk>\n" |
57 "</body>\n" | 56 "</body>\n" |
58 "</html>", source.c_str(), source.c_str()); | 57 "</html>", source.c_str(), source.c_str()); |
59 return debuggerTemplate; | 58 return debuggerTemplate; |
60 | 59 |
61 } | 60 } |
62 | 61 |
63 struct UploadContext { | 62 struct UploadContext { |
64 SkDynamicMemoryWStream fStream; | 63 SkDynamicMemoryWStream fStream; |
65 MHD_PostProcessor* fPostProcessor; | 64 MHD_PostProcessor* fPostProcessor; |
66 MHD_Connection* connection; | 65 MHD_Connection* connection; |
67 }; | 66 }; |
68 | 67 |
69 struct Request { | 68 struct Request { |
70 Request(SkString rootUrl) | 69 Request(SkString rootUrl) |
71 : fUploadContext(nullptr) | 70 : fUploadContext(nullptr) |
72 , fUrlDataManager(rootUrl) | 71 , fUrlDataManager(rootUrl) |
73 , fGPUEnabled(false) {} | 72 , fGPUEnabled(false) {} |
74 | 73 |
75 UploadContext* fUploadContext; | 74 UploadContext* fUploadContext; |
76 SkAutoTUnref<SkPicture> fPicture; | 75 SkAutoTUnref<SkPicture> fPicture; |
77 SkAutoTUnref<SkDebugCanvas> fDebugCanvas; | 76 SkAutoTUnref<SkDebugCanvas> fDebugCanvas; |
78 SkAutoTDelete<GrContextFactory> fContextFactory; | 77 SkAutoTDelete<GrContextFactory> fContextFactory; |
79 SkAutoTUnref<SkSurface> fSurface; | 78 SkAutoTUnref<SkSurface> fSurface; |
80 UrlDataManager fUrlDataManager; | 79 UrlDataManager fUrlDataManager; |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 SkAutoTUnref<UrlDataManager::UrlData> urlData( | 672 SkAutoTUnref<UrlDataManager::UrlData> urlData( |
674 SkRef(request->fUrlDataManager.getDataFromUrl(SkString(url)))); | 673 SkRef(request->fUrlDataManager.getDataFromUrl(SkString(url)))); |
675 | 674 |
676 if (urlData) { | 675 if (urlData) { |
677 return SendData(connection, urlData->fData.get(), urlData->fContentT
ype.c_str()); | 676 return SendData(connection, urlData->fData.get(), urlData->fContentT
ype.c_str()); |
678 } | 677 } |
679 return MHD_NO; | 678 return MHD_NO; |
680 } | 679 } |
681 }; | 680 }; |
682 | 681 |
683 class FaviconHandler : public UrlHandler { | |
684 public: | |
685 bool canHandle(const char* method, const char* url) override { | |
686 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && | |
687 0 == strcmp(url, "/favicon.ico"); | |
688 } | |
689 | |
690 int handle(Request* request, MHD_Connection* connection, | |
691 const char* url, const char* method, | |
692 const char* upload_data, size_t* upload_data_size) override { | |
693 SkString dir(FLAGS_faviconDir[0]); | |
694 dir.append("/favicon.ico"); | |
695 FILE* ico = fopen(dir.c_str(), "r"); | |
696 | |
697 SkAutoTUnref<SkData> data(SkData::NewFromFILE(ico)); | |
698 int ret = SendData(connection, data, "image/vnd.microsoft.icon"); | |
699 fclose(ico); | |
700 return ret; | |
701 } | |
702 }; | |
703 | |
704 | |
705 class RootHandler : public UrlHandler { | 682 class RootHandler : public UrlHandler { |
706 public: | 683 public: |
707 bool canHandle(const char* method, const char* url) override { | 684 bool canHandle(const char* method, const char* url) override { |
708 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && | 685 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && |
709 0 == strcmp(url, "/"); | 686 0 == strcmp(url, "/"); |
710 } | 687 } |
711 | 688 |
712 int handle(Request* request, MHD_Connection* connection, | 689 int handle(Request* request, MHD_Connection* connection, |
713 const char* url, const char* method, | 690 const char* url, const char* method, |
714 const char* upload_data, size_t* upload_data_size) override { | 691 const char* upload_data, size_t* upload_data_size) override { |
715 return SendTemplate(connection); | 692 return SendTemplate(connection); |
716 } | 693 } |
717 }; | 694 }; |
718 | 695 |
719 class UrlManager { | 696 class UrlManager { |
720 public: | 697 public: |
721 UrlManager() { | 698 UrlManager() { |
722 // Register handlers | 699 // Register handlers |
723 fHandlers.push_back(new RootHandler); | 700 fHandlers.push_back(new RootHandler); |
724 fHandlers.push_back(new PostHandler); | 701 fHandlers.push_back(new PostHandler); |
725 fHandlers.push_back(new ImgHandler); | 702 fHandlers.push_back(new ImgHandler); |
726 fHandlers.push_back(new ClipAlphaHandler); | 703 fHandlers.push_back(new ClipAlphaHandler); |
727 fHandlers.push_back(new EnableGPUHandler); | 704 fHandlers.push_back(new EnableGPUHandler); |
728 fHandlers.push_back(new CmdHandler); | 705 fHandlers.push_back(new CmdHandler); |
729 fHandlers.push_back(new InfoHandler); | 706 fHandlers.push_back(new InfoHandler); |
730 fHandlers.push_back(new DownloadHandler); | 707 fHandlers.push_back(new DownloadHandler); |
731 fHandlers.push_back(new DataHandler); | 708 fHandlers.push_back(new DataHandler); |
732 fHandlers.push_back(new FaviconHandler); | |
733 fHandlers.push_back(new BreakHandler); | 709 fHandlers.push_back(new BreakHandler); |
734 } | 710 } |
735 | 711 |
736 ~UrlManager() { | 712 ~UrlManager() { |
737 for (int i = 0; i < fHandlers.count(); i++) { delete fHandlers[i]; } | 713 for (int i = 0; i < fHandlers.count(); i++) { delete fHandlers[i]; } |
738 } | 714 } |
739 | 715 |
740 // This is clearly not efficient for a large number of urls and handlers | 716 // This is clearly not efficient for a large number of urls and handlers |
741 int invoke(Request* request, MHD_Connection* connection, const char* url, co
nst char* method, | 717 int invoke(Request* request, MHD_Connection* connection, const char* url, co
nst char* method, |
742 const char* upload_data, size_t* upload_data_size) const { | 718 const char* upload_data, size_t* upload_data_size) const { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 MHD_stop_daemon(daemon); | 767 MHD_stop_daemon(daemon); |
792 return 0; | 768 return 0; |
793 } | 769 } |
794 | 770 |
795 #if !defined SK_BUILD_FOR_IOS | 771 #if !defined SK_BUILD_FOR_IOS |
796 int main(int argc, char** argv) { | 772 int main(int argc, char** argv) { |
797 SkCommandLineFlags::Parse(argc, argv); | 773 SkCommandLineFlags::Parse(argc, argv); |
798 return skiaserve_main(); | 774 return skiaserve_main(); |
799 } | 775 } |
800 #endif | 776 #endif |
OLD | NEW |