Improve set-cookie scriptlet · gorhill/uBlock@e613282 (original) (raw)

`@@ -198,4 +198,108 @@ trustedSetAttr.details = {

`

198

198

`world: 'ISOLATED',

`

199

199

`};

`

200

200

``

``

201

`+

/**

`

``

202

`+

`

``

203

`+

*

`

``

204

`+

`

``

205

`+

`

``

206

`+

*

`

``

207

`+

`

``

208

`+

`

``

209

`+

`

``

210

`+

*

`

``

211

`+

`

``

212

`+

`

``

213

`` +

``

``

214

`+

`

``

215

`+

*

`

``

216

`+

`

``

217

`+

`

``

218

`` +

``

``

219

`+

`

``

220

`` +

``

``

221

`+

`

``

222

+

``

223

`+

export function removeAttr(

`

``

224

`+

rawToken = '',

`

``

225

`+

rawSelector = '',

`

``

226

`+

behavior = ''

`

``

227

`+

) {

`

``

228

`+

if ( typeof rawToken !== 'string' ) { return; }

`

``

229

`+

if ( rawToken === '' ) { return; }

`

``

230

`+

const safe = safeSelf();

`

``

231

`+

const logPrefix = safe.makeLogPrefix('remove-attr', rawToken, rawSelector, behavior);

`

``

232

`+

const tokens = rawToken.split(/\s|\s/);

`

``

233

`+

const selector = tokens

`

``

234

`` +

.map(a => ${rawSelector}[${CSS.escape(a)}])

``

``

235

`+

.join(',');

`

``

236

`+

if ( safe.logLevel > 1 ) {

`

``

237

`` +

safe.uboLog(logPrefix, Target selector:\n\t${selector});

``

``

238

`+

}

`

``

239

`+

const asap = /\basap\b/.test(behavior);

`

``

240

`+

let timerId;

`

``

241

`+

const rmattrAsync = ( ) => {

`

``

242

`+

if ( timerId !== undefined ) { return; }

`

``

243

`+

timerId = safe.onIdle(( ) => {

`

``

244

`+

timerId = undefined;

`

``

245

`+

rmattr();

`

``

246

`+

}, { timeout: 17 });

`

``

247

`+

};

`

``

248

`+

const rmattr = ( ) => {

`

``

249

`+

if ( timerId !== undefined ) {

`

``

250

`+

safe.offIdle(timerId);

`

``

251

`+

timerId = undefined;

`

``

252

`+

}

`

``

253

`+

try {

`

``

254

`+

const nodes = document.querySelectorAll(selector);

`

``

255

`+

for ( const node of nodes ) {

`

``

256

`+

for ( const attr of tokens ) {

`

``

257

`+

if ( node.hasAttribute(attr) === false ) { continue; }

`

``

258

`+

node.removeAttribute(attr);

`

``

259

`` +

safe.uboLog(logPrefix, Removed attribute '${attr}');

``

``

260

`+

}

`

``

261

`+

}

`

``

262

`+

} catch(ex) {

`

``

263

`+

}

`

``

264

`+

};

`

``

265

`+

const mutationHandler = mutations => {

`

``

266

`+

if ( timerId !== undefined ) { return; }

`

``

267

`+

let skip = true;

`

``

268

`+

for ( let i = 0; i < mutations.length && skip; i++ ) {

`

``

269

`+

const { type, addedNodes, removedNodes } = mutations[i];

`

``

270

`+

if ( type === 'attributes' ) { skip = false; }

`

``

271

`+

for ( let j = 0; j < addedNodes.length && skip; j++ ) {

`

``

272

`+

if ( addedNodes[j].nodeType === 1 ) { skip = false; break; }

`

``

273

`+

}

`

``

274

`+

for ( let j = 0; j < removedNodes.length && skip; j++ ) {

`

``

275

`+

if ( removedNodes[j].nodeType === 1 ) { skip = false; break; }

`

``

276

`+

}

`

``

277

`+

}

`

``

278

`+

if ( skip ) { return; }

`

``

279

`+

asap ? rmattr() : rmattrAsync();

`

``

280

`+

};

`

``

281

`+

const start = ( ) => {

`

``

282

`+

rmattr();

`

``

283

`+

if ( /\bstay\b/.test(behavior) === false ) { return; }

`

``

284

`+

const observer = new MutationObserver(mutationHandler);

`

``

285

`+

observer.observe(document, {

`

``

286

`+

attributes: true,

`

``

287

`+

attributeFilter: tokens,

`

``

288

`+

childList: true,

`

``

289

`+

subtree: true,

`

``

290

`+

});

`

``

291

`+

};

`

``

292

`+

runAt(( ) => { start(); }, behavior.split(/\s+/));

`

``

293

`+

}

`

``

294

`+

removeAttr.details = {

`

``

295

`+

name: 'remove-attr.js',

`

``

296

`+

aliases: [

`

``

297

`+

'ra.js',

`

``

298

`+

],

`

``

299

`+

dependencies: [

`

``

300

`+

runAt,

`

``

301

`+

safeSelf,

`

``

302

`+

],

`

``

303

`+

};

`

``

304

+

201

305

`/******************************************************************************/

`