5 Commits

Author SHA1 Message Date
0ec862eaac ssb: Fight blog post CSS a bit more.
All checks were successful
Build Tilde Friends / Build-All (push) Successful in 12m32s
2025-11-29 10:28:10 -05:00
7e1621dfb4 ssb: Slight improvements to blog header display. 2025-11-29 10:17:13 -05:00
c4d4e3822d update: CodeMirror. 2025-11-29 10:01:20 -05:00
d2e5015eac test: Wait for alerts harder. 2025-11-29 10:01:12 -05:00
510c2f81bd update: sqlite 3.51.1. 2025-11-28 18:42:48 -05:00
9 changed files with 97 additions and 84 deletions

View File

@@ -23,7 +23,7 @@ VERSION_NAME := This program kills fascists.
IPHONEOS_VERSION_MIN=14.5 IPHONEOS_VERSION_MIN=14.5
SQLITE_URL := https://www.sqlite.org/2025/sqlite-amalgamation-3510000.zip SQLITE_URL := https://www.sqlite.org/2025/sqlite-amalgamation-3510100.zip
BUNDLETOOL_URL := https://github.com/google/bundletool/releases/download/1.18.2/bundletool-all-1.18.2.jar BUNDLETOOL_URL := https://github.com/google/bundletool/releases/download/1.18.2/bundletool-all-1.18.2.jar
APPIMAGETOOL_URL := https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage APPIMAGETOOL_URL := https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
APPIMAGETOOL_MD5 := e989fadfc4d685fd3d6aeeb9b525d74d out/appimagetool APPIMAGETOOL_MD5 := e989fadfc4d685fd3d6aeeb9b525d74d out/appimagetool

View File

@@ -1,5 +1,5 @@
{ {
"type": "tildefriends-app", "type": "tildefriends-app",
"emoji": "🦀", "emoji": "🦀",
"previous": "&t4hk+Y6NB+TftzDLhJ9gUKLPU5YcFYvTEbJuTT2qPCQ=.sha256" "previous": "&g0o5rMFQcyi3GwyWGrSQcQPPABae0yrUpVehztef3XE=.sha256"
} }

View File

@@ -196,26 +196,6 @@ class TfMessageElement extends LitElement {
); );
} }
flag(event) {
let reason = prompt(
'What is the reason for reporting this content (spam, nsfw, ...)?',
'offensive'
);
if (reason !== undefined) {
tfrpc.rpc
.appendMessage(this.whoami, {
type: 'flag',
flag: {
link: this.message.id,
reason: reason.length ? reason : undefined,
},
})
.catch(function (error) {
alert(error?.message);
});
}
}
show_image(link) { show_image(link) {
let div = document.createElement('div'); let div = document.createElement('div');
div.style.left = 0; div.style.left = 0;
@@ -519,14 +499,11 @@ class TfMessageElement extends LitElement {
</button> </button>
` `
: undefined} : undefined}
<button class="w3-button w3-bar-item" @click=${this.react}>
👍 React
</button>
<button <button
class="w3-button w3-bar-item w3-border-bottom" class="w3-button w3-bar-item w3-border-bottom"
@click=${this.flag} @click=${this.react}
> >
⚠️ Flag 👍 React
</button> </button>
${formats.map( ${formats.map(
([format, name]) => html` ([format, name]) => html`
@@ -988,11 +965,7 @@ class TfMessageElement extends LitElement {
style="cursor: pointer" style="cursor: pointer"
@click=${(x) => this.toggle_expanded(':cw')} @click=${(x) => this.toggle_expanded(':cw')}
> >
<p> <p>${content.contentWarning}</p>
${this.message.flags
? `Caution: This message has been flagged ${this.message.flags.length} time${this.message.flags.length == 1 ? '' : 's'}.`
: content.contentWarning}
</p>
<p class="w3-small"> <p class="w3-small">
${this.is_expanded(':cw') ? 'Show less' : 'Show more'} ${this.is_expanded(':cw') ? 'Show less' : 'Show more'}
</p> </p>
@@ -1003,12 +976,11 @@ class TfMessageElement extends LitElement {
<div @click=${this.body_click}>${body}</div> <div @click=${this.body_click}>${body}</div>
${this.render_mentions()} ${this.render_mentions()}
`; `;
let payload = let payload = content.contentWarning
this.message.flags || content.contentWarning ? self.expanded[(this.message.id || '') + ':cw']
? self.expanded[(this.message.id || '') + ':cw'] ? html` ${content_warning} ${content_html} `
? html` ${content_warning} ${content_html} ` : content_warning
: content_warning : content_html;
: content_html;
return this.render_frame(html` return this.render_frame(html`
${this.render_header()} ${this.render_header()}
<div class="w3-container">${payload}</div> <div class="w3-container">${payload}</div>
@@ -1027,15 +999,13 @@ class TfMessageElement extends LitElement {
`); `);
} else if (content.type === 'blog') { } else if (content.type === 'blog') {
let self = this; let self = this;
tfrpc.rpc.get_blob(content.blog).then(function (data) { self.blog_data = tfrpc.rpc.get_blob(content.blog).then(function (data) {
self.blog_data = data; return data
? unsafeHTML(tfutils.markdown(data))
: html`Blog post content unavailable.`;
}); });
let payload = this.expanded[(this.message.id || '') + ':blog'] let payload = this.expanded[(this.message.id || '') + ':blog']
? html`<div> ? until(this.blog_data, 'Loading...')
${this.blog_data
? unsafeHTML(tfutils.markdown(this.blog_data))
: 'Loading...'}
</div>`
: undefined; : undefined;
let body; let body;
switch (this.format) { switch (this.format) {
@@ -1048,15 +1018,24 @@ class TfMessageElement extends LitElement {
case 'message': case 'message':
body = html` body = html`
<div <div
style="border: 1px solid #fff; border-radius: 1em; padding: 8px; margin: 4px; cursor: pointer" class="w3-border w3-theme-l4 w3-round-xlarge"
@click=${(x) => self.toggle_expanded(':blog')}> style="padding: 8px; margin: 4px; cursor: pointer"
@click=${(x) => self.toggle_expanded(':blog')}
>
<h2>${content.title}</h2> <h2>${content.title}</h2>
<div style="display: flex; flex-direction: row"> <div style="display: flex; flex-direction: row; gap: 8px">
<img src=/${content.thumbnail}/view></img> ${content.thumbnail
? html`<img src=/${content.thumbnail}/view style="max-width: 25vw; max-height: 25vw"></img>`
: undefined}
<span>${content.summary}</span> <span>${content.summary}</span>
</div> </div>
<p class="w3-small">
${this.expanded[(this.message.id || '') + ':blog']
? 'Show less'
: 'Show more'}
</p>
</div> </div>
${payload} <div class="w3-container">${payload}</div>
`; `;
break; break;
} }

File diff suppressed because one or more lines are too long

View File

@@ -217,9 +217,9 @@
} }
}, },
"node_modules/@lezer/common": { "node_modules/@lezer/common": {
"version": "1.3.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.3.0.tgz", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.4.0.tgz",
"integrity": "sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==", "integrity": "sha512-DVeMRoGrgn/k45oQNu189BoW4SZwgZFzJ1+1TV5j2NJ/KFC83oa/enRqZSGshyeMk5cPWMhsKs9nx+8o0unwGg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@lezer/css": { "node_modules/@lezer/css": {
@@ -276,9 +276,9 @@
} }
}, },
"node_modules/@lezer/lr": { "node_modules/@lezer/lr": {
"version": "1.4.3", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.3.tgz", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.4.tgz",
"integrity": "sha512-yenN5SqAxAPv/qMnpWW0AT7l+SxVrgG+u0tNsRQWqbrz66HIl8DnEbBObvy21J5K7+I1v7gsAnlE2VQ5yYVSeA==", "integrity": "sha512-LHL17Mq0OcFXm1pGQssuGTQFPPdxARjKM8f7GA5+sGtHi0K3R84YaSbmche0+RKWHnCsx9asEe5OWOI4FHfe4A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@lezer/common": "^1.0.0" "@lezer/common": "^1.0.0"

2
deps/sqlite/shell.c vendored
View File

@@ -14944,6 +14944,7 @@ static char *intckMprintf(sqlite3_intck *p, const char *zFmt, ...){
sqlite3_free(zRet); sqlite3_free(zRet);
zRet = 0; zRet = 0;
} }
va_end(ap);
return zRet; return zRet;
} }
@@ -29053,6 +29054,7 @@ static int do_meta_command(char *zLine, ShellState *p){
} }
p->showHeader = savedShowHeader; p->showHeader = savedShowHeader;
p->shellFlgs = savedShellFlags; p->shellFlgs = savedShellFlags;
rc = p->nErr>0;
}else }else
if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){ if( c=='e' && cli_strncmp(azArg[0], "echo", n)==0 ){

58
deps/sqlite/sqlite3.c vendored
View File

@@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite ** This file is an amalgamation of many separate C source files from SQLite
** version 3.51.0. By combining all the individual C code files into this ** version 3.51.1. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation ** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be ** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements ** possible if the files were compiled separately. Performance improvements
@@ -18,7 +18,7 @@
** separate file. This file contains only code for the core SQLite library. ** separate file. This file contains only code for the core SQLite library.
** **
** The content in this amalgamation comes from Fossil check-in ** The content in this amalgamation comes from Fossil check-in
** fb2c931ae597f8d00a37574ff67aeed3eced with changes in files: ** 281fc0e9afc38674b9b0991943b9e9d1e64c with changes in files:
** **
** **
*/ */
@@ -467,12 +467,12 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.51.0" #define SQLITE_VERSION "3.51.1"
#define SQLITE_VERSION_NUMBER 3051000 #define SQLITE_VERSION_NUMBER 3051001
#define SQLITE_SOURCE_ID "2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b" #define SQLITE_SOURCE_ID "2025-11-28 17:28:25 281fc0e9afc38674b9b0991943b9e9d1e64c6cbdb133d35f6f5c87ff6af38a88"
#define SQLITE_SCM_BRANCH "trunk" #define SQLITE_SCM_BRANCH "branch-3.51"
#define SQLITE_SCM_TAGS "release major-release version-3.51.0" #define SQLITE_SCM_TAGS "release version-3.51.1"
#define SQLITE_SCM_DATETIME "2025-11-04T19:38:17.314Z" #define SQLITE_SCM_DATETIME "2025-11-28T17:28:25.933Z"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@@ -10747,7 +10747,7 @@ SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);
** &nbsp; ){ ** &nbsp; ){
** &nbsp; // do something with pVal ** &nbsp; // do something with pVal
** &nbsp; } ** &nbsp; }
** &nbsp; if( rc!=SQLITE_OK ){ ** &nbsp; if( rc!=SQLITE_DONE ){
** &nbsp; // an error has occurred ** &nbsp; // an error has occurred
** &nbsp; } ** &nbsp; }
** </pre></blockquote>)^ ** </pre></blockquote>)^
@@ -38004,6 +38004,7 @@ SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){
return 0; return 0;
} }
/************** End of hash.c ************************************************/ /************** End of hash.c ************************************************/
/************** Begin file opcodes.c *****************************************/ /************** Begin file opcodes.c *****************************************/
/* Automatically generated. Do not edit */ /* Automatically generated. Do not edit */
@@ -130655,6 +130656,7 @@ SQLITE_PRIVATE void sqlite3SchemaClear(void *p){
for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){ for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem)); sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
} }
sqlite3HashClear(&temp2); sqlite3HashClear(&temp2);
sqlite3HashInit(&pSchema->tblHash); sqlite3HashInit(&pSchema->tblHash);
for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){ for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
@@ -160976,9 +160978,12 @@ SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){
addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName));
addModuleArgument(pParse, pTab, 0); addModuleArgument(pParse, pTab, 0);
addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName));
db->nSchemaLock++;
rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr);
db->nSchemaLock--;
if( rc ){ if( rc ){
sqlite3ErrorMsg(pParse, "%s", zErr); sqlite3ErrorMsg(pParse, "%s", zErr);
pParse->rc = rc;
sqlite3DbFree(db, zErr); sqlite3DbFree(db, zErr);
sqlite3VtabEponymousTableClear(db, pMod); sqlite3VtabEponymousTableClear(db, pMod);
} }
@@ -174040,8 +174045,22 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2); sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2);
} }
#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
if( pTabList->a[pLevel->iFrom].fg.fromExists ){ if( pTabList->a[pLevel->iFrom].fg.fromExists && i==pWInfo->nLevel-1 ){
sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); /* If the EXISTS-to-JOIN optimization was applied, then the EXISTS
** loop(s) will be the inner-most loops of the join. There might be
** multiple EXISTS loops, but they will all be nested, and the join
** order will not have been changed by the query planner. If the
** inner-most EXISTS loop sees a single successful row, it should
** break out of *all* EXISTS loops. But only the inner-most of the
** nested EXISTS loops should do this breakout. */
int nOuter = 0; /* Nr of outer EXISTS that this one is nested within */
while( nOuter<i ){
if( !pTabList->a[pLevel[-nOuter-1].iFrom].fg.fromExists ) break;
nOuter++;
}
testcase( nOuter>0 );
sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel[-nOuter].addrBrk);
VdbeComment((v, "EXISTS break"));
} }
/* The common case: Advance to the next row */ /* The common case: Advance to the next row */
if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont); if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont);
@@ -186225,6 +186244,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
/* Clear the TEMP schema separately and last */ /* Clear the TEMP schema separately and last */
if( db->aDb[1].pSchema ){ if( db->aDb[1].pSchema ){
sqlite3SchemaClear(db->aDb[1].pSchema); sqlite3SchemaClear(db->aDb[1].pSchema);
assert( db->aDb[1].pSchema->trigHash.count==0 );
} }
sqlite3VtabUnlockList(db); sqlite3VtabUnlockList(db);
@@ -187553,7 +187573,7 @@ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){
*/ */
SQLITE_API int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zMsg){ SQLITE_API int sqlite3_set_errmsg(sqlite3 *db, int errcode, const char *zMsg){
int rc = SQLITE_OK; int rc = SQLITE_OK;
if( !sqlite3SafetyCheckSickOrOk(db) ){ if( !sqlite3SafetyCheckOk(db) ){
return SQLITE_MISUSE_BKPT; return SQLITE_MISUSE_BKPT;
} }
sqlite3_mutex_enter(db->mutex); sqlite3_mutex_enter(db->mutex);
@@ -249220,6 +249240,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){
while( 1 ){ while( 1 ){
u64 iDelta = 0; u64 iDelta = 0;
if( i>=n ) break;
if( eDetail==FTS5_DETAIL_NONE ){ if( eDetail==FTS5_DETAIL_NONE ){
/* todo */ /* todo */
if( i<n && a[i]==0 ){ if( i<n && a[i]==0 ){
@@ -260283,7 +260304,7 @@ static void fts5SourceIdFunc(
){ ){
assert( nArg==0 ); assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused); UNUSED_PARAM2(nArg, apUnused);
sqlite3_result_text(pCtx, "fts5: 2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b", -1, SQLITE_TRANSIENT); sqlite3_result_text(pCtx, "fts5: 2025-11-28 17:28:25 281fc0e9afc38674b9b0991943b9e9d1e64c6cbdb133d35f6f5c87ff6af38a88", -1, SQLITE_TRANSIENT);
} }
/* /*
@@ -265104,7 +265125,12 @@ static int fts5VocabOpenMethod(
return rc; return rc;
} }
/*
** Restore cursor pCsr to the state it was in immediately after being
** created by the xOpen() method.
*/
static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){
int nCol = pCsr->pFts5->pConfig->nCol;
pCsr->rowid = 0; pCsr->rowid = 0;
sqlite3Fts5IterClose(pCsr->pIter); sqlite3Fts5IterClose(pCsr->pIter);
sqlite3Fts5StructureRelease(pCsr->pStruct); sqlite3Fts5StructureRelease(pCsr->pStruct);
@@ -265114,6 +265140,12 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){
pCsr->nLeTerm = -1; pCsr->nLeTerm = -1;
pCsr->zLeTerm = 0; pCsr->zLeTerm = 0;
pCsr->bEof = 0; pCsr->bEof = 0;
pCsr->iCol = 0;
pCsr->iInstPos = 0;
pCsr->iInstOff = 0;
pCsr->colUsed = 0;
memset(pCsr->aCnt, 0, sizeof(i64)*nCol);
memset(pCsr->aDoc, 0, sizeof(i64)*nCol);
} }
/* /*

14
deps/sqlite/sqlite3.h vendored
View File

@@ -146,12 +146,12 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.51.0" #define SQLITE_VERSION "3.51.1"
#define SQLITE_VERSION_NUMBER 3051000 #define SQLITE_VERSION_NUMBER 3051001
#define SQLITE_SOURCE_ID "2025-11-04 19:38:17 fb2c931ae597f8d00a37574ff67aeed3eced4e5547f9120744ae4bfa8e74527b" #define SQLITE_SOURCE_ID "2025-11-28 17:28:25 281fc0e9afc38674b9b0991943b9e9d1e64c6cbdb133d35f6f5c87ff6af38a88"
#define SQLITE_SCM_BRANCH "trunk" #define SQLITE_SCM_BRANCH "branch-3.51"
#define SQLITE_SCM_TAGS "release major-release version-3.51.0" #define SQLITE_SCM_TAGS "release version-3.51.1"
#define SQLITE_SCM_DATETIME "2025-11-04T19:38:17.314Z" #define SQLITE_SCM_DATETIME "2025-11-28T17:28:25.933Z"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@@ -10426,7 +10426,7 @@ SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);
** &nbsp; ){ ** &nbsp; ){
** &nbsp; // do something with pVal ** &nbsp; // do something with pVal
** &nbsp; } ** &nbsp; }
** &nbsp; if( rc!=SQLITE_OK ){ ** &nbsp; if( rc!=SQLITE_DONE ){
** &nbsp; // an error has occurred ** &nbsp; // an error has occurred
** &nbsp; } ** &nbsp; }
** </pre></blockquote>)^ ** </pre></blockquote>)^

View File

@@ -179,14 +179,14 @@ try:
select(driver, ['//button[text()="✅ Allow"]'], ('click',)) select(driver, ['//button[text()="✅ Allow"]'], ('click',))
words = select(driver, ['#document', 'frame', '//li//textarea']).get_attribute('value') words = select(driver, ['#document', 'frame', '//li//textarea']).get_attribute('value')
select(driver, ['#document', 'frame', '//li/button[text()="Delete Identity"]'], ('click',)) select(driver, ['#document', 'frame', '//li/button[text()="Delete Identity"]'], ('click',))
driver.switch_to.alert.send_keys('DELETE') wait.until(expected_conditions.alert_is_present()).send_keys('DELETE')
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
select(driver, ['//button[text()="✅ Allow"]'], ('click',)) select(driver, ['//button[text()="✅ Allow"]'], ('click',))
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
words = select(driver, ['#document', 'frame', '//textarea'], ('send_keys', words)) words = select(driver, ['#document', 'frame', '//textarea'], ('send_keys', words))
select(driver, ['#document', 'frame', '//button[text()="Import Identity"]'], ('click',)) select(driver, ['#document', 'frame', '//button[text()="Import Identity"]'], ('click',))
select(driver, ['//button[text()="✅ Allow"]'], ('click',)) select(driver, ['//button[text()="✅ Allow"]'], ('click',))
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))))
id1 = select(driver, ['#document', 'frame', 'li']).text.split(' ')[-1] id1 = select(driver, ['#document', 'frame', 'li']).text.split(' ')[-1]
assert id0 == id1 assert id0 == id1
@@ -197,16 +197,16 @@ try:
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',)) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',))
select(driver, ['//label[text()="Remember this decision."]'], ('click',)) select(driver, ['//label[text()="Remember this decision."]'], ('click',))
select(driver, ['//button[text()="❌ Deny"]'], ('click',)) select(driver, ['//button[text()="❌ Deny"]'], ('click',))
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',)) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',))
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',)) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',))
select(driver, ['tf-navigation', 'shadow_root', '=🎛️'], ('click',)) select(driver, ['tf-navigation', 'shadow_root', '=🎛️'], ('click',))
select(driver, ['tf-navigation', 'shadow_root', '#permission_reset:ssb_append'], ('click',)) select(driver, ['tf-navigation', 'shadow_root', '#permission_reset:ssb_append'], ('click',))
select(driver, ['tf-navigation', 'shadow_root', '#permissions_close'], ('click',)) select(driver, ['tf-navigation', 'shadow_root', '#permissions_close'], ('click',))
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',)) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',))
select(driver, ['//button[text()="❌ Deny"]'], ('click',)) select(driver, ['//button[text()="❌ Deny"]'], ('click',))
driver.switch_to.alert.accept() wait.until(expected_conditions.alert_is_present()).accept()
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',)) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#submit'], ('click',))
select(driver, ['//button[text()="✅ Allow"]'], ('click',)) select(driver, ['//button[text()="✅ Allow"]'], ('click',))
select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#edit'], ('send_keys', 'Hello, world 2!')) select(driver, ['#document', 'frame', 'tf-app', 'shadow_root', '#tf-tab-news', 'shadow_root', '#tf-compose', 'shadow_root', '#edit'], ('send_keys', 'Hello, world 2!'))