From d6b5951059c886a1e3d3f276faa48d8a97a77ab7 Mon Sep 17 00:00:00 2001 From: Thomas Buckley-Houston Date: Wed, 19 Jun 2019 09:03:20 +0300 Subject: [PATCH] HTTP server: add experimental DOM-dump mode Simply dumps the contents of the DOM --- interfacer/src/browsh/raw_text_server.go | 4 ++++ interfacer/src/browsh/version.go | 2 +- interfacer/test/http-server/server_test.go | 6 ++++++ interfacer/test/http-server/setup.go | 3 +++ webext/src/dom/commands_mixin.js | 2 +- webext/src/dom/serialise_mixin.js | 8 +++++++- webext/src/dom/text_builder.js | 8 +++++++- 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/interfacer/src/browsh/raw_text_server.go b/interfacer/src/browsh/raw_text_server.go index b878e79..230b5ee 100644 --- a/interfacer/src/browsh/raw_text_server.go +++ b/interfacer/src/browsh/raw_text_server.go @@ -225,6 +225,7 @@ func isProductionHTTP(r *http.Request) bool { // 'PLAIN' mode returns raw text without any HTML whatsoever. // 'HTML' mode returns some basic HTML tags for things like anchor links. +// 'DOM' mode returns a simple dump of the DOM. func getRawTextMode(r *http.Request) string { var mode = "HTML" if strings.Contains(r.Host, "text.") { @@ -233,6 +234,9 @@ func getRawTextMode(r *http.Request) string { if r.Header.Get("X-Browsh-Raw-Mode") == "PLAIN" { mode = "PLAIN" } + if r.Header.Get("X-Browsh-Raw-Mode") == "DOM" { + mode = "DOM" + } return mode } diff --git a/interfacer/src/browsh/version.go b/interfacer/src/browsh/version.go index 341f6a1..0d87838 100644 --- a/interfacer/src/browsh/version.go +++ b/interfacer/src/browsh/version.go @@ -1,3 +1,3 @@ package browsh -var browshVersion = "1.6.1" +var browshVersion = "1.6.2" diff --git a/interfacer/test/http-server/server_test.go b/interfacer/test/http-server/server_test.go index 4a511d4..29cf662 100644 --- a/interfacer/test/http-server/server_test.go +++ b/interfacer/test/http-server/server_test.go @@ -29,6 +29,12 @@ var _ = Describe("HTTP Server", func() { "Another page")) }) + It("should return the DOM", func() { + response := getPath("/smorgasbord", "dom") + Expect(response).To(ContainSubstring( + "
")) + }) + It("should return a background image", func() { response := getPath("/smorgasbord", "html") Expect(response).To(ContainSubstring("background-image: url(data:image/jpeg")) diff --git a/interfacer/test/http-server/setup.go b/interfacer/test/http-server/setup.go index e50796c..c3eb471 100644 --- a/interfacer/test/http-server/setup.go +++ b/interfacer/test/http-server/setup.go @@ -51,6 +51,9 @@ func getPath(path string, mode string) string { if mode == "plain" { request.Header.Add("X-Browsh-Raw-Mode", "PLAIN") } + if mode == "dom" { + request.Header.Add("X-Browsh-Raw-Mode", "DOM") + } response, err := client.Do(request) if err != nil { panic(fmt.Sprintf("%s", err)) diff --git a/webext/src/dom/commands_mixin.js b/webext/src/dom/commands_mixin.js index d3618e4..10b357d 100644 --- a/webext/src/dom/commands_mixin.js +++ b/webext/src/dom/commands_mixin.js @@ -50,7 +50,7 @@ export default MixinBase => _launch() { const mode = this.config.http_server_mode_type; - if (mode === "raw_text_plain" || mode === "raw_text_html") { + if (mode.includes("raw_text_")) { this._is_raw_text_mode = true; this._is_interactive_mode = false; this._raw_mode_type = mode; diff --git a/webext/src/dom/serialise_mixin.js b/webext/src/dom/serialise_mixin.js index 7c874a4..dede614 100644 --- a/webext/src/dom/serialise_mixin.js +++ b/webext/src/dom/serialise_mixin.js @@ -289,8 +289,14 @@ export default MixinBase => } _sendRawText() { + let body; + if (this._raw_mode_type == "raw_text_dom") { + body = document.getElementsByTagName("body")[0].innerHTML; + } else { + body = this._serialiseRawText(); + } let payload = { - body: this._serialiseRawText(), + body: body, page_load_duration: this.config.page_load_duration, parsing_duration: this._parsing_duration }; diff --git a/webext/src/dom/text_builder.js b/webext/src/dom/text_builder.js index bbdab83..7338742 100644 --- a/webext/src/dom/text_builder.js +++ b/webext/src/dom/text_builder.js @@ -30,7 +30,13 @@ export default class extends utils.mixins(CommonMixin, SerialiseMixin) { sendRawText(type) { this._raw_mode_type = type; this._parse_start_time = performance.now(); - this.buildFormattedText(this._sendRawText.bind(this)); + if (type == "raw_text_dom") { + setTimeout(() => { + this._sendRawText(); + }, this.config["http-server"].render_delay); + } else { + this.buildFormattedText(this._sendRawText.bind(this)); + } } buildFormattedText(callback) {