[EFL][WK2] Add Remote Web Inspector
[WebKit.git] / Source / WebKit2 / UIProcess / InspectorServer / efl / WebInspectorServerEfl.cpp
1 /*
2  * Copyright (C) 2012 Seokju Kwon (seokju.kwon@gmail.com)
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26 #include "WebInspectorServer.h"
27
28 #include "WebInspectorProxy.h"
29 #include "WebPageProxy.h"
30 #include <WebCore/MIMETypeRegistry.h>
31 #include <sys/stat.h>
32
33 namespace WebKit {
34
35 static String inspectorResourcePath()
36 {
37     String inspectorFilesPath = String::fromUTF8(WEB_INSPECTOR_INSTALL_DIR);
38     if (access(inspectorFilesPath.utf8().data(), R_OK))
39         inspectorFilesPath = String::fromUTF8(WEB_INSPECTOR_DIR);
40
41     return inspectorFilesPath;
42 }
43
44 bool WebInspectorServer::platformResourceForPath(const String& path, Vector<char>& data, String& contentType)
45 {
46     // The page list contains an unformated list of pages that can be inspected with a link to open a session.
47     if (path == "/pagelist.json") {
48         buildPageList(data, contentType);
49         return true;
50     }
51
52     // Point the default path to a formatted page that queries the page list and display them.
53     String localPath = inspectorResourcePath() + ((path == "/") ? ASCIILiteral("/inspectorPageIndex.html") : path);
54
55     FILE* fileHandle = fopen(localPath.utf8().data(), "r");
56     if (!fileHandle)
57         return false;
58
59     struct stat fileStat;
60     if (fstat(fileno(fileHandle), &fileStat)) {
61         fclose(fileHandle);
62         return false;
63     }
64
65     data.grow(fileStat.st_size);
66     int bytesRead = fread(data.data(), 1, fileStat.st_size, fileHandle);
67     fclose(fileHandle);
68
69     if (bytesRead < fileStat.st_size)
70         return false;
71
72     size_t extStart = localPath.reverseFind('.');
73     if (extStart == notFound)
74         return false;
75
76     String ext = localPath.substring(extStart + 1);
77     if (ext.isEmpty())
78         return false;
79
80     contentType = WebCore::MIMETypeRegistry::getMIMETypeForExtension(ext);
81
82     return true;
83 }
84
85 void WebInspectorServer::buildPageList(Vector<char>& data, String& contentType)
86 {
87     StringBuilder builder;
88     builder.append('[');
89
90     ClientMap::iterator end = m_clientMap.end();
91     for (ClientMap::iterator it = m_clientMap.begin(); it != end; ++it) {
92         WebPageProxy* webPage = it->value->page();
93         if (it != m_clientMap.begin())
94             builder.appendLiteral(", ");
95         builder.appendLiteral("{ \"id\": ");
96         builder.appendNumber(it->key);
97         builder.appendLiteral(", \"title\": \"");
98         builder.append(webPage->pageTitle());
99         builder.appendLiteral("\", \"url\": \"");
100         builder.append(webPage->activeURL());
101         builder.appendLiteral("\", \"inspectorUrl\": \"");
102         builder.appendLiteral("/inspector.html?page=");
103         builder.appendNumber(it->key);
104         builder.appendLiteral("\" }");
105     }
106
107     builder.append(']');
108     CString clientList = builder.toString().utf8();
109     data.append(clientList.data(), clientList.length());
110     contentType = String("application/json; charset=utf-8", String::ConstructFromLiteral);
111 }
112
113 }