At the close of play, Karunaratne, who was dropped on 14 by Jermaine Blackwood, is on 132 and De Silva on 56. Together they have so far put on 97 for the fourth wicket as Sri Lanka eye a massive first innings total on Monday.
After winning the toss and choosing to bat, Sri Lanka got off to a slow start but gradually built momentum throughout the day.
Karunaratne and Nissanka opened the batting and crept to 61-0 without loss at lunch. The 50 partnership came off 132 balls as the home side took a more cautious approach against the West Indies bowling led by Shannon Gabriel.
The partnership would endure until after the interval when Gabriel induced an edge from Nissanka, who was caught at slip by Rahkeem Cornwall for 56 and with the score at 139.
The West Indies would make further inroads fairly quickly afterwards when at 164-1, Roston Chase dismissed Oshado Fernando for three and then at 170-2 removed Angelo Matthews also for three.
However, that was the last success the West Indies bowlers would have for the remainder of play.
Gabriel has so far taken 1-56 from 12 overs while Chase has 2-42 from 17.
Mathews spent 10 hours at the crease to make an imperious unbeaten 200 with support from Dhananjaya de Silva and Niroshan Dickwella, who each made 63 in the tourists' 515-9 declared.
Sri Lanka will resume on the final day looking to make quick inroads with the ball after Zimbabwe reached stumps on 30 without loss, trailing by 127.
Mathews had waited since December 2018 to reach three figures in the longest format, but brought up his 10th Test century early on the penultimate day after Sri Lanka resumed on 295-4.
Dhananjaya had a sixth Test half-century when he went through for a single after being struck on the glove by a Donald Tiripano, but a fifth-wicket stand of 98 ended when he drove Victor Nyauchi (3-69) to Prince Masvaure at mid-on.
That was the only wicket to fall in the morning session and the Zimbabwe bowlers endured more frustration after lunch as Mathews, dropped by wicketkeeper Regis Chakabva on 108, and Dickwella increased the lead.
Dickwella was put down by Sean Ervine on 45 and struck only three boundaries in his 15th Test half-century before being trapped lbw by Sikandar Raza, halting a stand of 126.
Raza (3-62) saw the back of Suranga Lakmal and Lasith Embuldeniya in consecutive deliveries, but Mathews went on to become the first Sri Lankan man for five years to score a Test double-hundred.
Kasun Rajitha's dismissal prompted Dimuth Karunaratne to declare, but Sri Lanka were unable to end the day on a high note as Masvaure and Brian Mudzinganyama saw Zimbabwe through to the close unscathed.
At stumps, Sri Lanka are 328-8, a lead of 279 with two wickets still remaining. De Silva is 153 not out while Embuldeniya is on 25. Together they took Sri Lanka from 221-8 after the West Indies had threatened to restrict the home side to a lead below 200 runs, having trailed by 49 on first innings.
Resuming on 46-2, still three runs behind on first innings, Sri Lanka lost their third wicket at 73 when Veerasammy Permaul had Charith Asalanka caught at short leg for 19. Pathum Nissanka, 21, overnight, and de Silva stitched together a stand of 78 that was broken when the former got out lbw to Roston Chase for 66.
It was then 151-4.
At 157, Chase had Dinesh Chandimal out caught and bowled for two and the Sri Lankan lead was now only 108 with five wickets left.
However, de Silva forged a partnership of 51 with Ramesh Mendis, who made 25. Permaul then dismissed Suranga Lakmal for seven and the injured Angelo Matthews for 1 as Sri Lanka slipped to 221-8, a lead of 172.
It was the last success the West Indies would enjoy.
Permaul, who took 5-35 in the first innings, has so far taken 3-100 while Chase has figures of 2-82.
Scores in the match: Sri Lanka 204 and 328-8; West Indies 253.