blob: a4197061fa304bcd90344e16b4292e0edda23348 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@JS()
library embedder_test; // We need this to mess with the ShadowDOM.
import 'package:js/js.dart';
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/src/engine.dart';
void main() {
internalBootstrapBrowserTest(() => testMain);
}
void testMain() {
test('populates flt-renderer and flt-build-mode', () {
FlutterViewEmbedder();
expect(domDocument.body!.getAttribute('flt-renderer'),
'html (requested explicitly)');
expect(domDocument.body!.getAttribute('flt-build-mode'), 'debug');
});
test('innerHeight/innerWidth are equal to visualViewport height and width',
() {
if (domWindow.visualViewport != null) {
expect(domWindow.visualViewport!.width, domWindow.innerWidth);
expect(domWindow.visualViewport!.height, domWindow.innerHeight);
}
});
test('replaces viewport meta tags during style reset', () {
final DomHTMLMetaElement existingMeta = createDomHTMLMetaElement()
..name = 'viewport'
..content = 'foo=bar';
domDocument.head!.append(existingMeta);
expect(existingMeta.isConnected, isTrue);
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
embedder.reset();
},
// TODO(ferhat): https://github.com/flutter/flutter/issues/46638
skip: browserEngine == BrowserEngine.firefox);
test('accesibility placeholder is attached after creation', () {
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
expect(
embedder.glassPaneShadow?.querySelectorAll('flt-semantics-placeholder'),
isNotEmpty,
);
});
test('renders a shadowRoot by default', () {
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
final HostNode hostNode = embedder.glassPaneShadow!;
expect(domInstanceOfString(hostNode.node, 'ShadowRoot'), isTrue);
});
test('starts without shadowDom available too', () {
final dynamic oldAttachShadow = attachShadow;
expect(oldAttachShadow, isNotNull);
attachShadow = null; // Break ShadowDOM
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
final HostNode hostNode = embedder.glassPaneShadow!;
expect(domInstanceOfString(hostNode.node, 'Element'), isTrue);
expect(
(hostNode.node as DomElement).tagName,
equalsIgnoringCase('flt-element-host-node'),
);
attachShadow = oldAttachShadow; // Restore ShadowDOM
});
test('should add/remove global resource', () {
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
final DomHTMLDivElement resource = createDomHTMLDivElement();
embedder.addResource(resource);
final DomElement? resourceRoot = resource.parent;
expect(resourceRoot, isNotNull);
expect(resourceRoot!.childNodes.length, 1);
embedder.removeResource(resource);
expect(resourceRoot.childNodes.length, 0);
});
test('hide placeholder text for textfield', () {
final FlutterViewEmbedder embedder = FlutterViewEmbedder();
final DomHTMLInputElement regularTextField = createDomHTMLInputElement();
regularTextField.placeholder = 'Now you see me';
embedder.addResource(regularTextField);
regularTextField.focus();
DomCSSStyleDeclaration? style = domWindow.getComputedStyle(
embedder.glassPaneShadow!.querySelector('input')!,
'::placeholder');
expect(style, isNotNull);
expect(style.opacity, isNot('0'));
final DomHTMLInputElement textField = createDomHTMLInputElement();
textField.placeholder = 'Now you dont';
textField.classList.add('flt-text-editing');
embedder.addResource(textField);
textField.focus();
style = domWindow.getComputedStyle(
embedder.glassPaneShadow!.querySelector('input.flt-text-editing')!,
'::placeholder');
expect(style, isNotNull);
expect(style.opacity, '0');
}, skip: browserEngine != BrowserEngine.firefox);
}
@JS('Element.prototype.attachShadow')
external dynamic get attachShadow;
@JS('Element.prototype.attachShadow')
external set attachShadow(dynamic x);