Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
style(platform-browser): format code
  • Loading branch information
d-koppenhagen committed Feb 28, 2020
commit c7aab70390cebfec8314c6c82179fc54b09135a8
28 changes: 16 additions & 12 deletions packages/platform-browser/src/browser/link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import {
DOCUMENT,
ɵDomAdapter as DomAdapter,
ɵgetDOM as getDOM
} from '@angular/common';
import { Inject, Injectable, ɵɵinject } from '@angular/core';
} from "@angular/common";
import { Inject, Injectable, ɵɵinject } from "@angular/core";

/**
* Represents a link element.
Expand All @@ -20,7 +20,7 @@ import { Inject, Injectable, ɵɵinject } from '@angular/core';
*/
export type LinkDefinition = {
charset?: string;
crossorigin?: 'anonymous' | 'use-credentials';
crossorigin?: "anonymous" | "use-credentials";
disabled?: boolean;
href?: string;
hreflang?: string;
Expand All @@ -30,8 +30,7 @@ export type LinkDefinition = {
sizes?: string;
target?: string;
type?: string;
} &
{
} & {
[prop: string]: string;
};

Expand All @@ -47,7 +46,7 @@ export function createLink() {
*
* @publicApi
*/
@Injectable({ providedIn: 'root', useFactory: createLink, deps: [] })
@Injectable({ providedIn: "root", useFactory: createLink, deps: [] })
export class Link {
private _dom: DomAdapter;
constructor(@Inject(DOCUMENT) private _doc: any) {
Expand Down Expand Up @@ -114,17 +113,17 @@ export class Link {
): HTMLLinkElement {
if (!forceCreation) {
const selector: string = this._parseSelector(link);
const elem: HTMLLinkElement = this.getLink(selector) !;
const elem: HTMLLinkElement = this.getLink(selector)!;
// It's allowed to have multiple elements with the same name so it's not enough to
// just check that element with the same name already present on the page. We also need to
// check if element has tag attributes
if (elem && this._containsAttributes(link, elem)) return elem;
}
const element: HTMLLinkElement = this._dom.createElement(
'link'
"link"
) as HTMLLinkElement;
this._setLinkElementAttributes(link, element);
const head = this._doc.getElementsByTagName('head')[0];
const head = this._doc.getElementsByTagName("head")[0];
head.appendChild(element);
return element;
}
Expand All @@ -140,11 +139,16 @@ export class Link {
}

private _parseSelector(link: LinkDefinition): string {
const attr: string = link.rel ? 'rel' : 'property';
const attr: string = link.rel ? "rel" : "property";
return `${attr}="${link[attr]}"`;
}

private _containsAttributes(link: LinkDefinition, elem: HTMLLinkElement): boolean {
return Object.keys(link).every((key: string) => elem.getAttribute(key) === link[key]);
private _containsAttributes(
link: LinkDefinition,
elem: HTMLLinkElement
): boolean {
return Object.keys(link).every(
(key: string) => elem.getAttribute(key) === link[key]
);
}
}
81 changes: 57 additions & 24 deletions packages/platform-browser/src/browser/meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,29 @@
* found in the LICENSE file at https://angular.io/license
*/

import {DOCUMENT, ɵDomAdapter as DomAdapter, ɵgetDOM as getDOM} from '@angular/common';
import {Inject, Injectable, ɵɵinject} from '@angular/core';
import {
DOCUMENT,
ɵDomAdapter as DomAdapter,
ɵgetDOM as getDOM
} from "@angular/common";
import { Inject, Injectable, ɵɵinject } from "@angular/core";

/**
* Represents a meta element.
*
* @publicApi
*/
export type MetaDefinition = {
charset?: string; content?: string; httpEquiv?: string; id?: string; itemprop?: string;
charset?: string;
content?: string;
httpEquiv?: string;
id?: string;
itemprop?: string;
name?: string;
property?: string;
scheme?: string;
url?: string;
} &
{
} & {
// TODO(IgorMinar): this type looks wrong
[prop: string]: string;
};
Expand All @@ -38,17 +45,25 @@ export function createMeta() {
*
* @publicApi
*/
@Injectable({providedIn: 'root', useFactory: createMeta, deps: []})
@Injectable({ providedIn: "root", useFactory: createMeta, deps: [] })
export class Meta {
private _dom: DomAdapter;
constructor(@Inject(DOCUMENT) private _doc: any) { this._dom = getDOM(); }
constructor(@Inject(DOCUMENT) private _doc: any) {
this._dom = getDOM();
}

addTag(tag: MetaDefinition, forceCreation: boolean = false): HTMLMetaElement|null {
addTag(
tag: MetaDefinition,
forceCreation: boolean = false
): HTMLMetaElement | null {
if (!tag) return null;
return this._getOrCreateElement(tag, forceCreation);
}

addTags(tags: MetaDefinition[], forceCreation: boolean = false): HTMLMetaElement[] {
addTags(
tags: MetaDefinition[],
forceCreation: boolean = false
): HTMLMetaElement[] {
if (!tags) return [];
return tags.reduce((result: HTMLMetaElement[], tag: MetaDefinition) => {
if (tag) {
Expand All @@ -58,63 +73,81 @@ export class Meta {
}, []);
}

getTag(attrSelector: string): HTMLMetaElement|null {
getTag(attrSelector: string): HTMLMetaElement | null {
if (!attrSelector) return null;
return this._doc.querySelector(`meta[${attrSelector}]`) || null;
}

getTags(attrSelector: string): HTMLMetaElement[] {
if (!attrSelector) return [];
const list /*NodeList*/ = this._doc.querySelectorAll(`meta[${attrSelector}]`);
const list /*NodeList*/ = this._doc.querySelectorAll(
`meta[${attrSelector}]`
);
return list ? [].slice.call(list) : [];
}

updateTag(tag: MetaDefinition, selector?: string): HTMLMetaElement|null {
updateTag(tag: MetaDefinition, selector?: string): HTMLMetaElement | null {
if (!tag) return null;
selector = selector || this._parseSelector(tag);
const meta: HTMLMetaElement = this.getTag(selector) !;
const meta: HTMLMetaElement = this.getTag(selector)!;
if (meta) {
return this._setMetaElementAttributes(tag, meta);
}
return this._getOrCreateElement(tag, true);
}

removeTag(attrSelector: string): void { this.removeTagElement(this.getTag(attrSelector) !); }
removeTag(attrSelector: string): void {
this.removeTagElement(this.getTag(attrSelector)!);
}

removeTagElement(meta: HTMLMetaElement): void {
if (meta) {
this._dom.remove(meta);
}
}

private _getOrCreateElement(meta: MetaDefinition, forceCreation: boolean = false):
HTMLMetaElement {
private _getOrCreateElement(
meta: MetaDefinition,
forceCreation: boolean = false
): HTMLMetaElement {
if (!forceCreation) {
const selector: string = this._parseSelector(meta);
const elem: HTMLMetaElement = this.getTag(selector) !;
const elem: HTMLMetaElement = this.getTag(selector)!;
// It's allowed to have multiple elements with the same name so it's not enough to
// just check that element with the same name already present on the page. We also need to
// check if element has tag attributes
if (elem && this._containsAttributes(meta, elem)) return elem;
}
const element: HTMLMetaElement = this._dom.createElement('meta') as HTMLMetaElement;
const element: HTMLMetaElement = this._dom.createElement(
"meta"
) as HTMLMetaElement;
this._setMetaElementAttributes(meta, element);
const head = this._doc.getElementsByTagName('head')[0];
const head = this._doc.getElementsByTagName("head")[0];
head.appendChild(element);
return element;
}

private _setMetaElementAttributes(tag: MetaDefinition, el: HTMLMetaElement): HTMLMetaElement {
Object.keys(tag).forEach((prop: string) => el.setAttribute(prop, tag[prop]));
private _setMetaElementAttributes(
tag: MetaDefinition,
el: HTMLMetaElement
): HTMLMetaElement {
Object.keys(tag).forEach((prop: string) =>
el.setAttribute(prop, tag[prop])
);
return el;
}

private _parseSelector(tag: MetaDefinition): string {
const attr: string = tag.name ? 'name' : 'property';
const attr: string = tag.name ? "name" : "property";
return `${attr}="${tag[attr]}"`;
}

private _containsAttributes(tag: MetaDefinition, elem: HTMLMetaElement): boolean {
return Object.keys(tag).every((key: string) => elem.getAttribute(key) === tag[key]);
private _containsAttributes(
tag: MetaDefinition,
elem: HTMLMetaElement
): boolean {
return Object.keys(tag).every(
(key: string) => elem.getAttribute(key) === tag[key]
);
}
}
49 changes: 36 additions & 13 deletions packages/platform-browser/src/platform-browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,41 @@
* found in the LICENSE file at https://angular.io/license
*/

export {BrowserModule, platformBrowser} from './browser';
export {Meta, MetaDefinition} from './browser/meta';
export {Link, LinkDefinition} from './browser/link';
export {Title} from './browser/title';
export {disableDebugTools, enableDebugTools} from './browser/tools/tools';
export {BrowserTransferStateModule, StateKey, TransferState, makeStateKey} from './browser/transfer_state';
export {By} from './dom/debug/by';
export {EVENT_MANAGER_PLUGINS, EventManager} from './dom/events/event_manager';
export {HAMMER_GESTURE_CONFIG, HAMMER_LOADER, HAMMER_PROVIDERS__POST_R3__ as ɵHAMMER_PROVIDERS__POST_R3__, HammerGestureConfig, HammerLoader, HammerModule} from './dom/events/hammer_gestures';
export {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl, SafeValue} from './security/dom_sanitization_service';
export { BrowserModule, platformBrowser } from "./browser";
export { Meta, MetaDefinition } from "./browser/meta";
export { Link, LinkDefinition } from "./browser/link";
export { Title } from "./browser/title";
export { disableDebugTools, enableDebugTools } from "./browser/tools/tools";
export {
BrowserTransferStateModule,
StateKey,
TransferState,
makeStateKey
} from "./browser/transfer_state";
export { By } from "./dom/debug/by";
export {
EVENT_MANAGER_PLUGINS,
EventManager
} from "./dom/events/event_manager";
export {
HAMMER_GESTURE_CONFIG,
HAMMER_LOADER,
HAMMER_PROVIDERS__POST_R3__ as ɵHAMMER_PROVIDERS__POST_R3__,
HammerGestureConfig,
HammerLoader,
HammerModule
} from "./dom/events/hammer_gestures";
export {
DomSanitizer,
SafeHtml,
SafeResourceUrl,
SafeScript,
SafeStyle,
SafeUrl,
SafeValue
} from "./security/dom_sanitization_service";

export * from './private_export';
export {VERSION} from './version';
export * from "./private_export";
export { VERSION } from "./version";
// This must be exported so it doesn't get tree-shaken away prematurely
export {ELEMENT_PROBE_PROVIDERS__POST_R3__ as ɵELEMENT_PROBE_PROVIDERS__POST_R3__} from './dom/debug/ng_probe';
export { ELEMENT_PROBE_PROVIDERS__POST_R3__ as ɵELEMENT_PROBE_PROVIDERS__POST_R3__ } from "./dom/debug/ng_probe";