
    G@dO                         d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1  G d d          Z2 G d d          Z3 G d d          Z4 G d de          Z5 G d dee          Z6 G d de          Z7 G d de          Z8d  Z9e:d!k    r e9             dS dS )"zSimple web browser widget    N)PYQT5)QEventQtQUrlSignalSlot)	QFontInfo)	WEBENGINEQWebEnginePageQWebEngineSettingsQWebEngineView)QFrameQHBoxLayoutQLabelQProgressBarQWidget_)SpyderWidgetMixin)DEV)OLD_PYQT)is_text_stringto_text_string)ima)QStylePalette)action2buttoncreate_plugin_layoutcreate_toolbutton)UrlComboBox)FindReplacec                   2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )WebViewActionszoom_in_actionzoom_out_actionback_actionforward_actionselect_all_actioncopy_actioninspect_actionstop_actionrefresh_actionN)__name__
__module____qualname__ZoomInZoomOutBackForward	SelectAllCopyInspectStopRefresh     6lib/python3.11/site-packages/spyder/widgets/browser.pyr"   r"   '   s;        FGDG#IDGDGGGr9   r"   c                       e Zd ZdZdZdZdZdS )WebViewMenuSectionsmove_sectionselect_sectionzoom_sectionextras_sectionN)r,   r-   r.   MoveSelectZoomExtrasr8   r9   r:   r<   r<   3   s"        DFDFFFr9   r<   c                       e Zd ZdZdS )WebViewMenuscontext_menuN)r,   r-   r.   Contextr8   r9   r:   rF   rF   :   s        GGGr9   rF   c                   8     e Zd ZdZ ee          Z fdZ xZS )WebPagez
    Web page subclass to manage hyperlinks for WebEngine

    Note: This can't be used for WebKit because the
    acceptNavigationRequest method has a different
    functionality for it.
    c                     |t           j        k    r| j                            |           dS t	          t
          |                               |||          S )z=
        Overloaded method to handle links ourselves
        F)r   NavigationTypeLinkClickedlinkClickedemitsuperrJ   acceptNavigationRequest)selfurlnavigation_typeisMainFrame	__class__s       r:   rP   zWebPage.acceptNavigationRequestJ   sX     nFFF!!#&&&5Wd##;;+/ / 	/r9   )	r,   r-   r.   __doc__r   r   rM   rP   __classcell__rU   s   @r:   rJ   rJ   @   sQ          &,,K	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/r9   rJ   c                   "    e Zd ZdZ e            Z	  e            Z	 d fd	Zi fdZ	 	 ddZ	d Z
d	 Z	 	 ddZddZd Zd Zd Z e            d             Z e            d             Zd Zd Z e            f fd	Z fdZ fdZ xZS )WebViewz
    Web view.
    TNc                 h   ||n|}t           r$t                                          ||           n+t          j        | |           t	          j        | |           d| _        d | _        t          r?|rt          |           }nt          |           }| 
                    |           d| _        d S d S )N)class_parentg      ? )r   rO   __init__r   r   zoom_factorrG   r
   rJ   r   setPagesource_text)rQ   parenthandle_linksr\   web_pagerU   s        r:   r^   zWebView.__init__d   s    !-!5vv< 	HGGV,????#D&111&t,GGGG  	" 0"4==)$//LL"""!D	" 	"r9   c                 	   |                      t          j                  }|                     t          j        t          d          |                     d          |j        t          j	                  }|                      t          j
                  }|                     t          j
        t          d          |                     d          |j        t          j	                  }|                      t          j                  }|                     t          j        t          d          |j        t          j	                  }|                      t          j                  }|                     t          j        t          d          |j        t          j	                  }	|                     t          j        t          d	          |                     d
          | j        t          j	                  | _        |                     t          j        t          d          |                     d          | j        t          j	                  | _        |                      t          j                  }
|                     t          j        t          d          |
j        t          j	                  }|                      t          j                  }|                     t          j        t          d          |                     d          |j        t          j	                   |                      t          j                  }|                     t          j        t          d          |                     d          |j        t          j	                   |                     t2          j                  }|| _        ||fD ]$}|                     ||t:          j                   %||	fD ]$}|                     ||t:          j                   %| j        | j        fD ]$}|                     ||t:          j                    %|                     ||t:          j!                   tD          rdtF          s]| $                                %                                }|&                    tN          j(        d           |)                    d           d S |)                    d           d S )Nr1   previous)nametexticon	triggeredcontextr2   nextz
Select all)rg   rh   rj   rk   r4   zZoom inzoom_inzZoom outzoom_outr5   r7   refreshr6   stop)menusectionTF)*
pageActionr   r1   create_actionr"   r   create_icontriggerr   WidgetWithChildrenShortcutr2   r3   r4   r/   rm   r#   r0   rn   r$   InspectElementr5   Reloadr7   r6   create_menurF   rH   rG   add_item_to_menur<   rA   rB   rC   rD   r   r
   pagesettingssetAttributer   DeveloperExtrasEnabled
setVisible)rQ   optionsoriginal_back_actionr%   original_forward_actionr&   original_select_actionr'   original_copy_actionr(   original_inspect_actionr)   original_refresh_actionoriginal_stop_actionrq   itemr}   s                    r:   setupzWebView.setupx   s   #~/BCC(($6!!*--*21 ) 
 
 #'//.2H"I"I++'9!!&))-51 , 
 
 "&1I!J!J ..)<,41	 / 
 
  $~/BCC(($6*21	 ) 
 
 #00&9!!),,l1 1 
 
  $11':!!*--m1  2  
  
 #'//)#+ #+++'9-51	 , 
 
 #'//.2G"H"H'9!!),,-51 	 	
 	
 	
  $~/BCC$6!!&))*21 	 	
 	
 	
  455  .1 	 	D!!+0 "     '4 	 	D!!+2 "     ($*>? 	 	D!!+0 "     	'. 	 	
 	
 	
  	-y 	-yy{{++--H!!"4"K"&( ( (%%d+++++%%e,,,,,r9   Fc                     t           st          j        }nd}|s|t          j        z  }|r|t          j        z  }|                     |t          j        |                    S )z
Find text.r   )r
   r   FindWrapsAroundDocumentFindBackwardFindCaseSensitivelyfindText	FindFlags)rQ   rh   changedforwardcasewordregexpfindflags           r:   	find_textzWebView.find_text   se      	%=HHH 	>."==H 	E."DDH}}T>#;H#E#EFFFr9   c                 *    |                                  S )z+Return text selected by current text cursor)selectedTextrQ   s    r:   get_selected_textzWebView.get_selected_text   s      """r9   c                     || _         dS )z9Set source text of the page. Callback for QWebEngineView.N)ra   )rQ   ra   s     r:   set_source_textzWebView.set_source_text   s    &r9   r]   c                    t          |          }|sdS |st          j        |          }|st          rA|                                                     | j                   t          | j                  }nEt          |                                                                                                           }|rd	                    |          }	 |r t          j
        |t          j                  }n,t          j
        |t          j        t          j        z            }n# t          j        $ r Y dS w xY wd}|                    |          D ]}|dz  }|S )z0Get the number of matches for the searched text.r   z\b{pattern}\b)patternN   )r   reescaper
   r|   toPlainTextr   ra   	mainFrameformatcompile	MULTILINE
IGNORECASEsre_constantserrorfinditer)	rQ   r   ra   r   r   r   regobjnumber_matchesmatchs	            r:   get_number_matcheszWebView.get_number_matches  s_    !)) 	1 	)i((G 	? ?		''(<===,T-=>>,		--//;;==? ?  	?&--g->>G	 KGR\::GR\BM-IJJ" 	 	 	FF	 __[11 	  	 EaNNs   AD! !D43D4c                    t          |          }|                                                                 }|j        |j        |j        |j        |j        fD ]*}|                    ||	                                           +|-|                    |j
        |	                                           |                                }|                    |j        |           |                    |j        |           d S N)r	   r|   r}   StandardFont	SerifFontSansSerifFontCursiveFontFantasyFontsetFontFamilyfamily	FixedFont	pixelSizesetFontSizeDefaultFontSizeDefaultFixedFontSize)rQ   font
fixed_fontr}   
fontfamilysizes         r:   set_fontzWebView.set_font$  s    99;;''))#0(2D#183G#/1 	> 	>J "":t{{}}====!""8#5z7H7H7J7JKKK~~X5t<<<X:DAAAAAr9   c                     t          | d          r|                     | j                   dS |                     | j                   dS )zApply zoom factor.setZoomFactorN)hasattrr   r_   setTextSizeMultiplierr   s    r:   apply_zoom_factorzWebView.apply_zoom_factor1  sP    4)) 	9t/00000 &&t'788888r9   c                 <    || _         |                                  dS )zSet zoom factor.Nr_   r   )rQ   r_   s     r:   set_zoom_factorzWebView.set_zoom_factor:  s"    &     r9   c                     | j         S )zReturn zoom factor.)r_   r   s    r:   get_zoom_factorzWebView.get_zoom_factor?  s    r9   c                 h    t          d| j        dz
            | _        |                                  dS )z	Zoom out.皙?N)maxr_   r   r   s    r:   rn   zWebView.zoom_outC  s6     r4#3B#677     r9   c                 N    | xj         dz  c_         |                                  dS )zZoom in.r   Nr   r   s    r:   rm   zWebView.zoom_inI  s0     	B     r9   c                     dd l }	 |                    t          |                                                                                      d S # t
          $ r Y d S w xY w)Nr   )
webbrowseropenr   rR   toString
ValueError)rQ   webwindowtyper   s      r:   createWindowzWebView.createWindowP  si    	OON488::+>+>+@+@AABBBBB 	 	 	DD	s   AA 
AAc                     | j         rB| j                             |                                           |                                 d S d S r   )rG   popup	globalPosaccept)rQ   events     r:   contextMenuEventzWebView.contextMenuEventX  sI     	##EOO$5$5666LLNNNNN	 	r9   c                    t           rbt          r|                     d           t          t          |                               ||           t          r|                     d           n)t          t          |                               ||           	 |                                                     |            dS # t          $ r Y dS w xY w)z
        Reimplement Qt method to prevent WebEngine to steal focus
        when setting html on the page

        Solution taken from
        https://bugreports.qt.io/browse/QTBUG-52999
        FTN)	r
   r   
setEnabledrO   rZ   setHtml
focusProxyinstallEventFilterAttributeError)rQ   htmlbaseUrlrU   s      r:   r   zWebView.setHtml]  s      	8 '&&&'4  ((w777 &%%%'4  ((w777
	 OO0066666 	 	 	DD	s   'B> >
CCc                     t                                          |           	 |                                                     |            dS # t          $ r Y dS w xY w)zw
        Load url.

        This is reimplemented to install our event filter after the
        url is loaded.
        N)rO   loadr   r   r   )rQ   rR   rU   s     r:   r   zWebView.loadx  sf     	S
	OO0066666 	 	 	DD	s   'A 
AAc                 b   |                                  |u rw|                                t          j        k    r| j                                         n;|                                t          j        k    r| j                                         t                      	                    ||          S )z
        Handle events that affect the view.

        All events (e.g. focus in/out) reach the focus proxy, not this
        widget itself. That's why this event filter is necessary.
        )
r   typer   FocusInsig_focus_in_eventrN   FocusOutsig_focus_out_eventrO   eventFilter)rQ   widgetr   rU   s      r:   r   zWebView.eventFilter  s     ??&&zz||v~--',,....00(--///ww""65111r9   )TN)TTFFF)r]   FFFr   )r,   r-   r.   rV   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   rn   rm   r   r   r   r   r   r   rW   rX   s   @r:   rZ   rZ   V   s           !&((" " " " " "(  r- r- r- r-h @E%*G G G G# # #' ' ' @E.3   BB B B B9 9 9! ! !
      
TVV! ! V!
 
TVV! ! V!    
 %)DFF      6    "2 2 2 2 2 2 2 2 2r9   rZ   c                       e Zd ZdZddZd Zd Zd Zd Z e	            d	             Z
d
 Zd Zd Zd Zd Zd Z e	e          d             ZdS )
WebBrowserz
    Web browser widget.
    NTc                 :	    t          j         |           d  _        t           |           _         j                                          j        j                             j                    j        j	                             j
                    j        j                             j                   t           t          j        d          t!          d           j                  }t%           j        j                  }t%           j        j                  }d fd	} |t*          j        t          j        d                    } |t*          j        t          j        d                     |t*          j        t          j        d	                    }	 |t*          j        t          j        d
                    }
                    d            j        j                            fd            j        j                            fd           t9                                         d                                             j        j                            j                    j        j                             j!                    j        j                            fd           tE           #                                          }tI                      _%         j%        j&                             j'                   tP          s$ j        j)                             j*                   tW                      _,         j,        -                     j                    j,                                         t           t          j        d          t!          d           j.                  } j,        j/                            |j0                   tc                      }|	|
||| j%        |||fD ]}|2                    |           |r|2                    |           tg          |          }|2                     j                   |2                     j,                    4                    |           d S )N)rc   homeHome)ri   tiprj   c                 b    t          j                            |           j        |          S )N)rb   ri   )r   webviewrs   )propri   rQ   s     r:   pageact2btnz(WebBrowser.__init__.<locals>.pageact2btn  s7     ''--dlO O O Or9   ro   )ri   rp   rf   rl   Fc                  .                          d          S )NTr   stop_buttons   r:   <lambda>z%WebBrowser.__init__.<locals>.<lambda>  s    1G1G1M1M r9   c                  .                          d          S )NFr   r   s   r:   r   z%WebBrowser.__init__.<locals>.<lambda>  s    +2H2H2O2O r9   c                 ,                                     S r   )hide)_stateprogressbars    r:   r   z%WebBrowser.__init__.<locals>.<lambda>  s    9I9I9K9K r9   findz	Find text)ri   r   toggledr   )5r   r^   home_urlrZ   r   r   loadFinishedconnectload_finishedtitleChangedsetWindowTitle
urlChangedurl_changedr   r   ri   r   go_homer   r$   r#   r   ry   r6   r1   r2   r   loadStartedr   setTextVisibler  showloadProgresssetValuer   	get_labelr   	url_combovalidurl_combo_activatedr
   iconChangedicon_changedr    find_widget
set_editortoggle_find_widgetvisibility_changed
setCheckedr   	addWidgetr   	setLayout)rQ   rb   options_buttonrc   home_buttonzoom_out_buttonzoom_in_buttonr   refresh_buttonprevious_buttonnext_buttonlabelfind_buttonhlayoutr   layoutr  r   s   `               @@r:   r^   zWebBrowser.__init__  sY   v&&&t,???!))$*<===!))$*=>>>''(8999'38F3C3C,-fII26,@ @ @ ((DEE&t|'BCC	O 	O 	O 	O 	O 	O %!(;(;= = =!kchv&6&68 8 8%+chz&:&:< < <!k"&)9)9; ; ; 	u%%% (()M)M)M)MNNN!))*O*O*O*OPPP"4((""5))) (()9:::!))+*>???!))*K*K*K*KLLLt~~''(($T**$$T%=>>> 	@L$,,T->???&t,,##DL111'38F3C3C,-kNN040GI I I 	+33K4JKKK--&[+dno~%{KA 	& 	&F f%%%% 	.n---%g..&&&)***vr9   c                      t          d          S )zReturn address label textzAddress:r   r   s    r:   r  zWebBrowser.get_label  s    }}r9   c                 .    t          |          | _        dS )zSet home URLN)r   r  rQ   rh   s     r:   set_home_urlzWebBrowser.set_home_url  s    T

r9   c                 Z    |                      |           |                     |           dS )zSet current URLN)r  go_torQ   rR   s     r:   set_urlzWebBrowser.set_url  s)    

3r9   c                 |    t          |          rt          |          }n|}| j                            |           dS )zGo to page *address*N)r   r   r   r   )rQ   url_or_textrR   s      r:   r1  zWebBrowser.go_to  sB    +&& 	{##CCC#r9   c                 L    | j         |                     | j                    dS dS )zGo to home pageN)r  r3  r   s    r:   r  zWebBrowser.go_home  s.     =$LL''''' %$r9   c                      t          |          S )z%Convert text address into QUrl object)r   r.  s     r:   text_to_urlzWebBrowser.text_to_url  s    Dzzr9   c                     t          | j                                                  }|                     |                     |                     dS )z"Load URL from combo box first itemN)r   r  currentTextr1  r8  )rQ   r  rh   s      r:   r  zWebBrowser.url_combo_activated  sC    dn88::;;

4##D))*****r9   c                 \    |s)| j                             t          d                     d S d S )NzUnable to load page)r   r   r   )rQ   oks     r:   r	  zWebBrowser.load_finished  s9     	;L  #8!9!9:::::	; 	;r9   c                 *    |                                 S )z2Convert QUrl object to displayed text in combo box)r   r2  s     r:   url_to_textzWebBrowser.url_to_text  s    ||~~r9   c                 `    | j                             |                     |                     dS )z3Displayed URL has changed -> updating URL combo boxN)r  add_textr>  r2  s     r:   r  zWebBrowser.url_changed  s,     0 0 5 566666r9   c                     | j                             | j                                         | j                                                   |                     | j                                                   d S r   )r  setItemIconcurrentIndexr   ri   setWindowIconr   s    r:   r  zWebBrowser.icon_changed  se    ""4>#>#>#@#@#'<#4#4#6#6	8 	8 	84<,,../////r9   c                 r    |r| j                                          d S | j                                          d S r   )r  r  r  )rQ   states     r:   r  zWebBrowser.toggle_find_widget  s@     	$!!#####!!#####r9   )NNT)r,   r-   r.   rV   r^   r  r/  r3  r1  r   r  r8  r  r	  r>  r  r  boolr  r8   r9   r:   r   r     s        F F F FP  # # #  
   
TVV( ( V(
  + + +
; ; ;  7 7 70 0 0
 
T$ZZ$ $ Z$ $ $r9   r   c                   b     e Zd ZdZ ee          Zd fd	Z fdZe	d             Z
d	dZ xZS )
FrameWebViewz6
    Framed WebView for UI consistency in Spyder.
    Tc                     t                                          |           t           ||           _         j        j                             fd            j        j                             fd           t                      }|                     j                   |	                    dddd            
                    |                                             |ret          r8 j                                        j                             j                   d S  j        j                             j                   d S d S )N)rc   r\   c                  0                          d          S )NTfocus_apply_stylesheetr   s   r:   r   z'FrameWebView.__init__.<locals>.<lambda>0  s    D***66 r9   c                  0                          d          S )NFrL  rN  r   s   r:   r   z'FrameWebView.__init__.<locals>.<lambda>2  s    D***77 r9   r   )rO   r^   rZ   _webviewr   r  r   r   r  setContentsMarginsr   rO  r
   r|   rM   )rQ   rb   rc   r+  rU   s   `   r:   r^   zFrameWebView.__init__'  s\      %
 
 

 	(006666	8 	8 	8)117777	9 	9 	9 '''!!!Q1---v    	D D""$$0889IJJJJJ)11$2BCCCCC		D 	Dr9   c                     |dk    r!t                                          |          S t          | j        |          rt	          | j        |          S t                                          |          S )NrQ  )rO   __getattr__r   rQ  getattr)rQ   rg   rU   s     r:   rT  zFrameWebView.__getattr__@  sd    :77&&t,,,4=$'' 	-4=$///77&&t,,,r9   c                     | j         S r   )rQ  r   s    r:   
web_widgetzFrameWebView.web_widgetI  s
    }r9   Fc                    |rt           j        }nt           j        }t          j                                        }|j                            d| ddd           |                     |	                                           dS )z0Apply stylesheet according to the current focus.z
1px solid z0px 1px 0px 1pxz0px 0px 1px 0px3px)bordermarginpaddingborderRadiusN)
r   COLOR_ACCENT_3COLOR_BACKGROUND_4	qstylizerstyle
StyleSheetr   	setValuessetStyleSheetr   )rQ   rM  border_colorcsss       r:   rO  zFrameWebView._apply_stylesheetM  s     	<(7LL(;Lo((**
...$%	 	 	
 	
 	
 	3<<>>*****r9   )T)F)r,   r-   r.   rV   r   r   rM   r^   rT  propertyrW  rO  rW   rX   s   @r:   rI  rI  !  s          &,,KD D D D D D2- - - - -   X+ + + + + + + +r9   rI  c                     ddl m}   | d          }t                      }|                                 |                    d           |                                 t          j        |                                           dS )zRun web browserr   )qapplication   )	test_timezhttps://www.google.com/N)	spyder.utils.qthelpersri  r   r  r/  r  sysexitexec_)ri  appr   s      r:   testrq  _  s    333333
,
#
#
#C\\F
KKMMM
1222
NNHSYY[[r9   __main__);rV   r   r   rm  qstylizer.styler`  qtpyr   qtpy.QtCorer   r   r   r   r   
qtpy.QtGuir	   qtpy.QtWebEngineWidgetsr
   r   r   r   qtpy.QtWidgetsr   r   r   r   r   spyder.api.translationsr   spyder.api.widgets.mixinsr   spyder.config.baser   spyder.config.guir   spyder.py3compatr   r   spyder.utils.icon_managerr   spyder.utils.paletter   rl  r   r   r   spyder.widgets.comboboxesr   spyder.widgets.findreplacer    r"   r<   rF   rJ   rZ   r   rI  rq  r,   r8   r9   r:   <module>r     s@      
			     



           6 6 6 6 6 6 6 6 6 6 6 6 6 6            I I I I I I I I I I I I M M M M M M M M M M M M M M & % % % % % 7 7 7 7 7 7 " " " " " " & & & & & & ; ; ; ; ; ; ; ; ) ) ) ) ) ) . . . . . .7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 2 2 2 2 2 2
	 	 	 	 	 	 	 	              / / / / /n / / /,2 2 2 2 2n/ 2 2 2D
F$ F$ F$ F$ F$ F$ F$ F$R;+ ;+ ;+ ;+ ;+6 ;+ ;+ ;+|   zDFFFFF r9   