@@ -6,7 +6,7 @@ use oxc_diagnostics::OxcDiagnostic;
66use oxc_macros:: declare_oxc_lint;
77use oxc_span:: { GetSpan , Span } ;
88
9- use crate :: { AstNode , ast_util :: is_method_call , context:: LintContext , rule:: Rule } ;
9+ use crate :: { AstNode , context:: LintContext , rule:: Rule } ;
1010
1111fn require_post_message_target_origin_diagnostic ( span : Span ) -> OxcDiagnostic {
1212 OxcDiagnostic :: warn ( "Missing the `targetOrigin` argument." ) . with_label ( span)
@@ -45,52 +45,37 @@ declare_oxc_lint!(
4545) ;
4646
4747impl Rule for RequirePostMessageTargetOrigin {
48- #[ expect( clippy:: cast_possible_truncation) ]
4948 fn run < ' a > ( & self , node : & AstNode < ' a > , ctx : & LintContext < ' a > ) {
5049 let AstKind :: CallExpression ( call_expr) = node. kind ( ) else {
5150 return ;
5251 } ;
53- let arguments = & call_expr. arguments ;
54- if arguments. len ( ) != 1 || call_expr. optional {
52+ // ignore "foo.postMessage?.(...message)" and "foo.postMessage(...message)"
53+ if call_expr. arguments . len ( ) != 1
54+ || call_expr. optional
55+ || matches ! ( & call_expr. arguments[ 0 ] , Argument :: SpreadElement ( _) )
56+ {
5557 return ;
5658 }
57- let arg = & call_expr. arguments [ 0 ] ;
58- // ignore "foo.postMessage(...message)"
59- if matches ! ( arg, Argument :: SpreadElement ( _) ) {
60- return ;
61- }
62- if !is_method_call ( call_expr, None , Some ( & [ "postMessage" ] ) , Some ( 1 ) , Some ( 1 ) ) {
63- return ;
64- }
65- // ignore "foo['postMessage'](message)"
66- let Some ( member_expr) = call_expr. callee . as_member_expression ( ) else {
67- return ;
59+ let member_expr = match call_expr. callee . get_member_expr ( ) {
60+ // ignore "foo[postMessage](message)" and "foo?.postMessage(message)"
61+ Some ( expr) if !( expr. is_computed ( ) || expr. optional ( ) ) => expr,
62+ _ => return ,
6863 } ;
69- // ignore "foo[postMessage](message)" and "foo?.postMessage(message)"
70- if member_expr. is_computed ( ) || member_expr. optional ( ) {
71- return ;
64+ if matches ! ( member_expr. static_property_name( ) , Some ( name) if name == "postMessage" ) {
65+ let span = call_expr. arguments [ 0 ] . span ( ) ;
66+ ctx. diagnostic_with_suggestion (
67+ require_post_message_target_origin_diagnostic ( Span :: new ( span. end , span. end ) ) ,
68+ |fixer| {
69+ let text = match member_expr. object ( ) {
70+ Expression :: Identifier ( ident) => {
71+ format ! ( ", {}.location.origin" , ident. name. as_str( ) )
72+ }
73+ _ => ", self.location.origin" . to_string ( ) ,
74+ } ;
75+ fixer. insert_text_after_range ( span, text)
76+ } ,
77+ ) ;
7278 }
73-
74- let comma_idx =
75- Span :: new ( arg. span ( ) . end , call_expr. span . end ) . source_text ( ctx. source_text ( ) ) . find ( ',' ) ;
76- let offset = comma_idx. unwrap_or ( 0 ) as u32 ;
77- let target_span = Span :: new ( arg. span ( ) . end + offset, call_expr. span . end ) ;
78- ctx. diagnostic_with_suggestion (
79- require_post_message_target_origin_diagnostic ( target_span) ,
80- |fixer| {
81- let last_token = Span :: new ( call_expr. span . end - 1 , call_expr. span . end ) ;
82- let text = match member_expr. object ( ) {
83- Expression :: Identifier ( ident) => {
84- format ! ( "{}.location.origin" , ident. name. as_str( ) )
85- }
86- _ => "self.location.origin" . to_string ( ) ,
87- } ;
88-
89- let replacement =
90- if comma_idx. is_some ( ) { format ! ( " {text}," ) } else { format ! ( ", {text}" ) } ;
91- fixer. insert_text_before ( & last_token, replacement)
92- } ,
93- ) ;
9479 }
9580}
9681
@@ -149,15 +134,15 @@ fn test() {
149134 "globalThis.postMessage(message, globalThis.location.origin)" ,
150135 None ,
151136 ) ,
152- ( "foo.postMessage(message )" , "foo.postMessage(message , foo.location.origin)" , None ) ,
137+ ( "foo.postMessage(message )" , "foo.postMessage(message, foo.location.origin )" , None ) ,
153138 (
154139 "window.postMessage(message,)" ,
155140 "window.postMessage(message, window.location.origin,)" ,
156141 None ,
157142 ) ,
158143 (
159144 "window.postMessage(message, /** comments */ )" ,
160- "window.postMessage(message, /** comments */ window.location.origin, )" ,
145+ "window.postMessage(message, window.location.origin, /** comments */ )" ,
161146 None ,
162147 ) ,
163148 (
0 commit comments