src/vs/workbench/contrib/debug/browser/breakpointsView.ts/FunctionBreakpointInputRenderer/renderTemplate
class FunctionBreakpointInputRenderer:	renderTemplate(container: HTMLElement): IFunctionBreakpointInputTemplateData {
		const template: IFunctionBreakpointInputTemplateData = Object.create(null);

		const breakpoint = dom.append(container, $('.breakpoint'));
		template.icon = $('.icon');
		template.checkbox = createCheckbox();

		dom.append(breakpoint, template.icon);
		dom.append(breakpoint, template.checkbox);
		this.view.breakpointInputFocused.set(true);
		const inputBoxContainer = dom.append(breakpoint, $('.inputBoxContainer'));


		const inputBox = new InputBox(inputBoxContainer, this.contextViewService);
		const styler = attachInputBoxStyler(inputBox, this.themeService);
		const toDispose: IDisposable[] = [inputBox, styler];

		const wrapUp = (success: boolean) => {
			this.view.breakpointInputFocused.set(false);
			const id = template.breakpoint.getId();

			if (success) {
				if (template.type === 'name') {
					this.debugService.updateFunctionBreakpoint(id, { name: inputBox.value });
				}
				if (template.type === 'condition') {
					this.debugService.updateFunctionBreakpoint(id, { condition: inputBox.value });
				}
				if (template.type === 'hitCount') {
					this.debugService.updateFunctionBreakpoint(id, { hitCondition: inputBox.value });
				}
			} else {
				if (template.type === 'name' && !template.breakpoint.name) {
					this.debugService.removeFunctionBreakpoints(id);
				} else {
					this.view.renderInputBox(undefined);
				}
			}
		};

		toDispose.push(dom.addStandardDisposableListener(inputBox.inputElement, 'keydown', (e: IKeyboardEvent) => {
			const isEscape = e.equals(KeyCode.Escape);
			const isEnter = e.equals(KeyCode.Enter);
			if (isEscape || isEnter) {
				e.preventDefault();
				e.stopPropagation();
				wrapUp(isEnter);
			}
		}));
		toDispose.push(dom.addDisposableListener(inputBox.inputElement, 'blur', () => {
			// Need to react with a timeout on the blur event due to possible concurent splices #56443
			setTimeout(() => {
				wrapUp(!!inputBox.value);
			});
		}));

		template.inputBox = inputBox;
		template.toDispose = toDispose;
		return template;
	}