-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Install global submit listener only when amp-form extension is registered #17246
Changes from 3 commits
b07076d
a396169
4ea8797
ad813af
9ebc4cd
907397a
6323909
eb06a6d
330e49a
2cbd928
5ed7700
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -203,6 +203,17 @@ export function extensionScriptsInNode(head) { | |
return scripts; | ||
} | ||
|
||
/** | ||
* Verifies that an extension script is present in head for | ||
* installation. | ||
* @param {HTMLHeadElement|Element|ShadowRoot} head | ||
* @param {string} extensionId | ||
* return {!Promise<boolean>} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
*/ | ||
export function isExtensionScriptInNode(head, extensionId) { | ||
return extensionScriptsInNode(head).includes(extensionId); | ||
} | ||
|
||
/** | ||
* Waits for an extension if its script is present | ||
* @param {!Window} win | ||
|
@@ -222,7 +233,7 @@ function waitForExtensionIfPresent(win, extension, head) { | |
|
||
// TODO(jpettitt) investigate registerExtension to short circuit | ||
// the dom call in extensionScriptsInNode() | ||
if (!extensionScriptsInNode(head).includes(extension)) { | ||
if (!isExtensionScriptInNode(head)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You should pass There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd assume tests started to fail given this change. Might want to add some tests if not! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. right. gulp check-types task did catch this. Thanks all. |
||
return Promise.resolve(); | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,7 +15,7 @@ | |
*/ | ||
|
||
import {Services} from '../../src/services'; | ||
import {onDocumentFormSubmit_} from '../../src/document-submit'; | ||
import {installGlobalSubmitListenerForDoc, onDocumentFormSubmit_} from '../../src/document-submit'; | ||
|
||
describe('test-document-submit onDocumentFormSubmit_', () => { | ||
let sandbox; | ||
|
@@ -46,6 +46,43 @@ describe('test-document-submit onDocumentFormSubmit_', () => { | |
sandbox.restore(); | ||
}); | ||
|
||
describe('installGlobalSubmitListenerForDoc', () => { | ||
let ampDoc; | ||
let headNode; | ||
let rootNode; | ||
beforeEach(() => { | ||
headNode = document.createElement('head'); | ||
rootNode = document.createElement('html'); | ||
ampDoc = { | ||
getHeadNode: () => headNode, | ||
getRootNode: () => rootNode, | ||
}; | ||
}); | ||
|
||
afterEach(() => sandbox.reset()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't be necessary if you don't create the sandbox in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. removed |
||
|
||
it('should not register submit listener if amp-form is not registered.', | ||
() => { | ||
const script = document.createElement('script'); | ||
script.setAttribute('src', 'https://cdn.ampproject.org/v0/amp-list-0.1.js'); | ||
script.setAttribute('custom-element', 'amp-list'); | ||
ampDoc.getHeadNode().appendChild(script); | ||
sandbox.spy(rootNode, 'addEventListener'); | ||
installGlobalSubmitListenerForDoc(ampDoc); | ||
expect(rootNode.addEventListener).not.to.have.been.called; | ||
}); | ||
|
||
it('should register submit listener if amp-form extension is registered.', | ||
() => { | ||
const script = document.createElement('script'); | ||
script.setAttribute('src', 'https://cdn.ampproject.org/v0/amp-form-0.1.js'); | ||
script.setAttribute('custom-element', 'amp-form'); | ||
ampDoc.getHeadNode().appendChild(script); | ||
sandbox.spy(rootNode, 'addEventListener'); | ||
installGlobalSubmitListenerForDoc(ampDoc); | ||
expect(rootNode.addEventListener).called; | ||
}); | ||
}); | ||
|
||
it('should check target and action attributes', () => { | ||
tgt.removeAttribute('action'); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So
installGlobalSubmitListenerForDoc
get called super early in the AMP runtime (just after styles are installed). I don't know if<head>
's children will be fully parsed by then, meaning we may miss that<script src="amp-form.js">
is included in the head.That's the reason
getElementServiceIfAvailableForDoc
waits forwhenBodyAvailable
first.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As discussed offline yesterday. Modified new isExtensionScriptInNode method to wait for body before making checking that the script is present in head. Thanks