a) Connection from one port of your external IP address to another port on your external IP address will not work if you are behind NAT that is not set up properly to enable hairpin connections.
b) Local IP addresses to connect to may not be provided by the browser to the Javascript code if there's a setting or extension that disables it.
c) Local router can be set up to prohibit traffic between clients (usually wireless devices). If hairpins don't work, you can't exchange any data between such devices without the help of external relay server, as there is no local network at all.
Other than that, WebRTC promises that two browsers can transfer data directly if they are able send UDP packets to each other somehow.