Block & Line Cheat Sheet
Articolo originale: http://www.mozilla.org/newlayout/doc/block-and-line.html
Autore: Chris Waterson
Traduzione: Gabriele Romanato (19 febbraio 2008)
Sguardo d'insieme
I dettagli del layout di blocco e inline sono difficili. Questo documento serve da "cheat sheet" per descrivere come le stravaganze dei diversi flag di stato controllino quello che accade. È un lavoro in svolgimento, con le domande in rosso. Se conoscete le risposte siete pregati di informari in modo che io possa aggiornare il documento.
Oggetti
Questa sezione presenta alcune delle classi coinvolte nel reflow di blocco e inline, insieme con i membri importanti di ciascun oggetto che controllano il processo di reflow.
- nsFrame
La classe di base per tutti i frame.
- mFlags
-
Flag impostati sul frame per indicare il suo stato. Questi flag possono essere divisi in due categorie: flag che influenzano tutti i frame (flag "pubblici") e flag riservati ad un uso privato del singolo frame (flag "privati").
- NS_FRAME_IN_REFLOW
-
Questo bit viene impostato quando il frame è in fase di reflow. Di default è impostato in
WillReflow(), e non impostato inDidReflow(). Molti metodiReflow()verificano che il bit sia impostato con un'asserzione. - NS_FRAME_FIRST_REFLOW
Questo flag viene impostato su un frame creato ex novo ed in seguito pulito dal metodo
Reflow()quando il frame ha avuto il suo reflow iniziale.- NS_FRAME_SYNC_FRAME_AND_VIEW
- NS_FRAME_OUTSIDE_CHILDREN
Questo flag viene impostato se l'area combinata del figlio di un frame si estende oltre il box che delimita il frame. (Qual'è il "box che delimita il frame"?) Se questo flag viene impostato, allora
mOverflowAreaconterrà l'area totale del frame, incluso l'overflow.- NS_FRAME_EXTERNAL_REFERENCE
- NS_FRAME_REPLACED_ELEMENT
- NS_FRAME_GENERATED_CONTENT
- NS_FRAME_HAS_LOADED_IMAGES
- NS_FRAME_OUT_OF_FLOW
- NS_FRAME_SELECTED_CONTENT
- NS_FRAME_IS_DIRTY
- NS_FRAME_IS_UNFLOWABLE
-
Un frame che non scorre è una condizione di errore, per esempio dovuta a delle limitazioni nel sistema. Attualmente l'unico modo di ottenere questo tipo di frame è avere un albero dei frame "troppo profondo" (vedi
nsFrame::IsFrameTreeTooDeep()). - NS_FRAME_HAS_DIRTY_CHILDREN
- NS_FRAME_HAS_VIEW
- NS_FRAME_INDEPENDENT_SELECTION
- NS_FRAME_IS_SPECIAL
- nsBlockFrame
- mFlags
Questi flag sono i flag privati che hanno un senso per i frame di blocco.
- NS_BLOCK_SHRINK_WRAP
-
Fa in modo che il blocco si stringa attorno al suo contenuto. Questo significa che il blocco determina la larghezza dei suoi figli e rende l'area di contenuto di quella larghezza. Infine aggiunge padding e bordo per determinare la larghezza finale.
È qui che interviene la "larghezza che tende a zero"?
- NS_BLOCK_NO_AUTO_MARGINS
- NS_BLOCK_MARGIN_ROOT
-
Indica che questo è un frame da cui possono essere calcolati i margini figlio. L'assenza di questo flag implica che il calcolo dei margini figlio dovrebbero ignorare il frame e risalire la catena dei genitori. Usato in
nsBlockReflowContext::ComputeCollapsedTopMargin().Questo flag fa in modo che il costruttore di nsBlockReflowState imposti i flag
BRS_ISTOPMARGINROOTeBRS_ISBOTTOMMARGINROOT.Viene impostato di default per il documento, le celle di tabella interne e i frame contenitori posizionati in modo assoluto.
- NS_BLOCK_SPACE_MGR
-
Questo indica che un frame di blocco dovrebbe creare un proprio Space Manager. È richiesto per ogni frame di blocco che contiene flottanti: lo Space Manager viene usato per creare spazio per i frame flottati.
Viene impostato di default per i frame del documento, i frame area, i frame interni delle celle di tabella, i frame contenitori posizionati in modo assoluto e i frame flottati quando viene creato il frame.
- nsLineBox
-
Un blocco consta di righe e altri blocchi, impilati in verticale. Un frame di blocco ha un solo
nsLineBoxper ciascuna riga, e un solonsLineBoxper ciascun blocco figlio. Questi sono memorizzati come un elenco doubly-linked nel membromLinesdinsBlockFrame. - nsInlineFrame
- mFlags
- NS_INLINE_FRAME_CONTAINS_PERCENT_AWARE_CHILD
-
Questo flag viene impostato se il frame inline ha dei figli con un valore in percentuale impostato (attraverso lo Style Context) per la larghezza o l'altezza dell'area di contenuto, padding, bordo o margine.
- nsHTMLReflowState
Lo stato attuale del reflow, costruito quando il reflow scende ricorsivamente l'albero dei frame. Viene "passato" ad un frame figlio dal suo genitore, e fornisce le restrizioni con cui il frame figlio deve dimensionarsi (per esempio la larghezza e l'altezza disponibile per un frame figlio).
- mComputedWidth
- mComputedHeight
- mComputedMargin
- mComputedBorderPadding
- mComputedPadding
- mComputedOffsets
- mComputedMinWidth
- mComputedMaxWidth
- mComputedMinHeight
- mComputedMaxHeight
-
Given the current container frame and the style applied to the child, these values are the resolved values for the child frame's box.
- nsHTMLReflowMetrics
-
La struttura che viene "riempita" da un frame durante il reflow, e viene usata per comunicare le informazioni sulle dimensioni desiderate del frame al suo contenitore.
- mMaximumWidth
-
La larghezza massima che il frame occuperebbe se venisse eseguito il reflow con una larghezza disponibile non limitata. Lo si potrebbe meglio chiamare "larghezza preferita".
Viene calcolato quando è impostato il flag di
nsBlockReflowStateBRS_COMPUTEMAXWIDTH. - maxElementWidth
-
La larghezza massima per gli elementi all'interno del frame che non può essere ulteriormente divisa (per esempio la parola più lunga in un paragrafo). Si noti che un frame fuori dal flusso (per esempio un float) può influenzare questo valore.
Questo campo è un puntatore a un oggetto
nsSize. Se è null, il frame non ha bisogno di calcolarlo. - nsBlockReflowState
-
Informazioni aggiuntive sullo stato di reflow che il frame di blocco usa insieme con
nsHTMLReflowState. ComensHTMLReflowState, questo è un dato a sola lettura che viene passato da un genitore ai suoi figli. - mFlags
- BRS_UNCONSTRAINEDWIDTH
-
Questo flag è impostato nel costruttore
nsBlockReflowStatequando:-
Non c'è una larghezza calcolata per il frame in
nsHTMLReflowState, e -
al frame che ha il reflow è stato dato
NS_UNCONSTRAINEDSIZEcome sua larghezza disponibile innsHTMLReflowState.
-
Non c'è una larghezza calcolata per il frame in
- BRS_UNCONSTRAINEDHEIGHT
-
Questo flag viene impostato nel costruttore
nsBlockReflowStatequando al frame che ha avuto il reflow è stato datoNS_UNCONSTRAINEDSIZEcome sua altezza disponibile innsHTMLReflowState.Se impostato,
NS_UNCONSTRAINEDSIZEviene passato ansLineLayoutcome altezza disponibile. - BRS_SHRINKWRAPWIDTH
- BRS_NEEDRESIZEREFLOW
-
Correlato a
BRS_SHRINKWRAPWIDTH. Impostato se abbiamo bisogno di un reflow di ridimensionamento quando calcoliamo la dimensione finale. per esempio perché... perché? - BRS_ISINLINEINCRREFLOW
-
Questo flag è impostato in
nsBlockFrame::Reflow()se ci accorgiamo che stiamo facendo il reflow incrementale di un box di riga che contiene frame inline. In questo caso possiamo evitare un pò di lavoro durante il reflow. - BRS_NOWRAP
-
Questo flag è impostato nel costruttore
nsBlockReflowStatequando lo stilewhite-spacedel frame di blocco èpreonowrap. Altrimenti viene pulito. - BRS_ISTOPMARGINROOT
-
Questo flag è impostato nel costruttore
nsBlockReflowStatequando si fa il reflow di un frame "block margin root" (ossia un frame con il flagNS_BLOCK_MARGIN_ROOTimpostato, per cui i margini si applicano di default).Il flag viene anche impostato quando si fa il reflow di un frame il cui bordo o padding superiore ha un valore calcolato di zero. (perché?)
- BRS_ISBOTTOMMARGINROOT
-
Questo flag è impostato nel costruttore
nsBlockReflowStatequando si fa il reflow di un frame "block margin root" (ossia un frame con il flagNS_BLOCK_MARGIN_ROOTimpostato, per cui i margini si applicano di default).Il flag viene anche impostato quando si fa il reflow di un frame il cui bordo o padding inferiore ha un valore calcolato di zero. (perché?)
- BRS_APPLYTOPMARGIN
-
Questo flag è impostato se il margine superiore deve essere preso in considerazione quando si posiziona un box di riga che contiene un frame di blocco. Può essere impostato come effetto collaterale della chiamata a
nsBlockFrame::ShouldApplyTopMargin(). Una volta impostato,ShouldApplyTopMargin()lo usa come un facile modo di stabilire se il margine superiore deve essere applicato.Se il flag non è stato impostato nello stato di reflow del blocco, allora
ShouldApplyTopMargin()passa in rassegna l'elenco della riga per vedere se un frame di blocco precede il frame specificato. Se lo precede, il margine superiore deve essere applicato, e il flag viene impostato per memorizzare il risultato. Se non lo precede, il margine superiore viene applicato come risultato della logica generazionale del collassamento dei margini innsBlockReflowContext::ComputeCollapsedTopMargin(). In questo caso, il flag non viene impostato, e le successive chiamate aShouldApplyTopMargin()continueranno a scorrere l'elenco della riga.Viene anche impostato nel costruttore
nsBlockReflowStatese è impostatoBRS_ISTOPMARGINROOT. In altre parole, se il frame che ha il reflow è un margine radice di default. - BRS_COMPUTEMAXELEMENTSIZE
-
Questo flag viene impostato se il reflow deve ricalcolare la dimensione massima di un elemento.
Viene impostato nel costruttore
nsBlockReflowStatese il membro "maxElementSize" dell'oggettonsHTMLReflowMetricsè stato fornito dal (frame genitore?). - BRS_COMPUTEMAXWIDTH
-
Questo flag viene impostato se il reflow deve ricalcolare la larghezza massima di un frame (per esempio durante la prima fase del reflow di una tabella). Quando viene impostato,
nsBlockFrame::ReflowLinefa fluire la prima riga e ogni riga senza contenitore due volte nel blocco. - nsBlockReflowContext
-
Incapsula lo stato di reflow transitorio per un
nsLineBoxche contiene un frame di blocco. - mNextRCFrame
-
Durante un reflow incrementale, questo membro conserva il frame corrente nella catena del reflow.
- nsLineLayout
-
Incapsula lo stato di reflow transitorio per un
nsLineBoxche contiene frame inline. Viene creato un nuovo oggettonsLineLayoutper ogni box di riga inline lungo il flusso. - mFlags
- LL_ENDSINWHITESPACE
-
Impostato a
truedi default quando si inizia il layout di riga. - LL_UNDERSTANDSNWHITESPACE
- LL_TEXTSTARTSWITHNBSP
- LL_FIRSTLETTERSTYLEOK
- LL_ISTOPOFPAGE
- LL_UPDATEDBAND
- LL_IMPACTEDBYFLOATERS
- LL_LASTFLOATERWASLETTERFRAME
- LL_CANPLACEFLOATER
- LL_KNOWSTRICTMODE
- LL_INSTRICTMODE
- LL_LINEENDSINBR
- PerFrameData
-
(Perché non è semplicemente memorizzato nel frame?)
- mFlags
- PFD_RELATIVEPOS
- PFD_ISTEXTFRAME
- PFD_ISNONEMPTYTEXTFRAME
- PFD_ISNONWHITESPACETEXTFRAME
- PFD_ISLETTERFRAME
- PFD_ISSTICKY
- PFD_ISBULLET
- PerSpanData
-
In
nsLineLayout, uno "span" è un frame contenitore inline e un "frame" è uno dei suoi figli. ForsePerParentDataePerChildDatasarebbero nomi migliori?nsLineLayout::BeginLineReflowcrea l'inizialePerSpanDatache viene detto "root span".nsInlineFrame::ReflowFramescrea un nuovoPerSpanDataquando chiamansLineLayout::BeginSpan. Questa volta, ilnsLineLayoutdell'oggettomCurrentSpanviene passato al nuovo span. Il nuovo span registra il vecchiomCurrentSpancome suo genitore. Dopo aver fatto il reflow dei frame inline figli,nsInlineFrame::ReflowFrameschiamansLineLayout::EndSpan, che fa il pop diPerSpanDatae reimpostamCurrentSpan. - mFirstFrame
-
La prima struttura
PerFrameDatanello span. - mLastFrame
-
L'ultima struttura
PerFrameDatanello span. Le strutturePerFrameDatavengono aggiunte allo span come se avessero il reflow.mLastFramepuò anche essere manipolato direttamente se una riga viene divisa, o se i frame vengono spinti da una riga alla successiva. - mFrame
-
Il
PerFrameDatadel frame inline che "possiede" lo span, oppurenull, se questo è lo span radice.mFrameviene inizializzato sulPerFrameDatadel frame inline contenitore quando un nuovoPerSpanDataviene spinto innsLineLayout::BeginSpan.