General questions about Plugins
How to implement "Config" function of a Plugin
How to add new or override existing protocols
How to make a "Button" type plugin
How to make a "SideBar" type plugin
How to enable the 'Config' feature of a script plugin.
Extended DHTML support
SideBar plugin callback functions

General questions about Plugins:

1. COM Object

COM object must implement IMyIEClient interface. Please refer to IMyIE.h

2. Exe File:

Any win32 exe file could be used as plugin. Maxthon will send different parameters under different circumstance.
General parameter:
a. "-h=handle" : handle is the Wnd handle of the Maxthon main window, decimalist.

3. Script File:

Script File must be written in the following format:

Example:
<script language="Javascript">
alert(document.lastModified);
</script>

The 'language' could be any valid language that IE supports.

How to implement 'Config' function of a Plugin?

There is a 'Config' button in the 'Maxthon Plugin' option page. Maxthon will call the corresponding 'Config' function of a plugin, when user clicks the 'Config' button.

1. COM Object:

The COM's IMyIEClient::Config will be call with the parameter of the config dialog's hWnd handle.

2. Exe File:

The file will be called with a parameter of "-setup". For example, if the filename is "abc.exe", then Maxthon will call "abc.exe -setup ..." .

3. Script File:

Not support currently...

How to add new or override existing protocols?

With Maxthon, the plugin could establish a new protocol, such as book://, or override an existing protocol, such as ftp:// .When the user inputs the protocol in the address bar or clicks the protocol on webpage, Maxthon will call the plugin.

1. COM Object:

Not support currently...

2. Exe File:

The file will be called with the parameter "-u=url", in which the url is the address that the user wants to visit, such as book://www.mysite.com/abc.pdf, or ftp://www.google.com .

3. Srcipt File:

Not support currently...

How to make a "Button" type plugin?

Maxthon supports "Button" type plugins, which will be placed on "Ext Button" toolbar. The plugin is called when user clicks on the corresponding button. The 'Button' plugin could be implemented using the following methods.

1.COM Object:
When user clicks on the button, Maxthon will query the Com's IOleCommandTarget interface and ºÍIObjectWithSite interface£¬passing the IWebBrowser2 pointer of the current page to its IObjectWithSite::SetSite function£¬then call its IOleCommandTarget::Exec function. It's similar to IE's implementation of button. Please refer to MSDN for more information.

Sample Plugin.ini:
[General]
Name=ComButton
Author=bloodchen
Version=1.0
ModuleType=COM
FileName=ComButton.dll
CLSID={96E78121-9FF2-466D-B6CD-4038CAC1BB79}
Comments=Com type 'Button'
Type=M2Plugin_BUTTON
HotIcon=hot.ico
Icon=cold.ico

2.Script:
When the user clicks the button, Maxthon will run the script on current web page.

Sample Plugin.ini:
[General]
Name=LastModified
Author=bloodchen
Version=1.0
ModuleType=SCRIPT
FileName=LastModified.htm
Comments=See last modified date of current page
Type=M2Plugin_BUTTON
HotIcon=hot.ico
Icon=cold.ico

3.Exe File:
When the user clicks the button, Maxthon will call the file with the parameters of current address and handle of the main Maxthon window. For example, the file is abc.exe£¬then Maxthon will call abc.exe -h=23424 -u=http://www.yahoo.com, in which 23424 is the handle of the main Maxthon window and http://www.yahoo.com is the URL of the current page.

Sample Plugin.ini:
[General]
Name=ExeButton
Author=BloodChen
Version=1.0
ModuleType=EXE
FileName=abc.exe
Comments=Exe type Button
Type=M2Plugin_BUTTON
Icon=p.ico

How to make a 'SideBar' type plugin

Maxthon supports 'SideBar' plugin£¬This kind of plugin will appear on Maxthon's sidebar, implemented using a html file.

1.HTML:
When user clicks on the button£¬Maxthon will load the html file into the side bar , which is assigned in the plugin.ini.

Example Plugin.ini:
[General]
Name=Calculator++ 1.2
Author=SiC
Version=1.2
ModuleType=SCRIPT
FileName=calculator.htm
Comments=Scientific programmable calculator.
Type=M2Plugin_Sidebar
HotIcon=cpp.ico
Icon=cpp.ico

2. COM

When user clicks on the button£¬Maxthon will load the COM control into the side bar , which is assigned in the plugin.ini.

Example Plugin.ini:
[General]
Name=AXSidebar sample
Author=bloodchen
Version=1.0
ModuleType=COM
Comments=Simple activex side bar control
Type=M2Plugin_SideBar
FileName=AXSidebar.dll
CLSID={108C8E56-90AF-408B-873F-8AE3480BE090}
HotIcon=ax.ico
Icon=ax.ico

The COM plugin can be implemented in two ways:

1. A COM object similar to IE's browser band implementation. It must implement IObjectWithSite interface,
IDeskBand interface and optionally IInputObject interface. An example is the Net Snippet side bar plugin.

2. An activex control. Any valid activex control can be used, providing the correct CLSID. The activex control can optionally implement IObjectWithSite interface, from which Maxthon will pass the active tab's IWebBrowser2 interface. If the activex control is not registered in user's system and the FileName is not empty, Maxthon will try to register the file and load the control again. An example is the AXSidebar plugin (with source code).

How to enable the 'Config' feature of a script plugin. (Available after 1.1.067)

When user clicks the 'config' button in plugin config dialog, Maxthon will try to open the 'config.html' inside your plugin's folder. And a 'max.src' file will be created to let your plugin gets security_id, in order to call some maxthon functions. You can use following meta settings to specify the dialog's size.
<meta name="Dialog-Width" content="110">
<meta name="Dialog-Height" content="120">

Extended DHTML support

Maxthon has extended the DHTML support by adding several new commands which could be called from script langauge. The HTML or scirpt writer could call the function through the 'window.external' object. The function could be called from the script in a HTML page or a scirpt plugin.

Please notice: Some function will require a security_id as first parameter which was not needed in old version of MyIE2. Plugins used these command must be changed to use security_id .

How to get the security id?
1. For script plugins, you have to have a %max_security_id in your script file, such as 'var security_id=%max_security_id", then you can use security_id in your script.

2. For side bar plugins, a file named "max.src" will be created in your plugin's folder with content "max_security_id=id". You can include this file into your html page to get the id.

1. addFavorite( url , title ) , addFavorite( url )
   This function will ask user to add the 'url' into favortes, using 'title' for the name of the url.
   Example1: external.addFavorite( "http://www.google.com" ); Demo
   Example2: external.addFavorite( "http://www.google.com","This is google"); Demo
2. addProxy (name, address, speed, is_web_proxy)
   This function will call Maxthon's add proxy dialog to add the proxy named as 'name' at address 'address', giving the initial speed 'speed'. The is_web_proxy indicates whether the proxy is a web proxy or a normal proxy.
   Example: external.addProxy("My proxy","192.168.1.0:8080",1,0); Demo
3. addFilter( address ) , addFilter( address, is_pop_filter )
   This function will call Maxthon's add filter dialog, setting the address to be filtered as 'address'. 'is_pop_filter' indicates whether the defalut filter type is 'pop filter'.
   Example1: external.addFilter("http://www.yahoo.com/ad*"); Demo
   Example1: external.addFilter("http://www.yahoo.com/img/*", 0); Demo
4. readFile( security_id,plugin_name, file_name)
   This function can only be used in a script plugin, for the security reasons. The 'plugin_name' refers to the plugin name defined in plugin.ini and the 'file_name' indicates which file it wants to read. The function will return the file contents. If the plugin is not enabled or the 'plugin_name' is wrong or not found, the function will fail and return null.
   Example: alert(external.readFile(security_id,"Test plugin","plugin.ini")) ;
5. writeFile(security_id, plugin_name, file_name, content )
   This function can only be used in a script plugin, for the security reasons. The 'plugin_name' refers to the plugin name defined in plugin.ini and the 'file_name' indicates the file name which will be write. The 'content' is the content that will be write to the file. If the plugin is not enabled or the 'plugin_name' is wrong or not found, the function will fail and return null.
   Please note: The file will be overwritten from the beginning.
   Example: external.writeFile(security_id,"Test plugin","setting.ini","username=abc\npass=qwrxcv");
6. tab_count : this property will return total number of tabs as a integer.
   Example: var total_tab = external.tab_count ; Demo
7. activate_tab(security_id,index)
   This function will activate number 'index' tab of Maxthon.
8. get_tab(security_id,index)
   This function will return a web page object of tab index.
9. cur_sel
   This function will return the number of current active tab as a integer.
   Example: var cur_tab = external.cur_sel; Demo
10. close_tab(security_id,index)
    This function will close number 'index' tab of Maxthon.
11. m2_readIni(security_id,plugin_name,file_name,section_name,key,default_value)
    This function will read the key using the default_value in the ini file specified by file_name in the plugin folder.
    Example: path = external.m2_readIni(security_id,"testplugin","settings.ini","general","save","0");
12. m2_writeIni(security_id,plugin_name,file_name,section_name,key,value)
    This function will write assign the key with the value to the ini file specified by file_name.
    Example: external.m2_writeIni(security_id,"testplugin","settings.ini","general","save","1");
13. m2_search_text
    This property will return the text in Maxthon's search bar.
    Example: alert(external.m2_search_text)
14. m2_run_cmd(security_id,id)
    This function will call a Maxthon's command with the ID. The id of every command could be found in the language file.
    Example: external.m2_run_cmd(security_id,32772); //It will open a blank page.
15. m2_plugin_folder(security_id,plugin_name)
    This function will return the local path of the plugin.
    Example:external.m2_plugin_folder(security_id,"ViewSource!");
16. max_actSideBarItem( plugin_name )
    This function will activate the sidebar plugin named as 'plugin_name'.
17. max_modelessDialog( security_id,url,option,attr,window)
    This function will open a modelessDialog. It's same as window.ShowModelessDialog function. The last parameter 'window' is the window object of the web page.
18. m2_callerName( security_id, plugin_name)
    This function tells Maxthon the call is made from Plugin. It's usually used before a window.open call to let maxthon bypass the popup window that plugin opened.
19. max_showConfig(security_id, plug_name)
    This function will show the plugin's config dialog.
20. max_activex(security_id, prog_id)
    This function will create the activex with the prog_id.
21. max_language_id
    This property is the user's current selected language.

SideBar plugin callback functions:

The sidebar could implement a script function max_callback(status) .
1. When it's created the URL will be filename?maxcmd=init
2. When the plugin is activated, max_callback('sidebar_activate') will be called
3. When the plugin is deactivated, max_callback('sidebar_deactivate') will be called
4. When the active tab is changed, max_callback('sidebar_tab_change') will be called
5. When the plugin is unload, max_callback('sidebar_unload') will be called.