自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JumuFENG's blog

暂时写一些关于mozilla的东西

  • 博客(46)
  • 资源 (17)
  • 收藏
  • 关注

原创 NPAPI插件开发详细记录:与JS交互

插件主要用于HTML页面中增强HTML页面可以支持的资源类型,在HTML页面中最重要的一个特性就是可以利用脚本语言来实现与用户的交互,之前的文章也提及过相关的议题,不过在交流过程中还是发现好多开发者对于这个主题有不太明白的地方,这里再次详细介绍一下在插件中如何与JS进行交互。以前的文章可以与本文互为参考:脚本化接口、插件接口脚本化。本文的例子代码可以下载:无boost需安装CMake、原来

2014-04-05 17:39:40 9738 5

原创 NPAPI插件开发详细记录:利用cmake生成插件工程

在使用firebreath的过程中,逐渐了解cmake的,生成项目非常方便,曾经我提供过一个生成插件开发基本代码的小工具,其中也有生成VS project的选项,现在我将其更新了,工具默认生成cmake需要的CMakeLists文件。对cmake我也是一个初学者,因此本文并不打算介绍cmake,如果有兴趣深入学习请自行查找相关资料,本文以添加了CMakeLists文件的scriptdemo为例,简

2014-04-05 16:50:22 7853 1

原创 NPAPI插件开发详细记录:插件的调试

这里我归纳一下我知道的在插件开发中使用的几种调试手段。附加到进程之前也提及过关于插件的调试,这里需要补充一点关于在chrome中调试插件的内容,在chrome中运行插件时,插件的进程也是chrome.exe,因此要准确的找到正确的插件进程可以为chrome添加启动参数--plugin-startup-dialog,如图:

2014-04-05 16:40:59 7138

原创 NPAPI插件开发详细记录:安装包的制作

我们开发好的插件需要交给用户使用的,我们自己在开发的过程中可能有各式各样的方法来使插件可以运行,但是如果要交给用户使用,我们总不至于让用户自己去写注册表,或者让用户将咱们的dll复制到plugins目录下吧!为了让用户的安装操作简单化,介绍两种方法:按照扩展的方式将插件打包这种方式根据浏览器不同需要采取不同的打包方式,比如Firefox需要打包为xpi,而chrome则需要打包为crx。可

2013-04-24 10:12:07 20479 4

原创 自行设计NPAPI开发框架

经历了一年有余的插件开发,对插件的工作机制也比较熟悉了,在开发插件的过程中使用sdk中的np_entry.cpp、npn_gate.cpp、npp_gate.cpp以及pluginbase.h这几个文件,极大的提高了插件开发的效率,使开发过程变得简单高效,但是在使用的过程中也发现了一些不足之处以及一些细微的bug。在开发过程中我已经对这几个文件进行了不同程度的修改以满足我的开发需求。虽然修改了能满

2012-12-21 14:57:31 11375 7

原创 NPAPI插件开发详细记录:实用功能——添加、识别私有属性

据我所知,除了通用属性如:id、class等,object标签的属性有type、data、width、height,embed标签的属性有type、src、width、height。而flashplayer插件所具有的loop、autoplay等属性都是插件自己添加的,无法用NPN_GetProperty接口进行获取。假设我们要开发一个插件允许使用loop属性,那该怎么实现呢?这个就要找到NS

2012-12-16 16:08:46 9528

原创 NPAPI插件开发详细记录:实用功能——获取插件路径、页面路径、资源路径

获取插件路径该功能不复杂,不过使用了windows提供的API故只适用于windows平台。代码如下: LPTSTR moduleName = new TCHAR[100]; GetModuleFileName(GetModuleHandle(_T("name")),moduleName,100); std::string mPath = std::string(moduleNam

2012-12-16 16:06:05 11902

原创 NPAPI插件开发详细记录:实用功能——改变插件窗口大小

我们有时候需要调整插件窗口的尺寸大小,比如说,当你创建一个视频播放窗口,在用户点击播放之后想要将窗口的大小调整为视频的实际大小。播放完毕之后又将窗口尺寸调整回原来的尺寸大小。要实现这样一个功能,最简单的方式是写JS来实现,只需要首先用getElementById获取插件,然后设置其width属性和height属性。但是,通常情况下我们只管编写插件,不负责网页的设计,如果我们设计完一个插件,还要

2012-12-16 15:56:26 11314

原创 NPAPI插件开发详细记录:再谈多线程

前面提到过有关多线程的问题,主要是如何在插件中创建新的线程。但是在编写多个线程的插件过程中遇到的问题比如何创建一个线程要复杂得多。一个问题是多个线程之间共享数据,该问题其实就是普通的多线程编程中也会遇到,如果有丰富的多线程程序设计的经验,那么插件编写中多线程间共享数据的问题也不算什么复杂的问题了。简单提一下我的解决方法:我让多个线程间共享数据采用的方法是首先设计一个基础的数据类,其他要使用共享数据

2012-07-20 22:33:31 9700 5

原创 NPAPI插件开发详细记录:脚本化接口

scriptable接口的实现,与属性有关的函数为HasProperty、GetProperty、SetProperty。在JS中设置属性(以bar为例)用plugin.bar=barvalue;来设置,获取属性直接用plugin.bar;如果要为插件创建属性,必须要在HasProperty中返回true,在GetProperty一般调用NPN_GetProperty(mNpp,sWindowOb

2012-07-15 13:54:11 13784 7

原创 NPAPI插件开发详细记录:实用功能(库的使用及多线程)

有了前面的hello world的经验,本文在其基础上研究一些实用功能的实现。库的动态加载Windows平台下,可以动态的对dll进行加载,使用到的API主要有:LoadLibrary、GetProcAddress、FreeLibrary等。下面以加载winmm.dll为例对相关代码进行简要介绍:动态加载dll,在加载之前先进行typedef,这里以实用winmm.dll中的函数P

2012-06-23 23:07:25 12788 2

原创 NPAPI插件开发详细记录:插件运行流程分析

本文详细分析插件的代码是如何执行的,主要分析np_entry.cpp、npn_gate.cpp和npp_gate.cpp.希望能够有所收获。在windows平台下,插件就是一个dll,注意到这个dll的def文件内容是:LIBRARY ""EXPORTSNP_GetEntryPoints @1NP_Initialize @2NP_Shutdown @3插件接口既然是浏览器

2012-06-19 20:04:55 16182 10

原创 NPAPI插件开发详细记录:插件开发入门

为什么这还是入门呢?因为前面的我们什么都没学会,只是学会了建立一个dll项目,并生成了一个Firefox可以识别dll,在测试页面中不会弹出需要下载插件的错误。而任何功能都没有实现。所以这里才是真正的入门。本文随着作者本人的学习进度逐渐深入,难免有不周全之处,请看到本文的朋友帮忙指出有误的地方。插件窗口在哪里入门篇暂时只讲述一个问题,根据我的理解,plugin创建时,浏览器会创建一个子

2012-06-14 23:07:25 20040 17

原创 NPAPI插件开发详细记录:用VS2010开发NPAPI插件步骤

前面一段时间关注了用firebreath开发插件,但是感觉用起来不是那么得心应手,还是回到NPAPI开发插件上来。本文根据NPAPI开发详解,Windows版进行开发,其中以VS2008为例进行开发,在VS2010中基本上是相同的。必须的plugin sdk,将其解压到某个目录下,我这里是:D:\Users\zcf\Documents\My Program\2012。下面是创建插件的步

2012-06-13 22:26:57 32565 49

原创 使用WaveOut接口播放WAV文件

我需要在插件中实现一边接收数据,一边展示媒体文件的功能,因此从最简单的音频文件来开始研究,绝大多数API如:playSound等都是根据完整文件来播放音频的,即便是内存模式也是需要将整个文件全部读入一片内容,然后将内存指针传递给playSound。最后逐渐寻找到WaveOut接口。要一边接收数据一边播放,首先需要得到头信息,然后使用多个缓存在WaveOutWrite中交替为音频设备填充数据。

2012-04-29 14:57:40 9889 1

原创 用firebreath开发插件

在寻找插件开发资料的过程中找到了一个开发浏览器插件的开源项目——firebreath。参考:firebreath主页。根据其介绍可以实现各种浏览器插件的开发。于是我进行了尝试,并试图搜索利用firebreath开发插件的中文资料。搜索到的相关中文资料有一个:徐凡的博客。其中有使用firebreath开发浏览器插件(一、二、三)三篇关于firebreath开发插件的文章。看完了,但是还是不怎么会。

2012-04-22 17:12:13 20392 4

原创 Firefox扩展开发初级教程——开发一个简单的扩展

作为一篇初学者教程,一般第一个扩展都是hello world扩展,我的例子也不例外,也是一个hello world扩展,但是本扩展要实现的功能不是弹出一个对话框显示hello world。而是实现重启Firefox这个功能。为什么要以这样一个功能为例子呢?因为在开发扩展过程中,我们每次对扩展中的文件作出了修改之后,想看看效果都必须重启Firefox。按照上一篇文章那样建立一个bat文件虽然很方便,

2012-04-06 19:35:32 14730 24

原创 提高firefox扩展开发效率

本文介绍一些技巧和开发扩展中使用的工具,主要参考:https://developer.mozilla.org/En/Firefox_addons_developer_guide的第五章(Chapter 5: Let's build a Firefox extension )。如有不清楚的地方可以参考原文,以及在我的博客中寻找这篇文章的翻译版。创建开发者profile详细的资料可以参考:

2012-04-05 22:04:00 5539 2

翻译 firefox附加组件开发者指南(六)——firefox扩展及XUL应用程序

本章讨论辅助开发扩展的工具。扩展开发者的工具Venkman, JavaScript 调试器Venkman是一个成熟的运行于firefox中的javascript调试器。它像典型的调试器一样工作,既可以用于开发扩展有可以用于一般的网络开发。由于其与扩展和firefox本身的javascript一起工作。这个调试器还开业作为一种学习设计方法的好方式。安装Venkma

2012-03-13 21:42:38 7952

翻译 firefox附加组件开发者指南(五)——创建一个firefox扩展(下)

开发实用的扩展:一个会话管理扩展这一节,我们将会创建一个实用新特性的扩展:会话存储API。这可以让用户在任何时刻保存和恢复会话快照(浏览器窗口状态)。第一阶段:测试安装图12展示了会话管理扩展的接口。在工具菜单下,会话存储子菜单包含两个项——保存会话和清理会话,在它们之间是一个刚才保存可以恢复的会话清单,最近的在最前面。图12:菜单中的会话管理扩展接口如”会话存储API

2012-03-12 22:14:00 7686

翻译 firefox附加组件开发者指南(五)——创建一个firefox扩展(上)

本章篇幅较长,分上下两部分发布,本章中的图和清单4在原网站中没有,因此这里也没有,感兴趣的可以去原文补充。下面是译文。至今为止,各个章节中独立的介绍了相关的技术——XUL、javascript、CSS和XPCOM。本章中,我们讨论如何将它们放到一起来实际的创建一个扩展。注:那些对诸如netbeans、eclipse等IDE掌握得非常好的开发者的创建Firefox/thunderbird

2012-03-12 21:49:48 4784 2

翻译 firefox附加组件开发者指南(四)——使用XPCOM:实现高级处理

本章描述如何利用javascript脚本语言使用XPCOM来实现高级的处理。概述Javascript没有类似于用来打开文件以及进行字符编码转换的函数。要实现这些功能需要采用其他机制。IE使用activex来处理,在firefox中我们使用XPCOM(跨平台组件对象模型)。关于XPCOMXPCOM是用来开发独立于平台的组件的一个框架(framework)。在这个框架下开发的组

2012-03-05 19:21:14 5272

翻译 firefox附加组件开发者指南(三)——XUL简介(下)

其他XUL功能OverlayXUL的一个与众不同的特性就是overlay。可以将多个XUL文档联合起来,并当做一个单独的XUL文档来处理。在Firefox中,这用来对各种功能进行模块化并实现了扩展。通过在XML声明中插入一个xul-overlay处理指令和根元素的开始标签,通过xul-overlay指定的XUL文档会在当前当前的XUL文档读取的同时进行读取。实际显示的XUL文档是原始X

2012-03-04 16:33:15 2838

翻译 firefox附加组件开发者指南(三)——XUL简介(中)

XUL中可用的窗体部件根元素XUL文档使用不同的根元素来实现不同的目的。本节我们将会看到三种典型的根元素:window、page和dialog。根元素使用windowtype属性作为这种类型的窗口的标识符。例如,Firefox使用navigator:browser作为其浏览器窗口的windowtype,使用Browser:Preference作为其选项窗口的windowtype。使用将

2012-03-04 16:21:48 3697

翻译 firefox附加组件开发者指南(三)——XUL简介(上)

这一章内容较多,故分三篇:XUL简介、XUL中可用的窗体部件、其他XUL功能。在学习如何开发扩展之前,我们来了解XUL,基于XML的用户接口语言,XUL是扩展的基本组成之一。概述XUL概览XUL是一种基于XML的语言,是为mozilla浏览器的GUI标记语言而开发的。结合HTML和脚本语言去开发用户界面的早期实验经历了很长一个过程,可以认为XUL是这个过程的演化结果。用在win

2012-03-04 15:07:29 3106

翻译 firefox附加组件开发者指南(二)——开发扩展过程中使用的技术

在深入阐述之前,我们快速的介绍一下用来开发firefox扩展的技术。还有为开发firefox必须了解的一些知识。开发firefox扩展用到的技术Firefox及其扩展都是基于当前网络开发广泛使用的技术。其结构与使用在网页中的动态HTML和windows中使用的HTML应用程序是相似的。如果你有开发动态HTML的经验,你就会发现学习开发firefox扩展的技术会相对的轻松。各种技

2012-03-04 14:40:14 2224

翻译 Firefox附加组件开发者指南(一)——扩展简介

https://developer.mozilla.org/En/Firefox_addons_developer_guideChapter1: Introduction to extensionsChapter2: Technologies used in developing extensionsChapter3: Introduction to XUL—How to build

2012-03-04 14:13:39 5631 1

原创 firefox附加组件开发者指南——译序

本系列文章很适合作为学习Firefox附加组件开发的参考。其中说明了Firefox扩展开发所需要使用到的技术,并对这些技术进行了简明的介绍。翻译完本系列文章,特别是第五章之后,我对Firefox附加组件开发的理解又深入了一步。最初在MDN上看到这一系列的文章是为了想要搞清楚如何使用XPCOM接口而搜索到的,时间大概是2011年11月份。当时只对第四章比较感兴趣,看了一遍,但是我这人英语水平还不

2012-03-04 13:42:03 1589 1

翻译 使用js-ctypes——处理数据

原文:https://developer.mozilla.org/en/js-ctypes/Using_js-ctypes/Working_with_data创建CData对象使用js-ctypes的数据类型的由CType对象表示的。这些都是javascript构造函数。它们都是可调用的函数,你可以用来创建新的这种类型的CData对象。有几种方式进行创建新的CData对象。创建CD

2012-02-11 14:57:42 2297 1

翻译 使用js-ctypes——声明并调用函数

原文:https://developer.mozilla.org/en/js-ctypes/Using_js-ctypes/Declaring_and_calling_functions函数的声明使用Library对象的declare()方法。一旦声明,函数就可以使用标准的函数语法进行调用。例:无输入参数这个例子中,我们声明libc的clock()函数,其返回值是系统启动之后经历的

2012-02-11 14:57:09 1424

翻译 使用js-ctypes——声明类型

原文:https://developer.mozilla.org/en/js-ctypes/Using_js-ctypes/Declaring_types原文标明,本文尚未完成。如有疑问请参照原文。Ctypes对象提供了许多声明类型的方法,每种类型都由一个CType对象表示,CType对象提供了一个构造方法,可以通过调用该方法来定义这些类型的值。使用js-ctypes声明的类型相对于相关的

2012-02-09 22:02:59 2315

翻译 使用js-ctypes

译注:在学习使用js-ctypes的过程中遇到困难,于是仔细的看了这篇文章并对我感觉重要的地方进行了翻译,加之原文有些地方仍然会有改动。在看译文的过程中如有疑惑,请参考原文。使用js-ctypes导入 ctypes.jsm方法如下:Components.utils.import("resource://gre/modules/ctypes.jsm")加载本地库导入了代码模块之后,可

2012-02-09 21:56:32 2598 1

原创 自定义protocol之newChannel

前面对实现新的protocol进行了研究,本文描述一下在实现protocolhandler时遇到的newChannel方法的实现。研究得不是很透彻,希望有人能与我进行交流。前面研究得到的结论是newURI方法中返回一个nsIURI类型的uri。这个uri的protocol如果不是firefox可以直接处理的protocol,而是我们实现的protocol,那么就会调用我们实现的protocol

2012-01-11 20:55:03 1049

原创 在firefox中自定义protocol

前面的例子(为firefox添加新的protocol)虽然很详细,但是形式过于古老,无法应用于新的firefox版本中。我对这个进行进一步的研究。有了定制about页面的URL的经验,我打算实现一种新的协议“research”,在地址栏中输入“research:XXX”则显示百度或者谷歌搜索XXX关键词所得到的搜索页面。第一步,看看百度/谷歌搜索关键词之后的URL有什么特征,打开百度,在搜索框

2012-01-11 20:45:30 1523 1

原创 为firefox定制about页面的URL

在查阅如何注册新协议的过程中发现了一种定制自己的about页面的方式。感觉与添加新协议的过程极为相似。顺便尝试了一下,结果成功了。下面将其过程记录下来。原始页面在:https://developer.mozilla.org/En/Custom_about:_URLs该文章前面部分是针对firefox4之前的,也就是gecko2.0版本之前的,这里我就不描述了,第二部分是针对firefox4

2011-12-31 18:15:05 1191

翻译 为firefox添加新的protocol

Adding a New Protocol to Mozilla本文讲述如何为mozilla添加一个新的协议。实现该协议将要使用javascript和XPCOM,也包括了将其添加到现有的mozilla程序中。概述Mozilla支持一般的网络协议如HTTP和FTP。有时对现存的mozilla程序进行修改以使其支持一种新的协议非常有用,如此mozilla就可以更好的与其他应用程序集成。

2011-12-30 21:29:13 1500 2

原创 用VS制作简单dll的过程

今天尝试了一把做dll。之所以去做dll是因为之前发现firefox从gecko2.0开始支持JS-Ctypes,利用js-Ctypes可以直接使用javascript脚本调用dll二进制文件,与firefox进行交互。这极大的方便了制作插件及创建基于gecko的应用程序。下面我描述一下今天制作dll的过程,和一些感受。创建dll的过程其实并不难,但是MDN上明确表示对于C++制作的dll支持

2011-12-28 23:27:31 2265 2

原创 firefox调试记录8——小结

我调试跟踪firefox源代码的目的是找到firefox加载网页文件到渲染页面这个过程的处理代码,我的这个目的到现在为止还没达到。但是对firefox的源代码进行跟踪和调试所涉及到的内容也基本上就是这些了。因此做一个关于调试跟踪的小结。先说明一下我使用的相关软件、程序的版本等信息吧,操作系统是win XP;Visual Studio是2010版;firefox的源代码是8.0版本的;编译fir

2011-12-26 20:32:23 1552 1

原创 firefox调试记录7——打开与修改文件

按照网上其他人给出的方法,打开了firefox工程之后,设置好环境变量,自己就可以打开一些文件,下断点,进行调试等。但是我一直没有找到打开某个特定文件的方法,如下图是firefox工程点击右键时的选项:不过可以添加现有项目,这样可以把firefox.exe目录下的其他测试程序都打开来调试一下,上图中我就打开了TestGetURL等几个测试程序。因此,我总也没找到人家说的打开文件如何打开。后

2011-12-19 21:42:05 1119

原创 firefox调试记录6——Firefox主窗口创建过程研究

到此为止,可以说已经到了firefox比较关键的地方了,其打开过程弄得比较清楚了,现在先来理清楚firefox是如何创建浏览器窗口,并最终展示在用户面前。这里先分析一下AppShell->Run()开始调用到消息循环开始这个过程。当程序运行到~\firefox-8.0.source\toolkit\components\startup\nsAppRunner.cpp第35444行(在函数XRE

2011-12-19 21:31:08 1129 2

npscriptdemo带cmakelists无boost

前一个scriptable插件demo的改进版,去掉了使用boost的代码,并添加了cmake文件,可以直接用cmake生成项目。

2014-04-05

PluginPreGenV2.0.0.1

添加了生成CMakeLists文件的功能,安装CMAKE之后即可运行cmake生成项目。为npfrmwk.h添加了全局函数NP_OUTPUT_DBG_STRING和NP_OUTPUT_DBG_HEX利用OutputDebugString输出调试信息,可以使用Dbgview.exe查看这些输出信息。 方便的生成NPAPI插件项目。只需要将压缩包解压即可,运行后根据设置自动生成项目所需源代码及CMakeLists.txt,欢迎插件开发者下载使用

2013-09-01

scriptable插件demo

scriptable接口插件的demo。设置属性,调用函数,JS回调函数等功能,欢迎下载,学习交流

2013-01-29

NPAPI插件开发代码预生成V0.2

用于自动生成NPAPI插件开发过程中的一些必要文件,相关使用方式请参考本人CSDN博客!欢迎下载使用!这个是最新版本,前面两个有问题,请下载本文件

2013-01-05

NPAPI插件开发代码预生成V0.1

自动生成NPAPI开发框架代码的工具。前面一个生成的文件有错误,请不要下载,下载本文件。

2012-12-24

NPAPI插件开发代码预生成

用于自动生成NPAPI插件开发过程中的一些必要文件,相关使用方式请参考本人CSDN博客!欢迎下载使用!

2012-12-21

具有脚本化接口的简单NPAPI插件

具有脚本化接口的简单NPAPI插件,包含代码及相应VS项目,欢迎下载研究。

2012-12-21

具有类封装的简单NPAPI插件

具有类封装的最简NPAPI插件代码及相应VS项目,欢迎下载研究学习

2012-12-21

最简单NPAPI插件

最简单的NPAPI插件代码及整个VS工程。博文中相关代码。欢迎下载,研究学习!

2012-12-21

test_plugin

从firefox源代码中摘录下来的用于测试firefox中NPAPI接口的实例代码,包括原始文件及在VS2010中生成的项目,适合研究学习NPAPI插件开发中的一些较深入的技术细节,其中所有函数都为全局函数,没有采用类进行封装,故初学NPAPI开发时不建议参考。

2012-12-21

plugin SDK

NPAPI插件开发的sdk,主要包括开发插件所需的必要文件和头文件,以及几个简单的例子

2012-06-14

editplus用户文件userfile

文章:http://blog.csdn.net/z6482/article/details/7430198使用的editplus用户文件,欢迎下载试用,如使用过程中发现任何问题欢迎与我交流,

2012-04-05

firefox重启扩展

博文中firefox扩展开发初级教程示例扩展xpi包,可快速重启firefox。欢迎下载,学习使用并与我交流。firefox交流群:81424441

2012-04-05

xul_ctl_acp_stx

文章:http://blog.csdn.net/z6482/article/details/7430198中所使用的editplus的userfile。包含editplus的acp文件、stx文件、ctl文件以及一个xul模板文件。欢迎下载使用,如使用中有任何问题请联系我:[email protected]。或者到我博客中留言

2012-04-05

xul自动补齐acp文件

开发firefox扩展时使用XUL文件的自动补齐acp文件,用于editplus。不知能否用于其他编辑器 对XUL reference中列出的标签都可进行自动补齐, 如box标签,使用自动补齐之后只需要输入box然后按空格键即可自动补齐为 <box > </box> 另外还有几个比较特殊的是:xul、js、css、!。

2012-03-29

firefox附加组件开发者指南

本系列文章很适合作为学习Firefox附加组件开发的参考。其中说明了Firefox扩展开发所需要使用到的技术,并对这些技术进行了简明的介绍。原文地址:https://developer.mozilla.org/En/Firefox_addons_developer_guide 另外,博客中有本文档的全部内容。

2012-03-04

makefile学习教程

本文档是介绍编译时如何编写makefilefile的,我在陈皓的博客(http://blog.csdn.net/haoel/article/list/3 感谢原作者的无私奉献)。发现了这篇教程,发现下载资源中没有,于是分享给大家。好资源,当然免费下载啦!

2011-12-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除