Tolopilo combined for the shutout with Kevin Lankinen, who made one save over the first 2:11 of the second period after getting called in by a concussion spotter due to a collision late in the first period.
Teddy Blueger scored a short-handed goal for the Canucks (18-31-5), who ended a three-game skid with their second win in the past 16 games (2-12-2).
Lukas Dostal made 24 saves for the Ducks (28-23-3), who lost two straight to end a five-game road trip after winning their previous seven in a row.
O’Connor scored on a one-timer from the right hash mark that went in off the glove of Dostal sliding across his crease. Jake DeBrusk, playing his 600th NHL game, set up the winning goal by knocking down a clearing attempt by Ducks defenseman Jacob Trouba along the left boards and skating it to the face-off dot before passing across to O’Connor.
Cutter Gauthier appeared to score on a rebound for Anaheim at 17:59 of the first period, but the goal was immediately waved off and Ryan Poehling was penalized for goaltender interference after colliding with Tolopilo on the initial net drive with the puck. Tolopilo stayed in the game but was replaced by Lankinen to start the second period before coming back in.
Tolopilo’s best saves included stops on a Beckett Sennecke chance from the left side during a first-period power play, a Gauthier shot from the left dot off the rush at 5:30 of the third and a Chris Krieder wrist shot from the left circle with 5:45 left.
Blueger extended it to 2-0 at 19:32 of the third period with an empty-net goal during a 6-on-4 advantage for the Ducks, who had pulled Dostal for the extra skater prior to a slashing penalty against Conor Garland at 19:11.