B
    nôb\93  ã               @   s4  d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZmZ ddl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) G dd„ deƒZ*G dd„ deƒZ+G dd„ deƒZ,G dd„ de	ƒZ-dd„ Z.e/dkr0e.ƒ  dS )zSimple web browser widgeté    N)ÚQUrlÚSignalÚSlot)ÚQFrameÚQHBoxLayoutÚQLabelÚQProgressBarÚQMenuÚQVBoxLayoutÚQWidget)ÚQWebEnginePageÚQWebEngineSettingsÚQWebEngineViewÚ	WEBENGINE)Ú	QFontInfo)Ú_ÚDEV)Úis_text_stringÚto_text_string)Úaction2buttonÚadd_actionsÚcreate_actionÚcreate_toolbuttonÚcreate_plugin_layout)Úicon_manager)ÚUrlComboBox)ÚFindReplacec               @   s    e Zd ZdZeeƒZdd„ Zd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             C   s   |t jkr| j |¡ dS dS )z=
        Overloaded method to handle links ourselves
        FT)r   ZNavigationTypeLinkClickedÚlinkClickedÚemit)ÚselfÚurlZnavigation_typeZisMainFrame© r"   ú5lib/python3.7/site-packages/spyder/widgets/browser.pyÚacceptNavigationRequest+   s    
zWebPage.acceptNavigationRequestN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r$   r"   r"   r"   r#   r   !   s   r   c                   s    e Zd ZdZdd„ Zd"dd„Zdd	„ Zd
d„ Zd#dd„Zd$dd„Z	dd„ Z
dd„ Zdd„ Zeƒ dd„ ƒZeƒ dd„ ƒZdd„ Zdd„ Zeƒ f‡ fd d!„	Z‡  ZS )%ÚWebViewzWeb viewc             C   sn   t  | |¡ d| _t| tdƒt d¡| jd| _t| tdƒt d¡| j	d| _
trjt| ƒ}|  |¡ d| _d S )Ng      ð?zZoom outÚzoom_out)ÚiconÚ	triggeredzZoom inÚzoom_inÚ )r   Ú__init__Úzoom_factorr   r   Úimar+   r*   Úzoom_out_actionr-   Úzoom_in_actionr   r   ZsetPageÚsource_text)r    ÚparentZweb_pager"   r"   r#   r/   7   s    


zWebView.__init__TFc             C   s>   t stj}nd}|s|tjB }|r,|tjB }|  |t |¡¡S )z	Find textr   )r   r   ZFindWrapsAroundDocumentZFindBackwardZFindCaseSensitivelyZfindTextZ	FindFlags)r    ÚtextZchangedZforwardÚcaseZwordsÚregexpZfindflagr"   r"   r#   Ú	find_textE   s    

zWebView.find_textc             C   s   |   ¡ S )z+Return text selected by current text cursor)ZselectedText)r    r"   r"   r#   Úget_selected_textU   s    zWebView.get_selected_textc             C   s
   || _ dS )z9Set source text of the page. Callback for QWebEngineView.N)r4   )r    r4   r"   r"   r#   Úset_source_textY   s    zWebView.set_source_textr.   c             C   s´   t |ƒ}|sdS |st |¡}|sVtrB|  ¡  | j¡ t | jƒ}nt |  ¡  ¡  ¡ ƒ}y"|rht 	|¡}nt 	|tj
¡}W n tjk
rŽ   dS X d}x| |¡D ]}|d7 }q W |S )z0Get the number of matches for the searched text.r   Né   )r   ÚreÚescaper   ÚpageZtoPlainTextr;   r4   Z	mainFrameÚcompileÚ
IGNORECASEÚsre_constantsÚerrorÚfinditer)r    Úpatternr4   r7   r8   ZregobjZnumber_matchesÚmatchr"   r"   r#   Úget_number_matches]   s*    
zWebView.get_number_matchesNc             C   sˆ   t |ƒ}|  ¡  ¡ }x0|j|j|j|j|jfD ]}| || 	¡ ¡ q.W |d k	r`| |j
| 	¡ ¡ | ¡ }| |j|¡ | |j|¡ d S )N)r   r?   ÚsettingsZStandardFontZ	SerifFontZSansSerifFontZCursiveFontZFantasyFontZsetFontFamilyZfamilyZ	FixedFontZ	pixelSizeZsetFontSizeZDefaultFontSizeZDefaultFixedFontSize)r    ZfontZ
fixed_fontrH   Z
fontfamilyÚsizer"   r"   r#   Úset_fontz   s    
zWebView.set_fontc             C   s(   t | dƒr|  | j¡ n|  | j¡ dS )zApply zoom factorÚsetZoomFactorN)ÚhasattrrK   r0   ZsetTextSizeMultiplier)r    r"   r"   r#   Úapply_zoom_factor‡   s    
zWebView.apply_zoom_factorc             C   s   || _ |  ¡  dS )zSet zoom factorN)r0   rM   )r    r0   r"   r"   r#   Úset_zoom_factor   s    zWebView.set_zoom_factorc             C   s   | j S )zReturn zoom factor)r0   )r    r"   r"   r#   Úget_zoom_factor•   s    zWebView.get_zoom_factorc             C   s   t d| jd ƒ| _|  ¡  dS )zZoom outgš™™™™™¹?N)Úmaxr0   rM   )r    r"   r"   r#   r*   ™   s    zWebView.zoom_outc             C   s   |  j d7  _ |  ¡  dS )zZoom ingš™™™™™¹?N)r0   rM   )r    r"   r"   r#   r-   Ÿ   s    zWebView.zoom_inc             C   s"   dd l }| t|  ¡  ¡ ƒ¡ d S )Nr   )Ú
webbrowserÚopenr   r!   ÚtoString)r    ZwebwindowtyperQ   r"   r"   r#   ÚcreateWindow¦   s    zWebView.createWindowc             C   sš   t | ƒ}|  tj¡|  tj¡d |  tj¡|  tj¡d | j| jg}t	rvt
sv|  ¡  ¡ }| tjd¡ |d |  tj¡g7 }t||ƒ | | ¡ ¡ | ¡  d S )NT)r	   Ú
pageActionr   ÚBackÚForwardZ	SelectAllZCopyr3   r2   r   r   r?   rH   ZsetAttributer   ZDeveloperExtrasEnabledZInspectElementr   ZpopupZ	globalPosZaccept)r    ZeventZmenuZactionsrH   r"   r"   r#   ÚcontextMenuEventª   s    


zWebView.contextMenuEventc                sB   t r,|  d¡ tt| ƒ ||¡ |  d¡ ntt| ƒ ||¡ dS )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   Ú
setEnabledÚsuperr)   ÚsetHtml)r    ZhtmlZbaseUrl)Ú	__class__r"   r#   r[   ¹   s
    
zWebView.setHtml)TTFFF)r.   FF)N)r%   r&   r'   r(   r/   r9   r:   r;   rG   rJ   rM   rN   rO   r   r*   r-   rT   rX   r   r[   Ú__classcell__r"   r"   )r\   r#   r)   5   s$     
 

	r)   c               @   sˆ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Ze	ƒ dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze	eƒdd„ ƒZdS )Ú
WebBrowserz
    Web browser widget
    Nc                s*  t  ˆ|¡ d ˆ_tˆƒˆ_ˆjj ˆj¡ ˆjj ˆj	¡ ˆjj
 ˆj¡ tˆt d¡tdƒˆjd}tˆjjƒ}tˆjjƒ}‡fdd„}|tjƒ}|tjƒ‰|tjƒ}|tjƒ}ˆ d¡ ˆjj ‡fdd„¡ ˆjj ‡fdd„¡ tˆƒ‰ ˆ  d¡ ˆ  ¡  ˆjj ˆ j¡ ˆjj ˆ j ¡ ˆjj ‡ fd	d„¡ t!ˆ "¡ ƒ}	t#ˆƒˆ_$ˆj$j% ˆj&¡ t'svˆjj( ˆj)¡ t*ˆƒˆ_+ˆj+ ,ˆj¡ ˆj+ ¡  tˆt d
¡tdƒˆj-d}
ˆj+j. |
j/¡ t0ƒ }x0||||
|	ˆj$|||ˆ ˆfD ]}| 1|¡ qèW t2|ƒ}| 1ˆj¡ | 1ˆj+¡ ˆ 3|¡ d S )NÚhomeZHome)r+   Útipr,   c                s   t ˆ j | ¡ˆ jdS )N)r5   )r   ÚwebviewrU   )Zprop)r    r"   r#   Ú<lambda>Þ   s   z%WebBrowser.__init__.<locals>.<lambda>Fc                  s
   ˆ   d¡S )NT)rY   r"   )Ústop_buttonr"   r#   rb   æ   s    c                  s
   ˆ   d¡S )NF)rY   r"   )rc   r"   r#   rb   ç   s    c                s   ˆ   ¡ S )N)Úhide)Z_state)Úprogressbarr"   r#   rb   î   s    Úfindz	Find text)r+   r`   Ztoggled)4r   r/   Úhome_urlr)   ra   ZloadFinishedÚconnectÚload_finishedZtitleChangedZsetWindowTitleZ
urlChangedÚurl_changedr   r1   r+   r   Úgo_homer   r2   r3   r   ZReloadZStoprV   rW   rY   ZloadStartedr   ZsetTextVisiblerd   ÚshowZloadProgressZsetValuer   Ú	get_labelr   Ú	url_comboÚvalidÚurl_combo_activatedr   ZiconChangedÚicon_changedr   Úfind_widgetZ
set_editorÚtoggle_find_widgetZvisibility_changedZ
setCheckedr   Ú	addWidgetr   Ú	setLayout)r    r5   Zhome_buttonZzoom_out_buttonZzoom_in_buttonZpageact2btnZrefresh_buttonZprevious_buttonZnext_buttonZlabelZfind_buttonZhlayoutÚwidgetÚlayoutr"   )re   r    rc   r#   r/   Í   s\    













zWebBrowser.__init__c             C   s   t dƒS )zReturn address label textzAddress:)r   )r    r"   r"   r#   rm     s    zWebBrowser.get_labelc             C   s   t |ƒ| _dS )zSet home URLN)r   rg   )r    r6   r"   r"   r#   Úset_home_url  s    zWebBrowser.set_home_urlc             C   s   |   |¡ |  |¡ dS )zSet current URLN)rj   Úgo_to)r    r!   r"   r"   r#   Úset_url  s    
zWebBrowser.set_urlc             C   s&   t |ƒrt|ƒ}n|}| j |¡ dS )zGo to page *address*N)r   r   ra   Úload)r    Zurl_or_textr!   r"   r"   r#   ry     s    
zWebBrowser.go_toc             C   s   | j dk	r|  | j ¡ dS )zGo to home pageN)rg   rz   )r    r"   r"   r#   rk      s    
zWebBrowser.go_homec             C   s   t |ƒS )z%Convert text address into QUrl object)r   )r    r6   r"   r"   r#   Útext_to_url&  s    zWebBrowser.text_to_urlc             C   s"   t | j ¡ ƒ}|  |  |¡¡ dS )z"Load URL from combo box first itemN)r   rn   ZcurrentTextry   r|   )r    ro   r6   r"   r"   r#   rp   *  s    zWebBrowser.url_combo_activatedc             C   s   |s| j  tdƒ¡ d S )NzUnable to load page)ra   r[   r   )r    Úokr"   r"   r#   ri   /  s    zWebBrowser.load_finishedc             C   s   |  ¡ S )z2Convert QUrl object to displayed text in combo box)rS   )r    r!   r"   r"   r#   Úurl_to_text3  s    zWebBrowser.url_to_textc             C   s   | j  |  |¡¡ dS )z3Displayed URL has changed -> updating URL combo boxN)rn   Zadd_textr~   )r    r!   r"   r"   r#   rj   7  s    zWebBrowser.url_changedc             C   s.   | j  | j  ¡ | j ¡ ¡ |  | j ¡ ¡ d S )N)rn   ZsetItemIconZcurrentIndexra   r+   ZsetWindowIcon)r    r"   r"   r#   rq   ;  s    zWebBrowser.icon_changedc             C   s   |r| j  ¡  n
| j  ¡  d S )N)rr   rl   rd   )r    Ústater"   r"   r#   rs   @  s    zWebBrowser.toggle_find_widget)N)r%   r&   r'   r(   r/   rm   rx   rz   ry   r   rk   r|   rp   ri   r~   rj   rq   Úboolrs   r"   r"   r"   r#   r^   É   s   
>r^   c               @   s4   e Zd ZdZeeƒZdd„ Zdd„ Ze	dd„ ƒZ
dS )	ÚFrameWebViewz=
    Framed QWebEngineView for UI consistency in Spyder.
    c             C   s‚   t  | |¡ t| ƒ| _tƒ }| | j¡ | dddd¡ |  |¡ |  t j	t j
B ¡ trn| j ¡ j | j¡ n| jj | j¡ d S )Nr   )r   r/   r)   Ú_webviewr   rt   ZsetContentsMarginsru   ZsetFrameStyleZStyledPanelZSunkenr   r?   r   rh   )r    r5   rw   r"   r"   r#   r/   N  s    

zFrameWebView.__init__c             C   s   t | j|ƒS )N)Úgetattrr‚   )r    Únamer"   r"   r#   Ú__getattr___  s    zFrameWebView.__getattr__c             C   s   | j S )N)r‚   )r    r"   r"   r#   Ú
web_widgetb  s    zFrameWebView.web_widgetN)r%   r&   r'   r(   r   r   r   r/   r…   Úpropertyr†   r"   r"   r"   r#   r   H  s
   r   c              C   sH   ddl m}  | dd}tƒ }| ¡  | d¡ | ¡  t | ¡ ¡ dS )zRun web browserr   )Úqapplicationé   )Z	test_timezhttps://www.google.com/N)	Úspyder.utils.qthelpersrˆ   r^   rl   rx   rk   ÚsysÚexitZexec_)rˆ   Zapprv   r"   r"   r#   Útestg  s    

r   Ú__main__)0r(   r=   rB   r‹   Zqtpy.QtCorer   r   r   Zqtpy.QtWidgetsr   r   r   r   r	   r
   r   Zqtpy.QtWebEngineWidgetsr   r   r   r   Z
qtpy.QtGuir   Zspyder.config.baser   r   Zspyder.py3compatr   r   rŠ   r   r   r   r   r   Zspyder.utilsr   r1   Zspyder.widgets.comboboxesr   Zspyder.widgets.findreplacer   r   r)   r^   r   r   r%   r"   r"   r"   r#   Ú<module>   s*   $ 
