CSSRule.js 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. export default class CSSRule{constructor(cssModel,payload){this._cssModel=cssModel;this.styleSheetId=payload.styleSheetId;if(this.styleSheetId){const styleSheetHeader=cssModel.styleSheetHeaderForId(this.styleSheetId);this.sourceURL=styleSheetHeader.sourceURL;}
  2. this.origin=payload.origin;this.style=new SDK.CSSStyleDeclaration(this._cssModel,this,payload.style,SDK.CSSStyleDeclaration.Type.Regular);}
  3. rebase(edit){if(this.styleSheetId!==edit.styleSheetId){return;}
  4. this.style.rebase(edit);}
  5. resourceURL(){if(!this.styleSheetId){return'';}
  6. const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);return styleSheetHeader.resourceURL();}
  7. isUserAgent(){return this.origin===Protocol.CSS.StyleSheetOrigin.UserAgent;}
  8. isInjected(){return this.origin===Protocol.CSS.StyleSheetOrigin.Injected;}
  9. isViaInspector(){return this.origin===Protocol.CSS.StyleSheetOrigin.Inspector;}
  10. isRegular(){return this.origin===Protocol.CSS.StyleSheetOrigin.Regular;}
  11. cssModel(){return this._cssModel;}}
  12. class CSSValue{constructor(payload){this.text=payload.text;if(payload.range){this.range=TextUtils.TextRange.fromObject(payload.range);}}
  13. rebase(edit){if(!this.range){return;}
  14. this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);}}
  15. export class CSSStyleRule extends CSSRule{constructor(cssModel,payload,wasUsed){super(cssModel,payload);this._reinitializeSelectors(payload.selectorList);this.media=payload.media?SDK.CSSMedia.parseMediaArrayPayload(cssModel,payload.media):[];this.wasUsed=wasUsed||false;}
  16. static createDummyRule(cssModel,selectorText){const dummyPayload={selectorList:{selectors:[{text:selectorText}],},style:{styleSheetId:'0',range:new TextUtils.TextRange(0,0,0,0),shorthandEntries:[],cssProperties:[]}};return new CSSStyleRule(cssModel,(dummyPayload));}
  17. _reinitializeSelectors(selectorList){this.selectors=[];for(let i=0;i<selectorList.selectors.length;++i){this.selectors.push(new CSSValue(selectorList.selectors[i]));}}
  18. setSelectorText(newSelector){const styleSheetId=this.styleSheetId;if(!styleSheetId){throw'No rule stylesheet id';}
  19. const range=this.selectorRange();if(!range){throw'Rule selector is not editable';}
  20. return this._cssModel.setSelectorText(styleSheetId,range,newSelector);}
  21. selectorText(){return this.selectors.select('text').join(', ');}
  22. selectorRange(){const firstRange=this.selectors[0].range;if(!firstRange){return null;}
  23. const lastRange=this.selectors.peekLast().range;return new TextUtils.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);}
  24. lineNumberInSource(selectorIndex){const selector=this.selectors[selectorIndex];if(!selector||!selector.range||!this.styleSheetId){return 0;}
  25. const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);return styleSheetHeader.lineNumberInSource(selector.range.startLine);}
  26. columnNumberInSource(selectorIndex){const selector=this.selectors[selectorIndex];if(!selector||!selector.range||!this.styleSheetId){return undefined;}
  27. const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);console.assert(styleSheetHeader);return styleSheetHeader.columnNumberInSource(selector.range.startLine,selector.range.startColumn);}
  28. rebase(edit){if(this.styleSheetId!==edit.styleSheetId){return;}
  29. if(this.selectorRange().equal(edit.oldRange)){this._reinitializeSelectors((edit.payload));}else{for(let i=0;i<this.selectors.length;++i){this.selectors[i].rebase(edit);}}
  30. for(const media of this.media){media.rebase(edit);}
  31. super.rebase(edit);}}
  32. export class CSSKeyframesRule{constructor(cssModel,payload){this._cssModel=cssModel;this._animationName=new CSSValue(payload.animationName);this._keyframes=payload.keyframes.map(keyframeRule=>new CSSKeyframeRule(cssModel,keyframeRule));}
  33. name(){return this._animationName;}
  34. keyframes(){return this._keyframes;}}
  35. export class CSSKeyframeRule extends CSSRule{constructor(cssModel,payload){super(cssModel,payload);this._reinitializeKey(payload.keyText);}
  36. key(){return this._keyText;}
  37. _reinitializeKey(payload){this._keyText=new CSSValue(payload);}
  38. rebase(edit){if(this.styleSheetId!==edit.styleSheetId||!this._keyText.range){return;}
  39. if(edit.oldRange.equal(this._keyText.range)){this._reinitializeKey((edit.payload));}else{this._keyText.rebase(edit);}
  40. super.rebase(edit);}
  41. setKeyText(newKeyText){const styleSheetId=this.styleSheetId;if(!styleSheetId){throw'No rule stylesheet id';}
  42. const range=this._keyText.range;if(!range){throw'Keyframe key is not editable';}
  43. return this._cssModel.setKeyframeKey(styleSheetId,range,newKeyText);}}
  44. self.SDK=self.SDK||{};SDK=SDK||{};SDK.CSSRule=CSSRule;SDK.CSSStyleRule=CSSStyleRule;SDK.CSSKeyframesRule=CSSKeyframesRule;SDK.CSSKeyframeRule=CSSKeyframeRule;