Skip to content

Commit

Permalink
Visualization updates and removing backward compatibility code from 0…
Browse files Browse the repository at this point in the history
….5.3
  • Loading branch information
sarveshnagpal committed May 11, 2020
2 parents f71ac85 + 1457157 commit fd42bfa
Show file tree
Hide file tree
Showing 25 changed files with 263 additions and 169 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"packages": [
"packages/*"
],
"version": "0.5.2",
"version": "0.5.3",
"npmClient": "yarn",
"useWorkspaces": true
}
4 changes: 2 additions & 2 deletions packages/clarity-decode/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "clarity-decode",
"version": "0.5.2",
"version": "0.5.3",
"description": "An analytics library that uses web page interactions to generate aggregated insights",
"author": "Microsoft Corp.",
"license": "MIT",
Expand All @@ -26,7 +26,7 @@
"url": "https://github.com/Microsoft/clarity/issues"
},
"dependencies": {
"clarity-js": "^0.5.2"
"clarity-js": "^0.5.3"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^11.1.0",
Expand Down
11 changes: 0 additions & 11 deletions packages/clarity-decode/src/clarity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,6 @@ export function decode(input: string): DecodedPayload {
if (payload.click === undefined) { payload.click = []; }
let clickEntry = interaction.decode(entry) as ClickEvent;
payload.click.push(clickEntry);

// Extra processing introduced for backward compatibility in v1.0.0-b21.
if (payload.pointer === undefined) { payload.pointer = []; }
let clickData = clickEntry.data;
payload.pointer.push({
time: clickEntry.time, event: clickEntry.event, data: {
target: clickData.target,
x: clickData.x,
y: clickData.y
}
} as PointerEvent);
break;
case Data.Event.Scroll:
if (payload.scroll === undefined) { payload.scroll = []; }
Expand Down
1 change: 1 addition & 0 deletions packages/clarity-decode/types/data.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { NavigationEvent, NetworkEvent, PaintEvent } from "./performance";
import { PartialEvent } from "./core";

/* Redeclare enums */
export import Envelope = Data.Envelope;
export import Code = Data.Code;
export import Event = Data.Event;
export import Metric = Data.Metric;
Expand Down
8 changes: 4 additions & 4 deletions packages/clarity-devtools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "clarity-devtools",
"version": "0.5.2",
"version": "0.5.3",
"private": true,
"description": "Adds Clarity debugging support to browser devtools",
"author": "Microsoft Corp.",
Expand All @@ -24,9 +24,9 @@
"url": "https://github.com/Microsoft/clarity/issues"
},
"dependencies": {
"clarity-decode": "^0.5.2",
"clarity-js": "^0.5.2",
"clarity-visualize": "^0.5.2"
"clarity-decode": "^0.5.3",
"clarity-js": "^0.5.3",
"clarity-visualize": "^0.5.3"
},
"devDependencies": {
"@rollup/plugin-node-resolve": "^7.1.3",
Expand Down
6 changes: 3 additions & 3 deletions packages/clarity-devtools/src/content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ function activate(): void {
}, (items: any) => {
if (items.clarity.showText) { document.body.setAttribute(Layout.Constant.UNMASK_ATTRIBUTE, "true"); }
clarity.start({
lookahead: 250,
delay: 250,
lookahead: 0,
delay: 50,
lean: items.clarity.leanMode,
regions,
upload,
projectId: "clarity-inspector"
projectId: "clarity-devtools"
});
});
window["clarity"] = clarity;
Expand Down
36 changes: 29 additions & 7 deletions packages/clarity-devtools/src/panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ function save(encoded: boolean = true): void {

let a = document.createElement("a");
let suffix = encoded ? "encoded" : "decoded";
a.setAttribute("download", `clarity-vnext-${id.toUpperCase()}-${suffix}.json`);
a.setAttribute("download", `clarity-${id.toUpperCase()}-${suffix}.json`);
a.href = url;
a.click();
}
Expand All @@ -25,26 +25,47 @@ background.onMessage.addListener(function(message: any): void {
// Handle responses from the background page, if any
if (message && message.payload) {
let decoded = decode(message.payload);
if (decoded.envelope.sequence === 1) { reset(); }
eJson.push(JSON.parse(message.payload));
dJson.push(decoded);
data.process(decoded);
id = decoded.envelope.pageId;
let info = document.getElementById("info");
let header = document.getElementById("header") as HTMLElement;
let metadata = document.getElementById("header") as HTMLDivElement;
let download = document.getElementById("download") as HTMLElement;
let iframe = document.getElementById("clarity") as HTMLIFrameElement;
info.style.display = "none";
header.style.display = "block";
metadata.style.display = "block";
download.style.display = "block";
iframe.style.display = "block";
visualize.render(decoded, iframe, header);
if (decoded.envelope.sequence === 1) { reset(decoded.envelope); }
visualize.replay(decoded);
}
});

function reset(): void {
function resize(width: number, height: number): void {
let margin = 10;
let px = "px";
let iframe = document.getElementById("clarity") as HTMLIFrameElement;
let container = iframe.ownerDocument.documentElement;
let offsetTop = iframe.offsetTop;
let availableWidth = container.clientWidth - (2 * margin);
let availableHeight = container.clientHeight - offsetTop - (2 * margin);
let scale = Math.min(Math.min(availableWidth / width, 1), Math.min(availableHeight / height, 1));
iframe.removeAttribute("style");
iframe.style.position = "relative";
iframe.style.width = width + px;
iframe.style.height = height + px;
iframe.style.transformOrigin = "0 0 0";
iframe.style.transform = "scale(" + scale + ")";
iframe.style.border = "1px solid #cccccc";
iframe.style.overflow = "hidden";
iframe.style.left = ((container.clientWidth - (width * scale)) / 2) + px;
}

function reset(envelope: Data.Envelope): void {
if (console) { console.clear(); }
let iframe = document.getElementById("clarity");
let metadata = document.getElementById("header") as HTMLDivElement;
let iframe = document.getElementById("clarity") as HTMLIFrameElement;
let download = document.getElementById("download") as HTMLElement;
if (iframe) { iframe.parentElement.removeChild(iframe); }
iframe = document.createElement("iframe");
Expand All @@ -58,4 +79,5 @@ function reset(): void {
id = "";
(download.firstChild as HTMLElement).onclick = function(): void { save(true); };
(download.lastChild as HTMLElement).onclick = function(): void { save(false); };
visualize.setup(envelope.version, iframe, resize, metadata);
}
4 changes: 2 additions & 2 deletions packages/clarity-devtools/static/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"manifest_version": 2,
"name": "Clarity Developer Tools",
"description": "Get insights about how customers use your website.",
"version": "0.5.2",
"version_name": "0.5.2",
"version": "0.5.3",
"version_name": "0.5.3",
"minimum_chrome_version": "50",
"devtools_page": "devtools.html",
"icons": {
Expand Down
2 changes: 1 addition & 1 deletion packages/clarity-js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "clarity-js",
"version": "0.5.2",
"version": "0.5.3",
"description": "An analytics library that uses web page interactions to generate aggregated insights",
"author": "Microsoft Corp.",
"license": "MIT",
Expand Down
13 changes: 13 additions & 0 deletions packages/clarity-js/src/core/offset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { OffsetDistance } from "@clarity-types/core";

export default function(element: HTMLElement): OffsetDistance {
let output: OffsetDistance = { x: 0, y: 0 };
if (element && element.offsetParent) {
do {
output.x += element.offsetLeft;
output.y += element.offsetTop;
element = element.offsetParent as HTMLElement;
} while (element);
}
return output;
}
5 changes: 3 additions & 2 deletions packages/clarity-js/src/core/time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ export function start(): void {
startTime = performance.now();
}

export function time(): number {
return Math.round(performance.now() - startTime);
export function time(ts: number = null): number {
ts = ts ? ts : performance.now();
return Math.max(Math.round(ts - startTime), 0);
}

export function end(): void {
Expand Down
2 changes: 1 addition & 1 deletion packages/clarity-js/src/core/version.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
let version = "0.5.2";
let version = "0.5.3";
export default version;
8 changes: 6 additions & 2 deletions packages/clarity-js/src/interaction/click.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Event } from "@clarity-types/data";
import { ClickData } from "@clarity-types/interaction";
import { bind } from "@src/core/event";
import offset from "@src/core/offset";
import { schedule } from "@src/core/task";
import { link, target, track } from "@src/data/target";
import { iframe } from "@src/layout/dom";
Expand All @@ -22,8 +23,11 @@ function handler(event: Event, root: Node, evt: MouseEvent): void {
let x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
let y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
// In case of iframe, we adjust (x,y) to be relative to top parent's origin
x = x && frame ? x + frame.offsetLeft : x;
y = y && frame ? y + frame.offsetTop : y;
if (frame) {
let distance = offset(frame);
x = x ? x + distance.x : x;
y = y ? y + distance.y : y;
}

let t = target(evt);
// Find nearest anchor tag (<a/>) parent if current target node is part of one
Expand Down
8 changes: 6 additions & 2 deletions packages/clarity-js/src/interaction/pointer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Event } from "@clarity-types/data";
import { PointerState } from "@clarity-types/interaction";
import config from "@src/core/config";
import { bind } from "@src/core/event";
import offset from "@src/core/offset";
import { schedule } from "@src/core/task";
import { time } from "@src/core/time";
import { clearTimeout, setTimeout } from "@src/core/timeout";
Expand Down Expand Up @@ -34,8 +35,11 @@ function mouse(event: Event, root: Node, evt: MouseEvent): void {
let x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
let y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
// In case of iframe, we adjust (x,y) to be relative to top parent's origin
x = x && frame ? x + frame.offsetLeft : x;
y = y && frame ? y + frame.offsetTop : y;
if (frame) {
let distance = offset(frame);
x = x ? x + distance.x : x;
y = y ? y + distance.y : y;
}

// Check for null values before processing this event
if (x !== null && y !== null) { handler({ time: time(), event, data: { target: track(target(evt)), x, y } }); }
Expand Down
3 changes: 2 additions & 1 deletion packages/clarity-js/src/performance/longtask.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Event } from "@clarity-types/data";
import { LongTaskEntry, LongTaskState } from "@clarity-types/performance";
import { time } from "@src/core/time";
import encode from "./encode";

// Reference: https://w3c.github.io/longtasks/#sec-PerformanceLongTaskTiming
Expand All @@ -10,7 +11,7 @@ export function reset(): void {
}

export function compute(entry: LongTaskEntry): void {
state = { time: Math.round(entry.startTime),
state = { time: time(entry.startTime),
data: {
duration: Math.round(entry.duration),
attributionName: entry.attribution && entry.attribution.length > 0 ? entry.attribution[0].name : null,
Expand Down
3 changes: 2 additions & 1 deletion packages/clarity-js/src/performance/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Event } from "@clarity-types/data";
import { NetworkState } from "@clarity-types/performance";
import config from "@src/core/config";
import { schedule } from "@src/core/task";
import { time } from "@src/core/time";
import { clearTimeout, setTimeout } from "@src/core/timeout";
import encode from "./encode";

Expand All @@ -18,7 +19,7 @@ export function compute(entry: PerformanceResourceTiming): void {
state.push({
url: entry.name,
data: {
start: Math.round(entry.startTime),
start: time(entry.startTime),
duration: Math.round(entry.duration),
size: "transferSize" in entry ? Math.round(entry.transferSize) : null,
target: null,
Expand Down
3 changes: 2 additions & 1 deletion packages/clarity-js/src/performance/paint.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Event } from "@clarity-types/data";
import { PaintState } from "@clarity-types/performance";
import { time } from "@src/core/time";
import encode from "./encode";

// Reference: https://www.w3.org/TR/paint-timing/
Expand All @@ -10,6 +11,6 @@ export function reset(): void {
}

export function compute(entry: PerformanceEntry): void {
state = { time: Math.round(entry.startTime), data: { name: entry.name } };
state = { time: time(entry.startTime), data: { name: entry.name } };
encode(Event.Paint);
}
5 changes: 5 additions & 0 deletions packages/clarity-js/types/core.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ export interface AsyncTask {
resolve: TaskResolve;
}

export interface OffsetDistance {
x: number;
y: number;
}

export interface BrowserEvent {
event: string;
target: EventTarget;
Expand Down
4 changes: 2 additions & 2 deletions packages/clarity-visualize/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "clarity-visualize",
"version": "0.5.2",
"version": "0.5.3",
"description": "An analytics library that uses web page interactions to generate aggregated insights",
"author": "Microsoft Corp.",
"license": "MIT",
Expand All @@ -27,7 +27,7 @@
"url": "https://github.com/Microsoft/clarity/issues"
},
"dependencies": {
"clarity-decode": "^0.5.2"
"clarity-decode": "^0.5.3"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^11.1.0",
Expand Down
Loading

0 comments on commit fd42bfa

Please sign in to comment.