OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 apiPrivate.panels.SearchAction = { | 43 apiPrivate.panels.SearchAction = { |
44 CancelSearch: "cancelSearch", | 44 CancelSearch: "cancelSearch", |
45 PerformSearch: "performSearch", | 45 PerformSearch: "performSearch", |
46 NextSearchResult: "nextSearchResult", | 46 NextSearchResult: "nextSearchResult", |
47 PreviousSearchResult: "previousSearchResult" | 47 PreviousSearchResult: "previousSearchResult" |
48 }; | 48 }; |
49 | 49 |
50 apiPrivate.Events = { | 50 apiPrivate.Events = { |
51 AuditStarted: "audit-started-", | 51 AuditStarted: "audit-started-", |
52 ButtonClicked: "button-clicked-", | 52 ButtonClicked: "button-clicked-", |
53 ContextMenuClicked: "context-menu-clicked-", | |
53 PanelObjectSelected: "panel-objectSelected-", | 54 PanelObjectSelected: "panel-objectSelected-", |
54 NetworkRequestFinished: "network-request-finished", | 55 NetworkRequestFinished: "network-request-finished", |
55 OpenResource: "open-resource", | 56 OpenResource: "open-resource", |
56 PanelSearch: "panel-search-", | 57 PanelSearch: "panel-search-", |
57 ResourceAdded: "resource-added", | 58 ResourceAdded: "resource-added", |
59 ResourceContentEdited: "resource-content-edited", | |
58 ResourceContentCommitted: "resource-content-committed", | 60 ResourceContentCommitted: "resource-content-committed", |
61 ResourceLineMessagesChanged: "resource-line-messages-changed", | |
59 ViewShown: "view-shown-", | 62 ViewShown: "view-shown-", |
60 ViewHidden: "view-hidden-" | 63 ViewHidden: "view-hidden-" |
61 }; | 64 }; |
62 | 65 |
63 apiPrivate.Commands = { | 66 apiPrivate.Commands = { |
64 AddAuditCategory: "addAuditCategory", | 67 AddAuditCategory: "addAuditCategory", |
65 AddAuditResult: "addAuditResult", | 68 AddAuditResult: "addAuditResult", |
66 AddRequestHeaders: "addRequestHeaders", | 69 AddRequestHeaders: "addRequestHeaders", |
67 ApplyStyleSheet: "applyStyleSheet", | 70 ApplyStyleSheet: "applyStyleSheet", |
68 CreatePanel: "createPanel", | 71 CreatePanel: "createPanel", |
69 CreateSidebarPane: "createSidebarPane", | 72 CreateSidebarPane: "createSidebarPane", |
70 CreateToolbarButton: "createToolbarButton", | 73 CreateToolbarButton: "createToolbarButton", |
74 DisplaySearchResults: "displaySearchResults", | |
71 EvaluateOnInspectedPage: "evaluateOnInspectedPage", | 75 EvaluateOnInspectedPage: "evaluateOnInspectedPage", |
72 ForwardKeyboardEvent: "_forwardKeyboardEvent", | 76 ForwardKeyboardEvent: "_forwardKeyboardEvent", |
73 GetHAR: "getHAR", | 77 GetHAR: "getHAR", |
74 GetPageResources: "getPageResources", | 78 GetPageResources: "getPageResources", |
75 GetRequestContent: "getRequestContent", | 79 GetRequestContent: "getRequestContent", |
76 GetResourceContent: "getResourceContent", | 80 GetResourceContent: "getResourceContent", |
81 GetResourceLineMessages: "getResourceLineMessages", | |
77 InspectedURLChanged: "inspectedURLChanged", | 82 InspectedURLChanged: "inspectedURLChanged", |
78 OpenResource: "openResource", | 83 OpenResource: "openResource", |
84 RegisterLanguageService: "registerLanguageService", | |
85 RegisterMimeRecognizer: "registerMimeRecognizer", | |
79 Reload: "Reload", | 86 Reload: "Reload", |
80 Subscribe: "subscribe", | 87 Subscribe: "subscribe", |
81 SetOpenResourceHandler: "setOpenResourceHandler", | 88 SetOpenResourceHandler: "setOpenResourceHandler", |
82 SetResourceContent: "setResourceContent", | 89 SetResourceContent: "setResourceContent", |
90 SetResourceLineMessages: "setResourceLineMessages", | |
83 SetSidebarContent: "setSidebarContent", | 91 SetSidebarContent: "setSidebarContent", |
84 SetSidebarHeight: "setSidebarHeight", | 92 SetSidebarHeight: "setSidebarHeight", |
85 SetSidebarPage: "setSidebarPage", | 93 SetSidebarPage: "setSidebarPage", |
86 ShowPanel: "showPanel", | 94 ShowPanel: "showPanel", |
87 StopAuditCategoryRun: "stopAuditCategoryRun", | 95 StopAuditCategoryRun: "stopAuditCategoryRun", |
88 Unsubscribe: "unsubscribe", | 96 Unsubscribe: "unsubscribe", |
89 UpdateAuditProgress: "updateAuditProgress", | 97 UpdateAuditProgress: "updateAuditProgress", |
90 UpdateButton: "updateButton" | 98 UpdateButton: "updateButton" |
91 }; | 99 }; |
92 } | 100 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 | 177 |
170 /** | 178 /** |
171 * @constructor | 179 * @constructor |
172 */ | 180 */ |
173 function InspectorExtensionAPI() | 181 function InspectorExtensionAPI() |
174 { | 182 { |
175 this.audits = new Audits(); | 183 this.audits = new Audits(); |
176 this.inspectedWindow = new InspectedWindow(); | 184 this.inspectedWindow = new InspectedWindow(); |
177 this.panels = new Panels(); | 185 this.panels = new Panels(); |
178 this.network = new Network(); | 186 this.network = new Network(); |
187 this.language = new Language(); | |
179 defineDeprecatedProperty(this, "webInspector", "resources", "network"); | 188 defineDeprecatedProperty(this, "webInspector", "resources", "network"); |
180 } | 189 } |
181 | 190 |
182 /** | 191 /** |
192 * @interface | |
193 */ | |
194 function ServiceProvider(){} | |
195 ServiceProvider.prototype = { | |
196 /** | |
197 * @param {string} text | |
198 * @param {{source: string, line: number, column: number}=} location | |
199 * @return {!Promise<string>} | |
200 */ | |
201 transpile: function(text, location){ return Promise.reject(); }, | |
pfeldman
2015/08/13 21:15:46
We are using callbacks to be consistent with chrom
wes
2015/08/14 00:55:05
Are we? Before this patch there were absolutely no
pfeldman
2015/08/17 21:15:51
Ok, I misunderstood its purpose then.
| |
202 /** | |
203 * @param {{source: string, line: number, column: number}} location | |
204 * @return {!Promise<!Array<{text: string, callback: function(), category: ( string|undefined)}>>} | |
205 */ | |
206 populateContextMenu: function(location){ return Promise.reject(); }, | |
207 | |
208 /** | |
209 * @param {{source: string, line: number, column: number}} location | |
210 * @param {string} prefix | |
211 * @return {!Promise<!Array<{text: string, icon: (string|undefined), details : function(): !Promise<{detail: string, description: string}>}>>} | |
212 */ | |
213 completions: function(location, prefix) { return Promise.reject(); }, | |
214 | |
215 /** | |
216 * @param {string} content | |
217 * @param {{line: number, column: number}} cursor | |
218 * @param {string=} prefix | |
219 * @param {{source: string, line: number, column: number}=} context | |
220 * @return {!Promise<!Array<{text: string, icon: (string|undefined), details : function(): !Promise<{detail: string, description: string}>}>>} | |
221 */ | |
222 debuggerCompletions: function(content, cursor, prefix, context) { return Pro mise.reject(); } | |
223 } | |
224 | |
225 /** | |
226 * @constructor | |
227 */ | |
228 function Language() { | |
229 } | |
230 Language.prototype = { | |
231 /** | |
232 * @param {string} match | |
233 * @param {string} mime | |
234 * @param {boolean=} matchName | |
235 */ | |
236 registerMimeRecognizer: function(match, mime, matchName) { | |
237 extensionServer.sendRequest({command: commands.RegisterMimeRecognizer, m atch: match, mime: mime, matchName: matchName}); | |
238 }, | |
239 | |
240 /** | |
241 * @param {string} name | |
242 * @param {!Array<string>} mimes | |
243 * @param {!ServiceProvider} service | |
244 * @param {?=} simplemode | |
245 */ | |
246 register: function(name, mimes, service, simplemode) { | |
247 var capabilities = Object.keys(service); | |
248 if (Object.getPrototypeOf(service) !== Object.getPrototypeOf({})) { //ha ndle classes | |
249 var serviceWalker = service; | |
250 while ((serviceWalker = Object.getPrototypeOf(serviceWalker)) && ser viceWalker !== Object.getPrototypeOf({})) { | |
251 capabilities = capabilities.concat(Object.getOwnPropertyNames(se rviceWalker)); | |
252 } | |
253 } | |
254 capabilities = Array.from(/** @type {!Iterator<string>} */(new Set(capab ilities.filter(f => (f !== "constructor") && (typeof service[f] === "function")) ))); | |
255 | |
256 extensionServer.sendRequest({ | |
257 command: commands.RegisterLanguageService, | |
258 name: name, | |
259 mimes: mimes, | |
260 capabilities: capabilities, | |
261 simplemode: simplemode | |
262 }); | |
263 | |
264 extensionServer.registerHandler("transpile-"+name, function(request) { | |
265 if (!service.transpile) { | |
266 return extensionServer.sendRequest({command: "callback", request Id: request.requestId, result: request.input}); | |
267 } | |
268 service.transpile(request.input, request.location).then(function(tra nspiled) { | |
269 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId, result: transpiled}); | |
270 }) | |
271 .catch(function(err) { | |
272 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId}); | |
273 console.error(err); | |
274 }); | |
275 }); | |
276 | |
277 extensionServer.registerHandler("populateContextMenu-"+name, function(re quest) { | |
278 if (!service.populateContextMenu) { | |
279 return extensionServer.sendRequest({command: "callback", request Id: request.requestId}); | |
280 } | |
281 var eventName ="notify-"+apiPrivate.Events.ContextMenuClicked; | |
282 service.populateContextMenu(request.location).then(function(options) { | |
283 var opts = options.map(function(item, i) { return {text: item.te xt, id: i, category: item.category} }); | |
284 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId, result: opts}); | |
285 | |
286 if (extensionServer.hasHandler(eventName)) { | |
287 extensionServer.unregisterHandler(eventName); | |
288 } | |
289 extensionServer.registerHandler(eventName, handleClick); | |
290 | |
291 function handleClick(event) { | |
292 extensionServer.unregisterHandler(eventName); | |
293 if (options[event.id] && options[event.id].callback) { | |
294 options[event.id].callback(); | |
295 } | |
296 } | |
297 }) | |
298 .catch(function(err) { | |
299 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId}); | |
300 console.error(err); | |
301 }); | |
302 }); | |
303 | |
304 function handleCompletionsResponse(request) { | |
305 var commandName = "completionDetails-"+name; | |
306 return function(completions) { | |
307 var comps = completions.map(function(item, i) { return {text: it em.text, icon: item.icon, id: i} }); | |
308 | |
309 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId, result: comps}); | |
310 | |
311 if (extensionServer.hasHandler(commandName)) { | |
312 extensionServer.unregisterHandler(commandName); | |
313 } | |
314 extensionServer.registerHandler(commandName, handlerHover); | |
315 | |
316 function handlerHover(event) { | |
317 if (completions[event.id] && completions[event.id].details) { | |
318 completions[event.id].details().then(function(details) { | |
319 extensionServer.sendRequest({command: "callback", re questId: event.requestId, result: details}); | |
320 }).catch(function(err) { | |
321 extensionServer.sendRequest({command: "callback", re questId: event.requestId}); | |
322 console.error(err); | |
323 }); | |
324 } else { | |
325 extensionServer.sendRequest({command: "callback", reques tId: event.requestId}); | |
326 } | |
327 } | |
328 } | |
329 } | |
330 | |
331 extensionServer.registerHandler("completions-"+name, function(request) { | |
332 if (!service.completions) { | |
333 return extensionServer.sendRequest({command: "callback", request Id: request.requestId}); | |
334 } | |
335 service.completions(request.location, request.prefix) | |
336 .then(handleCompletionsResponse(request)) | |
337 .catch(function(err) { | |
338 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId}); | |
339 console.error(err); | |
340 }); | |
341 }); | |
342 | |
343 extensionServer.registerHandler("debuggerCompletions-"+name, function(re quest) { | |
344 if (!service.debuggerCompletions) { | |
345 return extensionServer.sendRequest({command: "callback", request Id: request.requestId}); | |
346 } | |
347 service.debuggerCompletions(request.content, request.cursor, request .prefix, request.context) | |
348 .then(handleCompletionsResponse(request)) | |
349 .catch(function(err) { | |
350 extensionServer.sendRequest({command: "callback", requestId: req uest.requestId}); | |
351 console.error(err); | |
352 }); | |
353 }); | |
354 } | |
355 } | |
356 | |
357 /** | |
183 * @constructor | 358 * @constructor |
184 */ | 359 */ |
185 function Network() | 360 function Network() |
186 { | 361 { |
187 /** | 362 /** |
188 * @this {EventSinkImpl} | 363 * @this {EventSinkImpl} |
189 */ | 364 */ |
190 function dispatchRequestEvent(message) | 365 function dispatchRequestEvent(message) |
191 { | 366 { |
192 var request = message.arguments[1]; | 367 var request = message.arguments[1]; |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
420 /** | 595 /** |
421 * @constructor | 596 * @constructor |
422 * @extends {PanelWithSidebar} | 597 * @extends {PanelWithSidebar} |
423 */ | 598 */ |
424 function SourcesPanel() | 599 function SourcesPanel() |
425 { | 600 { |
426 PanelWithSidebar.call(this, "sources"); | 601 PanelWithSidebar.call(this, "sources"); |
427 } | 602 } |
428 | 603 |
429 SourcesPanel.prototype = { | 604 SourcesPanel.prototype = { |
605 displaySearchResults: function(results) { | |
606 extensionServer.sendRequest({command: commands.DisplaySearchResults, res ults: results}); | |
607 }, | |
430 __proto__: PanelWithSidebar.prototype | 608 __proto__: PanelWithSidebar.prototype |
431 } | 609 } |
432 | 610 |
433 /** | 611 /** |
434 * @constructor | 612 * @constructor |
435 * @extends {ExtensionViewImpl} | 613 * @extends {ExtensionViewImpl} |
436 */ | 614 */ |
437 function ExtensionPanelImpl(id) | 615 function ExtensionPanelImpl(id) |
438 { | 616 { |
439 ExtensionViewImpl.call(this, id); | 617 ExtensionViewImpl.call(this, id); |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
699 } | 877 } |
700 | 878 |
701 /** | 879 /** |
702 * @this {EventSinkImpl} | 880 * @this {EventSinkImpl} |
703 */ | 881 */ |
704 function dispatchResourceContentEvent(message) | 882 function dispatchResourceContentEvent(message) |
705 { | 883 { |
706 this._fire(new Resource(message.arguments[0]), message.arguments[1]); | 884 this._fire(new Resource(message.arguments[0]), message.arguments[1]); |
707 } | 885 } |
708 | 886 |
887 /** | |
888 * @this {EventSinkImpl} | |
889 */ | |
890 function dispatchResourceEditEvent(message) | |
891 { | |
892 this._fire(new Resource(message.arguments[0]), message.arguments[1], mes sage.arguments[2]); | |
893 } | |
894 | |
895 /** | |
896 * @this {EventSinkImpl} | |
897 */ | |
898 function dispatchResourceLineMessagesChanged(message) { | |
899 this._fire(new Resource(message.arguments[0]), message.arguments[1]); | |
900 } | |
901 | |
709 this.onResourceAdded = new EventSink(events.ResourceAdded, dispatchResourceE vent); | 902 this.onResourceAdded = new EventSink(events.ResourceAdded, dispatchResourceE vent); |
710 this.onResourceContentCommitted = new EventSink(events.ResourceContentCommit ted, dispatchResourceContentEvent); | 903 this.onResourceContentCommitted = new EventSink(events.ResourceContentCommit ted, dispatchResourceContentEvent); |
904 this.onResourceContentEdited = new EventSink(events.ResourceContentEdited, d ispatchResourceEditEvent); | |
905 this.onResourceLineMessagesChanged = new EventSink(events.ResourceLineMessag esChanged, dispatchResourceLineMessagesChanged); | |
711 } | 906 } |
712 | 907 |
713 InspectedWindow.prototype = { | 908 InspectedWindow.prototype = { |
714 reload: function(optionsOrUserAgent) | 909 reload: function(optionsOrUserAgent) |
715 { | 910 { |
716 var options = null; | 911 var options = null; |
717 if (typeof optionsOrUserAgent === "object") { | 912 if (typeof optionsOrUserAgent === "object") { |
718 options = optionsOrUserAgent; | 913 options = optionsOrUserAgent; |
719 } else if (typeof optionsOrUserAgent === "string") { | 914 } else if (typeof optionsOrUserAgent === "string") { |
720 options = { userAgent: optionsOrUserAgent }; | 915 options = { userAgent: optionsOrUserAgent }; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
787 { | 982 { |
788 callback(response.content, response.encoding); | 983 callback(response.content, response.encoding); |
789 } | 984 } |
790 | 985 |
791 extensionServer.sendRequest({ command: commands.GetResourceContent, url: this._url }, callback && callbackWrapper); | 986 extensionServer.sendRequest({ command: commands.GetResourceContent, url: this._url }, callback && callbackWrapper); |
792 }, | 987 }, |
793 | 988 |
794 setContent: function(content, commit, callback) | 989 setContent: function(content, commit, callback) |
795 { | 990 { |
796 extensionServer.sendRequest({ command: commands.SetResourceContent, url: this._url, content: content, commit: commit }, callback); | 991 extensionServer.sendRequest({ command: commands.SetResourceContent, url: this._url, content: content, commit: commit }, callback); |
992 }, | |
993 | |
994 getLineMessages: function(callback) { | |
995 extensionServer.sendRequest({ command: commands.GetResourceLineMessages, url: this._url }, callback); | |
996 }, | |
997 | |
998 setLineMessages: function(messages, callback) { | |
999 extensionServer.sendRequest({ command: commands.SetResourceLineMessages, url: this._url, messages: messages }, callback); | |
797 } | 1000 } |
798 } | 1001 } |
799 | 1002 |
800 var keyboardEventRequestQueue = []; | 1003 var keyboardEventRequestQueue = []; |
801 var forwardTimer = null; | 1004 var forwardTimer = null; |
802 | 1005 |
803 function forwardKeyboardEvent(event) | 1006 function forwardKeyboardEvent(event) |
804 { | 1007 { |
805 const Esc = "U+001B"; | 1008 const Esc = "U+001B"; |
806 // We only care about global hotkeys, not about random text | 1009 // We only care about global hotkeys, not about random text |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
959 // extensions) | 1162 // extensions) |
960 var devtools_descriptor = Object.getOwnPropertyDescriptor(chrome, "devtools" ); | 1163 var devtools_descriptor = Object.getOwnPropertyDescriptor(chrome, "devtools" ); |
961 if (!devtools_descriptor || devtools_descriptor.get) | 1164 if (!devtools_descriptor || devtools_descriptor.get) |
962 Object.defineProperty(chrome, "devtools", { value: {}, enumerable: true }); | 1165 Object.defineProperty(chrome, "devtools", { value: {}, enumerable: true }); |
963 // Only expose tabId on chrome.devtools.inspectedWindow, not webInspector.in spectedWindow. | 1166 // Only expose tabId on chrome.devtools.inspectedWindow, not webInspector.in spectedWindow. |
964 chrome.devtools.inspectedWindow = {}; | 1167 chrome.devtools.inspectedWindow = {}; |
965 chrome.devtools.inspectedWindow.__defineGetter__("tabId", getTabId); | 1168 chrome.devtools.inspectedWindow.__defineGetter__("tabId", getTabId); |
966 chrome.devtools.inspectedWindow.__proto__ = coreAPI.inspectedWindow; | 1169 chrome.devtools.inspectedWindow.__proto__ = coreAPI.inspectedWindow; |
967 chrome.devtools.network = coreAPI.network; | 1170 chrome.devtools.network = coreAPI.network; |
968 chrome.devtools.panels = coreAPI.panels; | 1171 chrome.devtools.panels = coreAPI.panels; |
1172 chrome.devtools.language = coreAPI.language; | |
969 | 1173 |
970 // default to expose experimental APIs for now. | 1174 // default to expose experimental APIs for now. |
971 if (extensionInfo.exposeExperimentalAPIs !== false) { | 1175 if (extensionInfo.exposeExperimentalAPIs !== false) { |
972 chrome.experimental = chrome.experimental || {}; | 1176 chrome.experimental = chrome.experimental || {}; |
973 chrome.experimental.devtools = chrome.experimental.devtools || {}; | 1177 chrome.experimental.devtools = chrome.experimental.devtools || {}; |
974 | 1178 |
975 var properties = Object.getOwnPropertyNames(coreAPI); | 1179 var properties = Object.getOwnPropertyNames(coreAPI); |
976 for (var i = 0; i < properties.length; ++i) { | 1180 for (var i = 0; i < properties.length; ++i) { |
977 var descriptor = Object.getOwnPropertyDescriptor(coreAPI, properties [i]); | 1181 var descriptor = Object.getOwnPropertyDescriptor(coreAPI, properties [i]); |
978 Object.defineProperty(chrome.experimental.devtools, properties[i], d escriptor); | 1182 Object.defineProperty(chrome.experimental.devtools, properties[i], d escriptor); |
(...skipping 25 matching lines...) Expand all Loading... | |
1004 { | 1208 { |
1005 return "(function(injectedScriptId){ " + | 1209 return "(function(injectedScriptId){ " + |
1006 "var extensionServer;" + | 1210 "var extensionServer;" + |
1007 defineCommonExtensionSymbols.toString() + ";" + | 1211 defineCommonExtensionSymbols.toString() + ";" + |
1008 injectedExtensionAPI.toString() + ";" + | 1212 injectedExtensionAPI.toString() + ";" + |
1009 buildPlatformExtensionAPI(extensionInfo, inspectedTabId) + ";" + | 1213 buildPlatformExtensionAPI(extensionInfo, inspectedTabId) + ";" + |
1010 "platformExtensionAPI(injectedExtensionAPI(injectedScriptId));" + | 1214 "platformExtensionAPI(injectedExtensionAPI(injectedScriptId));" + |
1011 "return {};" + | 1215 "return {};" + |
1012 "})"; | 1216 "})"; |
1013 } | 1217 } |
OLD | NEW |