@@ -732,7 +732,7 @@ var codeInput = {
732732 // The only element that could be resized is this code-input element.
733733 this . syncSize ( ) ;
734734 } ) ;
735- resizeObserver . observe ( this ) ;
735+ resizeObserver . observe ( this . textareaElement ) ;
736736
737737 this . classList . add ( "code-input_loaded" ) ;
738738 }
@@ -1128,14 +1128,40 @@ var codeInput = {
11281128 get wrap ( ) { return this . getAttribute ( "wrap" ) || "" ; }
11291129 set wrap ( val ) { this . setAttribute ( "wrap" , val ) ; }
11301130
1131+ /**
1132+ * Get the JavaScript method from the internal textarea
1133+ * element, throwing an error when no textarea is present.
1134+ * The method is bound to the textarea as `this`.
1135+ *
1136+ * For internal use - treat the code-input element as a
1137+ * textarea for the standard functions (e.g. document.
1138+ * querySelector("code-input").focus()).
1139+ */
1140+ getTextareaMethod ( name ) {
1141+ if ( this . textareaElement ) {
1142+ return this . textareaElement [ name ] . bind ( this . textareaElement ) ;
1143+ } else {
1144+ // Unregistered
1145+ const fallbackTextarea = this . querySelector ( "textarea[data-code-input-fallback]" ) ;
1146+ if ( fallbackTextarea ) {
1147+ return fallbackTextarea [ name ] . bind ( fallbackTextarea ) ;
1148+ } else {
1149+ throw new Error ( "Cannot call " + name + " on an unregistered code-input element without a data-code-input-fallback textarea." ) ;
1150+ }
1151+ }
1152+ }
11311153
1132- blur ( options = { } ) { return this . textareaElement . blur ( options ) ; }
1133- checkValidity ( ) { return this . textareaElement . checkValidity ( ) ; }
1134- focus ( options = { } ) { return this . textareaElement . focus ( options ) ; }
1135- reportValidity ( ) { return this . textareaElement . reportValidity ( ) ; }
1136- setCustomValidity ( error ) { this . textareaElement . setCustomValidity ( error ) ; }
1137- setRangeText ( replacement , selectionStart = this . selectionStart , selectionEnd = this . selectionEnd , selectMode = "preserve" ) { this . getTextareaProperty ( "setRangeText" ) ( replacement , selectionStart , selectionEnd , selectMode ) ; }
1138- setSelectionRange ( selectionStart , selectionEnd , selectionDirection = "none" ) { this . getTextareaProperty ( "setSelectionRange" ) ( selectionStart , selectionEnd , selectionDirection ) ; }
1154+ blur ( options = { } ) { this . getTextareaMethod ( "blur" ) ( options ) ; }
1155+ checkValidity ( ) { return this . getTextareaMethod ( "checkValidity" ) ( ) ; }
1156+ focus ( options = { } ) { this . getTextareaMethod ( "focus" ) ( options ) ; }
1157+ reportValidity ( ) { return this . getTextareaMethod ( "reportValidity" ) ( ) ; }
1158+ setCustomValidity ( error ) { this . getTextareaMethod ( "setCustomValidity" ) ( error ) ; }
1159+ setRangeText ( replacement , selectionStart = this . selectionStart , selectionEnd = this . selectionEnd , selectMode = "preserve" ) {
1160+ this . getTextareaMethod ( "setRangeText" ) ( replacement , selectionStart , selectionEnd , selectMode ) ;
1161+ // Reflect that value updated
1162+ if ( this . textareaElement ) this . scheduleHighlight ( ) ;
1163+ }
1164+ setSelectionRange ( selectionStart , selectionEnd , selectionDirection = "none" ) { this . getTextareaMethod ( "setSelectionRange" ) ( selectionStart , selectionEnd , selectionDirection ) ; }
11391165
11401166 /**
11411167 * Allows plugins to store data in the scope of a single element.
0 commit comments