console icon indicating copy to clipboard operation
console copied to clipboard

Add note about escaping `%`

Open tomayac opened this issue 2 years ago • 12 comments

It looks like a bit of an interop issue:

Chrome:

Screenshot 2022-12-06 at 12 01 42

Safari:

Screenshot 2022-12-06 at 12 01 15

Firefox:

Screenshot 2022-12-06 at 12 01 26

Preview | Diff

tomayac avatar Dec 06 '22 01:12 tomayac

~This makes sense to me, but curious if there's comments from Firefox or Safari.~

terinjokes avatar Dec 06 '22 01:12 terinjokes

I have been using the web console to "print an object" and copy-paste it from a web console into a file since 2010 (for debugging, comparing two versions of data), and it is suddenly broken.

console.log(JSON.stringify( {a:"%%Hi",b:"%Hey"} ));
=>  {"a":"%Hi","b":"%Hey"}

photopea avatar Dec 06 '22 08:12 photopea

If I'm reading the spec:

If args’s size is 1, return args.

So the screenshot in https://github.com/whatwg/console/pull/218#issue-1477863265 for Chrome seems to be wrong for me. Did Chrome behavior changed recently ?

That being said, if you test with multiple parameters, as expected when using specifiers console.log("%%s", "hello"), Chrome, Firefox and Safari do print %s hello.

So, the change here makes sense to me, but I guess a bug should be filed on Chrome for console.log("%%")

nchevobbe avatar Dec 06 '22 13:12 nchevobbe

@nchevobbe It shouldn't even get there, it fails the earlier check in Logger. With no rest parameters, it should call straight into Printer, without calling into Formatter. That makes the screenshot incorrect, and following that would also fix @photopea's example.

That said, once properly in Formatter, I think escaping % still makes sense.

terinjokes avatar Dec 06 '22 14:12 terinjokes

I found a similar issue:

console.error( 'message: %s', '%hello%%world%');

Chrome:

message: %hello%world%

Firefox:

message: %hello%%world%

HolgerJeromin avatar Dec 14 '22 14:12 HolgerJeromin

Was reminded of this Issue and wondering what to make of it. Do we agree it's somewhat of an interop issue?

tomayac avatar Mar 22 '23 13:03 tomayac

I think so, yes. I guess this PR just needs the appropriate changes to Formatter() (beyond the informative table entry)? Also @terinjokes's comment is interesting about Formatter() not even being invoked for the case in the OP at all, which seems important.

domfarolino avatar Mar 22 '23 13:03 domfarolino

I think so, yes.

Great.

I guess this PR just needs the appropriate changes to Formatter() (beyond the informative table entry)? Also @terinjokes's comment is interesting about Formatter() not even being invoked for the case in the OP at all, which seems important.

This is out of my comfort zone. Edits by maintainers are allowed, so please feel free to pile onto this PR with more changes.

tomayac avatar Mar 22 '23 14:03 tomayac

I'd appreciate a first stab at it if possible, as I probably won't have time myself to drive the changes for a little while. But the algorithms you'd need to touch aren't too complicated I promise!

domfarolino avatar Mar 24 '23 15:03 domfarolino

console.log() with a single parameter should print exactly the string which it received.

When I have an object in JS, I want to save it into a JSON file. I do

 console.log(JSON.stringify(obj)); 

And when I copy-paste it from a console to a text file, I get a different object.

photopea avatar Mar 28 '23 15:03 photopea

So looking back at the original post https://github.com/whatwg/console/pull/218#issue-1477863265, which of the two behaviors is considered correct?

tomayac avatar Mar 28 '23 15:03 tomayac

As noted in https://github.com/whatwg/console/pull/218#issuecomment-1339479193, the current specification is to not intepret % if there are no rest parameters. IIRC, this case was put into Logger to support logging arbitrary strings in a backwards compatible manner.

terinjokes avatar Mar 28 '23 16:03 terinjokes