Bug 872078 - Added test case for font preview in Response view of Netmonitor. r=bomsy,jdescottes
authorSebastian Zartner <sebastianzartner@gmail.com>
Thu, 22 Apr 2021 18:53:39 +0000
changeset 577127 c37cd0b9dc822ff21d227eb848ccb86d24bd8f85
parent 577126 ceee4a44c6687111cfff578121307e42fc935ace
child 577128 071d91360e5b507b4802ea87a92c09a2a1b551e5
push id38400
push userimoraru@mozilla.com
push dateFri, 23 Apr 2021 09:51:01 +0000
treeherdermozilla-central@9b7bac5af873 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbomsy, jdescottes
bugs872078
milestone90.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 872078 - Added test case for font preview in Response view of Netmonitor. r=bomsy,jdescottes Depends on D110169 Differential Revision: https://phabricator.services.mozilla.com/D110170
devtools/client/netmonitor/test/OstrichLicense.txt
devtools/client/netmonitor/test/browser.ini
devtools/client/netmonitor/test/browser_net_fonts.js
devtools/client/netmonitor/test/head.js
devtools/client/netmonitor/test/html_fonts-test-page.html
devtools/client/netmonitor/test/ostrich-black.ttf
devtools/client/netmonitor/test/ostrich-regular.ttf
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/OstrichLicense.txt
@@ -0,0 +1,41 @@
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
\ No newline at end of file
--- a/devtools/client/netmonitor/test/browser.ini
+++ b/devtools/client/netmonitor/test/browser.ini
@@ -10,16 +10,17 @@ support-files =
   html_brotli-test-page.html
   html_image-tooltip-test-page.html
   html_cors-test-page.html
   html_csp-frame-test-page.html
   html_csp-resend-test-page.html
   html_csp-test-page.html
   html_custom-get-page.html
   html_cyrillic-test-page.html
+  html_fonts-test-page.html
   html_frame-test-page.html
   html_frame-subdocument.html
   html_filter-test-page.html
   html_infinite-get-page.html
   html_internal-stylesheet.html
   html_json-b64.html
   html_json-basic.html
   html_json-custom-mime-test-page.html
@@ -71,16 +72,18 @@ support-files =
   sjs_simple-unsorted-cookies-test-server.sjs
   sjs_slow-script-server.sjs
   sjs_sorting-test-server.sjs
   sjs_sse-test-server.sjs
   sjs_status-codes-test-server.sjs
   sjs_timings-test-server.sjs
   sjs_truncate-test-server.sjs
   test-image.png
+  ostrich-regular.ttf
+  ostrich-black.ttf
   service-workers/status-codes.html
   service-workers/status-codes-service-worker.js
   xhr_bundle.js
   xhr_bundle.js.map
   xhr_original.js
   !/devtools/client/shared/test/shared-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
 
@@ -135,16 +138,17 @@ skip-if = (verify && !debug && (os == 'm
 [browser_net_cookies_sorted.js]
 skip-if = (verify && debug && os == 'win')
 [browser_net_copy_as_curl.js]
 [browser_net_copy_as_fetch.js]
 [browser_net_use_as_fetch.js]
 [browser_net_cors_requests.js]
 [browser_net_cyrillic-01.js]
 [browser_net_cyrillic-02.js]
+[browser_net_fonts.js]
 [browser_net_frame.js]
 skip-if = true # Bug 1479782
 [browser_net_header-docs.js]
 [browser_net_internal-stylesheet.js]
 [browser_net_edit_resend_cancel.js]
 [browser_net_edit_resend_caret.js]
 [browser_net_edit_resend_with_filtering.js]
 [browser_net_edit_resend_xhr.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/browser_net_fonts.js
@@ -0,0 +1,84 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests if font preview is generated correctly
+ */
+
+add_task(async function() {
+  const { tab, monitor } = await initNetMonitor(FONTS_URL + "?name=fonts", {
+    requestCount: 1,
+  });
+  info("Starting test... ");
+
+  const { document, store, windowRequire } = monitor.panelWin;
+  const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
+
+  store.dispatch(Actions.batchEnable(false));
+
+  // Reload the page to get the font request
+  const waitForRequests = waitForNetworkEvents(monitor, 3);
+  tab.linkedBrowser.reload();
+  await waitForRequests;
+
+  const wait = waitForDOMIfNeeded(
+    document,
+    "#response-panel .response-font[src^='data:']"
+  );
+
+  const requests = document.querySelectorAll(
+    ".request-list-item .requests-list-status"
+  );
+
+  // Check first font request
+  clickElement(requests[1], monitor);
+  clickOnSidebarTab(document, "response");
+
+  await wait;
+
+  ok(true, "Font preview is shown");
+
+  const tabpanel = document.querySelector("#response-panel");
+  let image = tabpanel.querySelector(".response-font");
+  await once(image, "load");
+
+  ok(
+    image.complete && image.naturalHeight !== 0,
+    "Font preview got generated correctly"
+  );
+
+  let fontData = document.querySelectorAll(".tabpanel-summary-value");
+  is(fontData[0].textContent, "Ostrich Sans Medium", "Font name is correct");
+  // "font/ttf" is returned on Linux, which is the expected MIME type, though
+  // "application/octet-stream" is also accepted which is returned on Windows and MacOS.
+  ok(
+    ["font/ttf", "application/octet-stream"].includes(fontData[1].textContent),
+    "MIME type is correct"
+  );
+
+  // Check second font request
+  clickElement(requests[2], monitor);
+
+  await waitForDOM(document, "#response-panel .response-font[src^='data:']");
+
+  image = tabpanel.querySelector(".response-font");
+  await once(image, "load");
+
+  ok(
+    image.complete && image.naturalHeight !== 0,
+    "Font preview got generated correctly"
+  );
+
+  fontData = document.querySelectorAll(".tabpanel-summary-value");
+  is(fontData[0].textContent, "Ostrich Sans Black", "Font name is correct");
+  // Actually expected is "font/ttf", though "application/octet-stream" is
+  // ok as well and obviously returned when running the test locally.
+  ok(
+    ["font/ttf", "application/octet-stream"].includes(fontData[1].textContent),
+    "MIME type is correct"
+  );
+
+  await teardown(monitor);
+});
--- a/devtools/client/netmonitor/test/head.js
+++ b/devtools/client/netmonitor/test/head.js
@@ -90,16 +90,17 @@ const JSONP_URL = EXAMPLE_URL + "html_js
 const JSON_LONG_URL = EXAMPLE_URL + "html_json-long-test-page.html";
 const JSON_MALFORMED_URL = EXAMPLE_URL + "html_json-malformed-test-page.html";
 const JSON_CUSTOM_MIME_URL =
   EXAMPLE_URL + "html_json-custom-mime-test-page.html";
 const JSON_TEXT_MIME_URL = EXAMPLE_URL + "html_json-text-mime-test-page.html";
 const JSON_B64_URL = EXAMPLE_URL + "html_json-b64.html";
 const JSON_BASIC_URL = EXAMPLE_URL + "html_json-basic.html";
 const JSON_EMPTY_URL = EXAMPLE_URL + "html_json-empty.html";
+const FONTS_URL = EXAMPLE_URL + "html_fonts-test-page.html";
 const SORTING_URL = EXAMPLE_URL + "html_sorting-test-page.html";
 const FILTERING_URL = EXAMPLE_URL + "html_filter-test-page.html";
 const INFINITE_GET_URL = EXAMPLE_URL + "html_infinite-get-page.html";
 const CUSTOM_GET_URL = EXAMPLE_URL + "html_custom-get-page.html";
 const HTTPS_CUSTOM_GET_URL = HTTPS_EXAMPLE_URL + "html_custom-get-page.html";
 const SINGLE_GET_URL = EXAMPLE_URL + "html_single-get-page.html";
 const STATISTICS_URL = EXAMPLE_URL + "html_statistics-test-page.html";
 const CURL_URL = EXAMPLE_URL + "html_copy-as-curl.html";
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/test/html_fonts-test-page.html
@@ -0,0 +1,45 @@
+<!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />
+    <title>Network Monitor test page</title>
+    <style>
+      @font-face {
+        font-family: test-font;
+        src: url("ostrich-regular.ttf") format("truetype");
+        font-style: normal;
+        font-weight: 400;
+        font-display: swap;
+      }
+
+      @font-face {
+        font-family: test-font-bold;
+        src: url("ostrich-black.ttf") format("truetype");
+        font-style: normal;
+        font-weight: 700;
+        font-display: swap;
+      }
+
+      .regular {
+        font-family: test-font;
+      }
+
+      .bold {
+        font-family: test-font-bold;
+        font-weight: 700;
+      }
+      </style>
+  </head>
+
+  <body>
+    <p class="regular">Regular font</p>
+    <p class="bold">Bold font</p>
+  </body>
+
+</html>
new file mode 100644
index 0000000000000000000000000000000000000000..a0ef8fe1c94243535eb22562bb7c3deb5c834217
GIT binary patch
literal 12872
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
F^&czkp#uN_
new file mode 100644
index 0000000000000000000000000000000000000000..9682c07350475eb2b757f0a20b141e90f2ee64bb
GIT binary patch
literal 12476
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
Jk^U@c{u3~fNId`m